原因

因为众所周知的原因Minio切换开源项目为仅维护状态,所以需要寻找替代方案来继续使用类似S3的存储服务。

在论坛和推上有不少人推荐了Seaweedfs作为替代方案。

在这里记录一下Debian 13系统下,使用Seaweedfs代替Minio的过程。

安装Seaweedfs

1. 下载最新二进制文件 (请根据实际情况替换版本号)

wget https://github.com/seaweedfs/seaweedfs/releases/download/4.01/linux_amd64_full.tar.gz

2. 解压并移动到系统路径

tar -xvf linux_amd64_full.tar.gz
sudo cp weed /usr/local/bin/
sudo chmod +x /usr/local/bin/weed

3. 创建数据存储目录

sudo mkdir -p /opt/seaweedfs/master
sudo mkdir -p /opt/seaweedfs/volume
sudo mkdir -p /opt/seaweedfs/filer
sudo mkdir -p /etc/seaweedfs

4. 配置 Systemd 服务

4.1 创建 Master 服务 /etc/systemd/system/seaweedfs-master.service

[Unit]
Description=SeaweedFS Master
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/weed master \
  -mdir=/opt/seaweedfs/master \
  -port=9333 \
  -ip=0.0.0.0 \
  -defaultReplication=000
Restart=always

[Install]
WantedBy=multi-user.target

4.2 创建 Volume 服务 /etc/systemd/system/seaweedfs-volume.service

[Unit]
Description=SeaweedFS Volume
After=network.target seaweedfs-master.service

[Service]
Type=simple
User=root
# max=0 表示根据磁盘空间自动计算最大卷数
ExecStart=/usr/local/bin/weed volume \
  -dir=/opt/seaweedfs/volume \
  -mserver=127.0.0.1:9333 \
  -port=8080 \
  -max=0 
Restart=always

[Install]
WantedBy=multi-user.target

4.3 创建 Filer 服务 /etc/systemd/system/seaweedfs-filer.service

[Unit]
Description=SeaweedFS Filer
After=network.target seaweedfs-master.service

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/weed filer \
  -master=127.0.0.1:9333 \
  -port=8888 \
  -s3 \
  -s3.port=8333
# -s3 参数直接开启了 S3 兼容网关,端口 8333
Restart=always

[Install]
WantedBy=multi-user.target

4.4 启动服务

# 重载配置
sudo systemctl daemon-reload

# 启动并设置开机自启
sudo systemctl enable --now seaweedfs-master
sudo systemctl enable --now seaweedfs-volume
sudo systemctl enable --now seaweedfs-filer

# 检查状态
systemctl status seaweedfs-filer

5.迁移minio数据

5.1 安装 Rclone

sudo apt update
sudo apt install rclone -y

5.2 配置 Rclone

运行命令rclone config,添加 Minio 和 Seaweedfs 的配置。

  • 输入 n 新建
  • Name 输入: minio_old
  • Storage 类型选 s3 (Amazon S3 Compliant)
  • Provider 选 Minio
  • access_key_id: 输入你 MinIO 的 Access Key
  • secret_access_key: 输入你 MinIO 的 Secret Key
  • endpoint: 输入 MinIO 的地址 (例如 http://192.168.1.100:9000)
  • 其他选项默认回车即可

再次输入 n 新建

  • Name 输入: seaweedfs_new
  • Storage 类型选 s3
  • Provider 选 SeaweedFS或者Other (SeaweedFS 兼容通用 S3)
  • access_key_id: 默认为空,如果在启动时未配置鉴权,可留空;或者配置 weed s3 -config 指定的账号(因暂时未配置鉴权,此处留空)
  • 注:SeaweedFS S3 默认允许匿名读写,建议在正式环境配置 security.toml,迁移测试阶段可先跳过
  • secret_access_key: 同上
  • endpoint: 输入 SeaweedFS S3 地址 (例如 http://127.0.0.1:8333)
  • 其他选项默认回车

5.3 迁移数据

# --progress 显示进度条
# --transfers 16 增加并发数 (根据网络情况调整)
rclone sync minio_old: seaweedfs_new: --progress --transfers=16 --checkers=16

注意:sync 会让目标端完全即时同步源端状态(即如果源端删除了文件,目标端也会删除)。如果不希望删除目标端已有的额外文件,请使用 copy 命令。

rclone copy minio_old: seaweedfs_new: --progress

也可以只迁移单个桶的数据:

rclone copy minio_old:my-images seaweedfs_new:my-images --progress

5.4 验证迁移结果

rclone size minio_old:my-images
rclone size seaweedfs_new:my-images

6. 开启 SeaweedFS S3 认证

6.1 创建 /etc/seaweedfs/s3.json:

{
  "identities": [
    {
      "name": "admin",
      "credentials": [
        {
          "accessKey": "你的AccessKey",
          "secretKey": "你的SecretKey"
        }
      ],
      "actions": [
        "Admin",
        "Read",
        "Write"
      ]
    }
  ]
}

6.2 修改 Filer 服务 /etc/systemd/system/seaweedfs-filer.service

[Unit]
Description=SeaweedFS Filer
After=network.target seaweedfs-master.service

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/weed filer -s3 -s3.config=/etc/seaweedfs/s3.json \
  -master=127.0.0.1:9333 \
  -port=8888 \
  -s3 \
  -s3.port=8333
# -s3 参数直接开启了 S3 兼容网关,端口 8333
Restart=always

[Install]
WantedBy=multi-user.target

6.3 重启 Filer 服务

sudo systemctl daemon-reload
sudo systemctl restart seaweedfs-filer

7. 更新Rclone配置

重新运行rclone config,修改 seaweedfs_new 的 access_key_id 和 secret_access_key 为刚才配置的认证信息。

或者直接编辑~/.config/rclone/rclone.conf文件:

[seaweedfs_new]
type = s3
provider = SeaweedFS
endpoint = http://127.0.0.1:8333
acl = public-read-write
access_key_id = 你的AccessKey
secret_access_key = 你的SecretKey

8. 更新Nginx配置

之前使用Minio时候通过nginx反代可以使用域名方式访问,现在改为Seaweedfs服务。

# ---------------------------------------------------
# 1. S3 接口 + Web 访问 (s3.example.com)
#    用于 Rclone 连接,以及对外图片展示
# ---------------------------------------------------
server {
    listen 80;
    server_name s3.example.com;
    client_max_body_size 0;

    # 场景 A: 浏览器访问文件 (GET 请求) -> 走 Filer (8888) 为了速度和免密
    # 只有 GET/HEAD 请求才重写路径去 Filer
    location / {
        if ($request_method = GET) {
            rewrite ^/(.*)$ /buckets/$1 break;
            proxy_pass http://127.0.0.1:8888;
        }
        
        # 场景 B: S3 客户端操作 (PUT/DELETE/LIST) -> 走 S3 (8333) 为了鉴权
        # 如果不是 GET,说明是上传或管理,交给 S3 端口处理权限
        if ($request_method != GET) {
            proxy_pass http://127.0.0.1:8333;
        }
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# ---------------------------------------------------
# 2. 管理后台 (admin.example.com)
#    用于查看 SeaweedFS 自带的网页管理界面
# ---------------------------------------------------
server {
    listen 80;
    server_name admin.example.com;
    
    location / {
        # 【关键安全策略】开启 Basic Auth
        auth_basic "SeaweedFS Admin Area";
        auth_basic_user_file /etc/nginx/.htpasswd; 

        proxy_pass http://127.0.0.1:8888; # 原样反代 Filer
        proxy_set_header Host $host;
    }
}

BTW: .htpasswd生成方法:

sudo apt install apache2-utils -y
htpasswd -c /etc/nginx/.htpasswd your_username