在云原生和 AI 训练场景里,对象存储几乎是基础设施的"水电煤"——从镜像分发、模型权重到训练数据集,都离不开一个兼容 S3 协议、又能扛住高吞吐的存储服务。MinIO 一直是这个领域的明星,但如果你想要一个用 Rust 重写、内存占用更低、启动更快、原生支持多盘纠删码的替代品,RustFS 是一个值得重点关注的新选择。

本文基于一份可直接落地的 docker-compose.yml,完整演示 RustFS 单节点 4 盘部署:从快速启动、访问验证,到存储持久化、配置项解读、S3 客户端对接,再到生产环境加固,一次讲清楚。

一、RustFS 是什么?

RustFS 是一款用 Rust 实现的高性能 S3 兼容对象存储服务,核心特点:

  • S3 协议兼容:AWS CLI、MinIO Client(mc)、S3 SDK 均可直接对接,迁移成本几乎为零
  • Rust 实现:无 GC 停顿,内存占用低,单节点资源开销远小于同类 Java/Go 实现
  • 多盘纠删码:原生支持多数据盘布局,单节点即可享受数据冗余保护
  • 内置 Web Console:开箱即用的可视化管理界面,无需额外部署

定位上,它适合作为私有云对象存储CI/CD 制品库AI 训练数据池,或是MinIO 的轻量替代

二、架构与端口规划

┌─────────────────────────┐
│   Application / Client  │
│   (S3 SDK / Console)    │
└────┬────────────┬────────┘
     │ 9000       │ 9001
     ▼            ▼
┌─────────────────────────┐
│     RustFS Server       │
│  (Single Node, 4 drives)│
└──┬──┬──┬──┬──┬──────────┘
   │  │  │  │  │
   v0 v1 v2 v3 logs
  (4 data drives, 1 log volume)
服务 端口 用途
S3 API 9000 对象存储 API
Web Console 9001 可视化管理界面

单节点采用 4 数据盘 + 1 日志卷布局,命名卷分别挂载到容器内 /data/rustfs{0...3},由 RustFS 自动组建纠删码存储池。

三、Docker Compose 编排

完整的 docker-compose.yml 如下。它包含两个服务:RustFS 主服务,以及一个一次性的 volume-permission-helper,用来把命名卷的属主修正为 RustFS 容器内的 UID 10001,避免首启权限报错。

 1# RustFS Deployment - Docker Compose
 2# Ports:
 3#   9000 - S3 API
 4#   9001 - Web Console
 5# Docs: https://docs.rustfs.com/
 6#
 7# Prerequisites:
 8#   mkdir -p data logs
 9#   chown -R 10001:10001 data logs
10#   docker compose up -d
11
12services:
13  # ── RustFS Server ────────────────────────────────────────────────────
14  rustfs:
15    image: rustfs/rustfs:latest
16    container_name: rustfs-server
17    security_opt:
18      - "no-new-privileges:true"
19    ports:
20      - "9000:9000"   # S3 API
21      - "9001:9001"   # Console UI
22    environment:
23      # Storage volumes (4-drive layout typical for RustFS)
24      - RUSTFS_VOLUMES=/data/rustfs{0...3}
25
26      # Listen addresses
27      - RUSTFS_ADDRESS=0.0.0.0:9000
28      - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
29      - RUSTFS_CONSOLE_ENABLE=true
30      - RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS=*
31
32      # Credentials — CHANGE THESE IN PRODUCTION
33      - RUSTFS_ACCESS_KEY=rustfsadmin
34      - RUSTFS_SECRET_KEY=rustfsadmin
35
36      # Logging
37      - RUSTFS_OBS_LOGGER_LEVEL=info
38
39      # Bypass strict disk topology check for single-node
40      - RUSTFS_UNSAFE_BYPASS_DISK_CHECK=true
41
42    volumes:
43      - rustfs_data_0:/data/rustfs0
44      - rustfs_data_1:/data/rustfs1
45      - rustfs_data_2:/data/rustfs2
46      - rustfs_data_3:/data/rustfs3
47      - rustfs_logs:/app/logs
48    networks:
49      - rustfs-network
50    restart: unless-stopped
51    healthcheck:
52      test:
53        [
54          "CMD", "sh", "-ec",
55          'curl -fsS http://127.0.0.1:9000/health && curl -fsS http://127.0.0.1:9001/rustfs/console/health'
56        ]
57      interval: 30s
58      timeout: 10s
59      retries: 3
60      start_period: 40s
61
62  # ── Volume Permission Helper ──────────────────────────────────────────
63  # Ensures named volumes have correct ownership for the rustfs user (UID 10001)
64  volume-permission-helper:
65    image: alpine:latest
66    volumes:
67      - rustfs_data_0:/data0
68      - rustfs_data_1:/data1
69      - rustfs_data_2:/data2
70      - rustfs_data_3:/data3
71      - rustfs_logs:/logs
72    command:
73      - sh
74      - -c
75      - |
76        chown -R 10001:10001 /data0 /data1 /data2 /data3 /logs
77        echo 'Volume permissions fixed'
78        exit 0
79    restart: "no"
80
81networks:
82  rustfs-network:
83    driver: bridge
84
85volumes:
86  rustfs_data_0:
87  rustfs_data_1:
88  rustfs_data_2:
89  rustfs_data_3:
90  rustfs_logs:

几个关键设计点

  • RUSTFS_VOLUMES=/data/rustfs{0...3}:用展开语法一次性声明 4 个数据盘,RustFS 据此自动组建纠删码存储池
  • RUSTFS_UNSAFE_BYPASS_DISK_CHECK=true:单节点部署时绕过严格的磁盘拓扑检查(生产集群应关闭并使用真实多盘)
  • security_opt: no-new-privileges:阻止容器内进程通过 setuid 提权,最小权限原则
  • 双健康检查端点:同时校验 S3 API(9000)和 Console(9001),任一异常即判定不健康
  • volume-permission-helper:一次性 init 容器,先于主服务把命名卷属主改为 10001:10001,根治"首次启动 permission denied"

四、快速启动与验证

 1cd deploy
 2
 3# 1. 启动服务
 4docker compose up -d
 5
 6# 2. 查看日志
 7docker compose logs -f rustfs
 8
 9# 3. 检查健康状态
10curl http://localhost:9000/health
11curl http://localhost:9001/rustfs/console/health

两个健康检查端点均返回 2xx 即代表服务就绪。浏览器访问 http://localhost:9001 即可进入 Web Console。

默认访问凭证

服务 地址
S3 API http://localhost:9000
Web Console http://localhost:9001
Access Key rustfsadmin
Secret Key rustfsadmin

⚠️ 生产环境:首次登录 Console 后立即修改默认密码。下文「生产加固」一节会给出强制要求。

五、存储持久化

数据存放在 Docker 命名卷(rustfs_data_{0..3}rustfs_logs)中,docker compose down 不会丢失数据;只有 docker compose down -v 才会连卷一起删除。

如需绑定宿主机目录(便于备份或挂独立磁盘,需手动处理权限):

1mkdir -p /data/rustfs/{0,1,2,3} /data/rustfs/logs
2chown -R 10001:10001 /data/rustfs

然后在 docker-compose.yml 中将 volumes 替换为 bind mounts:

1volumes:
2  - /data/rustfs/0:/data/rustfs0
3  - /data/rustfs/1:/data/rustfs1
4  - /data/rustfs/2:/data/rustfs2
5  - /data/rustfs/3:/data/rustfs3
6  - /data/rustfs/logs:/app/logs

命名卷 vs bind mount 的取舍:命名卷由 Docker 管理、迁移方便、跨平台一致;bind mount 直连宿主机磁盘、性能略优、便于宿主机层面备份。生产环境推荐 bind mount 到独立物理盘。

六、常用运维操作

 1# 启动
 2docker compose up -d
 3
 4# 停止
 5docker compose down
 6
 7# 重启
 8docker compose restart rustfs
 9
10# 查看日志
11docker compose logs -f --tail=100 rustfs
12
13# 更新到最新版本
14docker compose pull
15docker compose up -d
16
17# 清除数据(危险!)
18docker compose down -v

七、环境变量速查

变量 默认值 说明
RUSTFS_ACCESS_KEY rustfsadmin S3 访问密钥
RUSTFS_SECRET_KEY rustfsadmin S3 访问密钥(生产必改
RUSTFS_OBS_LOGGER_LEVEL info 日志级别
RUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS * Console CORS 来源

完整列表见 RustFS Docs - Configuration

八、S3 客户端对接

RustFS 完全兼容 S3 协议,AWS CLI 和 MinIO Client 都能直接用。

AWS CLI

1# 配置凭证
2aws configure set default.region us-east-1
3aws configure set aws_access_key_id rustfsadmin
4aws configure set aws_secret_access_key rustfsadmin
5
6# 操作(--endpoint-url 指向 RustFS)
7aws --endpoint-url http://localhost:9000 s3 mb s3://my-bucket
8aws --endpoint-url http://localhost:9000 s3 cp test.txt s3://my-bucket/
9aws --endpoint-url http://localhost:9000 s3 ls s3://my-bucket/

MinIO Client (mc)

1mc alias set rustfs http://localhost:9000 rustfsadmin rustfsadmin
2mc mb rustfs/my-bucket
3mc cp test.txt rustfs/my-bucket/

因为协议兼容,你现有的 S3 SDK 代码、Terraform aws_s3_bucket 资源、Helm chart 里的对象存储配置——只需把 endpoint 指向 RustFS,无需改一行业务代码。这是 RustFS 最大的迁移红利。

九、生产环境加固清单

上面的配置面向快速体验,上生产前至少完成以下改动:

  1. 改默认凭证RUSTFS_ACCESS_KEY / RUSTFS_SECRET_KEY 改为强随机值,禁止使用 rustfsadmin
  2. 关闭磁盘检查豁免:删除 RUSTFS_UNSAFE_BYPASS_DISK_CHECK,改用真实多盘拓扑
  3. 收紧 CORSRUSTFS_CONSOLE_CORS_ALLOWED_ORIGINS 改为具体域名,禁止 *
  4. 启用 TLS:在反代层(Nginx/Caddy)终结 HTTPS,或挂载证书让 RustFS 直接监听 https
  5. 独立磁盘:4 个数据卷分别挂到不同物理盘,才能真正发挥纠删码的容错价值
  6. 监控告警:把 9000/health 接入 Prometheus 黑盒探测,异常及时告警
  7. 定期备份:对元数据和关键 bucket 配置异地备份策略

十、小结

RustFS 用 Rust 重写了 S3 兼容对象存储这一"老命题",带来了更低的资源占用和更稳的延迟表现。借助 Docker Compose,一份 docker-compose.yml 就能跑起一个 4 盘纠删码的单节点实例;又因为它完全兼容 S3 协议,迁移成本几乎为零。

对于个人 homelab、小团队制品库、AI 训练数据池这类场景,RustFS 是一个非常值得上手的 MinIO 替代方案。等到规模上来,再按「生产加固清单」逐步演进到多节点集群即可。

参考