services: frontend: build: context: . dockerfile: Dockerfile.frontend args: API_BASE_URL: http://backend:8081 ports: - "127.0.0.1:8080:8080" depends_on: backend: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:8080/health"] interval: 10s timeout: 5s retries: 5 start_period: 10s backend: build: context: . dockerfile: Dockerfile.backend ports: - "127.0.0.1:8081:8081" environment: COMPONENT_DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} COMPONENT_DATABASE_MAX_CONNECTIONS: ${COMPONENT_DATABASE_MAX_CONNECTIONS:-8} COMPONENT_DATABASE_CONNECT_TIMEOUT_SECS: ${COMPONENT_DATABASE_CONNECT_TIMEOUT_SECS:-10} depends_on: postgres: condition: service_healthy healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost:8081/v1/health"] interval: 5s timeout: 3s retries: 10 start_period: 5s # Migrations run automatically on startup via docker-entrypoint.sh when COMPONENT_DATABASE_URL is set. postgres: image: postgres:17-alpine environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} ports: - "127.0.0.1:5432:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 3s retries: 5 start_period: 5s volumes: postgres-data: