Appearance
MinIO 迁移到 SeaweedFS
织信旧版本使用 MinIO 作为对象存储,新版本改用 SeaweedFS。两者均兼容 S3 协议,且织信的默认存储参数一致(Access Key admin、Bucket informat-next),因此迁移工作只涉及对象数据(文件)的搬运,织信本身无需修改存储配置。
安装 SeaweedFS
若目标端已通过织信安装器部署过 SeaweedFS,可跳过本节
下表为 SeaweedFS 各组件的端口与路径,如需调整请同步修改后文命令:
| 项目 | 取值 | 说明 |
|---|---|---|
| 安装目录 | /usr/local/seaweedfs | 存放 weed 二进制及配置 |
| 数据目录 | /data/seaweedfs | 卷数据与 filer 元数据,磁盘需充足 |
| S3 端口 | 19000 | 对外提供 S3 API,织信通过此端口读写 |
| Master 端口 | 19002 | 集群管理,仅本机访问 |
| Volume 端口 | 19003 | 卷服务,仅本机访问 |
| Filer 端口 | 19011 | 文件元数据,仅本机访问 |
| Console 端口 | 19001 | Web 控制台 |
| Access Key | admin | S3 访问账号 |
| Secret Key | admin12951bd3afe | S3 访问密码 |
| Bucket | informat-next | 织信使用的存储桶 |
WARNING
迁移场景下,SeaweedFS 的 Access Key、Secret Key、Bucket 必须与原 MinIO 完全一致,否则织信切换后无法读取存储,需要在 admin 中调整修改后的Access Key、Secret Key、Bucket。下文 s3.json 中的凭据请填原 MinIO 的实际值。
1. 准备 weed 二进制
x86(amd64)架构:
shell
cd /tmp
curl -LO https://github.com/seaweedfs/seaweedfs/releases/download/4.12/linux_amd64.tar.gz
tar -xzf linux_amd64.tar.gz
chmod +x weedARM(arm64/aarch64)架构:
shell
cd /tmp
curl -LO https://github.com/seaweedfs/seaweedfs/releases/download/4.12/linux_arm64.tar.gz
tar -xzf linux_arm64.tar.gz
chmod +x weed2. 部署二进制与配置
shell
mkdir -p /usr/local/seaweedfs
cp -f weed /usr/local/seaweedfs/
mkdir -p /data/seaweedfs/files /data/seaweedfs/filerdb创建 filer 配置 /usr/local/seaweedfs/filer.toml:
shell
cat > /usr/local/seaweedfs/filer.toml << 'EOF'
[leveldb2]
enabled = true
dir = "/data/seaweedfs/filerdb"
EOF创建 S3 凭据配置 /usr/local/seaweedfs/s3.json,accessKey、secretKey 填原 MinIO 的实际值:
shell
cat > /usr/local/seaweedfs/s3.json << 'EOF'
{
"identities": [
{
"name": "admin",
"credentials": [
{
"accessKey": "admin",
"secretKey": "admin12951bd3afe"
}
],
"actions": ["Admin", "Read", "List", "Tagging", "Write"]
}
]
}
EOF3. 配置 systemd 服务
创建 /etc/systemd/system/seaweedfs.service:
shell
cat > /etc/systemd/system/seaweedfs.service << 'EOF'
[Unit]
Description=SeaweedFS Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/data/seaweedfs
ExecStart=/usr/local/seaweedfs/weed server -ip=127.0.0.1 -ip.bind=127.0.0.1 -dir=/data/seaweedfs/files -master.port=19002 -volume.port=19003 -filer=true -filer.port=19011 -s3=true -s3.port=19000 -s3.ip.bind=0.0.0.0 -s3.config=/usr/local/seaweedfs/s3.json
Restart=on-failure
LimitNOFILE=65536
Environment="WEED_MASTER_VOLUME_SIZE_LIMIT_MB=30000"
[Install]
WantedBy=multi-user.target
EOFTIP
-ip.bind=127.0.0.1 让 master、volume、filer 仅监听本机,-s3.ip.bind=0.0.0.0 单独放开 S3 端口对外访问。这样既保证 S3 客户端可连接,又避免内部组件暴露到公网。
启动并设置开机自启:
shell
systemctl daemon-reload
systemctl enable seaweedfs
systemctl start seaweedfs4. 创建存储桶
服务启动后创建织信使用的 informat-next 桶:
shell
/usr/local/seaweedfs/weed shell -master="127.0.0.1:19002" -filer="127.0.0.1:19011" <<< "s3.bucket.create -name informat-next"验证桶已创建:
shell
/usr/local/seaweedfs/weed shell -master="127.0.0.1:19002" -filer="127.0.0.1:19011" <<< "s3.bucket.list"输出中包含 informat-next 即表示安装完成,可继续执行下文的文件迁移。
5. 配置 Console 访问
生成 Basic Auth 密码文件(账号 admin、密码填 Secret Key 的实际值):
shell
SEAWEEDFS_HTPASSWD=$(openssl passwd -apr1 'admin12951bd3afe')
echo "admin:${SEAWEEDFS_HTPASSWD}" > /etc/nginx/.htpasswd_seaweedfs
chmod 644 /etc/nginx/.htpasswd_seaweedfs在 conf.d 下新增配置 /etc/nginx/conf.d/seaweedfs.conf:
shell
cat > /etc/nginx/conf.d/seaweedfs.conf << 'EOF'
server {
listen 19001;
server_name _;
client_max_body_size 2000M;
proxy_connect_timeout 1m;
proxy_send_timeout 30m;
proxy_read_timeout 30m;
proxy_set_header Connection '';
proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Server $host;
auth_basic "SeaweedFS Console";
auth_basic_user_file /etc/nginx/.htpasswd_seaweedfs;
location / {
proxy_pass http://127.0.0.1:19011;
access_log /var/log/nginx/seaweedfs_console_access.log;
}
}
EOF检查配置并重载 nginx:
shell
nginx -t
systemctl reload nginx完成后通过 http://<服务器IP>:19001 访问控制台,用 Access Key / Secret Key 登录。
TIP
密码文件用 openssl passwd -apr1 生成的是 Apache MD5(apr1)格式,所有 Linux 自带 openssl,无需额外安装 htpasswd 工具。若 Secret Key 含单引号,需先做转义再放入 openssl passwd -apr1 '...'。
迁移前准备
- 备份 MinIO 数据目录(默认
/data/minio_home/data),以便回滚。 - 迁移期间建议停止
informat-biz服务,避免产生新文件导致两端数据不一致。 - 确认目标端磁盘剩余空间大于 MinIO 现有数据量。
下表为 MinIO 与 SeaweedFS 的存储参数示例,请以实际部署为准(默认凭据、Bucket 一致,仅 Endpoint 可能不同):
| 参数 | 含义 | MinIO(源) | SeaweedFS(目标) |
|---|---|---|---|
| Endpoint | S3 API 访问地址 | http://127.0.0.1:19000 | http://127.0.0.1:19000 |
| Access Key | 访问密钥(账号) | admin | admin |
| Secret Key | 访问密钥(密码) | admin12951bd3afe | admin12951bd3afe |
| Bucket | 存储桶名称 | informat-next | informat-next |
TIP
同一台服务器迁移时,MinIO 与 SeaweedFS 不能占用相同端口,二者的 Endpoint 端口必然不同;不同服务器迁移时,Endpoint 的 IP 不同。请按实际情况填写下文命令中的地址。
迁移使用 MinIO 官方客户端 mc,它支持增量镜像、断点续传,适合大量小文件。根据执行迁移的机器架构下载对应版本:
x86(amd64)架构:
shell
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mcARM(arm64/aarch64)架构:
shell
curl -O https://dl.min.io/client/mc/release/linux-arm64/mc
chmod +x mc迁移步骤
1. 配置 mc 别名
别名(alias)是 mc 为一个 S3 服务保存的一组访问信息,配置后即可用简短的别名代替完整地址和密钥。命令格式为:
shell
./mc alias set <别名> <Endpoint> <AccessKey> <SecretKey>| 参数 | 含义 |
|---|---|
<别名> | 自定义名称,后续命令用它引用该服务,本文源端用 src、目标端用 dst |
<Endpoint> | S3 API 访问地址,对应上表的 Endpoint |
<AccessKey> | 访问密钥账号,对应上表的 Access Key |
<SecretKey> | 访问密钥密码,对应上表的 Secret Key |
分别为 MinIO(源)和 SeaweedFS(目标)配置别名,将地址替换为各自实际的 S3 API 地址。
同一台服务器,两个服务监听不同端口:
shell
# 源:MinIO
./mc alias set src http://127.0.0.1:<MinIO端口> admin admin12951bd3afe
# 目标:SeaweedFS
./mc alias set dst http://127.0.0.1:19000 admin admin12951bd3afe不同服务器,按各自 IP 配置(需保证迁移机器能访问两端的 S3 端口):
shell
# 源:原服务器 MinIO
./mc alias set src http://<旧服务器IP>:19000 admin admin12951bd3afe
# 目标:新服务器 SeaweedFS
./mc alias set dst http://<新服务器IP>:19000 admin admin12951bd3afe2. 镜像数据
shell
./mc mirror --overwrite src/informat-next dst/informat-next| 参数 | 含义 |
|---|---|
--overwrite | 目标已存在同名对象时覆盖 |
src/informat-next | 源:src 别名下的 informat-next Bucket |
dst/informat-next | 目标:dst 别名下的 informat-next Bucket |
mc mirror 可重复执行,仅同步差异对象。跨网络迁移耗时较长,建议配合 screen/tmux 等,避免 SSH 断开导致任务中断。
3. 校验
对比两端对象数量:
shell
echo "源对象数:$(./mc ls --recursive src/informat-next | wc -l)"
echo "目标对象数:$(./mc ls --recursive dst/informat-next | wc -l)"数量一致后,在织信中打开若干含附件、图片的记录,确认文件可正常预览和下载。
常见问题
织信需要修改存储配置吗?
不需要。织信通过固定的 Access Key / Secret Key 及 informat-next Bucket 访问存储,MinIO 与 SeaweedFS 这些参数一致,SeaweedFS 接管后织信无感切换。若曾修改过默认凭据,请保证 SeaweedFS 的 s3.json 与原 MinIO 配置一致。
对象数量一致但部分文件打不开?
确认 SeaweedFS 的 master、volume、filer、s3 组件均已就绪,且 informat-next Bucket 已创建。可在 weed shell 中执行 s3.bucket.list 检查。
迁移完成后还能保留 MinIO 吗?
确认 SeaweedFS 数据完整、织信读写正常并稳定运行一段时间后,再停止 MinIO 并删除其数据目录,删除前请保留备份。

