# Document Translation API - Production Docker Compose # Usage: docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d version: '3.8' services: # =========================================== # PostgreSQL Database # =========================================== postgres: image: postgres:16-alpine container_name: translate-postgres restart: unless-stopped environment: - POSTGRES_USER=${POSTGRES_USER:-translate} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-translate_secret_123} - POSTGRES_DB=${POSTGRES_DB:-translate_db} - PGDATA=/var/lib/postgresql/data/pgdata volumes: - postgres_data:/var/lib/postgresql/data networks: - translate-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-translate} -d ${POSTGRES_DB:-translate_db}"] interval: 10s timeout: 5s retries: 5 start_period: 10s deploy: resources: limits: memory: 512M reservations: memory: 128M # =========================================== # Backend API Service # =========================================== backend: build: context: . dockerfile: docker/backend/Dockerfile container_name: translate-backend restart: unless-stopped environment: # Database - DATABASE_URL=postgresql+asyncpg://${POSTGRES_USER:-translate}:${POSTGRES_PASSWORD:-translate_secret_123}@postgres:5432/${POSTGRES_DB:-translate_db} # Redis - REDIS_URL=redis://redis:6379/0 # Translation Services - TRANSLATION_SERVICE=${TRANSLATION_SERVICE:-ollama} - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://ollama:11434} - OLLAMA_MODEL=${OLLAMA_MODEL:-llama3} - DEEPL_API_KEY=${DEEPL_API_KEY:-} - OPENAI_API_KEY=${OPENAI_API_KEY:-} - OPENROUTER_API_KEY=${OPENROUTER_API_KEY:-} # File Limits - MAX_FILE_SIZE_MB=${MAX_FILE_SIZE_MB:-50} # Rate Limiting - RATE_LIMIT_REQUESTS_PER_MINUTE=${RATE_LIMIT_REQUESTS_PER_MINUTE:-60} - RATE_LIMIT_TRANSLATIONS_PER_MINUTE=${RATE_LIMIT_TRANSLATIONS_PER_MINUTE:-10} # Admin Auth (CHANGE IN PRODUCTION!) - ADMIN_USERNAME=${ADMIN_USERNAME} - ADMIN_PASSWORD=${ADMIN_PASSWORD} # Security - JWT_SECRET=${JWT_SECRET} - CORS_ORIGINS=${CORS_ORIGINS:-https://yourdomain.com} # Stripe Payments - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY:-} - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET:-} - STRIPE_STARTER_PRICE_ID=${STRIPE_STARTER_PRICE_ID:-} - STRIPE_PRO_PRICE_ID=${STRIPE_PRO_PRICE_ID:-} - STRIPE_BUSINESS_PRICE_ID=${STRIPE_BUSINESS_PRICE_ID:-} volumes: - uploads_data:/app/uploads - outputs_data:/app/outputs - logs_data:/app/logs networks: - translate-network depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 10s deploy: resources: limits: memory: 2G reservations: memory: 512M # =========================================== # Frontend Web Service # =========================================== frontend: build: context: . dockerfile: docker/frontend/Dockerfile args: - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-http://backend:8000} container_name: translate-frontend restart: unless-stopped environment: - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL:-http://backend:8000} networks: - translate-network depends_on: backend: condition: service_healthy deploy: resources: limits: memory: 512M reservations: memory: 128M # =========================================== # Nginx Reverse Proxy # =========================================== nginx: image: nginx:alpine container_name: translate-nginx restart: unless-stopped ports: - "${HTTP_PORT:-80}:80" - "${HTTPS_PORT:-443}:443" volumes: - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./docker/nginx/conf.d:/etc/nginx/conf.d:ro - ./docker/nginx/ssl:/etc/nginx/ssl:ro - nginx_cache:/var/cache/nginx networks: - translate-network depends_on: - frontend - backend healthcheck: test: ["CMD", "nginx", "-t"] interval: 30s timeout: 10s retries: 3 # =========================================== # Ollama (Optional - Local LLM) # =========================================== ollama: image: ollama/ollama:latest container_name: translate-ollama restart: unless-stopped volumes: - ollama_data:/root/.ollama networks: - translate-network deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] profiles: - with-ollama # =========================================== # Redis (Caching & Sessions) # =========================================== redis: image: redis:7-alpine container_name: translate-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data networks: - translate-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # =========================================== # Prometheus (Optional - Monitoring) # =========================================== prometheus: image: prom/prometheus:latest container_name: translate-prometheus restart: unless-stopped volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.enable-lifecycle' networks: - translate-network profiles: - with-monitoring # =========================================== # Grafana (Optional - Dashboards) # =========================================== grafana: image: grafana/grafana:latest container_name: translate-grafana restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=${GRAFANA_USER:-admin} - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin} - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana_data:/var/lib/grafana - ./docker/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro networks: - translate-network depends_on: - prometheus profiles: - with-monitoring # =========================================== # Networks # =========================================== networks: translate-network: driver: bridge ipam: config: - subnet: 172.28.0.0/16 # =========================================== # Volumes # =========================================== volumes: postgres_data: driver: local uploads_data: driver: local outputs_data: driver: local logs_data: driver: local nginx_cache: driver: local ollama_data: driver: local redis_data: driver: local prometheus_data: driver: local grafana_data: driver: local