services: # === WEB (Einstiegspunkt, einziger Service mit externem Port) === web: build: context: . dockerfile: Dockerfile.web ports: - "${PORT:-3000}:3000" environment: - NODE_ENV=production - API_INTERNAL_URL=http://api:3000 depends_on: api: condition: service_healthy restart: unless-stopped # === API === api: build: context: . dockerfile: Dockerfile.api environment: - DATABASE_URL=postgresql://musichub:${POSTGRES_PASSWORD}@postgres:5432/musichub - S3_ENDPOINT=http://minio:9000 - S3_ACCESS_KEY=${S3_ACCESS_KEY:-minioadmin} - S3_SECRET_KEY=${S3_SECRET_KEY:-minioadmin} - S3_BUCKET=${S3_BUCKET:-music-hub} - APP_URL=${APP_URL} - MAGIC_LINK_SECRET=${MAGIC_LINK_SECRET} - RESEND_API_KEY=${RESEND_API_KEY:-} - EMAIL_FROM=${EMAIL_FROM:-Music Hub } - NODE_ENV=production depends_on: postgres: condition: service_healthy minio-init: condition: service_completed_successfully healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # === POSTGRES === postgres: image: postgres:16-alpine environment: POSTGRES_USER: musichub POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: musichub volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U musichub"] interval: 5s timeout: 3s retries: 10 restart: unless-stopped # === MINIO (S3-kompatibel) === minio: image: minio/minio command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${S3_ACCESS_KEY:-minioadmin} MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY:-minioadmin} volumes: - miniodata:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 10s timeout: 5s retries: 5 restart: unless-stopped # === MINIO INIT (Bucket anlegen, einmalig) === minio-init: image: minio/mc depends_on: minio: condition: service_healthy entrypoint: > /bin/sh -c " mc alias set local http://minio:9000 $${S3_ACCESS_KEY:-minioadmin} $${S3_SECRET_KEY:-minioadmin} && mc mb -p local/$${S3_BUCKET:-music-hub} && echo 'Bucket ready' " # === DB MIGRATION (einmalig bei Deploy) === migrate: build: context: . dockerfile: Dockerfile.api command: bunx drizzle-kit migrate working_dir: /app/packages/db environment: - DATABASE_URL=postgresql://musichub:${POSTGRES_PASSWORD}@postgres:5432/musichub depends_on: postgres: condition: service_healthy restart: "no" volumes: pgdata: miniodata: