/ docker-compose.yml
docker-compose.yml
  1  services:
  2    # Qdrant vector database service (optional - only needed when using Qdrant)
  3    qdrant:
  4      image: qdrant/qdrant:v1.10.0
  5      container_name: qdrant
  6      ports:
  7        - "6333:6333"  # REST API
  8        - "6334:6334"  # gRPC API
  9      volumes:
 10        - qdrant_storage:/qdrant/storage
 11      environment:
 12        - QDRANT__SERVICE__GRPC_PORT=6334
 13      restart: unless-stopped
 14  
 15    # Service for ingesting documents
 16    ingest:
 17      build: .
 18      image: rag-poc-v1
 19      container_name: rag-ingest
 20      volumes:
 21        - vector_db:/app/vector_db
 22        - ./data:/app/data
 23        - ./config.yaml:/app/config.yaml:ro
 24        - ./access_mapping.json:/app/access_mapping.json:ro
 25      environment:
 26        - PYTHONUNBUFFERED=1
 27      command: python src/cli/ingest.py --help
 28      # Uncomment when using GPU: 
 29      # deploy:
 30      #   resources:
 31      #     reservations:
 32      #       devices:
 33      #         - driver: nvidia
 34      #           count: all
 35      #           capabilities: [gpu]
 36  
 37    # Service for querying documents
 38    query:
 39      build: .
 40      image: rag-poc-v1
 41      container_name: rag-query
 42      volumes:
 43        - vector_db:/app/vector_db
 44        - ./config.yaml:/app/config.yaml:ro
 45        - ./access_mapping.json:/app/access_mapping.json:ro
 46      environment:
 47        - PYTHONUNBUFFERED=1
 48      command: python src/cli/query.py --help
 49  
 50    # API Server - OpenAI-compatible endpoint
 51    api:
 52      build: .
 53      image: rag-poc-v1
 54      container_name: smpte-api-server
 55      ports:
 56        - "8000:8000"
 57      volumes:
 58        - vector_db:/app/vector_db
 59        - ./config.yaml:/app/config.yaml:ro
 60        - ./access_mapping.json:/app/access_mapping.json:ro
 61        - ./user_mapping.json:/app/user_mapping.json:ro
 62      environment:
 63        - PYTHONUNBUFFERED=1
 64      command: uvicorn src.api.server:app --host 0.0.0.0 --port 8000 --reload
 65      healthcheck:
 66        test:
 67          [
 68            "CMD",
 69            "python",
 70            "-c",
 71            "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')",
 72          ]
 73        interval: 30s
 74        timeout: 10s
 75        retries: 3
 76        start_period: 40s
 77  
 78    # OpenWebUI - Chat interface with Google OAuth
 79    openwebui:
 80      image: ghcr.io/open-webui/open-webui:main
 81      container_name: openwebui
 82      ports:
 83        - "3000:8080"
 84      environment:
 85        - OPENAI_API_BASE_URL=http://api:8000/v1
 86        - OPENAI_API_KEY=${OPENAI_API_KEY:-dummy}
 87        # Forward user info headers to API for role-based access
 88        - ENABLE_FORWARD_USER_INFO_HEADERS=true
 89        # Google OAuth only (disable email/password login)
 90        - ENABLE_LOGIN_FORM=false
 91        - ENABLE_OAUTH_SIGNUP=true
 92        - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
 93        - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
 94        - OPENID_PROVIDER_URL=https://accounts.google.com/.well-known/openid-configuration
 95        - WEBUI_URL=${CALLBACK_WEBUI_URL}
 96        # Branding
 97        - WEBUI_NAME=${WEBUI_NAME:-SMPTE Copilot}
 98        - DEFAULT_LOCALE=${DEFAULT_LOCALE:-en}
 99        # Model configuration - Pipe will be the primary model
100        - MODEL_FILTER_ENABLED=false
101        # Disable unused features
102        - ENABLE_IMAGE_GENERATION=false
103        - ENABLE_COMMUNITY_SHARING=false
104        # RAG settings (handled by our custom backend, disable built-in)
105        - ENABLE_RAG_WEB_SEARCH=false
106        - ENABLE_RAG_LOCAL_WEB_FETCH=false
107      volumes:
108        - openwebui-data:/app/backend/data
109      depends_on:
110        api:
111          condition: service_healthy
112  
113  volumes:
114    vector_db:
115    qdrant_storage:
116    openwebui-data: