迁移 minio 到 rustfs

迁移 minio 到 rustfs

前言

minio 在今年 5 月份时, 控制台 ui 出现了一个很大的变化 – 删减了绝大多数 ui 特性

现状

下图是社区版前后的对比

RELEASE.2025-04-22T22-12-26Z

RELEASE.2025-09-07T16-13-09Z

可以看到 Access KeysPolicies 的菜单都没了

讨论

在 github 上,有讨论这个问题的相关 issue

官方给出的答复如下图

minio ui 删减官方答复

我的看法

minio 在 oss 的开源圈中小有名气,我自己的图床也是基于 minio 搭建的

minio 项目的开源协议是 AGPL-3.0. 这个协议最大限制是它的传染性,就是说如果你修改了源代码,那么你必须要公开你修改之后的版本

就协议来说,对于我这种没有修改需求的用户而言,没有什么影响

这次的主要问题在于,我一个社区用户不能再通过控制台 ui 来管理访问 key,也不能通过控制台 ui 来管理访问策略

选择

如果想要在 minio 的控制台 ui 上用上以上的特性,有两个选择

  1. 回退 minio 版本到 RELEASE.2025-04-22T22-12-26Z, 这是拥有完整 ui 特性的最后版本
  2. 升级到商用版本

我最近刷到的有关 rustfs 的广告真的有点多,那不然就试试呗

rustfs 现在最新的版本是 1.0.0-alpha.66,都还没发布正式版本,也不知道是哪些人在吹

不过 rustfs 是一个国产项目,文档有中文版本,对国人还是很友好的

开搞

部署 rustfs

直接部署一个新环境肯定没什么问题,但我之前使用的是 minio, 数据也要迁移过来才行

另外就是,我在 minio 中配置的是多磁盘,那肯定也是想要能直接换到 rustfs 就能用的

我的环境虽然说是多磁盘,但实际上是伪多磁盘,实际磁盘也只有一块

之前的部署使用的是 docker compose 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
services:
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: minio
restart: always
networks:
- minio
environment:
MINIO_ROOT_USER: xxx
MINIO_ROOT_PASSWORD: xxx
volumes:
- ~/applications/minio/data/disk1:/mnt/data/disk1
- ~/applications/minio/data/disk2:/mnt/data/disk2
- ~/applications/minio/data/disk3:/mnt/data/disk3
- ~/applications/minio/data/disk4:/mnt/data/disk4
command: |
server
/mnt/data/disk{1...4}
--console-address ":9001"
nginx:
image: nginx:1.29.1
container_name: route-minio
restart: always
depends_on:
- minio
networks:
- minio
volumes:
- ~/applications/minio/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ~/applications/cert/home.wuhunyu.top:/etc/cert:ro
- ~/applications/minio/nginx/logs:/opt/nginx/logs
ports:
- 9000:9000
- 9001:9001


networks:
minio:
driver: bridge

简单修改一下 docker compose 的配置,换成 rustfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
services:
rustfs:
image: rustfs/rustfs:1.0.0-alpha.66
container_name: rustfs
restart: unless-stopped
networks:
- rustfs
environment:
TZ: Asia/Shanghai
RUSTFS_ACCESS_KEY: xxx
RUSTFS_SECRET_KEY: xxx
RUST_LOG: error
RUSTFS_OBS_LOG_DIRECTORY: "/var/logs/rustfs/"
RUSTFS_ADDRESS: ":9000"
RUSTFS_CONSOLE_ENABLE: true
volumes:
- ~/applications/rustfs/data/disk1:/mnt/data/disk1
- ~/applications/rustfs/data/disk2:/mnt/data/disk2
- ~/applications/rustfs/data/disk3:/mnt/data/disk3
- ~/applications/rustfs/data/disk4:/mnt/data/disk4
- ~/applications/rustfs/logs:/var/logs/rustfs
- /etc/localtime:/etc/localtime:ro
command: |
/mnt/data/disk{1...4}

nginx:
image: nginx:1.29.1
container_name: route-rustfs
restart: unless-stopped
environment:
TZ: Asia/Shanghai
depends_on:
- rustfs
networks:
- rustfs
volumes:
- ~/applications/rustfs/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ~/applications/cert/home.wuhunyu.top:/etc/cert:ro
- ~/applications/rustfs/nginx/logs:/opt/nginx/logs
- /etc/localtime:/etc/localtime:ro
ports:
- 9000:9000
- 9001:9001

networks:
rustfs:
driver: bridge

启动, 登录控制台 ui

rustfs 协议

数据迁移

部署的任务是完成了,但之前在 minio 的数据也需要迁移过来

如果要一个个地走 S3 的标准 API 那就有点麻烦了.看官方文档也支持 mc 工具,那不妨拿来用用

mc 工具是 minio 官方开发的一个命令行工具,它的功能要比控制台 ui 上的特性更丰富

但对于一般用户来说用的还是比较少

要用 mc 工具,那就得把两个 oss 服务都跑起来才行. 简单地修改修改一下原来的 minio 服务的端口就行了,避免端口冲突

比方说,我修改 minio 的 api 端口为 9002, 控制台 ui 端口为 9003

真实操作之前,还等登录控制台 ui 生成一个 Access Keys, minio 和 rustfs 都需要

1
2
3
4
5
6
7
8
# 配置 minio
$ mc alias set minio https://[访问地址]:9002 [Access Key] [Secret Key]

# 配置 rustfs
$ mc alias set rustfs https://[访问地址]:9000 [Access Key] [Secret Key]

# 开始全量迁移
$ mc mirror --overwrite --remove --preserve minio/ rustfs/

等结束就好了

rustfs 性能

最后我的 images bucket 是需要匿名可访问的

1
$ mc anonymous set download rustfs/images

注意事项

超时

如果像我一样配置了 nginx 反向代理,迁移过程中可能会因为迁移的文件太大而超时

这时候需要修改 nginx 配置,调大请求体,调大超时时间

1
2
3
4
proxy_send_timeout 3000s;
proxy_read_timeout 3000s;
proxy_connect_timeout 3000s;
client_max_body_size 100G;
作者

wuhunyu

发布于

2025-10-31

更新于

2025-10-31

许可协议