version: '3.8' services: # PostgreSQL Database db: image: postgres:16-alpine container_name: pounce-db restart: unless-stopped environment: POSTGRES_USER: pounce POSTGRES_PASSWORD: ${DB_PASSWORD:-changeme} POSTGRES_DB: pounce volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U pounce"] interval: 10s timeout: 5s retries: 5 # Redis (job queue + rate limiting storage) redis: image: redis:7-alpine container_name: pounce-redis restart: unless-stopped command: ["redis-server", "--appendonly", "yes"] volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # FastAPI Backend backend: build: context: ./backend dockerfile: Dockerfile container_name: pounce-backend restart: unless-stopped ports: - "8000:8000" environment: DATABASE_URL: postgresql+asyncpg://pounce:${DB_PASSWORD:-changeme}@db:5432/pounce SECRET_KEY: ${SECRET_KEY:-change-this-in-production} CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:3000} ENABLE_SCHEDULER: "false" ENABLE_JOB_QUEUE: "true" REDIS_URL: redis://redis:6379/0 RATE_LIMIT_STORAGE_URI: redis://redis:6379/0 ENABLE_METRICS: "true" depends_on: db: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 # Scheduler (APScheduler) - runs background jobs in a separate process scheduler: build: context: ./backend dockerfile: Dockerfile container_name: pounce-scheduler restart: unless-stopped environment: DATABASE_URL: postgresql+asyncpg://pounce:${DB_PASSWORD:-changeme}@db:5432/pounce SECRET_KEY: ${SECRET_KEY:-change-this-in-production} ENABLE_SCHEDULER: "true" depends_on: db: condition: service_healthy command: ["python", "run_scheduler.py"] # Worker (ARQ / Redis job queue) worker: build: context: ./backend dockerfile: Dockerfile container_name: pounce-worker restart: unless-stopped environment: DATABASE_URL: postgresql+asyncpg://pounce:${DB_PASSWORD:-changeme}@db:5432/pounce SECRET_KEY: ${SECRET_KEY:-change-this-in-production} ENABLE_SCHEDULER: "false" ENABLE_JOB_QUEUE: "true" REDIS_URL: redis://redis:6379/0 depends_on: db: condition: service_healthy redis: condition: service_healthy command: ["arq", "app.jobs.worker.WorkerSettings"] # Next.js Frontend frontend: build: context: ./frontend dockerfile: Dockerfile container_name: pounce-frontend restart: unless-stopped ports: - "3000:3000" environment: NEXT_PUBLIC_API_URL: ${API_URL:-http://localhost:8000} depends_on: - backend volumes: postgres_data: redis_data: