

一句话定位:RustFS 是面向 AI 时代、从零原生打造的高性能分布式对象存储,100% 兼容 S3 API,Apache 2.0 协议,可作为 MinIO 的 drop-in 替代方案。
目录
- [问题背景:备份仓库为什么想搬上 S3](#问题背景:备份仓库为什么想搬上 S3 "#1-%E9%97%AE%E9%A2%98%E8%83%8C%E6%99%AF%E5%A4%87%E4%BB%BD%E4%BB%93%E5%BA%93%E4%B8%BA%E4%BB%80%E4%B9%88%E6%83%B3%E6%90%AC%E4%B8%8A-s3")
- [RustFS 为什么能直接当 restic 后端](#RustFS 为什么能直接当 restic 后端 "#2-rustfs-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%83%BD%E7%9B%B4%E6%8E%A5%E5%BD%93-restic-%E5%90%8E%E7%AB%AF")
- [先把 RustFS 跑起来并建桶](#先把 RustFS 跑起来并建桶 "#3-%E5%85%88%E6%8A%8A-rustfs-%E8%B7%91%E8%B5%B7%E6%9D%A5%E5%B9%B6%E5%BB%BA%E6%A1%B6")
- [配置 restic 指向 RustFS](#配置 restic 指向 RustFS "#4-%E9%85%8D%E7%BD%AE-restic-%E6%8C%87%E5%90%91-rustfs")
- 真实场景里的三个边界
- 总结与下一步
1. 问题背景:备份仓库为什么想搬上 S3
我见过不少团队的备份还停在本地磁盘或一块外接硬盘上:restic 把快照写进 /backup,cron 每天凌晨跑一次。磁盘一满就手动清,换机器就得把整库 rsync 走,异地容灾基本靠"希望别同时坏"。
把备份后端换成对象存储是更省心的路子------restic 支持 S3 backend,快照和元数据都落进桶里,本地只留缓存。难点通常不在 restic,而在"找一个自己能掌控、又不怕厂商锁定的 S3 端点"。云厂商的对象存储按量计费、出口流量贵;而 RustFS 这种自托管、100% S3 兼容的开源存储,正好能把 restic 的仓库搬回你自己的机器或机房,凭证和密钥都在自己手里。
2. RustFS 为什么能直接当 restic 后端
restic 的 S3 backend 走标准 AWS S3 协议:设好 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY,把 RESTIC_REPOSITORY 指成 s3:http://<host>:<port>/<bucket>/<prefix> 就能用。RustFS 从协议层就实现了 S3 API 兼容,所以 restic 不需要任何插件或补丁,把它当成"另一个 S3"即可。
一个常被忽略的点:restic 默认按虚拟托管风格拼桶名(bucket.endpoint),而 RustFS 这类自建端点要用路径式寻址 。官方 RustFS 的 restic 集成文档明确要求加 -o s3.bucket-lookup=path,并且仓库 URL 里要带桶名。这条配置错了,restic 会一直报 invalid endpoint 或 bucket not found,排错半小时起步。
数据必须来自官方 benchmark / 文档 / 已验证来源,严禁编造或夸大。
3. 先把 RustFS 跑起来并建桶
最快的起法是一行 docker:
bash
docker run -d -p 9000:9000 -p 9001:9001 \
-e RUSTFS_ACCESS_KEY=rustfsadmin \
-e RUSTFS_SECRET_KEY=rustfsadmin \
-v $(pwd)/data:/data \
-v $(pwd)/logs:/logs \
rustfs/rustfs:1.0.0-rc.5
容器以非 root 用户(UID 10001)运行,挂载宿主机目录时记得 chown -R 10001:10001 data logs,否则会权限报错。RustFS 的二进制约 93MB(对照方案约 320MB),从边缘盒子到 PB 级集群都能跑同一份存储层------这也是它适合接备份类 workload 的原因之一。
生产请把镜像标签从 latest 固定到具体版本(如上面的 1.0.0-rc.5),并在起服务前把默认 rustfsadmin/rustfsadmin 改成强密钥。RustFS 在 rc 阶段已经废弃硬编码默认口令,部署必须显式设 RUSTFS_ACCESS_KEY / RUSTFS_SECRET_KEY。
建桶有两种方式。控制台打开 http://localhost:9001,Buckets → Create Bucket;或者用 rc(RustFS 原生 CLI,对标 mc):
bash
rc alias set local http://localhost:9000 rustfsadmin rustfsadmin
rc mb local/backups
官方文档建议每个备份作业用独立的桶,不要多个 restic 仓库塞进同一个桶------这样快照、生命周期、权限都能按作业隔离。
4. 配置 restic 指向 RustFS
设好环境变量并初始化仓库。注意 RESTIC_REPOSITORY 把桶名写进路径,且 init 必须带 -o s3.bucket-lookup=path:
bash
export AWS_ACCESS_KEY_ID=rustfsadmin
export AWS_SECRET_ACCESS_KEY=你的强密钥
export AWS_DEFAULT_REGION=us-east-1
export RESTIC_REPOSITORY=s3:http://localhost:9000/backups/restic
export RESTIC_PASSWORD=你的仓库密码
restic -o s3.bucket-lookup=path init
初始化成功后开始备份一个目录:
bash
restic -o s3.bucket-lookup=path backup ~/Documents
列快照、恢复、校验,都在同一条路径风格下:
bash
restic -o s3.bucket-lookup=path snapshots
restic -o s3.bucket-lookup=path restore 最新快照ID --target /tmp/restore
restic -o s3.bucket-lookup=path check
把凌晨的 cron 改成每天全量 + 保留策略,restic 自己管去重和快照过期:
bash
10 2 * * * RESTIC_REPOSITORY=s3:http://localhost:9000/backups/restic \
RESTIC_PASSWORD=你的仓库密码 \
AWS_ACCESS_KEY_ID=rustfsadmin AWS_SECRET_ACCESS_KEY=你的强密钥 \
restic -o s3.bucket-lookup=path backup ~/Documents \
&& restic -o s3.bucket-lookup=path forget --keep-daily 7 --keep-weekly 5 --keep-monthly 12
备份链路从本地目录到落盘的全貌如下:

5. 真实场景里的三个边界
第一,路径式寻址不是可选项。只要 RustFS 没有配自定义域名做虚拟托管,restic 就必须带 -o s3.bucket-lookup=path,否则连不上。这条写进脚本比写进脑子可靠。
第二,仓库密码和访问密钥要分开保存。restic 的 RESTIC_PASSWORD 加密的是快照数据本身,丢了就谁都解不开;RustFS 的 AWS_SECRET_ACCESS_KEY 只是门禁。两者职责不同,别用同一个值,也别把密钥写进仓库同目录。
第三,小文件多是 restic 的强项,也是 RustFS 的强项。restic 仓库里大量是元数据小对象,RustFS 对小对象的高吞吐读路径在这类 workload 上不吃亏------这也是它适合承接备份软件仓库的原因。但要记住,RustFS 在 1.0 正式发布前属于预发布阶段,上生产前先在 staging 跑通完整 init/backup/restore/check 一轮再切换。
对接时真正要记的参数就这几项:

6. 总结与下一步
把 restic 的仓库搬到 RustFS,本质上是"标准 S3 协议 + 自托管存储"的组合:restic 不用改,RustFS 提供兼容端点,你拿到的是数据自主权。落地时记住三件事------路径式寻址必带、每个作业独立桶、仓库密码与访问密钥分离。
下一步可以照这个顺序验证:先 restic init 一个测试桶,传几个文件,restore 到临时目录比对哈希,确认无误再把生产 cron 切过来。需要异地容灾时,再用 RustFS 的站点复制把桶异步搬去第二个集群。
深入学习 RustFS :RustFS
技术文档: RustFS 技术文档- 提供架构、安装指南和 API 参考。
GitHub 仓库: GitHub 仓库 - 获取源代码、提交问题或贡献代码。