version: "3.9" services: db: image: postgres:15-alpine environment: POSTGRES_USER: ${POSTGRES_USER:-airpg} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-airpg} POSTGRES_DB: ${POSTGRES_DB:-airpg} volumes: - pg_data:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-airpg}"] interval: 5s timeout: 3s retries: 10 qdrant: image: qdrant/qdrant:v1.9.0 environment: QDRANT__LOG_LEVEL: INFO volumes: - qdrant_data:/qdrant/storage ports: - "6333:6333" - "6334:6334" healthcheck: test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/6333 && echo -e 'GET /collections HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n' >&3 && head -n 1 <&3 | grep -q 200"] interval: 10s timeout: 5s retries: 10 backend: build: context: . dockerfile: deploy/Dockerfile.backend env_file: - .env environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-airpg}:${POSTGRES_PASSWORD:-airpg}@db:5432/${POSTGRES_DB:-airpg} QDRANT_URL: http://qdrant:6333 volumes: - ./data:/app/data - ./app:/app/app ports: - "8000:8000" depends_on: db: condition: service_healthy qdrant: condition: service_healthy frontend: build: context: ./frontend dockerfile: ../deploy/Dockerfile.frontend environment: VITE_API_BASE_URL: /api ports: - "5173:5173" depends_on: - backend volumes: pg_data: qdrant_data: