下午想从网盘把一份十几 GB 的资料拉回本地,进度条慢悠悠地爬,客户端弹出提示:开通会员,享受极速下载。这一幕几乎人人都遇到过。文件是自己的,带宽是自己的,想全速拿回来,却要先交一笔订阅费。上传时也是同样的剧本,几十 GB 的照片库备份到一半,速度掉得让人怀疑人生,第二天接着传。
限速是网盘行业最成熟的商业模式,也是最让用户难受的一个设计。对开发者来说,这件事其实存在另一种解法:把存储搬到自己的机器上,让限速从根上消失。
RustFS 是一个用 Rust 编写的开源分布式对象存储,采用 Apache 2.0 许可证发布,兼容 S3 API,可以跑在 Linux、Windows、macOS、FreeBSD 和容器里,x86、ARM、RISC-V 架构都在支持之列。它没有会员体系,自然也没有限速机制。速度的天花板,落在你家的宽带和你机器上的磁盘这两样物理条件上。
会员买到的是速度,而速度本不该被圈起来
所谓"不限速",指的是对象存储的世界里根本不存在"非会员限速"这个机制。没有那个开关,自然不会被按下。它不是承诺一个具体的 MB/s 数字,而是把限速的权力从服务方手里拿走。
公有网盘的成本模型决定了它必须给免费用户限速,才能把付费转化做出来。这无可厚非,但对用户而言,代价是自己文件的读写权被打了个折扣。自建方案把这笔账反过来算:硬件和带宽由你出,服务也由你跑,读写的速度上限就是物理条件本身,没有中间商在中间设卡。
当然,家庭宽带的上行带宽通常远低于下行。如果你主要在局域网内用,影响不大;如果想在外面访问家里的存储,得先把外网访问的问题解决掉,这个后面会展开。
这套方案最适合的人群也很清楚:手边有闲置的台式机、NAS 或者一台小主机,愿意花一个晚上折腾命令行,并且受够了每个月为下载速度付费的人。它不追求取代所有人的网盘,而是把选择权还给会自己动手的人。
三条命令,把它跑在自己的机器上
Docker 是最省事的路径。前提是机器上装有 Docker Engine,版本不低于 20.10,并且 9000 和 9001 两个端口空闲,前者跑 S3 API,后者跑控制台。
第一步拉镜像:
docker pull rustfs/rustfs:latest
第二步建一个命名卷,这样以后替换容器时对象数据仍然可用:
docker volume create rustfs-data
第三步启动容器,运行前把凭证占位符换成你自己的值:
docker run -d \
--name rustfs \
--restart unless-stopped \
-p 127.0.0.1:9000:9000 \
-p 127.0.0.1:9001:9001 \
-v rustfs-data:/data \
-e RUSTFS_ACCESS_KEY="<your-access-key>" \
-e RUSTFS_SECRET_KEY="<your-secret-key>" \
-e RUSTFS_ADDRESS=":9000" \
-e RUSTFS_CONSOLE_ADDRESS=":9001" \
-e RUSTFS_CONSOLE_ENABLE=true \
-e RUSTFS_OBS_LOGGER_LEVEL=error \
-e RUSTFS_OBS_LOG_DIRECTORY="/var/log/rustfs/" \
rustfs/rustfs:latest \
/data
这里把两个端口都绑在 127.0.0.1 上,容器只接受本机访问。想在别的设备上访问,属于外网访问的范畴,留到后面外网那一节再说。
凭证这一步别偷懒。官方文档明确要求在把 RustFS 接入网络前设置唯一的 RUSTFS_ACCESS_KEY 和 RUSTFS_SECRET_KEY,任何一个都不要沿用 rustfsadmin 这个公开默认值。需要强随机密钥的话,openssl rand -base64 24 就能生成一个。万一容器启动时忘了设置,停掉容器、带上两个 -e 选项重新创建即可,rustfs-data 卷里的数据会保持不变。
启动完验证一下:
docker ps --filter name=rustfs
curl --fail http://localhost:9000/health
健康检查通过,S3 API 就在 http://localhost:9000 上待命。
部署方式不止 Docker 一种
Docker 之外,官方安装文档按场景给了完整的路线图:本地试用可以走一键安装脚本或容器;单服务器生产环境对应 SNSD(单磁盘)或 SNMD(多磁盘)的 Linux 安装;多服务器生产集群在完成生产检查清单后用 MNMD;Kubernetes 场景有云原生部署方案;Windows 和 macOS 主机也有原生安装,CPU 架构覆盖 x86、ARM 和 RISC-V。
Docker Compose 同样在官方支持之列。官方仓库里的 docker-compose.yml 除了 rustfs 本体,还带上了 grafana、prometheus、otel-collector 和 jaeger 这组主要用于可观测性的服务,想全都要就 docker compose --profile observability up -d;只想要存储本身,docker compose -f docker-compose.yml up -d rustfs 就只会启动 rustfs 容器。compose 文件里有个细节做得体贴:一个 rustfs_perms 初始化容器会在 rustfs 启动前把挂载卷的所有权改成 10001,替你处理掉了前面提到的权限问题。二进制和 systemd 的安装方式则把这两个凭证变量放在 /etc/default/rustfs 里设置,重启 rustfs 服务生效。
浏览器打开 9001,建桶传文件都在网页里
日常管理不需要敲命令。RustFS 自带 Web 控制台,默认启用并监听 9001 端口,与 S3 API 的 9000 相互独立。本地部署直接访问 http://localhost:9001,用启动时配置的那对访问密钥和秘密密钥登录,也就是控制台里的 Key Login 方式。
登录之后,创建和管理存储桶、上传和下载对象、管理访问密钥,这些日常操作都能在界面里完成,身份与访问管理(IAM)的配置也有现成的入口。登录方式不止一种:本地管理员标准方式是 Key Login,也就是部署时配置的那对密钥;如果身份工作流签发过会话令牌,可以用 STS Login 走临时凭证;配置了 OIDC 提供商之后,登录页还会出现对应的 OIDC 登录入口。假如登录页连不上后端服务,可以在页面上选择 Server Configuration 或直接访问 /config,填入可从外部访问的服务地址,健康检查通过后保存即可。
有一处权限细节提前知道会省不少排查时间:容器以非 root 用户 rustfs(ID 为 10001)运行,如果你不用命名卷,而是绑定挂载主机目录,目录所有者必须与容器用户匹配,否则会遇到权限拒绝错误,需要先执行:
chown -R 10001:10001 /path/to/host_directory
官方文档还有一条提醒:未配置自定义凭证时,RustFS 会回退到 rustfsadmin / rustfsadmin 这组默认值,仅适合一次性本地测试。把控制台开放到可信网络之外之前,先配置唯一的访问密钥和高强度秘密密钥,并启用 TLS。
电脑里的文件,让 rclone 直接同步和挂载
存储跑起来之后,日常文件怎么进出它?答案可以是 rclone。RustFS 官方就提供了 rclone 集成指南,把存储桶配成一个 S3 remote,同步和挂载都顺手;provider 选项里明确列有 Other,即"任意其他 S3 兼容服务商"。也就是说,任何暴露 S3 API 的端点它都能接,RustFS 正好在列。
这里能看出 S3 兼容的真正价值:S3 是对象存储的事实标准,客户端生态是现成的。数据存进一个 S3 兼容的服务,意味着客户端选择权始终在你手里,今天用 rclone,明天换别的工具,数据不用搬家,客户端也不用重学。
配置时需要填的核心项就四个:provider 选 Other,然后是 access_key_id、secret_access_key,以及 RustFS 的 endpoint,本地部署就是 http://localhost:9000。region 填 us-east-1 即可——RustFS 本身会忽略这个值,但 S3 签名流程需要它,留空反而可能报签名错误。四个字段填完,rclone 就认识你的私人存储了。
配置好之后,浏览、建桶、同步都是现成的命令:
rclone lsd remote:
rclone mkdir remote:bucket
rclone ls remote:bucket
rclone sync --interactive /home/local/directory remote:bucket
sync 配上 --interactive 会先展示将要做的变更再执行,第一次跑大目录时心里更有底。除此之外,rclone copy 负责单纯复制,rclone check 可以对本地和远端做校验比对,更进阶的玩法是 rclone mount,把存储桶直接挂载成本地磁盘,文件管理器里拖拽即用。不过挂载这条路在 Windows 上要先装 WinFsp 驱动才能用,而且不少应用得开着 --vfs-cache-mode 才能正常读写挂载盘里的文件,真要把它当工作盘,先读一遍 rclone 的 mount 文档。照片库备份、代码归档、虚拟机镜像,都可以交给它做定时同步。官方文档的后续步骤里也提供了 S3 客户端的配置指引,客户端这一层始终有得选。
到这里,一条完整的路径就通了:Docker 起服务,浏览器管桶,rclone 同步文件。整个过程没有出现过"会员"两个字。
自建的账单:备份、穿透、坏盘都得自己扛
诚实地说,自建不是零成本,只是成本换了个形态。
第一笔是可靠性。前文的单容器部署属于 SNSD 模式(单节点单磁盘),官方文档对它的容错描述很直白:无,需依赖备份,定位是开发、测试和低密度非关键业务。数据安全完全取决于你的磁盘和你的备份习惯。想往上走一档,可以选 SNMD(单节点多磁盘),节点内最多容忍 M 块校验盘故障;再往上是 MNMD(多节点多磁盘),至少 4 个节点,靠跨服务器的纠删码实现磁盘级和节点级容错,那是生产工作负载的配置。另外要记得,磁盘冗余不等于备份,真正重要的数据仍然需要一份独立的异地副本。
第二笔是外网访问。家庭宽带大多没有公网 IP,出门在外想访问家里的存储,得自己搭穿透或中转,这部分的复杂度官方文档不会替你消化,属于自建绕不开的一课。有一点要划重点:别图省事在路由器上把 9000 和 9001 直接端口映射到公网,S3 API 和控制台都不该这么裸露。官方文档明确提示,在可信网络之外开放控制台前要使用 TLS,证书也得自己准备和挂载;真要对外提供服务,把凭证、TLS、访问范围都配齐再开。
第三笔是运维本身。容器要盯着重启策略,日志要翻,磁盘满了要扩。这些事网盘厂商一直在替你做,代价就是你交的会员费。自建把这笔钱换成了你的时间和注意力,换得值不值,取决于你的数据有多重要、你有多享受这种掌控感。
最后一点看法
网盘卖的是省心,自建买回的是控制权。对一个愿意折腾命令行的人来说,一台闲置的机器加三条 Docker 命令,就能换来一个没有限速开关、没有订阅到期、文件永远在自己手里的存储服务。它不会承诺你一个具体的速度数字,因为那个数字只由你家的宽带和磁盘决定。限速的开关不复存在,文件的归属清清楚楚,这份"取决于自己",恰恰是自建的全部意义。