Skip to content

MinIO:自建 S3 兼容对象存储

应用需要保存用户上传文件、构建产物或模型数据时,直接把文件散落在业务服务器上,很快会遇到扩容、权限和接口不统一的问题。MinIO 提供一套与 Amazon S3 兼容的对象存储 API:应用面对的是存储桶、对象和访问策略,底层数据则留在自己控制的磁盘上。

这个选择现在多了一条重要前提。minio/minio 已归档,社区版改为只分发源码;最后一个稳定 Release 是 RELEASE.2025-10-15T17-29-55Z。存量系统仍可按固定版本运行,新生产系统则需要把后续安全修复、AGPL-3.0 合规和自行构建镜像的成本纳入决定。

GitHub 仓库信息

信息内容
项目标题MinIO
项目描述高性能、兼容 Amazon S3 API 的对象存储,采用 GNU AGPLv3 许可证开放源码。
GitHub 仓库minio/minio
官网地址https://min.io/
主要开发语言Go 98.96%、Shell 0.82%、Makefile 0.13%
开源许可证AGPL-3.0
最近代码更新2026-04-24(GitHub pushed_at,核对日期:2026-09-17)

MinIO 改变了哪一步

对象存储不要求应用知道文件落在哪块磁盘。客户端用 S3 协议创建存储桶、上传对象和读取对象,MinIO 负责把请求映射到本地存储,并维护对象元数据、策略和版本信息。这让原本绑定某个文件路径的应用可以改用统一接口,也便于以后迁移到其他 S3 兼容服务。

MinIO 的三个能力最能说明这种变化:

  • S3 兼容接口:已有 S3 SDK、备份工具和数据管道可以把 endpoint 改为 MinIO,而不必重新设计文件上传协议。兼容不等于所有 AWS 服务能力都存在,接入前仍要核对应用实际使用的 API。
  • 管理控制台与 mc 客户端:管理员可以创建存储桶、查看对象和调整访问策略;自动化场景则用 mc 或 S3 SDK。控制台负责管理体验,9000 端口上的 S3 API 才是业务数据入口。
  • 纠删码和分布式部署:多盘、多节点模式能够把对象拆分到纠删码集合中,应对部分磁盘或节点故障。这是生产拓扑能力,不会因为单容器挂了一个卷就自动获得高可用。

MinIO 看起来像“带网页的文件服务器”,但 Console 面向管理员,不是给普通用户使用的网盘入口。MinIO 的核心价值在于 S3 API、策略和对象语义;需要分享链接、目录协作或相册体验时,应由上层应用提供。

采用前先看维护状态

截至 2026-09-17,仓库 README 明确标记为不再维护,并把社区用户引向 AIStor Free 或 AIStor Enterprise。最后一个社区版 Release 修复了一个权限提升漏洞,同时要求容器用户从固定源码构建镜像。这意味着:

  • 已有 MinIO 环境应至少核对是否达到 RELEASE.2025-10-15T17-29-55Z,并重新评估未来漏洞响应方案;
  • 新的个人实验、迁移验证或兼容性测试仍可以使用社区版;
  • 需要厂商支持、持续补丁或明确 SLA 的生产工作负载,不应只依赖归档仓库;
  • 在闭源产品或商业服务中使用、修改或再分发前,需要自行评估 AGPL-3.0 义务,项目 README 也明确提醒了这项风险。

如果需求只是给服务器目录加一个网页,可以考虑文件管理器;如果要多人协作、同步和分享,可评估 Nextcloud;如果目标是长期维护的大规模 S3 基础设施,则应比较 AIStor、Ceph、SeaweedFS 或托管对象存储。比较重点应放在维护承诺、故障域、升级能力和 API 覆盖,而不是只看能否启动一个 S3 endpoint。

Docker Compose 部署

下面的路径用于单机体验和兼容性验证:固定最后一个社区版 Release,从源码构建本地镜像,再用 Compose 管理容器和数据卷。多节点生产部署需要独立设计磁盘、节点、负载均衡、TLS、监控和故障演练,不能从这份单节点配置直接扩展得出。

