上一篇文章中,我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来,来使用 Traefik 的能力,进行一系列相关的基础设施搭建吧。

本篇文章,聊聊 MinIO 的单独使用,以及结合 Traefik 完成私有化 S3 服务的基础搭建。

写在前面

说起 MinIO 和“对象存储”,其实在早些时候,已经写过不少和 MinIO 相关的内容了:

MinIO  是目前开源领域实至名归的头部方案

这几年随着 AI 行业的爆炸式发展,MinIO 的用户量和应用范围变的更加广阔。除了基础模型厂商和研究机构,在前几年已经开始大规模使用 MinIO 作为模型训练场景的基础组件,多数用户或许只是拿它作为简单的存储组件使用。

时至今日,我们不仅仅可以用它来打通各种软件数据存储和共享、进行跨设备的数据备份、同步,还能够在 RAG 场景中,使用它来做大规模的语料存储。

为了后续上述场景中,我们能够愉快玩耍。

让我们从最简单的用法开始,了解该如何和 Traefik 一起结合使用,快速完成私有化的对象存储服务的搭建。

文本中相关的代码,我已经开源在了 soulteary/traefik-minio-example,有需要自取。

准备工作

这篇文章的准备工作非常简单,只需要完成 Docker 运行环境的安装、下载基础配置代码、程序镜像的下载即可。

获取基础配置代码

使用 git 将包含基础配置的项目下载到本地:

git clone https://github.com/soulteary/traefik-minio-example.git

然后,进入代码目录:

cd traefik-minio-example

Docker 环境的准备

如果你已经安装了 Docker ,那么可以跳过这个小节。

如果你还没有安装 Docker,不论你使用的是 Windows、Linux、macOS,都可以相对快速简单的完成 Docker 的安装和简单配置。

你可以参考之前的一些文章:《Docker 环境下使用 Traefik 3 的最佳实践:快速上手》中的“Docker 环境”、《基于 Docker 的深度学习环境:Windows 篇》中的“准备 Docker 虚拟化运行环境” 或者《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》中的“更简单的 Docker 安装”,来根据不同的操作系统,完成相关的配置,这里就不多做赘述了。

MinIO Docker 镜像下载

虽然 MinIO 官方的文档告诉我们,使用它直接下载 latest 镜像就行(不携带版本)。但是,在以往的使用过程中,发现过升级版本,没有完整向后兼容的问题。

为了减少不必要的麻烦,这里建议始终携带一个较新版本的,如:

docker pull minio/minio:RELEASE.2024-08-03T04-33-23Z

因为 MinIO 特别小巧,下载过程会相对比较快:

# docker pull minio/minio:RELEASE.2024-08-03T04-33-23Z

RELEASE.2024-08-03T04-33-23Z: Pulling from minio/minio
a4ed047ad504: Pull complete 
bbc1fc383cb4: Pull complete 
feb4010d8963: Pull complete 
929fc7e1cabd: Pull complete 
4f4fb700ef54: Pull complete 
1081fb4576cf: Pull complete 
7e20bc251850: Pull complete 
da9a532441d8: Pull complete 
Digest: sha256:c933bb53ac226d1f4bdfeac66a3854d02903771e91d7ee2cbc330841a1d77d7e
Status: Downloaded newer image for minio/minio:RELEASE.2024-08-03T04-33-23Z
docker.io/minio/minio:RELEASE.2024-08-03T04-33-23Z

完成了镜像的下载,我们就可以正式开始折腾了。

基础使用

我们先来通过最简单的 MinIO 运行命令,来了解 MinIO 的基础用法和默认程序行为。

MinIO 官方的下载页面,我们能够看到官方推荐的使用方法:

podman run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

用上一篇文章提到的 “命令行转换配置大法”,可以快速的得到下面的 Docker Compose 配置:

name: minio
services:
  minio:
    ports:
      - 9000:9000
      - 9001:9001
    image: minio/minio:RELEASE.2024-08-03T04-33-23Z
    command: server /data --console-address ":9001"

如果你没有完成前文中“准备工作”中的“获取基础配置代码”的步骤,可以将上面的配置保存为 docker-compose.yml,然后使用 docker compose up 来启动一个服务 90009001 端口的 minio 容器实例。

如果你已经完成了基础配置代码的下载,上面的配置已经保存在示例的基础配置代码中了。我们可以执行下面的命令,快速的体验最基础的 MinIO 使用方法。

cp docker-compose.simple.yml docker-compose.yml

docker compose up

当我们看到类似下面的日志之后,就可以通过浏览器访问 MinIO 了。

docker compose up   
[+] Building 0.0s (0/0)                                                                                                                         docker:desktop-linux
[+] Running 1/1
 ✔ Container minio  Recreated                                                                                                                                   0.2s 
Attaching to minio-minio-1
minio-minio-1  | MinIO Object Storage Server
minio-minio-1  | Copyright: 2015-2024 MinIO, Inc.
minio-minio-1  | License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
minio-minio-1  | Version: RELEASE.2024-08-03T04-33-23Z (go1.22.5 linux/arm64)
minio-minio-1  | 
minio-minio-1  | API: http://172.21.0.2:9000  http://127.0.0.1:9000 
minio-minio-1  | WebUI: http://172.21.0.2:9001 http://127.0.0.1:9001 
minio-minio-1  | 
minio-minio-1  | Docs: https://min.io/docs/minio/linux/index.html
minio-minio-1  | WARN: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

默认情况下,我们在浏览器访问 localhost:9000 会被直接重定向到 localhost:9001/login 的 MinIO 控制面板的登录界面。

MinIO 控制面板登录界面

默认情况下,我们使用 minioadmin 作为账号和密码,就能够登录 MinIO 后台进行管理了。

MinIO 控制面板登录后界面

如果你使用过 AWS S3、阿里云或腾讯云的对象存储,那么你对左侧的“对象浏览器”、“访问密钥管理”、“存储桶管理”、“访问策略管理”、“用户身份管理” 等等功能应该会比较熟悉。

如果你不熟悉也没有关系,接下来的内容和后续的使用中,多使用使用,自然就熟悉了。

使用 MinIO 管理后台存储文件

考虑到有一部分同学没有接触过对象存储或 MinIO 类似的产品,这里我们简单介绍下 MinIO 的基础使用。如果你已经熟悉,可以跳过这个小节,了解更完善的搭建方法。

在 MinIO 后台创建一个“存储桶”

想要使用 MinIO 这类产品进行对象存储,我们首先需要创建一个“存储桶”(Bucket),在 MinIO 侧边栏中选择 Bucket,然后创建一个新的 Bucket 即可,名字根据自己的需求起即可,我这里随便写了一个“say-hi”。

查看 Bucket 的详细情况

创建之后,我们可以在后台看到这个 Bucket 的详细情况,以及做一些细节的权限设置,副本设置等等。

在 MinIO 后台完成文件的上传

选择侧边栏的“对象管理器”,然后选择这个我们创建的 Bucket,可以随便上传文件或者文件夹。我这里上传了一个使用 AI 将图片生成的短视频。

在 MinIO 后台进行文件的操作

文件上传之后,我们能够在这个控制台进行一些简单的操作:下载、分享、预览、删除等等。

在 MinIO 后台预览上传文件

比如,我这里点击了预览,就能够直接在浏览器中浏览这个视频啦。当然,你也可以将预览或者下载的链接嵌入你需要嵌入的文档、程序中使用。

使用客户端来完成文件的管理

使用网页进行操作,当然非常的简单。但是如果我们想要操作大量的文件,或者在其他的程序中使用 MinIO 提供的对象存储能力呢?

MinIO 和我们使用的云服务商一样,支持通过编程的方式,或标准化集成的方式来访问存储能力。

首先,我们需要创建一个“访问授权”密钥。

在 MinIO 后台选择 “Access Keys”

选择侧边栏的 “Access Keys”,创建一个新的授权密钥。

在 MinIO 后台创建 Access Key

默认创建的密钥都是随机创建的字符串 “乱码”。

在 MinIO 后台为访问密钥起名字

这里有个小经验,密钥名称其实是可以修改的。为了更好的区分访问密钥的用途,建议手动修改密钥的名字。

如果你有支持 S3 协议的软件,可以使用你自己的软件来测试和验证刚刚启动的 MinIO 服务。如果你没有的话,可以根据自己的操作系统,选择一些支持 S3 协议的软件。

Windows 可以使用的 S3 浏览器

如果你是 Windows 环境,可以使用一些类似 S3 Browser 的工具、包括 Cyberduck 等等,完成简单配置,进行服务验证。

macOS 可以使用类似的软件

macOS 同样可以使用 Cyberduck,不过我这里使用的是另外一款类似的软件,完成简单的配置之后,选择“挂载”,就能够将 MinIO 中的某个 Bucket,挂载为本地的磁盘使用了。

完成 S3 本地磁盘挂载

当然,我们也可以在各种编程语言中使用对应的 S3 SDK 来使用这个存储能力。除了 AWS 和 MinIO S3 SDK 之外,GitHub 上还有许多其他社区用户的实现,都可以参考使用。

更完善的 MinIO Docker 使用方案

相比较直接使用官方的默认命令转换的 Docker Compose 配置,下面的配置中会更适合我们快速本地搭建一个存储服务:

name: minio

services:
  minio:
    container_name: minio
    ports:
      - 9000:9000
      - 9001:9001
    image: minio/minio:RELEASE.2024-08-03T04-33-23Z
    environment:
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/core.html
      - MINIO_DOMAIN=minio.lab.io
      - MINIO_COMPRESSION_ENABLE=on
      - MINIO_COMPRESSION_ALLOW_ENCRYPTION=off
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/root-credentials.html
      - MINIO_ROOT_USER=soulteary
      - MINIO_ROOT_PASSWORD=soulteary
      - MINIO_API_ROOT_ACCESS=on
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/console.html
      - MINIO_BROWSER=on
      - MINIO_BROWSER_LOGIN_ANIMATION=off
      - MINIO_BROWSER_REDIRECT=false
      - MINIO_BROWSER_SESSION_DURATION=365d
      # refs: https://min.io/docs/minio/linux/reference/minio-server/minio-server.html
    command: server /data --address=":9000" --console-address=":9001"
    volumes:
      - ./minio/data:/data
      - ./minio/config:/root/.minio
    extra_hosts:
      - "minio.lab.io:127.0.0.1"
    healthcheck:
        # refs:
        # - https://min.io/docs/minio/linux/reference/minio-mc/mc-ready.html
        # - https://github.com/minio/minio/issues/18389
        test: ["CMD", "mc", "ready", "local"]
        interval: 3s
        timeout: 10s
        retries: 12

在上面的配置中,我们额外做了一些事情,你可以根据你的实际情况进行调整:

  • 指定了服务交互使用的域名,并对容器内服务绑定了域名为本地,避免对外解析。
  • 启用了针对文本和一些类型文件的压缩,能够减少磁盘占用,以及提升对外提供服务时的传输效率。
  • 禁用了文件端到端加密,减少不必要的性能损耗。
  • 重新指定了超级用户的账号和密码都是 soulteary
  • 声明文件访问地址不再自动跳转管理后台,增加一些安全性。
  • 根据实际需要临时启用后台管理界面,并延长有效的登录状态时间为 1 年。
  • 显式声明了 API 和后台地址的服务端口。
  • 将我们上传的数据挂载到本地,避免服务结束数据和容器一起被回收。
  • 增加了容器健康检查,能够支持服务故障自愈。

和上文中一样,我们将配置保存为 docker-compose.yml ,使用 docker compose up 就能够体验更可靠的 MinIO 容器服务啦。

cp docker-compose.standalone.yml docker-compose.yml

docker compose up

执行完命令,就能够看到熟悉,但是有一些不同的服务运行状态啦(更明确的运行状态)。

# docker compose up
[+] Building 0.0s (0/0)                                                                                                                         docker:desktop-linux
[+] Running 1/0
 ✔ Container minio-minio-1  Recreated                                                                                                                           0.1s 
Attaching to minio
minio  | MinIO Object Storage Server
minio  | Copyright: 2015-2024 MinIO, Inc.
minio  | License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
minio  | Version: RELEASE.2024-08-03T04-33-23Z (go1.22.5 linux/arm64)
minio  | 
minio  | API: http://172.21.0.2:9000  http://127.0.0.1:9000 
minio  | WebUI: http://172.21.0.2:9001 http://127.0.0.1:9001 
minio  | 
minio  | Docs: https://min.io/docs/minio/linux/index.html

当然,这样运行的服务,我们还是得使用 IP 和端口进行访问,并且不支持 HTTPS 访问。不论是在线服务还是内网生产使用,都还是比较麻烦的。

所以,接下来,我们来一步步将上面的配置改造为适合和 Traefik 一起使用的。

完善 MinIO 配置,适配 Traefik 使用

还是使用上面的配置,在配置中添加“网络”相关内容:

name: minio

services:
  minio:
    ...
    networks:
      - traefik

networks:
  traefik:
    external: true

接着,在程序容器“标签”中声明一些必要的信息,来辅助 Traefik 更好的理解和注册我们的程序为 HTTPS 服务:

name: minio

services:
  minio:
    ...
    labels:
      # 用于 Traefik 服务发现
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      # MinIO API 服务相关
      # - HTTP 相关设置:
      #   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务
      - "traefik.http.routers.minio-http.entrypoints=http"
      #   并自动跳转至 HTTPS 协议(443端口)
      - "traefik.http.routers.minio-http.middlewares=redir-https"
      #   默认服务域名为 minio.lab.io
      - "traefik.http.routers.minio-http.rule=Host(`minio.lab.io`)"
      #   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)
      - "traefik.http.routers.minio-http.service=noop@internal"
      # - HTTPS 相关设置:
      #   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务
      - "traefik.http.routers.minio-https.entrypoints=https"
      #   在这个端口上使用 TLS 协议
      - "traefik.http.routers.minio-https.tls=true"
      #   对响应内容启用 GZIP 压缩
      - "traefik.http.routers.minio-https.middlewares=gzip"
      #   默认服务域名为 minio.lab.io
      - "traefik.http.routers.minio-https.rule=Host(`minio.lab.io`)"
      #   HTTPS 服务名称为 minio-backend,使用 9000 端口提供服务
      - "traefik.http.routers.minio-https.service=minio-backend"
      # 声明服务名称为 minio-backend,使用 9000 端口提供服务
      - "traefik.http.services.minio-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio-backend.loadbalancer.server.port=9000"

      # MinIO Admin 服务相关
      # - HTTP 相关设置:
      #   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务
      - "traefik.http.routers.minio-admin-http.entrypoints=http"
      #   并自动跳转至 HTTPS 协议(443端口)
      - "traefik.http.routers.minio-admin-http.middlewares=redir-https"
      #   默认服务域名为 minio.console.lab.io
      - "traefik.http.routers.minio-admin-http.rule=Host(`minio.console.lab.io`)"
      #   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)
      - "traefik.http.routers.minio-admin-http.service=noop@internal"
      # - HTTPS 相关设置:
      #   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务
      - "traefik.http.routers.minio-admin-https.entrypoints=https"
      #   在这个端口上使用 TLS 协议
      - "traefik.http.routers.minio-admin-https.tls=true"
      #   对响应内容启用 GZIP 压缩
      - "traefik.http.routers.minio-admin-https.middlewares=gzip"
      #   默认服务域名为 minio.console.lab.io
      - "traefik.http.routers.minio-admin-https.rule=Host(`minio.console.lab.io`)"
      #   HTTPS 服务名称为 minio-backend,使用 9001 端口提供服务
      - "traefik.http.routers.minio-admin-https.service=minio-admin-backend"
      # 声明服务名称为 minio-backend,使用 9001 端口提供服务
      - "traefik.http.services.minio-admin-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio-admin-backend.loadbalancer.server.port=9001"

在上面的配置中,我们分别针对 MinIO 的 API 和管理后台进行的配置,并分别配置了 HTTP 和 HTTPS 两种协议的访问,并将 HTTP 协议的访问请求统一跳转为 HTTPS 访问。

并且,考虑到信息安全,我们对 API 和管理后台绑定了不同的服务域名。这里,我们还可以在后台的“中间件”中添加更多的“安全访问”限制的功能,比如额外的身份验证。

name: minio

services:
  minio:
    ...
    extra_hosts:
      - "minio.lab.io:127.0.0.1"
      - "minio.console.lab.io:127.0.0.1"

和上面一样,为了避免服务域名被解析到容器之外,我们可以做一下域名绑定。

完成配置我已经存放到开源项目中 soulteary/traefik-minio-example/docker-compose.traefik.yml,考虑到篇幅长度,就不再粘贴。

使用方法和上面一样:

cp docker-compose.traefik.yml docker-compose.yml

docker compose up

服务启动后,我们就能够通过新的域名(minio.console.lab.io)来访问 MinIO 管理后台啦。

使用独立域名访问 MinIO 管理后台

我们可以通过许多种方式,来通过 MinIO API 接口域名,来提供资源的访问,包括开放“存储桶”的访问权限,给私有存储桶开放某些路径的访问权限,或者使用 API 来获取桶中的内容。

因为是验证,这里做一个简单的演示,将桶类所有路径都设置为开放访问。

开放存储桶的访问权限

在我们设置完所有路径都开放访问后,就可以使用下面的路径来访问上文中上传到服务中的资源啦。

# https://域名/桶名称/资源名称

https://minio.lab.io/say-hi/bigbro.mp4

爱因斯坦,你好呀

对上面的服务进行抽象

上面的服务配置中,我们 HardCode 了一些内容。

为了能够更快的搭建各种“个性化”的服务,来适配不同的场景,和上篇文章一样,我们对它进行服务抽象。

抽象配置文件

先来定义核心的配置文件 .env

# Docker 服务名称
SERVICE_NAME=minio
# 使用的应用镜像
DOCKER_IMAGE=minio/minio:RELEASE.2024-08-03T04-33-23Z
# 服务域名和端口
API_DOMAIN=minio.lab.io
API_PORT=9000
# 管理域名和端口
DASHBOARD_DOMAIN=minio.console.lab.io
DASHBOARD_PORT=9001
# 超级管理员
ADMIN_USER=soulteary
ADMIN_PASS=soulteary

完成配置文件的抽象后,我们来将配置文件相关的内容应用到 Docker 容器配置中。

更新使用 MinIO 的 Docker 容器配置

先来完成独立使用 MinIO 的容器配置:

name: minio

services:
  minio:
    container_name: ${SERVICE_NAME}
    image: ${DOCKER_IMAGE}
    ports:
      - 9000:${API_PORT}
      - 9001:${DASHBOARD_PORT}
    environment:
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/core.html
      - MINIO_DOMAIN=${API_DOMAIN}
      - MINIO_COMPRESSION_ENABLE=on
      - MINIO_COMPRESSION_ALLOW_ENCRYPTION=off
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/root-credentials.html
      - MINIO_ROOT_USER=${ADMIN_USER}
      - MINIO_ROOT_PASSWORD=${ADMIN_PASS}
      - MINIO_API_ROOT_ACCESS=on
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/console.html
      - MINIO_BROWSER=on
      - MINIO_BROWSER_LOGIN_ANIMATION=off
      - MINIO_BROWSER_REDIRECT=false
      - MINIO_BROWSER_SESSION_DURATION=365d
      # refs: https://min.io/docs/minio/linux/reference/minio-server/minio-server.html
    command: server /data --address=":${API_PORT}" --console-address=":${DASHBOARD_PORT}"
    volumes:
      - ./minio/data:/data
      - ./minio/config:/root/.minio
    extra_hosts:
      - "${API_DOMAIN}:127.0.0.1"
    healthcheck:
        # refs:
        # - https://min.io/docs/minio/linux/reference/minio-mc/mc-ready.html
        # - https://github.com/minio/minio/issues/18389
        test: ["CMD", "mc", "ready", "local"]
        interval: 3s
        timeout: 10s
        retries: 12

接下来是搭配 Traefik 使用的容器配置:

name: minio

services:
  minio:
    container_name: ${SERVICE_NAME}
    image: ${DOCKER_IMAGE}
    environment:
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/core.html
      - MINIO_DOMAIN=${API_DOMAIN}
      - MINIO_COMPRESSION_ENABLE=on
      - MINIO_COMPRESSION_ALLOW_ENCRYPTION=off
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/root-credentials.html
      - MINIO_ROOT_USER=${ADMIN_USER}
      - MINIO_ROOT_PASSWORD=${ADMIN_PASS}
      - MINIO_API_ROOT_ACCESS=on
      # refs: https://min.io/docs/minio/linux/reference/minio-server/settings/console.html
      - MINIO_BROWSER=on
      - MINIO_BROWSER_LOGIN_ANIMATION=off
      - MINIO_BROWSER_REDIRECT=false
      - MINIO_BROWSER_SESSION_DURATION=365d
      # refs: https://min.io/docs/minio/linux/reference/minio-server/minio-server.html
    command: server /data --address=":${API_PORT}" --console-address=":${DASHBOARD_PORT}"
    networks:
      - traefik
    labels:
      # 用于 Traefik 服务发现
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      # MinIO API 服务相关
      # - HTTP 相关设置:
      #   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务
      - "traefik.http.routers.minio-http.entrypoints=http"
      #   并自动跳转至 HTTPS 协议(443端口)
      - "traefik.http.routers.minio-http.middlewares=redir-https"
      #   默认服务域名为 minio.lab.io
      - "traefik.http.routers.minio-http.rule=Host(`${API_DOMAIN}`)"
      #   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)
      - "traefik.http.routers.minio-http.service=noop@internal"
      # - HTTPS 相关设置:
      #   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务
      - "traefik.http.routers.minio-https.entrypoints=https"
      #   在这个端口上使用 TLS 协议
      - "traefik.http.routers.minio-https.tls=true"
      #   对响应内容启用 GZIP 压缩
      - "traefik.http.routers.minio-https.middlewares=gzip"
      #   默认服务域名为 minio.lab.io
      - "traefik.http.routers.minio-https.rule=Host(`${API_DOMAIN}`)"
      #   HTTPS 服务名称为 minio-backend,使用 9000 端口提供服务
      - "traefik.http.routers.minio-https.service=minio-backend"
      # 声明服务名称为 minio-backend,使用 9000 端口提供服务
      - "traefik.http.services.minio-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio-backend.loadbalancer.server.port=${API_PORT}"

      # MinIO Admin 服务相关
      # - HTTP 相关设置:
      #   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务
      - "traefik.http.routers.minio-admin-http.entrypoints=http"
      #   并自动跳转至 HTTPS 协议(443端口)
      - "traefik.http.routers.minio-admin-http.middlewares=redir-https"
      #   默认服务域名为 minio.console.lab.io
      - "traefik.http.routers.minio-admin-http.rule=Host(`${DASHBOARD_DOMAIN}`)"
      #   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)
      - "traefik.http.routers.minio-admin-http.service=noop@internal"
      # - HTTPS 相关设置:
      #   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务
      - "traefik.http.routers.minio-admin-https.entrypoints=https"
      #   在这个端口上使用 TLS 协议
      - "traefik.http.routers.minio-admin-https.tls=true"
      #   对响应内容启用 GZIP 压缩
      - "traefik.http.routers.minio-admin-https.middlewares=gzip"
      #   默认服务域名为 minio.console.lab.io
      - "traefik.http.routers.minio-admin-https.rule=Host(`${DASHBOARD_DOMAIN}`)"
      #   HTTPS 服务名称为 minio-backend,使用 9001 端口提供服务
      - "traefik.http.routers.minio-admin-https.service=minio-admin-backend"
      # 声明服务名称为 minio-backend,使用 9001 端口提供服务
      - "traefik.http.services.minio-admin-backend.loadbalancer.server.scheme=http"
      - "traefik.http.services.minio-admin-backend.loadbalancer.server.port=9001"
    volumes:
      - ./minio/data:/data
      - ./minio/config:/root/.minio
    extra_hosts:
      - "${API_DOMAIN}:127.0.0.1"
      - "${DASHBOARD_DOMAIN}:127.0.0.1"
    healthcheck:
        # refs:
        # - https://min.io/docs/minio/linux/reference/minio-mc/mc-ready.html
        # - https://github.com/minio/minio/issues/18389
        test: ["CMD", "mc", "ready", "local"]
        interval: 3s
        timeout: 10s
        retries: 12

networks:
  traefik:
    external: true

当所有的配置都是声明式的之后,我们的服务部署和维护就会变的非常简单,只需要修改其中的“文本参数”即可。在初高中的时候,我们就学习过很多次的 “控制变量法” 嘛。当变量就剩下一两个了,这些东西,还复杂嘛?是不是相当简单呢?

文本中相关的代码,都已经开源在了 soulteary/traefik-minio-example,希望你玩的开心。

其他

相信看完上面的内容后,你应该已经能够搭建出单一磁盘支持的私有化的 S3 存储服务。

为了服务的可靠性,我个人建议做两件事情。

你可以通过各种方式,让容器能够同时访问多块物理磁盘。然后结合 MinIO 服务目录,设置 MinIO 使用多块磁盘,而非一块磁盘。MinIO 支持的纠删码,能够让我们以相对低的成本,完成数据在物理层面的可靠性保障。

当遇到极端情况的时候,数据依旧能够被正确的读取和修复。

除此之外,我们还可以进行一些数据备份操作,参考 “桶复制” ,你可以使用 MinIO 的 CLI 或者管理界面,配置数据同步、备份策略,确保数据有多份副本存储。

最后

好了,这篇文章,同样写了比较长的篇幅,希望对你有帮助。

–EOF