VPSKnow

私有网盘与云存储搭建完全指南

中级
40分钟

不想再忍受公有网盘的限速、扫描删文件和高昂会员费?拥有一台 VPS 之后,您可以彻底夺回数据掌控权。无论是打造全功能个人办公云、聚合所有零散网盘,还是搭建媲美 Google Photos 的私有相册,本指南都将为您提供完整方案。

⚖️ 方案选型:Nextcloud / AList / Immich

三款工具各有侧重,根据您的 VPS 配置和核心需求选择:

☁️

Nextcloud

全能私有云首选
  • 体验最接近 Google Drive / iCloud
  • 文件同步、在线编辑、日历、联系人全家桶
  • 客户端覆盖 iOS/Android/Win/Mac/Linux
  • 插件生态丰富(Office、Think 等)

PHP 架构,大量文件时扫描慢,需配合 Redis 优化

适合:大硬盘 VPS,作为主力私有云存储和协作平台
🗂️

AList

轻量聚合网盘神器
  • 挂载阿里云盘、百度云盘、OneDrive、S3 等 40+ 种存储
  • 极省资源(256MB 内存也能流畅运行)
  • 支持在线预览视频、图片、PDF、Office 文档
  • WebDAV 输出,可挂载为本地磁盘

自身不存储文件,只做前端展示和协议转换

适合:小硬盘 VPS,聚合管理多个第三方网盘资源
📸

Immich

最像 Google Photos 的自托管相册
  • 自动备份手机照片(iOS/Android App)
  • AI 人脸识别、物体分类、地图时间线
  • 相册、分享相册、多用户支持
  • 视频自动转码,播放流畅

机器学习功能需要较多 CPU,低配机响应慢

适合:有大量照片需要备份管理,想脱离 Google Photos 的用户

☁️ 实战:Nextcloud 全能云完整部署

我们使用 Nextcloud + MariaDB + Redis 三服务 Compose 组合,这是官方推荐的生产级配置。Redis 缓存是让 Nextcloud 流畅运行的关键,不要省略。

docker-compose.yml(含 Redis 缓存)

/opt/nextcloud/docker-compose.yml
# 文件路径:/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
# 文件路径:/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
# 文件路径:/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 缓存

config/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 触发后台任务

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
# 文件路径:/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 你的新密码

主流网盘挂载速查

阿里云盘

  1. 后台 → 存储 → 添加 → 选 'Aliyundrive Open'
  2. 用手机扫码授权(刷新令牌有效期 30 天,需定期刷新)
  3. 挂载路径填 /aliyun,完成

OneDrive

  1. 后台 → 存储 → 添加 → 选 'OneDrive'
  2. 点击授权链接,用 Microsoft 账号登录授权
  3. 选择个人版或企业版,挂载路径填 /onedrive

百度网盘

  1. 后台 → 存储 → 添加 → 选 'Baidu.Netdisk'
  2. 需要百度账号的 bduss 和 stoken 参数(从 Cookie 提取)
  3. 注意:百度 API 限速严重,下载速度受限
💡 AList 安全提示: 部署后立即修改管理员密码(docker exec -it alist ./alist admin set 新密码),仅授予上游网盘必要权限,不公开管理入口,不在截图或日志中暴露刷新令牌。需要公开分享时,为单独目录设置权限和有效期;敏感文件仍保留独立备份。

📸 实战:Immich 自托管私有相册

Immich 提供移动端自动上传、时间线、人脸识别和地图等相册能力,适合愿意自行维护存储、数据库与升级流程的用户。它更新较快,部署文件、依赖镜像和端口应始终来自同一个明确发布版。

⚠️ 磁盘空间规划: 原始照片、缩略图、转码文件、数据库和机器学习缓存都会占用空间。UPLOAD_LOCATION 与数据库目录优先使用本地可靠文件系统;不要把 Rclone/FUSE 挂载直接当作 Immich 原始图库或数据库。对象存储更适合承接经过校验的异地备份。

docker-compose.yml

/opt/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
# 文件路径:/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 上的本地磁盘。编辑、移动文件就像操作本地硬盘一样自然,所有操作实时同步到云端。

WebDAV 挂载方式汇总
# ── 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
Windows
RaiDrive
免费版够用,图形化操作
Windows
CloudDrive2
多协议支持,性能更好
macOS
Finder 原生
连接服务器 → 输入 WebDAV 地址
iOS
Files App
添加存储位置 → WebDAV
Android
Solid Explorer
网络 → WebDAV
Linux
davfs2
命令行挂载,见上方代码
全平台
Rclone
命令行极客首选,见下节
全平台
Cyberduck
GUI 客户端,支持 FTP/WebDAV/S3

🔄 高阶:Rclone 命令行挂载与同步

Rclone 可连接 S3、WebDAV、OneDrive、Google Drive、Cloudflare R2 等存储。在这里它主要用于把已生成的一致性备份集复制到异地,并在传输后校验;挂载功能只用于便捷访问,不承担数据库、Nextcloud 数据目录或 Immich 原始图库的主存储职责。

Rclone 安装与常用命令
# ── 安装并确认版本 ───────────────────────────────────────────────────────────
# 优先使用发行版软件包或从 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
💡 自动备份边界: 不要在应用仍写入时直接复制 Nextcloud/Immich 数据目录。先按应用文档生成一致的数据库导出和文件快照,再用带日期的 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_timeoutproxy_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 并关闭维护模式;旧机保留只读直到观察期结束。该流程通常有短暂停机,不能宣称零停机。