公司要做系统迁移,从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 这个软件即可。