公司要做系统迁移,从AWS迁移到自建机房,那迁移的项目就一大堆,S3也在其中之列。
找来找去,第一首选的替代软件是minio,可是万恶的minio团队在这个时间点,已经后台移除了 admin 相关的操作权限
要想用呢,只能用个老版本的:quay.io/minio/minio:RELEASE.2025-04-22T22-12-26Z
那只能再找了,于是找到了SeaweedFS,这个软件其实是个彻头彻尾的单文件,但是分布式全集群架构
简单的说,就是一个软件,包含了10几种功能。
而我们呢,其实就要它的一个功能s3,而且要用于生产。网上一大堆的教程都是各种分布式的部署,如果机器足够,大家可以参考网上教程。
我们单台机器,硬盘底层是raid10,然后上层就只提供s3,而且要配置简单,没有什么安全问题,这台机器是直接暴露公网IP的。
那最简单的方法就是Docker compose,而且只放开s3的指定端口:
services:
seaweedfs-s3:
image: chrislusf/seaweedfs
container_name: seaweedfs-s3
volumes:
- ./data:/data
- ./config/config.json:/seaweedfs/config.json
ports:
- "127.0.0.1:8333:8333"
# - "9333:9333"
entrypoint: /bin/sh -c
command: |
"echo 'Starting SeaweedFS S3 server' && \
weed server -dir=/data -volume.max=120 -s3 -s3.config /seaweedfs/config.json"
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
{
"identities": [
{
"name": "admin",
"credentials": [
{
"accessKey": "aaa",
"secretKey": "bbb"
}
],
"actions": [
"Admin",
"Read",
"List",
"Tagging",
"Write"
]
},
{
"name": "goods",
"credentials": [
{
"accessKey": "ccc",
"secretKey": "ddd"
}
],
"actions": [
"Read:goods",
"Write:goods",
"List:goods",
"Tagging:goods",
"Admin:goods"
]
}
]
}
解释一下,上面定义了一个admin用户,可以对所有s3进行读写和管理。
然后又定义了一个goods用户,它只对goods桶有权限。
那seaweed的桶和权限实际是分开的,管理的时候可以先建桶,然后在配置文件里再配置权限,最后重载docker compose up -d即可
大家肯定也注意到了,端口映射只开了127.0.0.1:8333,这是因为http端口,前面需要套个https才能放到生产环境。
那前置代理https,就套用Caddy好了,配置文件Caddyfile也巨简单, 就三行:
s3.rendoumi.com {
reverse_proxy 127.0.0.1:8333
}
那我们管理的时候就用minio的客户端mc即可
mc alias set mys3 https://s3.rendoumi.com aaa bbb
mc ls mys3/goods
mc mb newgoods mys3
mc ls mys3/newgoods
最后,如果要从S3同步文件,那就用 JuiceFS 的 juicesync 这个软件即可。