services: postgres: image: postgres:16-alpine container_name: karbe-postgres restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-karbe} POSTGRES_USER: ${POSTGRES_USER:-karbe} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD must be set} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 10s timeout: 5s retries: 10 start_period: 20s networks: - karbe minio: image: minio/minio:RELEASE.2026-05-24T17-08-30Z container_name: karbe-minio restart: unless-stopped environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-karbe} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?MINIO_ROOT_PASSWORD must be set} command: server /data --console-address ":9001" volumes: - minio_data:/data healthcheck: test: ["CMD", "curl", "-fsS", "http://127.0.0.1:9000/minio/health/live"] interval: 30s timeout: 5s retries: 5 start_period: 20s networks: - karbe minio-init: image: minio/mc:RELEASE.2026-05-21T01-59-54Z container_name: karbe-minio-init depends_on: minio: condition: service_healthy restart: "no" entrypoint: > /bin/sh -c " mc alias set karbe http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD && mc mb -p karbe/$$S3_BUCKET || true " environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-karbe} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?MINIO_ROOT_PASSWORD must be set} S3_BUCKET: ${S3_BUCKET:-karbe-medias} networks: - karbe app: build: context: . dockerfile: Dockerfile container_name: karbe-app restart: unless-stopped env_file: - .env.production depends_on: postgres: condition: service_healthy minio: condition: service_healthy minio-init: condition: service_completed_successfully networks: - karbe healthcheck: test: ["CMD", "wget", "-qO", "-", "http://127.0.0.1:3000/api/health"] interval: 30s timeout: 5s retries: 5 start_period: 30s caddy: image: caddy:2.10-alpine container_name: karbe-caddy restart: unless-stopped ports: - "80:80" - "443:443" depends_on: app: condition: service_healthy volumes: - ./docker/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config networks: - karbe networks: karbe: name: karbe-net volumes: postgres_data: minio_data: caddy_data: caddy_config: