不想再忍受公有网盘的限速、扫描删文件和高昂会员费?拥有一台 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:${NEXTCLOUD_VERSION}-apache # 在 .env 固定已复核的受支持版本
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:${MARIADB_VERSION} # 固定兼容版本,升级前先读双方发布说明
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位
NEXTCLOUD_VERSION=填写已复核的受支持版本
MARIADB_VERSION=填写与该版本兼容的版本
# 启动:cd /opt/nextcloud && docker compose up -d
# 保护密钥:chmod 600 .env
# 8080 只绑定本机;通过已配置 HTTPS 的域名完成初始化
# 临时排查也可用 SSH 隧道:ssh -L 8080:127.0.0.1:8080 user@服务器 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:${ALIST_VERSION} # 在 .env 固定已复核的发布版,不使用 latest
container_name: alist
user: "1000:1000" # 替换为数据目录实际 UID:GID
restart: unless-stopped
volumes:
- ./data:/opt/alist/data # AList 配置和数据库文件
ports:
- "127.0.0.1:5244:5244" # 只绑定本地,配合 Nginx 反代
environment:
- UMASK=027
# .env:ALIST_VERSION=v3.60.0(示例;部署前核对发布页)
# 先让 UID 1000 拥有 ./data,再启动并获取初始管理员密码:
# 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 提供移动端自动上传、时间线、人脸识别和地图等相册能力,适合愿意自行维护存储、数据库与升级流程的用户。它更新较快,部署文件、依赖镜像和端口应始终来自同一个明确发布版。
⚠️ 磁盘空间规划: 原始照片、缩略图、转码文件、数据库和机器学习缓存都会占用空间。UPLOAD_LOCATION 与数据库目录优先使用本地可靠文件系统;不要把 Rclone/FUSE 挂载直接当作 Immich 原始图库或数据库。对象存储更适合承接经过校验的异地备份。
docker-compose.yml
# 不要手写或混用 main 分支 Compose;依赖镜像和端口会随版本变化
mkdir -p /opt/immich
cd /opt/immich
# 先在发布页选择并复核一个明确版本,再下载同一版本的两个文件
export IMMICH_RELEASE=vX.Y.Z
curl -fL -o docker-compose.yml "https://github.com/immich-app/immich/releases/download/${IMMICH_RELEASE}/docker-compose.yml"
curl -fL -o example.env "https://github.com/immich-app/immich/releases/download/${IMMICH_RELEASE}/example.env"
# 审阅文件后创建配置;不要把密钥提交到 Git
cp example.env .env
chmod 600 .env
# 编辑 .env,确认上传目录、数据库目录和强密码后再启动
docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps .env 配置文件
# 文件路径:/opt/immich/.env
UPLOAD_LOCATION=/opt/immich/photos # 照片存储路径(确保磁盘空间足够)
DB_DATA_LOCATION=/opt/immich/postgres # 数据库应放本地可靠磁盘
IMMICH_VERSION=vX.Y.Z # 与下载的 Compose 发布版完全一致
DB_PASSWORD=Immich数据库密码_随机16位
DB_USERNAME=immich
DB_DATABASE_NAME=immich
# 2283 端口和依赖以该发布版 Compose 为准
# 公网使用前先配置反向代理、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 可连接 S3、WebDAV、OneDrive、Google Drive、Cloudflare R2 等存储。在这里它主要用于把已生成的一致性备份集复制到异地,并在传输后校验;挂载功能只用于便捷访问,不承担数据库、Nextcloud 数据目录或 Immich 原始图库的主存储职责。
# ── 安装并确认版本 ───────────────────────────────────────────────────────────
# 优先使用发行版软件包或从 rclone.org 下载并校验官方发布包
apt update
apt install rclone -y
rclone version
# ── 配置云存储连接(交互式引导)──────────────────────────────────────────────
rclone config
# 按照提示选择存储类型:
# n(新建配置)→ 选择编号(如 s3 对应 AWS S3 / 对象存储)
# 输入密钥和配置信息,完成后 q 退出
# ── 备份:copy 不会删除远端已有对象 ─────────────────────────────────────────
rclone copy /srv/backup-set r2:my-bucket/nextcloud/2026-07-27 --transfers 4 --checkers 8 --checksum --progress
# 传输完成后做单向完整性检查;保留策略交给对象存储生命周期规则
rclone check /srv/backup-set r2:my-bucket/nextcloud/2026-07-27 --one-way --checksum
# sync 会删除目标端多余文件;只有做镜像且已 dry-run 审核时才使用
rclone sync --dry-run --interactive /source remote:mirror
# 挂载仅适合访问层,不作为数据库或 Immich 原始图库的主存储
rclone mount remote:bucket /mnt/cloud --daemon --vfs-cache-mode full --cache-dir /var/cache/rclone
# 查看已配置的远程存储列表
rclone listremotes
# 测试连接和列出文件
rclone ls r2:my-bucket/ | head -20 rclone copy 上传并执行 rclone check。远端保留与删除由独立生命周期规则管理,并定期在隔离目录做恢复演练。
❓ 常见问题解答
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 要求的中间大版本,也不要使用 latest。先确认当前版本、目标版本、应用兼容性和官方升级路径,再备份数据库、配置与数据并验证可恢复;进入维护窗口后一次只升级一个受支持大版本,查看容器日志和 occ status,完成冒烟测试后再继续。数据库迁移后不能只换回旧镜像完成回滚;真正的回滚必须同时恢复升级前的应用、数据库、配置和数据快照。
Rclone 挂载 S3/R2 为本地目录后,Nextcloud 能直接使用这个目录存储文件吗?
不建议把通用 Rclone/FUSE 挂载直接作为 Nextcloud 主数据目录。网络抖动、挂载顺序、缓存一致性和对象存储语义都可能让应用看到不完整状态;数据库更不能放在这类挂载上。更稳妥的做法是使用本地可靠文件系统,若确需对象存储则按 Nextcloud 官方支持方式评估主对象存储;异地容灾使用一致性快照加 rclone copy,上传后校验并实际演练恢复。
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 服务商控制宿主机,默认应假设其具备读取运行中实例或磁盘的能力。HTTPS 只保护传输,服务端加密和磁盘加密也各有密钥与运行时边界;Nextcloud 端到端加密仅覆盖受支持的客户端与加密文件夹,还会带来共享、恢复和兼容性限制。敏感资料优先在可信客户端加密后上传,并离线保管恢复密钥;同时启用多因素认证、最小权限、加密备份和恢复演练。自托管提供更多控制权,但不会自动比公有云更安全。
学完私有云盘后,下一步应该怎么进阶?
按本站 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 的所有数据?
先让新旧环境使用兼容的固定版本,并在旧机降低 DNS TTL。正式切换时开启维护模式,停止写入后生成数据库一致性导出,复制配置、应用数据和用户数据;认证信息使用受限配置文件或交互输入,不放在命令行。把备份传到新机后先核对文件数量、大小与校验值,再恢复数据库和文件权限,在临时域名或本地 hosts 下验证登录、上传、下载、分享与后台任务。验收后再切换 DNS 并关闭维护模式;旧机保留只读直到观察期结束。该流程通常有短暂停机,不能宣称零停机。