services: postgres: image: postgres:16-alpine environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 10 minio: image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} volumes: - minio-data:/data healthcheck: test: ["CMD", "mc", "ready", "local"] interval: 5s timeout: 5s retries: 10 minio-init: image: minio/mc:latest depends_on: minio: condition: service_healthy environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} MINIO_BUCKET: ${MINIO_BUCKET} entrypoint: > /bin/sh -c " mc alias set local http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD && (mc mb local/$$MINIO_BUCKET || true) && mc anonymous set download local/$$MINIO_BUCKET " migrate: build: context: ./backend target: prod environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} MINIO_ENDPOINT: minio:9000 MINIO_ACCESS_KEY: ${MINIO_ROOT_USER} MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD} MINIO_BUCKET: ${MINIO_BUCKET} MINIO_PUBLIC_URL: ${MINIO_PUBLIC_URL} JWT_SECRET_KEY: ${JWT_SECRET_KEY} JWT_ALGORITHM: ${JWT_ALGORITHM} JWT_EXPIRE_MINUTES: ${JWT_EXPIRE_MINUTES} PUBLIC_BASE_URL: ${PUBLIC_BASE_URL} ALLOWED_ORIGINS: ${ALLOWED_ORIGINS} command: uv run alembic upgrade head depends_on: postgres: condition: service_healthy backend: build: context: ./backend target: prod environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} MINIO_ENDPOINT: minio:9000 MINIO_ACCESS_KEY: ${MINIO_ROOT_USER} MINIO_SECRET_KEY: ${MINIO_ROOT_PASSWORD} MINIO_BUCKET: ${MINIO_BUCKET} MINIO_PUBLIC_URL: ${MINIO_PUBLIC_URL} JWT_SECRET_KEY: ${JWT_SECRET_KEY} JWT_ALGORITHM: ${JWT_ALGORITHM} JWT_EXPIRE_MINUTES: ${JWT_EXPIRE_MINUTES} PUBLIC_BASE_URL: ${PUBLIC_BASE_URL} ALLOWED_ORIGINS: ${ALLOWED_ORIGINS} depends_on: migrate: condition: service_completed_successfully minio-init: condition: service_completed_successfully frontend: build: context: ./frontend target: prod depends_on: - backend volumes: pgdata: minio-data: