Services
| Service | Image | Port | Health Check |
|---|---|---|---|
db | postgres:16-alpine | 5432 | pg_isready -U nil -d nil_benchmark |
minio | minio/minio | 9000, 9001 | curl http://localhost:9000/minio/health/live |
backend | Custom (Python 3.12-slim) | 8000 | Depends on db + minio healthy |
frontend | Custom (Node 22-alpine) | 3000 | Depends on backend |
Startup Order
dbandminiostart in parallel- Health checks must pass before
backendstarts - Backend runs
entrypoint.sh: creates tables viaBase.metadata.create_all(), seeds ifSEED_DB=true frontendstarts after backend is up
Volumes
| Volume | Purpose |
|---|---|
pgdata | PostgreSQL data persistence |
miniodata | MinIO object storage persistence |
./backend:/app | Backend source code (hot-reload) |
./frontend:/app + /app/node_modules | Frontend source (HMR), isolated node_modules |
Network
All services onnil-net bridge network. Frontend proxies /api/* to backend:8000 via Vite config.
Backend Dockerfile
PYTHONPATH=/app is required because the volume mount overrides the installed package. entrypoint.sh handles migrations + seeding before starting uvicorn.