同样叫开源网盘搭建,两个项目的仓库能差三个数量级:Nextcloud 的 server 仓库 7,321,518 KB(约 7.0 GB),Alist 只有 6,895 KB(约 6.7 MB)。选型、授权、外网访问这三步的坑都在下面。
起因:为什么非要自己搭
起因很俗:客户受够了公共网盘的会员、限速、提取码和文件已删除四件套。需求三条:文件在自己机器上、外面能访问、能给客户发链接。
前两条不难,难的是第三条。自建这套东西,90% 的返工都出在外网访问这一环:一放到公网,分享链接打不开、登录跳回内网地址、日志里全是反代 IP。
过程:先把网盘这个词拆清楚
我一开始把开源网盘当一个品类去找,搜出来的根本不是一回事。先拆定位:
- 真·网盘(自己存文件、自己管用户):Nextcloud、ownCloud、Seafile、Cloudreve。
- 对象存储:MinIO,S3 兼容,是存储后端不是网盘。
- 聚合挂载:Alist,把已有存储挂到一处列目录,自己不存。
- 目录管理界面:File Browser,给指定目录套一个 Web 界面。
- 备份工具:Kopia,增量备份用的,别拿来当网盘。
照着功能多去选,多半是装上全家桶再关掉一半。取舍标准:你要的是存,还是看,还是转。
踩坑:选型和授权这两关
2026-10-15 用 GitHub REST API 拉的真实元数据,六个项目如下:
| 项目 | 星 | 许可证 | 体积 | 最后推送 |
|---|---|---|---|---|
| minio/minio | 61,320 | AGPL-3.0 | 125,263 KB | 2026-04-24 |
| AlistGo/alist | 50,296 | AGPL-3.0 | 6,895 KB | 2026-10-13 |
| nextcloud/server | 37,103 | AGPL-3.0 | 7,321,518 KB | 2026-10-14 |
| filebrowser/filebrowser | 35,895 | Apache-2.0 | 24,323 KB | 2026-07-31 |
| cloudreve/Cloudreve | 28,837 | GPL-3.0 | 8,932 KB | 2026-09-21 |
| haiwen/seafile | 15,330 | NOASSERTION | 12,545 KB | 2026-10-10 |
一是许可证比想象中严。六个里三个 AGPL-3.0、一个 GPL-3.0,只有 File Browser 是 Apache-2.0。AGPL 的特点是网络交互也触发开源义务——自己用没事,包装成对外服务就得读条款。别凭开源等于随便用下判断。
二是 Seafile 的许可证 GitHub 显示 NOASSERTION。不是它没授权,是 GitHub 识别不出来。只认仓库里的 LICENSE 文件,别拿页面顶部那一行当结论。
三是看 pushed_at 而不只看版本。MinIO 最后推送 2026-04-24,比同表落后半年;File Browser 停在 2026-07-31。要评估跟主干还是钉版本,这个差值比星数有用。
解法:外网访问到底要配哪几项
以 Nextcloud 为例,官方反代文档里有几处跟流传做法不一样,我照官方原文核过:
trusted_proxies 必须显式写。官方要求显式定义受信任的代理地址,不写的话日志里客户端 IP 全是反代机器的地址。
forwarded_for_headers 别乱改。官方默认取 X-Forwarded-For(PHP 查找串 HTTP_X_FORWARDED_FOR),并明说配错可能让客户端伪造 IP。这个值取决于代理软件,不是抄来的。
最反直觉的一条:overwritehost 多数时候不需要设。官方最新文档的口径是多数场景下不需要——Nextcloud 会读取代理转发的 Host 头。老教程一上来就让你配,是过度配置。
真正会咬人的是 trusted_domains。官方写明:列多个域名时 Nextcloud 全接受,但分享链接、下载地址、通知链接会沿用当时访问所用的主机名。内网复制的链接,外网打不开。要统一就无条件设 overwritehost 加 overwrite.cli.url。
验证:拿什么判断这套能用
一,断开局域网,手机切 4G 打开域名,能登录才算通。只在本机浏览器验过不算。
二,传一个大文件再下载回来。拿 100 MB 左右的文件测,顺便看反代 client_max_body_size 有没有卡住——默认常是 1 MB,上传失败的报错还很含糊。
三,复制一个分享链接,粘到记事本里看域名。是公网域名就对了,是内网主机名就回去改 overwrite。
四,翻日志看客户端 IP。是真实出口 IP 说明转发头对了,是反代内网地址说明还没配好。
这套从外到内先核环境的顺序,开源论坛本地部署那篇说过。容器里连不上宿主机服务,通常是把 localhost 写进了配置——容器网络通病,HertzBeat 那次部署踩的是同一个坑。
源码与文档出处
- Nextcloud:
github.com/nextcloud/server,反代文档见官方 admin_manual 的 reverse_proxy_configuration 页 - Cloudreve:
github.com/cloudreve/Cloudreve - Seafile:
github.com/haiwen/seafile - File Browser:
github.com/filebrowser/filebrowser - Alist:
github.com/AlistGo/alist - MinIO:
github.com/minio/minio
说明:本次核的是仓库元数据与官方文档原文,没有在本机跑起来(本机无 Docker 环境),安装命令与依赖版本请以官方仓库最新说明为准。只想把大文件发给客户,拆分组装加云分享那条路轻得多——先划清工具边界再决定要不要自建。
常见问题
家里宽带没有公网 IP,还能外网访问吗?
能,但要换方案:内网穿透、有公网 IP 的云服务器中转,或者部署到云上。没有公网 IP 时路由器的端口映射无效,先确认再动手。
AGPL 项目公司内部用需要开源吗?
仅在内部使用、不对外提供服务的通常不触发义务;包装成对外服务(比如给客户开账号)就要按 AGPL 条款处理。具体以项目 LICENSE 文件与法律意见为准,本文不构成法律建议。
为什么分享链接发给别人打不开?
先看复制链接时用的是哪个域名。trusted_domains 列了多个域名时,Nextcloud 按当时访问的主机名生成链接,内网复制的链接就是内网地址。要统一就设 overwritehost 与 overwrite.cli.url。
仓库体积大会影响什么?
主要是 clone 时间、CI 耗时和磁盘占用,跟运行性能不是一回事。7 GB 的仓库在弱网别直接 clone,用 shallow clone 或拉 release 包。
选 Nextcloud 还是 Cloudreve?
要生态和插件选 Nextcloud(PHP 栈,仓库 7 GB,机器要有余量);要轻量、Go 单文件、部署快选 Cloudreve(8,932 KB)。团队没人维护 PHP 环境,强上 Nextcloud 后面会很累。

