不限速的私有网盘:绿联 NAS 用 Docker 部署 Cloudreve Pro(附完整 compose)

Cloudreve 是目前自建网盘里最省心的选择之一:多用户、多存储策略、自带 WebDAV、离线下载、缩略图和在线预览,数据全部落在自己硬盘上。Pro 版在此基础上多了同用户组绑定多个存储策略、积分与付费下载、容量包、激活码、支付对接等运营能力。

本文记录在绿联 DXP6800 Pro 上用 Docker Compose 部署 Cloudreve Pro 的完整过程,所有命令都可以直接复制。文末附上我真实踩到的三个坑,能帮你少折腾一晚上。

一、先看效果

部署完成后,网页端可以正常上传文件、浏览列表和生成缩略图,存储配额统计也正常:

Cloudreve Pro 部署完成后的文件页,左侧显示 1TB 存储空间配额

上传队列运行正常,分片上传带进度:

Cloudreve 上传队列显示三张图片正在上传

图片视图能自动出预览,存储占用实时统计:

Cloudreve 图片视图显示已上传的图片缩略图与 25.1MB 占用

二、开始前准备两样东西

Cloudreve Pro 的镜像放在私有仓库里,必须先登录才能拉取,所以要去 Pro 授权管理面板 拿两组东西:

  • 授权密钥(点「获取授权密钥」):启动容器时通过环境变量 CR_LICENSE_KEY 传入,用来兑换离线许可证。
  • 私有镜像仓库账号密码(点「获取 Docker 镜像」):用来 docker login release.cloudreve.org

这两组东西都在同一个面板里,但用途完全不同,别搞混——我用错了其中一组,导致容器起来后一直提示授权失败(见坑 1)。

另外注意:Pro 授权是按根域名授权的,子域名可以用。首次启动会联网兑换离线许可证,如果 NAS 不能出网,需要在面板额外拿一个「离线许可证密钥」,通过 CR_OFFLINE_LICENSE 传入。

三、三步部署

第 1 步:开好 Docker 与 SSH,确认路径

应用中心安装 Docker 并打开一次(它会自动建好共享文件夹 docker),然后在「控制面板 → 终端机」里开启 SSH。

确认 docker 目录在哪块盘:文件管理器里右键共享文件夹 docker → 属性,看「存储位置」。存储空间 1 对应 /volume1/docker,存储空间 2 就是 /volume2/docker。建议先在文件管理器里把项目目录建出来,不存在的路径在建 compose 项目时会直接报错。

ssh 你的管理员账号@NAS内网IP
sudo -i
cd /volume1/docker
mkdir -p cloudreve-nas && cd cloudreve-nas

第 2 步:登录私有仓库并拉取 Pro 镜像

docker login release.cloudreve.org
# Username / Password 填授权面板「获取 Docker 镜像」生成的那一组
docker pull release.cloudreve.org/cloudreve/pro:latest
docker images | grep cloudreve

看到镜像列出来就成功了。仓库凭证不是永久有效,以后更新镜像如果报 no basic auth credentialsunauthorized,回面板重新生成一组再登录即可。

第 3 步:写 compose 并启动

/volume1/docker/cloudreve-nas 下新建 docker-compose.yml,内容如下(已包含 PostgreSQL、Redis 和一个固定子网的网络段):

services:
  cloudreve:
    image: release.cloudreve.org/cloudreve/pro:latest
    container_name: cloudreve
    restart: unless-stopped
    depends_on:
      postgresql:
        condition: service_started
      redis:
        condition: service_started
    ports:
      - "5212:5212"        # Web 界面
      - "6888:6888"        # Aria2 离线下载
      - "6888:6888/udp"
    environment:
      - TZ=Asia/Shanghai
      - CR_LICENSE_KEY=你的授权密钥
      - CR_CONF_Database.Type=postgres
      - CR_CONF_Database.Host=postgresql
      - CR_CONF_Database.Port=5432
      - CR_CONF_Database.User=cloudreve
      - CR_CONF_Database.Password=你的数据库密码
      - CR_CONF_Database.Name=cloudreve
      - CR_CONF_Redis.Server=redis:6379
    volumes:
      - ./data:/cloudreve/data

  postgresql:
    image: postgres:17
    container_name: postgresql
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - POSTGRES_USER=cloudreve
      - POSTGRES_PASSWORD=你的数据库密码
      - POSTGRES_DB=cloudreve
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    image: redis:latest
    container_name: redis
    restart: unless-stopped
    volumes:
      - ./redis:/data

