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

主流网盘挂载速查

阿里云盘

  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 是目前最像 Google Photos 的自托管相册方案,拥有极流畅的移动端 App(iOS/Android)、AI 人脸识别、自动备份和地图时间线,已成为摆脱 Google Photos 的首选替代品。

⚠️ 磁盘空间规划: Immich 会存储原始照片和视频,一个人 5 年的手机相册通常需要 50-200GB 空间。请确保您的 VPS 有足够的磁盘(大盘鸡),或将 UPLOAD_LOCATION 指向外挂的对象存储(通过 Rclone 挂载)。

docker-compose.yml

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

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 是命令行界的"存储万能钥匙",支持 40+ 种云存储协议(S3/WebDAV/OneDrive/Google Drive/Cloudflare R2 等)。在私有云盘场景中,Rclone 的主要用途是:① 将 Nextcloud/Immich 数据定期备份到对象存储(异地容灾);② 将对象存储挂载为本地目录(扩展存储容量)。

Rclone 安装与常用命令
# ── 安装 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
💡 Rclone + Cron 自动备份: 将 Nextcloud 数据定期备份到 Cloudflare R2(免费 10GB/月,出站流量免费):
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_timeoutproxy_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 迁移章节的零停机流程。