# Deploy — Docker Compose ## Stack - Docker Compose with 3 services: `api` (FastAPI), `frontend` (nginx/React), `mlflow` - Multi-stage Dockerfiles: build stage → production stage - Env vars via `.env` file (see `.env.example` for template) ## Files ``` deploy/ docker-compose.yml # Main: api + frontend + PostgreSQL/PostGIS docker-compose.mlflow.yml # MLflow tracking server .env.example # Required env vars template backend/Dockerfile # FastAPI app image backend/.dockerignore frontend/Dockerfile # nginx serving built React app frontend/.dockerignore ``` ## Running ```bash # Full stack docker compose -f deploy/docker-compose.yml up -d # With MLflow docker compose -f deploy/docker-compose.yml -f deploy/docker-compose.mlflow.yml up -d ``` ## Conventions - Never commit `.env` — use `.env.example` as template - Dockerfiles use multi-stage builds to minimize image size - Frontend is built during Docker build, served by nginx - Backend runs uvicorn with `--host 0.0.0.0` inside container ## Anti-Patterns - Don't hardcode ports in docker-compose — use env vars - Don't commit secrets to `.env.example` — placeholder values only - Don't run as root in Dockerfiles — create non-root user - Don't skip `.dockerignore` — keeps build context small