services: # ========================================== # 1. Vector Database Service # ========================================== db: image: pgvector/pgvector:pg16 container_name: localragvault-db restart: always environment: POSTGRES_DB: ${DB_NAME:-localragvault} POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-localragvault_secure_pass} volumes: - pgdata:/var/lib/postgresql/data ports: - "5433:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-localragvault}"] interval: 5s timeout: 5s retries: 5 start_period: 10s networks: - vault-net # ========================================== # 2. FastAPI Backend Service # ========================================== api: build: context: . target: api container_name: localragvault-api restart: always env_file: - .env.docker environment: # Explicitly override database host to point to the 'db' service DB_HOST: db ports: - "8000:8000" extra_hosts: # Ensures host.docker.internal resolves on Linux desktops - "host.docker.internal:host-gateway" volumes: - uploads_data:/app/uploads - logs_data:/app/logs depends_on: db: condition: service_healthy networks: - vault-net # ========================================== # 3. Streamlit UI Dashboard # ========================================== ui: build: context: . target: ui container_name: localragvault-ui restart: always env_file: - .env.docker environment: # Inside Docker, Streamlit reaches FastAPI via internal DNS ('http://api:8000') API_BASE_URL: http://api:8000 ports: - "8501:8501" extra_hosts: - "host.docker.internal:host-gateway" depends_on: - api networks: - vault-net # ========================================== # Named Volumes & Private Networks # ========================================== volumes: pgdata: name: localragvault_pgdata uploads_data: name: localragvault_uploads logs_data: name: localragvault_logs networks: vault-net: name: localragvault_network driver: bridge