Запуск MinIO через Traefik с Docker Compose

MinIO — S3-совместимое объектное хранилище: бэкапы, артефакты CI, вложения приложений, статика. Ниже — один узел за Traefik: API на s3.(yourdomain), консоль на minio.(yourdomain).

Нужны рабочий Traefik и сеть traefik_network.

1. Каталог и .env

mkdir -p minio/data
cd minio
cat > .env <<'EOF'
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=(youpassword)
MINIO_BUCKET=data
EOF

Пароль — длинный (MinIO требует не меньше 8 символов; лучше 16+).

2. docker-compose.yml

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
    volumes:
      - ./data:/data
    labels:
      - traefik.enable=true
      # S3 API :9000
      - traefik.http.middlewares.minio_api_https.redirectscheme.scheme=https
      - traefik.http.routers.minio_api.entrypoints=web
      - traefik.http.routers.minio_api.middlewares=minio_api_https@docker
      - traefik.http.routers.minio_api.rule=Host(`s3.(yourdomain)`)
      - traefik.http.routers.minio_api_https.entrypoints=websecure
      - traefik.http.routers.minio_api_https.rule=Host(`s3.(yourdomain)`)
      - traefik.http.routers.minio_api_https.tls=true
      - traefik.http.routers.minio_api_https.tls.certresolver=le
      - traefik.http.routers.minio_api_https.service=minio_api
      - traefik.http.services.minio_api.loadbalancer.server.port=9000
      # Console :9001
      - traefik.http.middlewares.minio_console_https.redirectscheme.scheme=https
      - traefik.http.routers.minio_console.entrypoints=web
      - traefik.http.routers.minio_console.middlewares=minio_console_https@docker
      - traefik.http.routers.minio_console.rule=Host(`minio.(yourdomain)`)
      - traefik.http.routers.minio_console_https.entrypoints=websecure
      - traefik.http.routers.minio_console_https.rule=Host(`minio.(yourdomain)`)
      - traefik.http.routers.minio_console_https.tls=true
      - traefik.http.routers.minio_console_https.tls.certresolver=le
      - traefik.http.routers.minio_console_https.service=minio_console
      - traefik.http.services.minio_console.loadbalancer.server.port=9001
    networks:
      - traefik_network

  minio-init:
    image: minio/mc:latest
    container_name: minio-init
    depends_on:
      - minio
    entrypoint: ["/bin/sh", "-c"]
    command:
      - |
        for i in $$(seq 1 30); do
          mc alias set local http://minio:9000 $${MINIO_ROOT_USER} $${MINIO_ROOT_PASSWORD} && break
          sleep 1
        done
        mc mb -p local/$${MINIO_BUCKET} || true
        exit 0
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
      MINIO_BUCKET: ${MINIO_BUCKET}
    networks:
      - traefik_network
    restart: "no"

networks:
  traefik_network:
    external: true

⚠️ Замените (yourdomain) и пароль. Два Host-правила — отдельные сервисы Traefik на порты 9000 и 9001.

3. Запуск

docker compose up -d

Консоль: https://minio.(yourdomain) (root user/password из .env).
S3 endpoint для приложений: https://s3.(yourdomain).

Пример для клиента / .env приложения:

S3_ENDPOINT=https://s3.(yourdomain)
S3_ACCESS_KEY=minio
S3_SECRET_KEY=(youpassword)
S3_BUCKET=data
S3_USE_SSL=true

4. Замечания

  • Бэкапьте ./data (или том) — это объекты и метаданные.
  • Для продакшена лучше отдельный IAM-пользователь/ключи, не root; консоль можно закрыть allowlist/Authelia.
  • Path-style vs virtual-host: за одним хостом s3.(yourdomain) обычно хватает path-style (https://s3…/bucket/key).
  • Рядом с rclone crypt, Nextcloud и CI registry MinIO закрывает роль «свой S3».

Итог: S3 API + веб-консоль за HTTPS на том же Docker + Traefik стеке.