services: db: image: postgres:15 restart: always environment: POSTGRES_USER: root POSTGRES_PASSWORD: root POSTGRES_DB: documentintelligence ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U root -d documentintelligence"] interval: 5s timeout: 5s retries: 10 networks: - doc-net redis: image: redis restart: always ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 10 networks: - doc-net qdrant: image: qdrant/qdrant restart: always ports: - "6333:6333" volumes: - qdrant-data:/qdrant/storage healthcheck: test: ["CMD-SHELL", "bash -c 'exec 3<>/dev/tcp/127.0.0.1/6333'"] interval: 5s timeout: 5s retries: 10 networks: - doc-net migrate: build: context: ./server image: docintelligence-server:latest command: uv run alembic upgrade head healthcheck: disable: true depends_on: db: condition: service_healthy env_file: - ./server/.docker.env restart: "no" networks: - doc-net backend: build: context: ./server image: docintelligence-server:latest command: uv run uvicorn app.main:app --host 0.0.0.0 --port 8000 restart: unless-stopped ports: - "8000:8000" depends_on: db: condition: service_healthy redis: condition: service_healthy qdrant: condition: service_healthy migrate: condition: service_completed_successfully env_file: - ./server/.docker.env volumes: - hf-cache:/home/app/.cache/huggingface - uploads-data:/app/uploads networks: - doc-net email-worker: build: context: ./server image: docintelligence-server:latest command: uv run python -m workers.email_worker restart: unless-stopped # workers share the backend image, which bakes in an HTTP healthcheck # for uvicorn; these processes don't serve HTTP, so that check would # always fail here and eventually mark a perfectly fine worker unhealthy healthcheck: disable: true depends_on: db: condition: service_healthy redis: condition: service_healthy migrate: condition: service_completed_successfully env_file: - ./server/.docker.env networks: - doc-net ingestion-worker: build: context: ./server image: docintelligence-server:latest command: uv run python -m workers.ingestion_worker restart: unless-stopped healthcheck: disable: true depends_on: db: condition: service_healthy redis: condition: service_healthy qdrant: condition: service_healthy migrate: condition: service_completed_successfully env_file: - ./server/.docker.env volumes: - hf-cache:/home/app/.cache/huggingface - uploads-data:/app/uploads networks: - doc-net delete-worker: build: context: ./server image: docintelligence-server:latest command: uv run python -m workers.delete_worker restart: unless-stopped healthcheck: disable: true depends_on: db: condition: service_healthy redis: condition: service_healthy qdrant: condition: service_healthy migrate: condition: service_completed_successfully env_file: - ./server/.docker.env volumes: - hf-cache:/home/app/.cache/huggingface - uploads-data:/app/uploads networks: - doc-net frontend: build: context: ./client dockerfile: Dockerfile args: NEXT_PUBLIC_API_URL: http://localhost:8000/api/v1 restart: unless-stopped ports: - "3000:3000" depends_on: backend: condition: service_healthy networks: - doc-net volumes: postgres-data: qdrant-data: hf-cache: uploads-data: networks: doc-net: