45 lines
1.3 KiB
Markdown
45 lines
1.3 KiB
Markdown
|
|
# 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
|