☰
用Docker+Cloudreve搭建私有云:一分钟搞定免费网盘
2026/10/5 15:40:10 网站建设 项目流程

上周有个朋友突然找我诉苦:他要把几十个设计源文件发给客户,微信传不了一百兆,某度网盘下载要开会员,还担心文件被莫名其妙吞掉。我说,那你搞个私有云吧。他第一反应是"那是搞技术的人玩的东西吧"。我说,其实你现在身边随便一台电脑,给我一分钟,我让你拥有一个免费、无广告、数据完全在自己手里的私有云。这篇文章就是把这套玩法完整写出来:我用的是 Docker + Cloudreve 这套组合,全程只要一条命令,小白也能照抄,部署完以后你从浏览器就能上传、下载、共享文件,还能挂载成电脑里的一个网络磁盘。我会把这台私有云的选型理由、部署步骤、外网访问方式、备份升级和常见坑位全部讲透,目的是让你看完就能自己动手,不用再看其他教程。

1. 从网盘憋屈史说起:为什么我最终选了一行命令的私有云

1.1 大厂网盘到底哪里让人不爽

先别急着谈技术,我们来算一笔账。我自己其实是从很早的网盘时代就开始用云存储的人,这些年免费空间从几个G缩到几百M,下载速度从几兆一秒变成几十KB,配套的广告和推广却越来越多。你存进去的文件,理论上只属于你,但使用体验一直被"限速、广告、会员体系"这三件事拿捏。

更让人不踏实的是隐私。虽然网盘平台不会公开你的文件,但资料在别人服务器上,你要上传、要解析、要转码、要审核,这些过程对普通用户来说是个黑盒。我见过周围有些做自由职业的朋友,合同、身份证照片、客户源文件全放网盘上,我说你们心真大。哪怕你不放敏感资料,光是你积累的照片和文字,也不希望哪天打开文件夹发现"因为你太久没登录,文件被清理了"。

所以私有云解决的不是"存储空间不够"的问题,而是一个更基础的需求:这些数据到底是放在别人的硬盘上,还是放在你自己的硬盘上。私有云的本意就是把存储和服务的掌控权拿回来,免费无广告只是顺带的赠品。

1.2 "私有云"没有想象中高不可攀

很多人听到"私有云"三个字,第一反应是要搞一堆服务器、机柜、NAS,还要会配置网络、负载均衡、分布式存储。实际上那个叫企业私有云。个人家用和几个人的小团队共享数据,一台普通电脑就完全够用。

你在家里用一台淘汰下来的笔记本,或者一台几百块的迷你主机,装个 Linux 系统,或者干脆用 Windows,然后装上 Docker,最后跑一个云盘应用容器,这个容器负责:网页界面、用户登录、文件上传下载、分享链接、WebDAV 协议对接。外部设备通过浏览器访问,就像用网盘一样,但数据都在你自己的机器里。

我所在的圈子有不少人,一台旧 i3 笔记本、一块 2T 移动硬盘,就撑起了全家人的照片和文件共享。这就是私有云最现实的样子——门槛比你想象的低得多。

1.3 我对比过的几套开源方案和最终选择

既然要自己控数据,首选当然是开源方案。我前后试过 Nextcloud、Kodbox、Seafile、AList,还有最终用的 Cloudreve。这几套的定位有差异,我直接梳理成一张表:

方案部署难度资源占用中文支持免费无广告主要面向备注
Nextcloud中等偏上较高,PHP全家桶有官方中文开源免费多设备同步、协作办公功能全面但有点重,小白配置会头皮发麻
Kodbox中等中等原生中文有免费版在线网盘、文档预览可道云,上手容易,企业版收费入口明显
Seafile中等中等有官方中文开源免费文件同步和加密同步很强,但分享和界面设计相对偏工程师
AList低很低原生中文免费聚合各类网盘、挂载分享更像"管理工具",不适合当主角
Cloudreve低极低,Go编写原生中文免费无广告轻量私有网盘单命令部署,自带多存储策略

我最后稳定用了 Cloudreve,理由是它最贴合"小白 + 1分钟部署 + 数据自我掌控"这个定位。Go 语言编译出来的程序以轻量著称,一个容器内存占用经常只有几十兆;功能上又不缺,支持用户体系、分享链接、离线下载、WebDAV,还允许把存储桶接到阿里云OSS、腾讯云COS这类地方。Cloudreve 从底层设计上就是一个"私有网盘",不是为极客准备的玩具。

可能你已经发现了,我没有提那些商业化私有云盒子和成品NAS系统。不是说它们不好,是它们跟你自己动手部署不是一回事。成品NAS买回来点几下也能用,但价格不便宜,系统升级、硬盘迁移、数据备份完全依赖厂商节奏。Docker 自建的方式,所有逻辑你都看得见,即使哪一天不用 Cloudreve 了,你的文件目录也还在硬盘上,换个反向代理随时接续。

2. 装好Docker,你的服务器才算真正开始

2.1 三种常见设备选Docker的差异

私有云需要一个长期开机的"宿主",这台机器可以是 Windows 电脑、Mac 电脑、Linux 服务器或者任意一台瘦终端。Docker 在这三类系统上的安装方式不太一样,我按最常见的场景走一遍。

Windows 用户:早期 Docker 在 Windows 上跑需要装一个虚拟机,体验很折腾。现在基本是安装 Docker Desktop,它会自动让你启用 WSL2 后端。建议在"控制面板-启用或关闭Windows功能"里把"适用于 Linux 的 Windows 子系统"和"虚拟机平台"勾上,然后重启。装完 Docker Desktop,设置里把 WSL2 作为默认后端,之后所有 docker 命令都能直接用。

macOS 用户:同样是 Docker Desktop,Apple Silicon 芯片的机器跑起来性能很稳,内存占用比 Windows 环境还低一些。下载安装包后拖进 Applications 就行,没什么坑。

Linux 服务器/迷你主机:没有图形界面,直接命令行安装。如果你用的系统是 Ubuntu/Debian 系,官方提供了一键脚本,但我不建议盲敲curl | sh。更稳妥的方式是用系统自带的包管理器安装 docker.io 或 docker-ce,然后把当前用户加入docker组,这样不用每次敲命令都加 sudo。

无论哪条路,装完以后在终端敲一行docker version,能看到 client 和 server 两段版本信息,就说明 Docker 服务已经在跑了。这是后面一切操作的基础。

2.2 部署前的目录规划与数据心智模型

Docker 对小白来说最反直觉的一点是:容器里的文件系统是临时的,如果不做持久化,容器一删数据就没了。心智模型可以用快递柜来理解:容器是一个临时包裹,里面放着程序文件;而宿主机的目录是地下仓库,只有你主动把包裹里的抽屉对接给仓库,数据才真正落下来。

部署 Cloudreve 之前,我先在宿主机上规划好一个数据根目录,比如/data/cloudreve或 Windows 下的D:\docker\cloudreve。在这个目录下会对应出几个子目录:uploads放用户上传的文件,avatar放头像,temp放临时文件,另外还会有一个conf.ini配置文件。这样设计的好处是:整个服务的所有重要数据被收敛在一个目录里,备份、迁移、重装都只跟这一个目录打交道。

规划的时候顺便看一眼硬盘空间。df -h在 Linux 下可以查看挂载点容量;Windows 用户直接在资源管理器里看分区剩余空间。我建议至少留出大于你预期数据总量一半的余量,因为后续你很可能还想在 Docker 里跑别的服务。

2.3 Docker安装与加速源配置的小白注意点

Docker 装完只是第一步,真正让小白劝退的是镜像拉不动。docker pull走的是公共镜像仓库,国内网络环境有时会很慢,一条命令卡半小时。这里有两个选择:一是等,Cloudreve 官方镜像体积不算大,耐心点也能拉下来;二是配置镜像加速器,说白了就是指定一个国内可访问的镜像源来下载。

配置方式大同小异:Windows/Mac 在 Docker Desktop 的 Settings 里找到 Docker Engine 或 Registry mirrors,Linux 则编辑/etc/docker/daemon.json,加入一行 registry-mirrors 配置,然后重启 Docker。注意不要同时填太多源,一般一两个够用即可。写配置的时候要保证 JSON 格式正确,我见过不少人多了一个逗号,重启后 Docker 直接起不来,还以为是系统坏了。

如果你实在不想碰加速配置,也可以直接在部署时耐心等待,或者把 Docker 镜像换成人人都能拉到的其它节点。这个环节完全是环境问题,不影响私有云本身的功能。

3. 一分钟部署全程:解构那条docker run命令

3.1 一键命令的逐段拆解

假设你的 Docker 已经跑起来,现在进入真正核心的部分。我要在终端里执行类似下面这条命令:

docker run -d \ --name cloudreve \ --restart unless-stopped \ -p 5212:5212 \ -v /data/cloudreve/uploads:/cloudreve/uploads \ -v /data/cloudreve/conf.ini:/cloudreve/conf.ini \ -v /data/cloudreve/temp:/cloudreve/temp \ -v /data/cloudreve/avatar:/cloudreve/avatar \ cloudreve/cloudreve:latest

如果你是第一次用 Docker,这条命令别看晕,它的每一段都是在说"把哪个抽屉对接进哪个仓库":

  • docker run -d:创建并后台运行一个容器,-d表示不会占住你的终端。
  • --name cloudreve:给这个容器起个名字,方便以后用docker logs cloudreve、docker stop cloudreve去操作它。
  • --restart unless-stopped:这是小白最容易忽略但极其重要的一行。它让 Docker 在开机时自动拉起容器,在容器意外退出时自动重启。没有它,宿主机一重启,你的私有云就静默宕机了,而且你不会第一时间发现。
  • -p 5212:5212:端口映射。左边5212是宿主机对外暴露的端口,右边5212是 Cloudreve 程序内部的监听端口。以后你在浏览器访问http://宿主机IP:5212就是访问私有云。
  • 四个-v:分别把配置、上传文件、临时目录、头像目录挂载到宿主机。其中conf.ini那个挂载要提前准备一个空文件,否则 Docker 会误以为你要挂载一个目录,在容器里生成一个同名文件夹,最终导致配置写不进去。

命令里冒号后面的路径是容器内部路径,Cloudreve 官方在这一点上做得比较规矩,路径是固定的。唯一要改的是冒号前的宿主机路径,Windows 下写成类似D:\docker\cloudreve\conf.ini也可以,注意盘符和反斜杠。如果是 Linux 服务器,建议路径里不要有中文和空格。

3.2 第一次启动:管理员账号和初始密码去哪找

命令执行完,终端会输出一长串容器 ID,这表示容器已经创建并启动了。很多小白会在这一步以为"我密码呢?"然后对着登录页一脸茫然。

Cloudreve 对初学者的一个特点是:初始管理员账号密码写在启动日志里。执行下面这条命令:

docker logs cloudreve

日志里会有一行类似这样的信息:

Admin username: admin Admin password: 某个随机字符串

这就是你第一把进入系统后台的钥匙。注意,这个随机密码只有第一次初始化会输出,之后不会再出现,而且官方也建议登录后立刻改掉。我第一次部署的时候没存下密码,后来只好删容器重新建,才重新拿到口令。这个坑你必须躲开。

如果你发现docker logs输出的内容很少甚至没有,说明你可能用了旧版本镜像或者日志被清过。更禁用但有效的办法是删掉容器重新跑一次docker run,重新生成管理员口令,不过要注意如果已经配置过数据,不要乱删。

3.3 验证安装:不是看到界面就结束

能打开登录页只算成功了一半。我的习惯是部署完执行一套"三连验证",确保这台私有云真的能干活:

  1. 访问http://127.0.0.1:5212或http://局域网IP:5212,确认登录页能加载。
  2. 用日志里的初始账号密码登录,进入后台,创建自己的普通用户,再退出后台,用普通用户登录,发一个几十M的测试文件上去。
  3. 上传完成后,在宿主机看一眼/data/cloudreve/uploads对应的目录里出现了新文件,确认数据确实落在宿主机硬盘上。

第 3 步是很多人会跳过的。只有当你亲眼看到文件出现在你规划的目录里,你才算真正理解私有云和公共云盘的区别:不是云端,是你自己的磁盘。这一步验证完,一套基础可用的私有云已经上线,全程确实只需要一分钟,剩下的时间都花在拉镜像上。

4. 让私有云真正"私有"且好用:存储、外网访问、备份与升级

4.1 存储策略与容量规划

Cloudreve 有个很强的地方在于存储策略。它支持本地存储,也支持把文件放到对象存储平台。对个人用户,我强烈建议先用"本地存储",也就是文件直接落在宿主机挂载的uploads目录下。理由很简单,数据在自己手里,恢复起来最直接,不依赖任何第三方账号。

容量规划上,先想清楚这网盘主要是干嘛的。如果是存文档、照片、小视频,一块几百 G 的硬盘能撑很久;如果你打算拿它存高清电影素材,那规划应该变成接大盘。Cloudreve 本身不对文件大小做硬性限制,真正限制在上游:如果你用了 Nginx 反向代理,默认的单次上传体积限制是 1M,必须手动改成更大体积;如果你不经过反向代理,直接裸跑,一般不需要额外配置。

我建议从一开始就在后台把用户配额设好,别等到有人把硬盘塞满再来清。在"管理面板-用户管理"里可以给每个用户设置存储额度。对家人朋友,给个 50-100G 足够;给客户临时共享,用分享链接,连单个文件大小都能控制住。

4.2 外网访问的几种靠谱姿势

私有云搭建在内网机器以后,你马上会面对一个问题:人在外面,怎么访问家里的文件。我先说结论,在今天的网络环境里,最简单的路线是买一台便宜的云服务器做中继,或者用路由器的公网IP能力。

如果你所在的宽带分配到了公网 IP,或者你愿意折腾 IPv6,那最正统的做法是在路由器上做一个端口转发:把外网的某个端口映射到内网那台宿主机的5212端口,然后在宿主机或云服务器上再套一层反向代理,用 Nginx 或 Caddy 把 HTTP 加密成 HTTPS。Caddy 是我个人偏好的选择,因为它的配置文件很短,会自动申请和续期证书,省掉手工处理证书的烦恼。加完 HTTPS 以后,只要你知道一个域名或访问地址,任何人在任何地方都能安全地打开你的私有云界面。

如果家里没有公网 IP,最简单的方案是用支持 UDP 打洞的开源组网工具把多台设备组成一个虚拟局域网,手机和电脑上装上客户端,在外面也能像在家里一样访问http://内网IP:5212。这种方案对小白友好,但需要客户端常驻,适合你自己用、家人用,不太适合给陌生客户临时发链。

还有一种更省事但需要花钱的方案:直接把 Docker 跑在一台有公网 IP 的云服务器上。数据不在本地硬盘,但服务端完全是你控制,照样符合"数据自己掌控"的定义。三种方式没有绝对优劣,我个人的建议是先用局域网用起来,再逐步加反向代理,网络复杂度最后再升级。

4.3 备份意识:数据自己掌控的前提是备份

这是我这篇里最掏心窝子的一段。数据自己掌控不是把你硬盘一塞就完事,而是你要有备份。很多人觉得数据放在自己硬盘上比放在网盘里安全,但如果硬盘突然挂了,又没有备份,那就什么都没了。而且放在自己手里,意味着你要为自己承担备份责任,平台替你兜底的因素消失了。

Cloudreve 的数据分两部分:一部分是用户上传的实际文件,另一部分是系统配置、用户账号、文件索引的数据库。对它的备份策略很简单:定期把宿主机上/data/cloudreve这个目录整体打包,然后拷到另一块磁盘、另一台机器,或者按你的习惯上传到其它存储。Linux 下我常用一条 crontab 定时命令:

tar czf /backup/cloudreve-$(date +%F).tar.gz /data/cloudreve

这个压缩包就是全部家当。恢复的时候,把压缩包解压到新机器相同路径,重新docker run挂载同一个目录,配置和文件就回来了。一台私有云真正的安全感不是硬件,而是这套备份习惯。我自己的频率是每周一次自动打包,重要版本更新前再手动加一次。

4.4 升级与迁移

Cloudreve 更新不算频繁,但偶尔会发新版本。升级容器前,先备份,再执行:

docker pull cloudreve/cloudreve:latest docker stop cloudreve docker rm cloudreve docker run -d ... (同前面的命令)

看到没有?升级流程其实就是"拉新镜像、删旧容器、重新跑同一套挂载命令"。因为数据都在宿主机目录里,容器删掉不会伤到数据。如果你用的是 docker-compose,那就更简单,直接:

docker compose pull docker compose up -d

Compose 会自动对比镜像差异并重建容器。平时维护时,建议创建 docker-compose.yml 保存一份,这样可以不用记住那一长串 docker run 参数。迁移到新机器同理:把备份目录解压到新机器的相同位置,再跑一次 compose 或 docker run 命令,即可无缝接续。

5. 我踩过的坑,希望你直接跳过

5.1 端口冲突与防火墙拦路

部署中最常见的现象是"命令执行成功,网页打不开"。第一嫌疑就是防火墙把端口拦了。Windows 和 macOS 桌面系统一般会弹窗询问是否允许 Docker 监听,点允许就行;Linux 服务器则要确认5212端口是否在防火墙放行列表中。Ubuntu 的 ufw 下可以用:

sudo ufw allow 5212/tcp

第二嫌疑是端口被别的进程占用了。5212不算常见端口,但如果你机器上之前跑过别的服务,可能冲突。Linux 下用lsof -i :5212查看,Windows 用netstat -ano | findstr 5212。如果被占,把宿主机的映射端口换成一个高位端口,比如-p 9521:5212,访问时改成9521即可。记住:容器内部端口不要改,只有外部映射端口可以动。

5.2 上传大文件失败排查

我遇到过不少次类似场景:小文件秒传,大文件传一会就报错。排查顺序一般是这样的:

  1. 先看磁盘空间,df -h,确认不是硬盘满了。
  2. 如果用了 Nginx 或 Caddy 反代,检查反代配置里的client_max_body_size或默认限制,设为0或足够大的值。
  3. 再看 Cloudreve 后台的存储策略,确认"分片上传"和"断点续传"开关是开启的,尤其是网络不稳定的时候,分片能救命。
  4. 最后排查 temp 临时目录的挂载是否有剩余空间。

大多数时候问题出在第 2 步,因为默认服务能传小文件,给人感觉一切正常,实际上大文件被反代拦在半路。如果你不经过反代直接裸跑,基本不会踩这个雷。

5.3 Docker容器重启后配置丢失的真相

用 Docker 跑服务,最大的噩梦就是升级或重启过后,数据不翼而飞。其实不是数据丢了,而是你没有做数据持久化,所有文件写在容器可写层里,容器一旦删除,数据就随之下葬。

我之前见过有人图省事,部署 Cloudreve 只挂载了uploads目录,其他三个挂载点全部省略。结果镜像更新后,新容器里没有旧的conf.ini配置,程序只能重新初始化,旧的管理员账号和存储策略全部归零,而uploads里又留着旧文件。最后只能靠第三方工具手动恢复索引,非常痛苦。

正确做法就一句话:所有需要持久的目录都挂载出来。Cloudreve 官方给出的四个挂载点,一个都不能少。尤其是conf.ini,它在容器里是一个文件,宿主机也要对应一个文件,不是目录。如果你先创建了/data/cloudreve/conf.ini这个空文件,Docker 挂载就没有歧义。

5.4 用官方工具做健康检查的几个实用命令

容器跑久了,迟早会遇到"怎么今天访问变慢了""是不是服务挂了"之类的问题。我常用的诊断命令就三条:

docker ps docker logs --tail 100 cloudreve docker stats cloudreve

docker ps看容器是否在运行,如果状态不是 Up,结合--restart unless-stopped基本能自动恢复;docker logs看服务日志,上传失败、登录失败、磁盘异常都会记录在这里;docker stats看实时 CPU 和内存占用,如果内存长期接近容器上限,考虑加内存或者拆服务。

日常用到最多的一句是docker logs --tail 100 cloudreve,它能帮你定位用户反馈的九成问题。记住这些命令,你就不用每次都重启容器草率处理了。


如果让我给后来者一个建议,那就是别把私有云当成一个"一次性装完的东西"。它更像一个要养起来的习惯:数据目录有计划,备份有节奏,Docker 镜像有更新。我现在的用法是,白天在办公室电脑上用 WebDAV 挂载私有云,自动同步工作文件,晚上回家手机打开相册自动备份,偶尔家里人需要某个文件,我直接在后台生成一个自定义分享链接发过去,完全无广告。

这套环境稳定跑了大半年后,我还做了一件事:把同一台机器上的 Docker 环境复用起来,在它旁边跑了一些其他自托管服务。这也是我最初选 Docker 的隐藏好处——你得先有一个能用的"插座",以后想插什么服务才有地方插。你家里那台吃灰的旧电脑,现在终于有理由通电了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询