version: '3.8' services: # Redis Cache Cluster redis: image: redis:7-alpine container_name: ku-redis ports: - "6379:6379" command: > redis-server --maxmemory 2gb --maxmemory-policy allkeys-lru --save "" --appendonly no volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 3 networks: - ku-network # Knowledge Universe API api: build: context: . dockerfile: Dockerfile container_name: ku-api ports: - "8000:8000" - "9090:9090" # Metrics environment: # Redis Configuration - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_DB=0 # Cache Settings - CACHE_TTL_REQUEST=14400 - CACHE_TTL_SOURCE=43200 - MAX_CACHE_MEMORY_GB=2 # Crawler Settings - CRAWLER_TIMEOUT=8 - CRAWLERS_PARALLEL=5 # API Keys (load from .env file) - GITHUB_TOKEN=${GITHUB_TOKEN} - YOUTUBE_API_KEY=${YOUTUBE_API_KEY} - KAGGLE_USERNAME=${KAGGLE_USERNAME} - KAGGLE_KEY=${KAGGLE_KEY} # Application Settings - DEBUG=false - LOG_LEVEL=INFO - ENABLE_METRICS=true depends_on: redis: condition: service_healthy volumes: - ./logs:/app/logs healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s restart: unless-stopped networks: - ku-network # Prometheus (Optional - for monitoring) prometheus: image: prom/prometheus:latest container_name: ku-prometheus ports: - "9091:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' networks: - ku-network profiles: - monitoring # Grafana (Optional - for dashboards) grafana: image: grafana/grafana:latest container_name: ku-grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana-data:/var/lib/grafana depends_on: - prometheus networks: - ku-network profiles: - monitoring volumes: redis-data: prometheus-data: grafana-data: networks: ku-network: driver: bridge