不想再忍受公有网盘的限速、扫描删文件和高昂会员费?拥有一台 VPS 之后,您可以彻底夺回数据掌控权。无论是打造全功能个人办公云、聚合所有零散网盘,还是搭建媲美 Google Photos 的私有相册,本指南都将为您提供完整方案。
⚖️ 方案选型:Nextcloud / AList / Immich
三款工具各有侧重,根据您的 VPS 配置和核心需求选择:
Nextcloud
全能私有云首选- 体验最接近 Google Drive / iCloud
- 文件同步、在线编辑、日历、联系人全家桶
- 客户端覆盖 iOS/Android/Win/Mac/Linux
- 插件生态丰富(Office、Think 等)
PHP 架构,大量文件时扫描慢,需配合 Redis 优化
AList
轻量聚合网盘神器- 挂载阿里云盘、百度云盘、OneDrive、S3 等 40+ 种存储
- 极省资源(256MB 内存也能流畅运行)
- 支持在线预览视频、图片、PDF、Office 文档
- WebDAV 输出,可挂载为本地磁盘
自身不存储文件,只做前端展示和协议转换
Immich
最像 Google Photos 的自托管相册- 自动备份手机照片(iOS/Android App)
- AI 人脸识别、物体分类、地图时间线
- 相册、分享相册、多用户支持
- 视频自动转码,播放流畅
机器学习功能需要较多 CPU,低配机响应慢
☁️ 实战:Nextcloud 全能云完整部署
我们使用 Nextcloud + MariaDB + Redis 三服务 Compose 组合,这是官方推荐的生产级配置。Redis 缓存是让 Nextcloud 流畅运行的关键,不要省略。
docker-compose.yml(含 Redis 缓存)
# 文件路径:/opt/nextcloud/docker-compose.yml
# 完整的 Nextcloud + MariaDB + Redis 三服务组合
services:
# ── Nextcloud 应用服务 ──────────────────────────────────────────────────────
nextcloud:
image: nextcloud:28-apache # 使用稳定的具体版本号,避免大版本自动升级
container_name: nextcloud_app
restart: unless-stopped
ports:
- "127.0.0.1:8080:80" # 只绑定本地,配合 Nginx 反代对外提供 HTTPS
volumes:
- ./data:/var/www/html # Nextcloud 程序文件 + 用户文件
environment:
# 数据库连接信息
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
# Redis 缓存连接
- REDIS_HOST=redis
- REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
depends_on:
- db
- redis
# ── MariaDB 数据库 ──────────────────────────────────────────────────────────
db:
image: mariadb:11 # MariaDB 11 性能优于 10.6
container_name: nextcloud_db
restart: unless-stopped
# 这些参数是 Nextcloud 官方推荐的,提升写性能和兼容性
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-file-per-table=1
volumes:
- ./db_data:/var/lib/mysql # 数据目录持久化(命名卷或 bind mount 均可)
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
# ── Redis 缓存(显著提升 UI 响应速度和文件扫描性能)──────────────────────────
redis:
image: redis:7-alpine
container_name: nextcloud_redis
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- ./redis_data:/data .env 配置文件
# 文件路径:/opt/nextcloud/.env
MYSQL_ROOT_PASSWORD=MySQL_ROOT强密码_随机20位
MYSQL_PASSWORD=Nextcloud数据库密码_随机16位
REDIS_PASSWORD=Redis密码_随机16位
# 启动:cd /opt/nextcloud && docker compose up -d
# 首次访问 http://服务器IP:8080 完成初始化向导 Nginx 反代配置(HTTPS + 大文件上传)
# 文件路径:/etc/nginx/conf.d/nextcloud.conf
# Nextcloud 官方推荐的 Nginx 反代配置
server {
listen 443 ssl;
http2 on;
server_name cloud.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/cloud.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cloud.yourdomain.com/privkey.pem;
# 上传文件大小限制(根据需求调整,Nextcloud 默认 512MB)
client_max_body_size 10G;
client_body_timeout 300s;
# 反代到 Docker 容器
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebDAV 支持所需的超时设置
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
}
}
server {
listen 80;
server_name cloud.yourdomain.com;
return 301 https://$host$request_uri;
} ⚙️ 进阶:Nextcloud 性能调优三部曲
很多用户抱怨 Nextcloud 慢,通常是因为没有配置内存缓存。完成以下三步可以显著提升响应速度:
第一步:在 config.php 中启用 Redis 缓存
# 进入 Nextcloud 容器内部编辑配置文件
docker exec -it nextcloud_app bash
# 编辑 config.php 添加 Redis 缓存配置
nano /var/www/html/config/config.php
# 在 </array> 结束标签之前添加以下内容:
# 'memcache.local' => '\OC\Memcache\Redis',
# 'memcache.locking' => '\OC\Memcache\Redis',
# 'redis' => array(
# 'host' => 'redis', # Docker 网络内用服务名通信
# 'port' => 6379,
# 'password' => '你的Redis密码',
# ), 第二步:改用系统 Cron 触发后台任务
# Nextcloud 默认用 AJAX 触发后台任务(每次打开页面才执行)
# 更可靠的方式是在宿主机设置 Cron 定时任务:
# 在宿主机执行 crontab -e,添加以下行(每 5 分钟执行一次):
# */5 * * * * docker exec -u www-data nextcloud_app php -f /var/www/html/cron.php
# 同时在 Nextcloud 管理后台修改:
# 设置 → 基本设置 → 后台任务 → 选择 "Cron" 第三步:PHP 内存与 OPcache 优化
在 Nextcloud 容器的 docker-compose.yml 中加入环境变量覆盖 PHP 配置:
environment:
# ...原有配置...
- PHP_MEMORY_LIMIT=512M # PHP 最大内存(默认 128M 对 Nextcloud 不够)
- PHP_UPLOAD_LIMIT=10G # 单文件上传大小限制
- OPCACHE_ENABLE=1 # 开启 OPcache 字节码缓存,显著提升 PHP 执行速度
- OPCACHE_MEMORY=128 # OPcache 内存大小(MB) 🗂️ 实战:AList 聚合网盘部署与配置
AList 的核心价值是"一个界面管理所有网盘"。它自身极省资源,将所有云盘的 API 统一封装为 WebDAV 和 Web 界面对外提供服务。
docker-compose.yml
# 文件路径:/opt/alist/docker-compose.yml
services:
alist:
image: xhofe/alist:latest
container_name: alist
restart: unless-stopped
volumes:
- ./data:/opt/alist/data # AList 配置和数据库文件
ports:
- "127.0.0.1:5244:5244" # 只绑定本地,配合 Nginx 反代
environment:
- PUID=0 # 容器内以 root 运行(方便挂载权限管理)
- PGID=0
- UMASK=022
# 启动后获取初始管理员密码:
# docker exec -it alist ./alist admin random
# 或重置密码:
# docker exec -it alist ./alist admin set 你的新密码 主流网盘挂载速查
阿里云盘
- 后台 → 存储 → 添加 → 选 'Aliyundrive Open'
- 用手机扫码授权(刷新令牌有效期 30 天,需定期刷新)
- 挂载路径填 /aliyun,完成
OneDrive
- 后台 → 存储 → 添加 → 选 'OneDrive'
- 点击授权链接,用 Microsoft 账号登录授权
- 选择个人版或企业版,挂载路径填 /onedrive
百度网盘
- 后台 → 存储 → 添加 → 选 'Baidu.Netdisk'
- 需要百度账号的 bduss 和 stoken 参数(从 Cookie 提取)
- 注意:百度 API 限速严重,下载速度受限
docker exec -it alist ./alist admin set 新密码),并在管理后台开启访客模式或设置访问密码,防止公网任意用户浏览您的文件。
📸 实战:Immich 自托管私有相册
Immich 是目前最像 Google Photos 的自托管相册方案,拥有极流畅的移动端 App(iOS/Android)、AI 人脸识别、自动备份和地图时间线,已成为摆脱 Google Photos 的首选替代品。
⚠️ 磁盘空间规划: Immich 会存储原始照片和视频,一个人 5 年的手机相册通常需要 50-200GB 空间。请确保您的 VPS 有足够的磁盘(大盘鸡),或将 UPLOAD_LOCATION 指向外挂的对象存储(通过 Rclone 挂载)。
docker-compose.yml
# 文件路径:/opt/immich/docker-compose.yml
# 官方 Compose(简化版),完整版参考 https://immich.app/docs/install/docker-compose
services:
# ── Immich 主服务 ───────────────────────────────────────────────────────────
immich-server:
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
container_name: immich_server
restart: unless-stopped
ports:
- "127.0.0.1:2283:3001"
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload # 照片存储目录(设置为大容量路径)
env_file: .env
depends_on:
- redis
- database
# ── 机器学习服务(人脸识别/物体分类)────────────────────────────────────────
immich-machine-learning:
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
container_name: immich_ml
restart: unless-stopped
volumes:
- model_cache:/cache # 模型文件缓存
env_file: .env
# ── Redis 缓存 ──────────────────────────────────────────────────────────────
redis:
image: redis:7-alpine
container_name: immich_redis
restart: unless-stopped
# ── PostgreSQL 数据库(Immich 官方要求 PG,不支持 MySQL)──────────────────────
database:
image: tensorchord/pgvecto-rs:pg16-v0.2.0 # 带向量扩展的 PG,支持 AI 相似度搜索
container_name: immich_postgres
restart: unless-stopped
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
volumes:
- ./pg_data:/var/lib/postgresql/data
volumes:
model_cache: .env 配置文件
# 文件路径:/opt/immich/.env
UPLOAD_LOCATION=/opt/immich/photos # 照片存储路径(确保磁盘空间足够)
IMMICH_VERSION=release
DB_PASSWORD=Immich数据库密码_随机16位
DB_USERNAME=immich
DB_DATABASE_NAME=immich
# 启动后访问 http://服务器IP:2283 完成初始化
# 配合 Nginx 反代并开启 HTTPS 使用(移动端 App 需要 HTTPS) 🔗 高阶:WebDAV 挂载为本地磁盘
这是私有网盘最强大的用法:通过 WebDAV 协议,将 VPS 上的 Nextcloud 或 AList 挂载成 Windows 里的 Z: 盘或 Mac 上的本地磁盘。编辑、移动文件就像操作本地硬盘一样自然,所有操作实时同步到云端。
# ── Linux 命令行挂载 WebDAV(davfs2)──────────────────────────────────────────
apt install davfs2 -y
mkdir -p /mnt/nextcloud
# 编辑 /etc/davfs2/secrets 添加认证信息(格式:地址 用户名 密码)
# https://cloud.yourdomain.com/remote.php/dav/files/username/ username password
# 挂载
mount -t davfs https://cloud.yourdomain.com/remote.php/dav/files/username/ /mnt/nextcloud
# 开机自动挂载(/etc/fstab):
# https://cloud.yourdomain.com/remote.php/dav/files/username/ /mnt/nextcloud davfs user,auto,_netdev 0 0
# ── Windows 客户端推荐工具 ────────────────────────────────────────────────────
# RaiDrive:最易用,图形界面,挂载为 Windows 盘符(如 Z:)
# CloudDrive2:支持多协议,性能较好,有免费版
# 原生 WebDAV:Windows 内置支持,但性能较差,仅适合小文件
# ── macOS 原生挂载 ────────────────────────────────────────────────────────────
# Finder → 前往 → 连接服务器 → 输入:
# https://cloud.yourdomain.com/remote.php/dav/files/username/
# ── 移动端(iOS / Android)────────────────────────────────────────────────────
# iOS:Files App → 添加存储位置 → WebDAV
# Android:推荐使用 Solid Explorer 或 X-plore 挂载 WebDAV 🔄 高阶:Rclone 命令行挂载与同步
Rclone 是命令行界的"存储万能钥匙",支持 40+ 种云存储协议(S3/WebDAV/OneDrive/Google Drive/Cloudflare R2 等)。在私有云盘场景中,Rclone 的主要用途是:① 将 Nextcloud/Immich 数据定期备份到对象存储(异地容灾);② 将对象存储挂载为本地目录(扩展存储容量)。
# ── 安装 Rclone ───────────────────────────────────────────────────────────────
curl https://rclone.org/install.sh | bash
# ── 配置云存储连接(交互式引导)──────────────────────────────────────────────
rclone config
# 按照提示选择存储类型:
# n(新建配置)→ 选择编号(如 s3 对应 AWS S3 / 对象存储)
# 输入密钥和配置信息,完成后 q 退出
# ── 常用同步命令 ────────────────────────────────────────────────────────────
# 将本地目录同步到 Cloudflare R2(单向同步:本地→云端)
rclone sync /opt/nextcloud/data r2:my-bucket/nextcloud-backup --transfers=4 # 并发传输数
--checkers=8 # 并发校验数
--progress # 显示进度
# 双向同步(谨慎使用,可能覆盖文件)
rclone bisync /local/dir remote:bucket/dir --create-empty-src-dirs
# 挂载 WebDAV / S3 为本地目录(实验性,生产慎用)
rclone mount remote:bucket /mnt/cloud --daemon # 后台运行
--vfs-cache-mode full # 完整本地缓存(读写性能最好)
--cache-dir /tmp/rclone # 缓存目录
# 查看已配置的远程存储列表
rclone listremotes
# 测试连接和列出文件
rclone ls r2:my-bucket/ | head -20 在
crontab -e 中加入:0 4 * * * rclone sync /opt/nextcloud/data r2:backup/nextcloud --transfers=4 >> /var/log/rclone-backup.log 2>&1 ❓ 常见问题解答
Nextcloud 部署后打开很慢,甚至超时,如何排查?
排查顺序:① Redis 是否在运行:docker compose ps 检查 redis 服务状态,docker logs nextcloud_redis 查看日志;② config.php 缓存配置是否正确:进入容器检查 /var/www/html/config/config.php 中是否包含 memcache 配置;③ Cron 任务是否积压:登录 Nextcloud 管理后台 → 概况,查看是否有大量积压任务(改用系统 Cron 后台任务后此问题通常消失);④ PHP 内存是否不足:docker stats nextcloud_app 查看内存使用,若接近上限需提高 PHP_MEMORY_LIMIT;⑤ 数据库是否慢:docker logs nextcloud_db 查看是否有慢查询警告。
Nextcloud 和 AList 可以同时部署在一台 VPS 上吗?
完全可以,而且是非常常见的搭配。两者通过不同端口运行(Nextcloud 映射到 8080,AList 映射到 5244),用 Nginx 通过不同子域名反代到对应端口(cloud.yourdomain.com 指向 8080,pan.yourdomain.com 指向 5244)。资源需求:Nextcloud(含 MariaDB + Redis)约 600-800MB 内存;AList 约 50-100MB。两者加在一起在 2GB 内存的 VPS 上可以流畅运行。超出内存时建议先按第 15 篇 Docker 章节配置 Swap 作为缓冲。
AList 挂载阿里云盘后下载速度很快,百度网盘却只有几十 KB/s,为什么?
这是百度网盘官方 API 的限速策略,与 AList 无关。百度网盘对非 SVIP 账号的 Open API 下载速度有严格限制(通常 50-300KB/s),即使您是 SVIP 会员,API 下载也比客户端慢。解决方案:① 购买百度网盘 SVIP(会提升 API 限速上限);② 使用 AList 的"离线下载"功能,将百度网盘文件转存到 AList 本地存储后再下载;③ 对于百度网盘的文件,直接在百度网盘客户端下载通常比 API 快得多。阿里云盘的官方 Open API 下载基本无限速,是体验最好的 AList 挂载选项。
Immich 的 AI 人脸识别和物体分类功能需要 GPU 吗?低配 VPS 能用吗?
不需要 GPU,Immich 的机器学习使用 CPU 推理。低配 VPS 能用,但有以下取舍:① 1 核 CPU:照片识别极慢,上传大量照片时 CPU 会长时间满载,影响其他服务。建议上传完成后手动在后台慢慢跑识别;② 2 核及以上:可以接受,大批量上传时会有明显负载,识别日常新增照片(每天几十张)完全没问题;③ 内存至少 2GB:机器学习模型加载到内存约需 500MB-1GB。如果内存不足,可以在 Compose 中禁用 immich-machine-learning 服务,牺牲 AI 功能换取资源节省。
Nextcloud 版本升级如何操作?直接改 Compose 中的镜像版本号就行吗?
不能跳版本升级! Nextcloud 的版本升级必须逐个大版本进行(如 27 → 28,不能直接 27 → 30)。正确升级流程:① 先备份数据目录和数据库;② 将 Compose 中镜像版本改为下一个大版本(如 nextcloud:28-apache);③ docker compose pull && docker compose up -d;④ 等待数据库迁移完成(通过 docker logs -f nextcloud_app 查看进度);⑤ 确认升级成功后,再重复以上步骤升级到下一个大版本。使用 nextcloud:latest 标签存在自动跨大版本升级的风险,生产环境建议固定具体版本号(如 nextcloud:28-apache)。
Rclone 挂载 S3/R2 为本地目录后,Nextcloud 能直接使用这个目录存储文件吗?
技术上可行,但需要注意:① 将 Rclone 挂载目录(如 /mnt/r2-storage)作为 Nextcloud Compose 中 ./data 的 bind mount 来源;② Rclone 挂载需先于 Docker Compose 启动,建议写成 systemd 服务确保开机顺序;③ Rclone FUSE 挂载的 I/O 性能不如本地磁盘,大量小文件操作会比较慢(S3 的元数据 API 有调用频率限制);④ 推荐的更可靠方案:Nextcloud 数据存在本地磁盘,用 Rclone sync 定期备份到 R2(而非直接用 R2 做主存储)。这样读写性能不受影响,R2 只用于灾难恢复。
WebDAV 挂载在 Windows 上传输大文件经常断开,有什么解决方法?
Windows 原生 WebDAV 客户端对大文件和长连接支持较差。解决方案:① 改用 RaiDrive 或 CloudDrive2——这两个工具的 WebDAV 实现比 Windows 原生更稳定,支持断点续传;② 增大 Nginx 超时配置:在 Nextcloud 的 Nginx 反代配置中将 proxy_read_timeout 和 proxy_send_timeout 设为 3600s(1小时);③ 调大 Nextcloud 的上传超时:在 PHP 配置中设置 max_execution_time=3600;④ 改用 Nextcloud 官方桌面客户端同步大文件,而非 WebDAV 直传——官方客户端有完善的断点续传和冲突处理机制,稳定性远优于 WebDAV。
私有网盘的数据安全怎么保障?VPS 服务商能不能看到我的文件?
从技术角度:VPS 服务商拥有宿主机的物理访问权,理论上可以访问磁盘数据。实用防护措施:① 传输层加密:确保 Nextcloud/AList 通过 HTTPS 提供服务,传输过程加密;② Nextcloud 端到端加密(E2EE):在 Nextcloud 中启用 E2E 加密插件,文件在客户端加密后上传,服务端只存储密文,即使访问磁盘也看不到内容;③ 磁盘级加密:使用 LUKS 对数据分区加密(重启时需要手动解密,运维复杂度高);④ 选择信誉良好的 VPS 服务商(Hetzner、Vultr 等),遵守当地隐私法规,这是最实用的保障。对于绝大多数个人用户,HTTPS + 强密码 + Nextcloud E2EE 的组合已经远比公有云盘安全。
学完私有云盘后,下一步应该怎么进阶?
按本站 30 篇路径,第 17 篇(本篇)→ 第 18 篇(mail-server-setup)→ 第 19 篇(data-backup)是最自然的延伸。关联逻辑:第 18 篇的 Mailcow 邮件服务器与 Nextcloud 可以深度集成——在 Nextcloud 中安装"Mail"插件,直接在云盘界面收发邮件,实现"私有 Google Workspace";第 19 篇的 3-2-1 备份策略正是为了保护本篇的 Nextcloud 数据——Rclone 同步到 R2、定时快照、异地备份,让辛苦建立的私有云盘真正做到"数据永不丢失"。三篇构成"存储 → 通信 → 备份"的完整自托管基础设施闭环。
VPS 换了新机器,怎么迁移 Nextcloud 的所有数据?
完整迁移步骤:① 在旧机器上备份:docker exec nextcloud_db mysqldump -u root -p nextcloud | gzip > /tmp/nc_db.sql.gz,同时打包数据目录 tar czf /tmp/nc_data.tar.gz /opt/nextcloud/data;② 传输到新机器:rsync -avz /tmp/nc_*.gz /opt/nextcloud root@新机器IP:/root/;③ 在新机器上安装 Docker 并启动 Nextcloud Compose(不要初始化,直接停止);④ 恢复数据库:docker exec -i nextcloud_db mysql -u root -p nextcloud < nc_db.sql(先解压);⑤ 恢复文件目录:解压 nc_data.tar.gz 到对应路径;⑥ 更新 config.php 中的服务器地址(trusted_domains);⑦ 启动服务,在 Nextcloud 容器内运行 php occ maintenance:mode --off 关闭维护模式;⑧ 修改 DNS 指向新机器。整个过程参照第 15 篇 Docker 迁移章节的零停机流程。