# ============================================================================= # Docker Compose Configuration for Accessible Video Processing Platform # ============================================================================= # Services: # - api: FastAPI + Gunicorn REST API # - worker: Celery worker for background processing # - mongodb: MongoDB database # - redis: Redis for Celery broker and cache # ============================================================================= version: '3.8' services: # --------------------------------------------------------------------------- # MongoDB Database # --------------------------------------------------------------------------- mongodb: image: mongo:7.0 container_name: accessible-video-mongodb restart: unless-stopped command: ["mongod", "--config", "/etc/mongod.conf"] environment: MONGO_INITDB_DATABASE: ${MONGODB_DB:-accessible_video} volumes: - mongodb-data:/data/db - mongodb-config:/data/configdb - ./config/mongod.conf:/etc/mongod.conf:ro networks: - accessible-video-network healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 30s timeout: 10s retries: 3 start_period: 10s logging: driver: "json-file" options: max-size: "10m" max-file: "3" # --------------------------------------------------------------------------- # Redis Cache and Message Broker # --------------------------------------------------------------------------- redis: image: redis:7-alpine container_name: accessible-video-redis restart: unless-stopped command: redis-server --appendonly yes --maxmemory 2gb --maxmemory-policy allkeys-lru volumes: - redis-data:/data networks: - accessible-video-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 start_period: 5s logging: driver: "json-file" options: max-size: "10m" max-file: "3" # --------------------------------------------------------------------------- # FastAPI Backend API # --------------------------------------------------------------------------- api: build: context: ./backend dockerfile: Dockerfile target: api container_name: accessible-video-api restart: unless-stopped depends_on: mongodb: condition: service_healthy redis: condition: service_healthy ports: - "8003:8000" environment: # App configuration APP_ENV: ${APP_ENV:-dev} API_BASE_URL: ${API_BASE_URL:-http://localhost:8000} # Auth JWT_SECRET: ${JWT_SECRET} JWT_ALG: ${JWT_ALG:-HS256} JWT_ACCESS_TTL_MIN: ${JWT_ACCESS_TTL_MIN:-240} JWT_REFRESH_TTL_DAYS: ${JWT_REFRESH_TTL_DAYS:-7} COOKIE_DOMAIN: ${COOKIE_DOMAIN:-ai-sandbox.oliver.solutions} COOKIE_SECURE: ${COOKIE_SECURE:-true} COOKIE_SAMESITE: ${COOKIE_SAMESITE:-Lax} # Database MONGODB_URI: mongodb://mongodb:27017/${MONGODB_DB:-accessible_video} MONGODB_DB: ${MONGODB_DB:-accessible_video} # Redis REDIS_URL: redis://redis:6379/0 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0 # GCP GCP_PROJECT_ID: ${GCP_PROJECT_ID} GCS_BUCKET: ${GCS_BUCKET:-accessible-video} GOOGLE_APPLICATION_CREDENTIALS: /secrets/gcp-credentials.json # AI Services GEMINI_API_KEY: ${GEMINI_API_KEY} TRANSLATE_API_KEY: ${TRANSLATE_API_KEY:-} ELEVENLABS_API_KEY: ${ELEVENLABS_API_KEY:-} # Email SENDGRID_API_KEY: ${SENDGRID_API_KEY:-} EMAIL_FROM: ${EMAIL_FROM:-noreply@ai-sandbox.oliver.solutions} CLIENT_BASE_URL: ${CLIENT_BASE_URL:-https://ai-sandbox.oliver.solutions/video-accessibility} # Microsoft Authentication AZURE_CLIENT_ID: ${AZURE_CLIENT_ID:-} AZURE_AUTHORITY: ${AZURE_AUTHORITY:-} AZURE_REDIRECT_URI: ${AZURE_REDIRECT_URI:-} # CORS CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:6001,http://localhost:5173,http://localhost:3000} # Observability SENTRY_DSN: ${SENTRY_DSN:-} OTEL_EXPORTER_OTLP_ENDPOINT: ${OTEL_EXPORTER_OTLP_ENDPOINT:-} volumes: - ./secrets:/secrets:ro - api-logs:/app/logs networks: - accessible-video-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # --------------------------------------------------------------------------- # Celery Worker for Background Processing # --------------------------------------------------------------------------- worker: build: context: ./backend dockerfile: Dockerfile target: worker container_name: accessible-video-worker restart: unless-stopped depends_on: mongodb: condition: service_healthy redis: condition: service_healthy environment: # App configuration APP_ENV: ${APP_ENV:-dev} # Auth (required by Settings class even though worker doesn't use it) JWT_SECRET: ${JWT_SECRET} JWT_ALG: ${JWT_ALG:-HS256} JWT_ACCESS_TTL_MIN: ${JWT_ACCESS_TTL_MIN:-240} JWT_REFRESH_TTL_DAYS: ${JWT_REFRESH_TTL_DAYS:-7} COOKIE_DOMAIN: ${COOKIE_DOMAIN:-ai-sandbox.oliver.solutions} COOKIE_SECURE: ${COOKIE_SECURE:-true} COOKIE_SAMESITE: ${COOKIE_SAMESITE:-Lax} # Database MONGODB_URI: mongodb://mongodb:27017/${MONGODB_DB:-accessible_video} MONGODB_DB: ${MONGODB_DB:-accessible_video} # Redis REDIS_URL: redis://redis:6379/0 CELERY_BROKER_URL: redis://redis:6379/0 CELERY_RESULT_BACKEND: redis://redis:6379/0 # GCP GCP_PROJECT_ID: ${GCP_PROJECT_ID} GCS_BUCKET: ${GCS_BUCKET:-accessible-video} GOOGLE_APPLICATION_CREDENTIALS: /secrets/gcp-credentials.json # AI Services GEMINI_API_KEY: ${GEMINI_API_KEY} TRANSLATE_API_KEY: ${TRANSLATE_API_KEY:-} ELEVENLABS_API_KEY: ${ELEVENLABS_API_KEY:-} GOOGLE_TTS_CREDENTIALS: /secrets/gcp-credentials.json # Email SENDGRID_API_KEY: ${SENDGRID_API_KEY:-} EMAIL_FROM: ${EMAIL_FROM:-noreply@ai-sandbox.oliver.solutions} CLIENT_BASE_URL: ${CLIENT_BASE_URL:-https://ai-sandbox.oliver.solutions/video-accessibility} # Microsoft Authentication AZURE_CLIENT_ID: ${AZURE_CLIENT_ID:-} AZURE_AUTHORITY: ${AZURE_AUTHORITY:-} AZURE_REDIRECT_URI: ${AZURE_REDIRECT_URI:-} # CORS CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:6001,http://localhost:5173,http://localhost:3000} # Observability SENTRY_DSN: ${SENTRY_DSN:-} volumes: - ./secrets:/secrets:ro - worker-logs:/app/logs networks: - accessible-video-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" # ============================================================================= # Networks # ============================================================================= networks: accessible-video-network: driver: bridge name: accessible-video-network # ============================================================================= # Volumes # ============================================================================= volumes: mongodb-data: name: accessible-video-mongodb-data mongodb-config: name: accessible-video-mongodb-config redis-data: name: accessible-video-redis-data api-logs: name: accessible-video-api-logs worker-logs: name: accessible-video-worker-logs