尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

MinIO 停止维护怎么办?Docker 迁移 RustFS 实战:数据零丢失

MinIO 停止维护怎么办?Docker 迁移 RustFS 实战:数据零丢失 前言MinIO 说停就停线上的文件服务还得接着跑。2025 年 12 月MinIO 官宣社区版进入维护模式。2026 年 2 月仓库归档只读不再有提交CVE 不再修复官方资源全面转向商业版 AIStor——订阅制个人项目用不起。还在跑社区版的部署等于抱着一个不再更新的黑盒。youlai-bootSpring Boot 权限管理后端的文件存储一直跑在 MinIO 上趁这次把迁移完整走了一遍旧数据整目录复制、endpoint 和桶名不变顺手把客户端换成 AWS SDK 标准实现。过程同样适用于任何 Docker 部署的 MinIO——包括 vue3-element-admin 配套环境在内。本文看点选型判断RustFS / SeaweedFS / Garage 什么场景选谁标准客户端顺手切 AWS SDK v2跟协议不跟厂商数据零丢失旧目录整目录复制旧数据原样保留当备份一、环境准备1.1 MinIO 停更时间线先看事实再谈迁移时间事件2025-12官宣社区版进入维护模式不收新功能和 PR安全修复视情况评估2026-02GitHub 仓库归档只读README 标注 “THIS REPOSITORY IS NO LONGER MAINTAINED”之后官方资源全部转向商业版 AIStor社区版已披露的 CVE 不再修复1.2 替代品怎么选主流开源替代有四个先给结论表方案协议状态适合场景SeaweedFSApache 2.0生产验证 10 年海量小文件要久经考验RustFSApache 2.0活跃迭代较新单容器部署MinIO 迁移成本最低GarageAGPL v3生产可用地理分布式集群Ceph RGWLGPL企业级PB 级规模单机太重四个候选都宣称 S3 兼容所以这不是区分度。真正的分水岭是部署心智模型SeaweedFS 最成熟但它是 Master / Volume / Filer 多角色架构从 MinIO 迁过来要重新理解一套部署模型RustFS 单容器一条docker run9000 API 9001 控制台和 MinIO 的使用习惯完全一致RustFS 还直接兼容 MinIO 磁盘格式——旧数据整目录复制即可数据不过网络见 2.2 节其他候选都得走网络搬运我选 RustFS理由是迁移路径最短部署方式、端口约定、控制台操作全部延续连磁盘数据格式都兼容团队不需要学新东西应用侧最小只换一对 AK/SK。边界也要说清RustFS 比 SeaweedFS 年轻生产验证的厚度不如前者。PB 级核心存储选 SeaweedFS 或 Ceph 更稳单机自用、中小规模迁移成本这一票投给 RustFS。1.3 迁移前检查# Docker 环境docker-v# 磁盘空间2.2 节整目录复制需要约 2 倍旧数据的空间df-h/data# 记录旧 MinIO 数据目录路径2.2 节复制数据用本文示例为 /data/miniodockerinspect minio--format{{range .Mounts}}{{.Source}} - {{.Destination}}{{\n}}{{end}}最后一项记下旧数据目录路径——它和新目录/data/rustfs平级对应2.2 节从它复制数据。二、迁移准备整个迁移流程一张图停用 MinIO复制旧数据启动 RustFS切换 AWS SDK验证上传流程只做一件事数据先落位服务后启动。不存在先跑起来再迁数据的折返——容器只启动一次命令不重复执行。2.1 停用 MinIO# 容器删除数据目录保留——迁移没验证完之前随时可以回退dockerstop miniodockerrmminio2.2 准备数据目录旧数据在/data/minio1.3 节查到的路径整目录复制为/data/rustfs——两个目录平级独立旧目录原样保留天然就是回退备份。# 清掉可能存在的空目录复制要求目标目录不存在rm-rf/data/rustfs# 旧目录整体复制为新目录-a 保留权限与时间戳cp-a/data/minio /data/rustfs# 副本属主还是 root旧 MinIO 以 root 跑对齐 RustFS 的运行身份chown-R10001:10001 /data/rustfs为什么直接复制磁盘目录就行先纠正一个直觉——MinIO 磁盘上不是一个对象一个文件ls /data/minio/public看到的不是图片而是一堆和对象同名的目录里面是xl.meta元数据和分片所以挑出图片文件复制行不通。但整目录复制可以RustFS 自 1.0.0-alpha.89 起兼容 MinIO 磁盘格式官方称 drop-in replacementissue #2212桶、对象、桶策略一并识别数据不过网络。TB 级数据走网络搬运要数小时目录复制只受磁盘速度限制参考2.3 TB 生产迁移实录。复制过来的数据有三件事心里要有数Access Key 不随数据迁移社区实测反馈旧密钥别指望能用统一用启动时环境变量里的新 AK/SK——所以第四章的应用配置还是要改兼容边界桶元数据、对象含标签/版本/对象锁、生命周期、IAM 在迁移范围站点复制、事件通知、LDAP/OIDC 不在旧目录先别删确认 3.2 验证通过后再清理在那之前它就是现成的回退备份三、启动 RustFS3.1 启动容器数据已就位这一步只管把服务跑起来dockerrun-d\--namerustfs\--restartunless-stopped\-p9000:9000\-p9001:9001\-v/data/rustfs:/data\-eRUSTFS_ACCESS_KEYrustfs-admin\-eRUSTFS_SECRET_KEY换成你的强密码\rustfs/rustfs:latest端口含义和 MinIO 完全一致9000 是 S3 API应用连这个9001 是 Web 控制台。云服务器安全组原来为 MinIO 放行过的话一个端口都不用改。数据目录属主必须是 10001。MinIO 官方镜像以 root 运行挂哪都能写RustFS 镜像在 Dockerfile 里声明了USER 10001容器进程以这个非 root 身份运行。而 bind mount 不转换权限——容器内的 UID 10001 写/data时内核按宿主机目录的属主检查。属主没对齐时容器一启动就崩# 启动即崩[FATAL] Server runtime failed: Io error: Permission denied (os error 13)2.2 已经对副本执行过chown 10001这里可以正常启动。两个常见疑问。为什么不用chmod 755755 只给属主写权限UID 10001 落在其他人位照样不能写用chmod 777能绕过但等于向服务器所有用户开放写权限。10001 哪来的docker inspect rustfs/rustfs:latest --format {{.Config.User}}可查——镜像作者声明的普通用户区间10000-60000身份。官方 issue #2396 确认了这是非 root 容器的标准要求。3.2 验证服务dockerps|greprustfs# 状态 Up 即成功dockerlogs-frustfs# 日志无报错浏览器打开http://服务器IP:9001用启动时设置的 AK/SK 登录——控制台里应该直接看到旧 MinIO 的桶和文件。3.3 开启匿名读旧桶策略随数据带过来如果是新建的桶或旧桶没开过博客图床、前端直链场景要开匿名下载。操作路径两步左侧菜单第一项对象浏览→ 存储桶列表 → 找到目标桶点行末的设置按钮进入桶详情后在访问与共享 → 访问策略处点击编辑改为公开保存后出现“修改成功”提示即生效不开的话外链图片一律 403。注意“公开”是只读匿名访问——外链能拉取图片但上传仍然要走 AK/SK 认证安全性可控。四、应用切换4.1 切换 AWS SDKio.minio:minio是个 S3 协议客户端库现在还能用但命脉系于一家已全面转向商业版的公司。AWS SDK for Java v2 是 S3 生态的事实标准官方支持连接任意 S3 兼容存储——既然都动手迁移了一起换掉以后不再挑 SDKdependencygroupIdsoftware.amazon.awssdk/groupIdartifactIds3/artifactId!-- 写作时最新版实际以 Maven Central 为准 --version2.54.2/version/dependency完整实现源码RustFSFileServiceImpl.javafile-storage:type:s3# 枚举改为 s3跟协议走不跟厂商走s3:endpoint:http://服务器IP:9000access-key:rustfs-admin# RustFS 的新 AKsecret-key:换成你的强密码# RustFS 的新 SKbucket:public# 数据已复制过来桶还是原来那个importsoftware.amazon.awssdk.auth.credentials.*;importsoftware.amazon.awssdk.regions.Region;importsoftware.amazon.awssdk.services.s3.S3Client;BeanpublicS3Clients3Client(FileStoragePropertiesprops){vars3props.getS3();returnS3Client.builder()// 连自己的服务器而非 AWS.endpointOverride(URI.create(s3.getEndpoint()))// 非 AWS 服务必填值任意.region(Region.US_EAST_1)// IP 端点必须桶名走路径不走子域名见踩坑清单.forcePathStyle(true).credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(s3.getAccessKey(),s3.getSecretKey()))).build();}上传调用从MinioClient换成S3Client.putObject参数语义一一对应改动集中在一个 Service 实现类RustFSFileServiceImpl.java里。判断标准一句话协议客户端跟协议走不跟厂商走。S3 协议是 AWS 定的开放标准比任何一家对象存储公司都活得久。4.2 验证上传# 重启应用mvn spring-boot:run方式一打开http://localhost:8000/doc.html调文件上传接口接口返回文件 URL 即成功。方式二打开vue3-element-admin前端「组件封装 → 图片上传」选择图片上传也可以直接访问有来在线环境https://vue.youlai.tech/#/component/upload上传成功后复制返回的文件 URL 在浏览器打开——图片正常显示说明后端到 RustFS 的链路通了。最后回 RustFS 控制台public桶里能看到刚上传的图片文件迁移端到端验证完成。五、踩坑清单坑现象解法目录属主不对启动即崩Permission denied (os error 13)RustFS 以 UID 10001 非 root 运行chown -R 10001:10001数据目录官方 issue #2396旧密钥失效沿用旧 AK/SK 上传报 403 AccessDenied旧 MinIO 的 Service Account 不会迁移统一换 RustFS 启动时的新 AK/SKSDK 没开 path-style请求域名解析成桶名.服务器IP连接失败AWS SDK 设S3Configuration.pathStyleAccessEnabled(true)旧版方法名forcePathStyleIP 端点必须走路径式桶不存在应用上传报 NoSuchBucket旧桶随数据复制带过来只在全新空目录部署时才需手动重建直接挑文件复制复制完对象不显示MinIO 磁盘上每个对象是目录xl.meta分片不是文件整目录cp -a复制RustFS 兼容该格式≥ 1.0.0-alpha.89新版 SDK 签名报错XAmzContentSHA256Mismatch旧 MinIO 不支持流式签名永不修复——该迁移了外链图片 403匿名拉取被拒桶的访问策略设为「公开」只读匿名访问见 3.3 节属主问题的根源是镜像安全模型的差异MinIO 官方镜像以 root 运行挂哪都能写RustFS 以 UID 10001 的非 root 用户运行宿主机目录必须先chown 10001再启动官方 issue #2396 确认。照着 MinIO 习惯迁移的人几乎 100% 在这里崩一次。403 的迷惑性最强签名校验是过的死在策略层。排查的人总以为是密钥打错了其实是旧 Service Account 连同它绑定的桶策略一起留在了旧系统里。path-style 是 IP 直连的隐藏要求AWS SDK 默认虚拟主机式寻址把桶名拼进域名public.服务器IP这种地址 DNS 直接解析失败。旧 MinIO Java SDK 默认路径式所以无感切 AWS SDK 后pathStyleAccessEnabled(true)就是必写项——4.1 装配代码里已带上。最后一条是本文的引子用新版 AWS SDK 向旧版 MinIO 上传报XAmzContentSHA256Mismatch。这不是配置错了——新版 SDK 默认走流式分块签名旧版 MinIO 解析不了而且永远不会修。遇到它别再排查配置这是 MinIO 停更砸到你身上的第一块石头。补一句新校验和的坑AWS SDK 2025 年起默认开启新校验和个别 S3 兼容服务也会报同族错误兜底开关是环境变量AWS_REQUEST_CHECKSUM_CALCULATIONwhen_required。六、总结对象存储的选型不是一锤子买卖再主流的方案也可能停更。这次迁移真正值钱的不是 RustFS而是S3 协议这层抽象——服务端换成谁都是配置级改动客户端统一到 AWS SDK 这个事实标准以后连 SDK 都不用再挑。后续可扩展RustFS 分布式部署多节点纠删码数据可靠性再上一档接入监控告警桶容量、请求量的观测相关开源项目项目简介源码youlai-bootSpring Boot 4 权限管理后端本文文件存储所在项目Gitee · GitHub · AtomGitvue3-element-admin配套 Vue3 前端Gitee · GitHub · AtomGit在线体验vue.youlai.techPC · app.youlai.tech移动端如果你的 MinIO 还在带病运行别等下一个 CVE——S3 兼容的替代方案切换成本比你想的低得多。
返回列表