# VoiceForge Production Docker Compose # Scalable, secure production setup version: '3.8' services: # PostgreSQL Database db: image: postgres:15-alpine container_name: voiceforge-db restart: always environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} POSTGRES_DB: ${POSTGRES_DB:-voiceforge} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U postgres" ] interval: 10s timeout: 5s retries: 5 # Redis Cache & Broker redis: image: redis:7-alpine container_name: voiceforge-redis restart: always command: redis-server --save 60 1 --loglevel warning volumes: - redis_data:/data healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 10s timeout: 5s retries: 5 # FastAPI Backend backend: build: context: ../../backend dockerfile: ../deploy/docker/Dockerfile.backend container_name: voiceforge-backend restart: always environment: - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-voiceforge} - REDIS_URL=redis://redis:6379/0 - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials/google-cloud-key.json - API_HOST=0.0.0.0 - API_PORT=8000 volumes: - ../../credentials:/app/credentials:ro - uploads_data:/app/uploads ports: - "8000:8000" depends_on: db: condition: service_healthy redis: condition: service_healthy # Production: Use Gunicorn with Uvicorn workers command: gunicorn app.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000 # Celery Worker worker: build: context: ../../backend dockerfile: ../deploy/docker/Dockerfile.backend container_name: voiceforge-worker restart: always environment: - DATABASE_URL=postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-voiceforge} - REDIS_URL=redis://redis:6379/0 - GOOGLE_APPLICATION_CREDENTIALS=/app/credentials/google-cloud-key.json volumes: - ../../credentials:/app/credentials:ro - uploads_data:/app/uploads depends_on: backend: condition: service_started redis: condition: service_healthy command: celery -A app.workers.celery_app worker --loglevel=warning --concurrency=2 # Streamlit Frontend frontend: build: context: ../../frontend dockerfile: ../deploy/docker/Dockerfile.frontend container_name: voiceforge-frontend restart: always environment: - API_BASE_URL=http://backend:8000 ports: - "8501:8501" depends_on: - backend volumes: postgres_data: redis_data: uploads_data: networks: default: name: voiceforge-network