MinIO + Caddy 在 Docker 環境的最佳架構實戰紀錄

在這篇教學文章中,我將分享如何透過 Docker 部署 MinIO 搭配 Caddy 作為反向代理伺服器,自動處理 HTTPS 憑證,快速建立一套安全又易於管理的 S3 相容物件儲存服務。本文適用於中小型團隊、自架私有雲、或希望低成本建置 S3 儲存系統的開發者。

部署目標與需求

  • API 網域: s3.example-storage.com 提供 S3 API 存取,支援應用程式直接讀寫物件儲存。
  • 管理 Console 網域: console.s3.example-storage.com 提供 MinIO Web 管理介面。
  • 自動化 HTTPS 憑證: 使用 Caddy 自動簽發與續約 Let’s Encrypt 憑證。
  • API 與 Console 完全分流: 避免 API domain 被自動轉導至管理介面。
  • 資料卷規劃: 所有 Volume 掛載於專案資料夾,便於備份與維護。

部署架構設計

部署架構主要包含兩個容器:

  • MinIO 物件儲存服務:提供標準 S3 API 相容接口。
  • Caddy 反向代理伺服器:自動申請 HTTPS 憑證並反向代理 MinIO API 與管理介面。

示意架構:Client → Caddy (HTTPS) → MinIO (API / Console)

網域分工:

  • API domain: s3.example-storage.com
  • Console domain: console.s3.example-storage.com

docker-compose.yml 配置範例

version: '3.8'

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin123
    command: server /data --address ":9000" --console-address ":9001"
    volumes:
      - ./minio_data:/data
    networks:
      - minio_net

  caddy:
    image: caddy:latest
    container_name: caddy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
    networks:
      - minio_net

networks:
  minio_net:

Caddyfile 配置範例

http://console.s3.example-storage.com {
    redir https://console.s3.example-storage.com{uri}
}

http://s3.example-storage.com {
    redir https://s3.example-storage.com{uri}
}

console.s3.example-storage.com {
    reverse_proxy minio:9001
}

s3.example-storage.com {
    reverse_proxy minio:9000
}

最佳實踐與提醒

  • MinIO 預設帳號密碼應更換,避免資安風險。
  • 資料持久化建議:定期備份 minio_data 目錄。
  • Caddy 資料夾權限:確認 caddy_datacaddy_config 權限正確。
  • DNS 設定:請將 API 與 Console 網域指向 Caddy 主機 IP。