services: qdrant: image: qdrant/qdrant:latest container_name: rag_qdrant ports: - "6333:6333" - "6334:6334" volumes: - qdrant_data:/qdrant/storage restart: unless-stopped healthcheck: test: [ "CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/6333'" ] interval: 15s timeout: 10s retries: 10 start_period: 30s redis: image: redis:7-alpine container_name: rag_redis ports: - "6379:6379" volumes: - redis_data:/data restart: unless-stopped healthcheck: test: [ "CMD", "redis-cli", "ping" ] interval: 10s timeout: 5s retries: 5 start_period: 5s mongodb: image: mongo:7 container_name: rag_mongodb ports: - "27017:27017" volumes: - mongo_data:/data/db restart: unless-stopped healthcheck: test: [ "CMD", "mongosh", "--eval", "db.adminCommand('ping')" ] interval: 10s timeout: 5s retries: 5 start_period: 10s backend: build: context: . dockerfile: Dockerfile.backend container_name: rag_backend ports: - "8000:8000" env_file: .env environment: - QDRANT_HOST=qdrant - QDRANT_PORT=6333 volumes: - ./uploads:/app/uploads - .:/app - hf_cache:/root/.cache/huggingface - fastembed_cache:/root/.cache/fastembed depends_on: qdrant: condition: service_healthy redis: condition: service_healthy mongodb: condition: service_healthy restart: unless-stopped command: uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload # ── Frontend React (Assistant Pédagogique) → http://localhost:3001 ── frontend: build: context: . dockerfile: Dockerfile.frontend container_name: rag_frontend ports: - "3001:3001" depends_on: - backend restart: unless-stopped # ── Admin Panel Streamlit → http://localhost:8502 ── admin: build: context: . dockerfile: Dockerfile.admin container_name: rag_admin ports: - "8502:8502" environment: - BACKEND_URL=http://backend:8000 volumes: - .:/app depends_on: - backend restart: unless-stopped command: > streamlit run frontend/admin_panel/admin.py --server.port 8502 --server.address 0.0.0.0 --server.enableCORS false --server.enableXsrfProtection false # ── Celery Worker → Async RAG processing ── celery_worker: build: context: . dockerfile: Dockerfile.backend container_name: rag_celery_worker env_file: .env environment: - QDRANT_HOST=qdrant - QDRANT_PORT=6333 volumes: - ./uploads:/app/uploads - .:/app - hf_cache:/root/.cache/huggingface - fastembed_cache:/root/.cache/fastembed depends_on: redis: condition: service_healthy qdrant: condition: service_healthy restart: unless-stopped command: celery -A backend.celery_app worker --loglevel=info --concurrency=2 -Q celery,priority prometheus: image: prom/prometheus:latest container_name: rag_prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" restart: unless-stopped grafana: image: grafana/grafana:latest container_name: rag_grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards depends_on: - prometheus restart: unless-stopped volumes: qdrant_data: redis_data: mongo_data: prometheus_data: grafana_data: hf_cache: fastembed_cache: