公司要做系统迁移,从AWS迁移到自建机房,那迁移的项目就一大堆,S3也在其中之列。
找来找去,第一首选的替代软件是minio,可是万恶的minio团队在这个时间点,已经后台移除了 admin 相关的操作权限
要想用呢,只能用个老版本的:quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z
那只能再找了,于是找到了SeaweedFS,这个软件其实是个彻头彻尾的单文件,但是分布式全集群架构
简单的说,就是一个软件,包含了10几种功能。
而我们呢,其实就要它的一个功能s3,而且要用于生产。网上一大堆的教程都是各种分布式的部署,如果机器足够,大家可以参考网上教程。
我们单台机器,硬盘底层是raid10,然后上层就只提供s3,而且要配置简单,没有什么安全问题,这台机器是直接暴露公网IP的。
那最简单的方法就是Docker compose,而且只放开s3的指定端口:
1services:
2 seaweedfs-s3:
3 image: chrislusf/seaweedfs
4 container_name: seaweedfs-s3
5 volumes:
6 - ./data:/data
7 - ./config/config.json:/seaweedfs/config.json
8 ports:
9 - "127.0.0.1:8333:8333"
10 # - "9333:9333"
11 entrypoint: /bin/sh -c
12 command: |
13 "echo 'Starting SeaweedFS S3 server' && \
14 weed server -dir=/data -volume.max=120 -s3 -s3.config /seaweedfs/config.json"
15 restart: unless-stopped
仔细解释上面的参数:
- ports 只开了 127.0.0.1:8333 的S3端口,其它都不开,如果需要查看服务状态,可以临时打开9333端口查看,看完再关
- -volume.max=120,这个务必要注意,seaweed是分卷的,一个卷最多30G,缺省是8个卷。那缺省就是只有240G的容量,我们的硬盘是4T的,剩余3.7TB,那算下来,30*120=3600G=3.6T。这样就对准了,这个参数一定要根据生产的实际情况进行调整.
- 另外还把config.json的配置文件给mount入docker卷中了,配置文件里放的就是S3的IAM访问权限控制
详细看一下config.json
1{
2 "identities": [
3 {
4 "name": "admin",
5 "credentials": [
6 {
7 "accessKey": "aaa",
8 "secretKey": "bbb"
9 }
10 ],
11 "actions": [
12 "Admin",
13 "Read",
14 "List",
15 "Tagging",
16 "Write"
17 ]
18 },
19 {
20 "name": "goods",
21 "credentials": [
22 {
23 "accessKey": "ccc",
24 "secretKey": "ddd"
25 }
26 ],
27 "actions": [
28 "Read:goods",
29 "Write:goods",
30 "List:goods",
31 "Tagging:goods",
32 "Admin:goods"
33 ]
34 }
35 ]
36}
解释一下,上面定义了一个admin用户,可以对所有s3进行读写和管理。
然后又定义了一个goods用户,它只对goods桶有权限。
那seaweed的桶和权限实际是分开的,管理的时候可以先建桶,然后在配置文件里再配置权限,最后重载docker compose up -d
即可
大家肯定也注意到了,端口映射只开了127.0.0.1:8333,这是因为http端口,前面需要套个https才能放到生产环境。
那前置代理https,就套用Caddy好了,配置文件Caddyfile也巨简单, 就三行:
1s3.rendoumi.com {
2 reverse_proxy 127.0.0.1:8333
3}
那我们管理的时候就用minio的客户端mc即可
1mc alias set mys3 https://s3.rendoumi.com aaa bbb
2
3mc ls mys3/goods
4
5mc mb newgoods mys3
6
7mc ls mys3/newgoods
最后,如果要从S3同步文件,那就用 JuiceFS 的 juicesync 这个软件即可。