# MadBase - Pillar: Storage (Self-Hosted, High Availability) # Distributed MinIO with erasure coding # # Requires 4 nodes minimum for erasure coding. Each node needs its own block storage volume. # This setup provides fault tolerance with N/2 drive failure tolerance. services: minio1: image: quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z hostname: minio1 container_name: madbase_minio1 command: server http://minio{1...4}/data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY} MINIO_BROWSER_REDIRECT_URL: http://localhost:9001 volumes: - minio1_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped minio2: image: quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z hostname: minio2 container_name: madbase_minio2 command: server http://minio{1...4}/data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY} MINIO_BROWSER_REDIRECT_URL: http://localhost:9001 volumes: - minio2_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped minio3: image: quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z hostname: minio3 container_name: madbase_minio3 command: server http://minio{1...4}/data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY} MINIO_BROWSER_REDIRECT_URL: http://localhost:9001 volumes: - minio3_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped minio4: image: quay.io/minio/minio:RELEASE.2024-06-13T22-53-53Z hostname: minio4 container_name: madbase_minio4 command: server http://minio{1...4}/data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY} MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY} MINIO_BROWSER_REDIRECT_URL: http://localhost:9001 volumes: - minio4_data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # Load balancer (optional - for production use nginx or traefik) # This is a simple round-robin proxy minio-lb: image: nginx:alpine container_name: madbase_minio_lb ports: - "9000:9000" - "9001:9001" volumes: - ./config/nginx-minio.conf:/etc/nginx/nginx.conf:ro depends_on: - minio1 - minio2 - minio3 - minio4 restart: unless-stopped volumes: minio1_data: minio2_data: minio3_data: minio4_data: networks: default: name: madbase external: true