准备环境

主机需要 Git、Go 1.24 或更高版本、可用的 Docker Engine 与 docker compose 插件、能访问 GitHub 和构建依赖的网络,以及一块明确纳入备份计划的本地存储。

在准备作为工作目录的父目录中执行:

bash
git clone https://github.com/minio/minio.git minio-source
cd minio-source
git checkout RELEASE.2025-10-15T17-29-55Z
git status --short --branch

最后一条命令应显示 detached HEAD 位于目标 Release,且工作区没有额外改动。构建命令会编译仓库源码并创建本地镜像;这是上游 Release 给容器用户的路径,本指南没有代替读者执行:

bash
TAG=local/minio:RELEASE.2025-10-15T17-29-55Z make docker
docker image inspect local/minio:RELEASE.2025-10-15T17-29-55Z \
  --format '{{.Id}} {{.Architecture}}'

make docker 需要下载 Go 依赖并运行上游构建。如果构建环境要求更严格的供应链控制,应先审查依赖、在隔离构建机完成构建,再把镜像推送到自己的受控 registry。不要把失败的构建替换成同名的未知第三方镜像。

创建凭据和 Compose

离开源码目录,创建独立部署目录:

bash
cd ..
mkdir minio-deploy
cd minio-deploy
umask 077
MINIO_SECRET="$(openssl rand -base64 32)"
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\n' "$MINIO_SECRET" > .env
unset MINIO_SECRET

.env 包含根凭据,不应提交到 Git、放入普通日志或交给前端代码。创建 compose.yaml

yaml
services:
  minio:
    image: local/minio:RELEASE.2025-10-15T17-29-55Z
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:?set MINIO_ROOT_USER in .env}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?set MINIO_ROOT_PASSWORD in .env}
    ports:
      - "127.0.0.1:9000:9000"
      - "127.0.0.1:9001:9001"
    volumes:
      - minio-data:/data

volumes:
  minio-data:

这份配置把 S3 API 和 Console 都绑定到宿主机回环地址,适合本机使用或由同机反向代理提供 HTTPS。局域网访问需要改成受控网卡地址并配合防火墙;不要为了远程访问直接把两个端口暴露到公网。

启动与四层验收

先解析配置,再启动服务:

bash
docker compose config --quiet
docker compose up -d
docker compose ps

docker compose ps 应显示 minio 服务为运行状态。不要把完整的 docker compose config 输出保存到普通日志,因为展开后的配置可能包含根凭据。

检查 S3 API 的存活探针和近期日志:

bash
curl --fail http://127.0.0.1:9000/minio/health/live
docker compose logs --tail=100 minio

curl 以零状态退出且日志没有持续启动错误,说明 HTTP 和进程层面可用。随后打开 http://127.0.0.1:9001,使用 .env 中的根账号登录,完成一次真正体现对象存储价值的任务:

  1. 创建名为 demo 的存储桶;
  2. 上传一个测试文件;
  3. 在对象列表中确认文件名和大小;
  4. 下载该对象并与原文件比对。

这一步同时验证了认证、存储桶操作、对象写入和读取。只看到登录页还不能证明数据路径可用。

最后验证容器重建不会丢失对象:

bash
docker compose down
docker compose up -d

重新登录 Console,demo 存储桶和测试对象仍应存在。down 默认保留命名卷;docker compose down -v 会删除 minio-data,等同于删除这套单节点部署的数据。

一次上传经过哪些组件

Mermaid 流程图
查看源码
flowchart LR
    App[业务应用或 S3 客户端] -->|S3 API :9000| API[MinIO API]
    Admin[管理员浏览器] -->|Console :9001| Console[MinIO Console]
    Console --> API
    API --> Auth[凭据与策略检查]
    Auth --> Object[对象读写与元数据]
    Object --> Volume[(minio-data 卷)]

业务应用和 Console 最终都经过同一套 API、认证与对象存储逻辑。命名卷保存的是受 MinIO 管理的对象与元数据整体,不是普通上传目录。绕过 S3 API 直接修改卷内文件,可能破坏对象与元数据的一致性。

日常使用与权限

根账号适合初始化,不适合分发给业务应用。完成首次部署后,应使用 Console 或 mc admin user 创建独立用户,按存储桶和操作范围授予最小权限,再让应用使用对应的 access key 与 secret key。

接入应用时通常需要四项信息:

配置单机示例说明
Endpointhttp://127.0.0.1:9000生产环境应使用受信任的 HTTPS 域名
Access key应用专用用户不使用根账号
Secret key应用专用密钥只通过 secret 管理系统注入
Path style视 SDK 而定未配置通配符域名时通常使用 path-style

需要虚拟主机风格的 bucket.example.com 时,必须配置 MINIO_DOMAIN、通配符 DNS、证书和反向代理规则。只改 SDK 的寻址模式不会自动完成这些网络条件。

备份、升级与恢复边界

单节点部署的恢复单元至少包括 minio-data 卷、实际使用的 compose.yaml、加密保存的 .env 以及反向代理配置。文件系统级快照前应停止写入并停止容器,保证卷内对象数据和 MinIO 内部元数据处于一致时点;恢复后用存储桶列表、对象下载和校验值做业务验收。通用的命名卷备份方法见 Docker 备份与恢复数据

跨存储系统迁移可以使用 mc mirror 做对象级复制,但对象复制不天然包含所有用户、策略、生命周期配置和部署凭据。不要把一次 mc mirror 当成完整灾难恢复方案。

社区仓库归档后没有可继续跟随的上游版本。若维护者未来恢复发布,或团队选择了自己的修复分支,升级流程仍应是:

  1. 阅读目标版本的 Release notes 与许可证变化;
  2. 停止写入并备份完整恢复单元;
  3. 在隔离环境构建新镜像并记录 tag 或 digest;
  4. 运行 docker compose config --quiet 后替换镜像并启动;
  5. 验证健康探针、登录、存储桶列表、上传、下载和应用端 S3 请求;
  6. 失败时同时回退镜像与升级前数据快照。

只把镜像 tag 改回旧值不足以处理不兼容的数据迁移。Compose 的通用更新与回退方法见 Docker Compose 服务生命周期

安全与故障定位

公网部署至少要把 S3 API 与 Console 放在受控的 HTTPS 入口后,限制 Console 的访问来源,并保持容器端口不被绕过。通用基线可参考 Docker Compose 生产安全加固Docker 服务反向代理与 HTTPS

常见问题可以按症状排查:

症状定位修复与再验证
Console 能打开但应用上传失败检查应用是否误用了 9001、凭据或 path-style 设置Endpoint 改为 9000 对应地址,使用应用专用凭据,再完成上传下载
容器反复退出查看 docker compose logs minio,确认凭据变量和 /data 可写修正 .env 或卷权限后重建容器,再检查 health endpoint
重建后数据消失检查是否执行过 down -v 或换了 Compose 项目名从一致性备份恢复原卷,重新验收存储桶与对象
反向代理后链接或签名异常核对外部协议、Host、端口和 SDK endpoint统一外部 HTTPS 地址及代理头,重新生成请求,不复用旧签名
需要多节点高可用单卷 Compose 不具备节点冗余按分布式部署文档重新规划独立磁盘、同构节点、时钟和负载均衡

版本与验证说明

这份指南以最后一个稳定 Release RELEASE.2025-10-15T17-29-55Z 作为部署版本,以 2026-09-17 的默认分支快照说明归档状态。配置、端口、构建入口和持久化目录均来自官方 README、Release、Dockerfile 与配置文档。

本次只进行了静态来源核对,没有执行 MinIO 源码、构建镜像、启动容器,也没有演练备份恢复或分布式故障。部署命令是读者验收步骤,不代表已经在目标主机上运行通过。

参考资料

全部公开文章由同一个站点构建和发布。