networks:
  default:
    ipam:
      config:
        - subnet: 10.88.0.0/24

需要改的只有两处:把 CR_LICENSE_KEY 换成授权密钥;把两处数据库密码换成你自己的(必须完全一致,建议只用字母数字,避免 $ 被 compose 当成变量插值)。

docker compose config >/dev/null && echo "语法 OK"
docker compose up -d
docker compose ps

三个容器都显示 Up 就成了,此时访问 http://NAS内网IP:5212

四、初始化:第一个注册的账号就是管理员

打开页面后立刻注册,第一个注册的账号会自动成为管理员。这一步务必在暴露到公网之前做完,否则会被别人抢注。

然后进 /admin 做三件事:

  1. 参数设置 → 站点信息:把你的访问地址(内网或域名)加进站点 URL 列表。不配这一项,文件能传上去但下载链接和缩略图会指向错误主机名。
  2. 存储策略:确认本机存储的 Blob 存储目录是 data/uploads,它落在 NAS 的 ./data 里。
  3. 用户组:把自己的用户组绑定这份存储策略,否则上传会失败。

五、让它在公网可用

家宽一般没有公网 IP,常规做法是用 frp 把 5212 转发出去,再用域名访问:

  • frpc 里 localPort 填 5212,remotePort 自定义一个不常用端口,记得在 frps 的 allowPorts 和 VPS 安全组里放行。
  • 有域名的话,建议在 VPS 上用 Nginx 或 Caddy 套一层 HTTPS,反代到 frp 的入口,证书交给 Let's Encrypt。
  • 反代必须呈递 Host 头(proxy_set_header Host $http_host;),否则部分功能异常;同时把 client_max_body_size 放大,不然大文件分片会上传失败。
  • 让 Cloudreve 记录真实访客 IP:在 data/conf.ini[System] 段加上 ProxyHeader = X-Forwarded-For,然后重启容器。

公网可访问之后,建议顺手关掉开放注册,或改成邀请码/邮箱验证——网盘地址被扫到是很快的事。

六、我踩过的三个坑

坑 1:容器起来了,但一直提示 Failed to obtain license

原因是 CR_LICENSE_KEY 填错了:我把「获取 Docker 镜像」生成的仓库凭证填了进去。两者都是授权面板里的一长串 JWT,但用途完全不同。有个快速的辨别方法——把那段 JWT 解出来看 aud 字段,如果写的是 https://release.cloudreve.org,那就是镜像仓库凭证,不是授权密钥。

正确做法是用「获取授权密钥」那一串。换好之后重启,日志里会显示拿到许可证并开始监听 5212。

坑 2:建网报错 all predefined address pools have been fully subnetted

这不是端口冲突,而是 NAS 上 Docker 项目太多,默认的地址池(172.16 到 172.31 的 /16 网段)被分完了,新建项目分不到子网。最快、最干净的解法是给这个项目固定一个子网,不用清理任何旧网络:

networks:
  default:
    ipam:
      config:
        - subnet: 10.88.0.0/24

把这段加到 compose 末尾即可(注意避开你内网的网段和已有 Docker 网络)。上面那份 compose 已经带上了。

坑 3:端口占用与管理员抢注

5212 和 6888 如果被别的服务占了,改冒号左边那个宿主机端口就行(容器内的端口不要动),比如 "25890:5212"。另外重复强调一次:管理员账号一定要在开公网之前注册掉。

七、维护与备份

  • 更新:docker compose pull && docker compose up -d(凭证过期先重新 docker login)。
  • 备份只有三样:docker-compose.yml(含密钥,注意权限)、data/(配置+上传的文件)、postgres/(数据库)。
  • 迁移:换机器时把这三个目录拷过去,保持挂载路径一致,再 docker compose up -d 即可。

八、参考资料

整套跑下来,从拉镜像到能正常上传文件大约十几分钟。如果你也在 NAS 上折腾自建网盘,这份 compose 可以直接抄;遇到授权或建网报错,对照第六节排查基本就够了。

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息