| services: | |
| postgres: | |
| image: pgvector/pgvector:pg16 | |
| container_name: rag-postgres | |
| environment: | |
| POSTGRES_DB: ${POSTGRES_DB} | |
| POSTGRES_USER: ${POSTGRES_USER} | |
| POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} | |
| ports: | |
| - "5432:5432" | |
| volumes: | |
| - pgdata:/var/lib/postgresql/data | |
| - ./ingest/schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro | |
| healthcheck: | |
| test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] | |
| interval: 5s | |
| timeout: 3s | |
| retries: 10 | |
| restart: unless-stopped | |
| api: | |
| build: | |
| context: . | |
| dockerfile: Dockerfile | |
| container_name: rag-api | |
| env_file: | |
| - .env | |
| environment: | |
| # Override DATABASE_URL for in-container networking. The .env value | |
| # uses localhost so the host-side ingest script works; this override | |
| # routes the API container to the postgres service hostname. | |
| DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB} | |
| # Allow same-origin requests from the API host to its own /ui page | |
| # (the UI is served from this container, not a separate one). | |
| CORS_ORIGIN: http://localhost:8000 | |
| ports: | |
| - "8000:8000" | |
| volumes: | |
| # Expose the eval harness output directory to the dashboard. | |
| # Read-only: the container never writes here; the host runs | |
| # eval/run_eval.py and the container renders what it finds. | |
| - ./eval/results:/app/eval/results:ro | |
| depends_on: | |
| postgres: | |
| condition: service_healthy | |
| restart: unless-stopped | |
| # The UI lives at /ui inside the api container — no separate UI service. | |
| # Phase 5 swapped Streamlit for HTMX templates served by FastAPI directly. | |
| volumes: | |
| pgdata: | |