services: api: build: context: . dockerfile: Dockerfile ports: - "8000:8000" environment: - DATABASE_URL=postgresql+asyncpg://postgres:${ECOGUARD_DOCKER_POSTGRES_PASSWORD:-ecoguard-local-password}@postgres:5432/ecoguard - REDIS_URL=${ECOGUARD_REDIS_URL:-redis://redis:6379} - MODEL_PATH=/app/models/tinyllama.gguf - ENVIRONMENT=production - LOG_LEVEL=INFO - AUTH_ENABLED=true - API_KEYS=[] - JWT_SECRET=${ECOGUARD_DOCKER_JWT_SECRET:?Set ECOGUARD_DOCKER_JWT_SECRET (min 32 chars)} - ADMIN_USERNAME=${ECOGUARD_DOCKER_ADMIN_USERNAME:?Set ECOGUARD_DOCKER_ADMIN_USERNAME} - ADMIN_PASSWORD=${ECOGUARD_DOCKER_ADMIN_PASSWORD:?Set ECOGUARD_DOCKER_ADMIN_PASSWORD} - CORS_ORIGINS=${ECOGUARD_DOCKER_CORS_ORIGINS:-["http://localhost:8000","http://localhost:5173"]} - RATE_LIMIT_ENABLED=true - METRICS_ENABLED=true - CACHE_ENABLED=false - CACHE_TTL_SECONDS=300 - CACHE_MAX_ENTRIES=1000 - AUTO_MIGRATE=true - GUARDRAILS_ENABLED=${ECOGUARD_GUARDRAILS_ENABLED:-false} - IP_ALLOWLIST=${ECOGUARD_IP_ALLOWLIST:-[]} - REQUEST_TIMEOUT_SECONDS=120 - MAX_CONCURRENT_INFERENCE=4 - DRIFT_ALERT_THRESHOLD=0.8 - DEMO_MODE=false - OTLP_ENDPOINT=${ECOGUARD_OTLP_ENDPOINT:-} - BACKEND=${ECOGUARD_BACKEND:-llama-cpp} - BACKEND_URL=${ECOGUARD_BACKEND_URL:-} volumes: - ./models:/app/models:ro depends_on: postgres: condition: service_healthy redis: condition: service_started restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/health"] interval: 30s timeout: 5s retries: 3 start_period: 60s redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 postgres: image: postgres:15-alpine environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=${ECOGUARD_DOCKER_POSTGRES_PASSWORD:-ecoguard-local-password} - POSTGRES_DB=ecoguard ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d ecoguard"] interval: 10s timeout: 5s retries: 5 volumes: postgres_data: redis_data: