Content hash: 3cf21ed5c92152f4740b6367e50ee8bec344a828995426fafd43be97a1c1db95
# docker-compose.yml — Production-ready multi-service stack
# App (FastAPI) + PostgreSQL + Redis + Nginx
#
# Usage:
# docker compose config --quiet # validate
# docker compose up -d # start
# docker compose ps # verify
# docker compose logs -f app # tail logs
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
DATABASE_URL: "postgresql+asyncpg://appuser:changeme@db:5432/appdb"
REDIS_URL: "redis://redis:6379/0"
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 10s
timeout: 5s
retries: 3
start_period: 15s
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: appuser
POSTGRES_PASSWORD: changeme
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"]
interval: 5s
timeout: 3s
retries: 5
restart: unless-stopped
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redisdata:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 3
restart: unless-stopped
nginx:
image: nginx:1.27-alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
restart: unless-stopped
volumes:
pgdata:
redisdata: