services: proxy: image: nginx:1.27-alpine container_name: wrapped-proxy restart: unless-stopped ports: - "${APP_PORT:-8000}:80" volumes: - ./deploy/nginx.dev.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - app app: build: context: . dockerfile: Dockerfile container_name: wrapped-app restart: unless-stopped expose: - "8000" env_file: - .env environment: DATABASE_URL: postgresql+asyncpg://wrapped:wrapped@postgres:5432/wrapped S3_ENDPOINT_URL: http://minio:9000 S3_ACCESS_KEY: wrappedminio S3_SECRET_KEY: wrappedminio123 S3_BUCKET: wrapped S3_USE_SSL: "false" S3_CREATE_BUCKET: "true" APP_BASE_URL: ${APP_BASE_URL:-http://localhost:8000} # Trust docker / compose networks so nginx X-Real-IP / X-Forwarded-For are used. TRUSTED_PROXIES: ${TRUSTED_PROXIES:-127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16} depends_on: postgres: condition: service_healthy minio: condition: service_started minio-init: condition: service_completed_successfully volumes: - ./app:/app/app:ro command: > sh -c "alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload --proxy-headers --forwarded-allow-ips='*'" postgres: image: postgres:16-alpine container_name: wrapped-postgres restart: unless-stopped environment: POSTGRES_USER: wrapped POSTGRES_PASSWORD: wrapped POSTGRES_DB: wrapped # Not published by default (host :5432 often busy). Set POSTGRES_PORT to expose. ports: - "${POSTGRES_PORT:-127.0.0.1:5433}:5432" volumes: - wrapped_pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U wrapped -d wrapped"] interval: 5s timeout: 5s retries: 10 minio: image: minio/minio:latest container_name: wrapped-minio restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: wrappedminio MINIO_ROOT_PASSWORD: wrappedminio123 ports: - "${MINIO_API_PORT:-9000}:9000" - "${MINIO_CONSOLE_PORT:-9001}:9001" volumes: - wrapped_minio_data:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 5 minio-init: image: minio/mc:latest container_name: wrapped-minio-init depends_on: minio: condition: service_healthy entrypoint: > /bin/sh -c " mc alias set local http://minio:9000 wrappedminio wrappedminio123 && mc mb --ignore-existing local/wrapped && exit 0 " volumes: wrapped_pg_data: wrapped_minio_data: