services: kb-query: build: # Repo-root context (not the usual `.` = this dir) so the Dockerfile can # `COPY packages/kb-retrieval/` โ€” the packages/ Dockerfile convention from # CLAUDE.md. scripts/deploy/deploy.sh's gate and deploy-node.sh's # `docker compose ... up --build` both resolve this the same way. context: ../.. dockerfile: services/kb-query/Dockerfile container_name: kb-query restart: unless-stopped ports: # LAN-only bind, never 0.0.0.0 โ€” same convention as paperless/nextcloud # (exposure: private). npm@PIHA vhost + OIDC are a later step (plan ยง8); # this bind is what that vhost will eventually proxy to. # Requires .env (from env.example) next to this file at deploy. - "${LAN_BIND_IP}:8230:8080" environment: - KB_DSN=${KB_DSN} # Embed backends (Krok 2, aktywny fallback โ€” app/embed_router.py): primary is # Ollama @ SOLARIA (GPU, duty-cycled), fallback is ollama-piha on this host # (CPU, OLLAMA_KEEP_ALIVE=0). Empty EMBED_FALLBACK_URL disables the fallback # leg (pre-Krok-2 behaviour: /search 503s while SOLARIA sleeps). - EMBED_PRIMARY_URL=${EMBED_PRIMARY_URL:-http://solaria:11434} - EMBED_FALLBACK_URL=${EMBED_FALLBACK_URL:-} - EMBED_PRIMARY_NAME=${EMBED_PRIMARY_NAME:-solaria} - EMBED_FALLBACK_NAME=${EMBED_FALLBACK_NAME:-piha} - EMBED_HEALTH_TTL_S=${EMBED_HEALTH_TTL_S:-30} - EMBED_HEALTH_TIMEOUT_S=${EMBED_HEALTH_TIMEOUT_S:-1.5} - EMBED_PRIMARY_TIMEOUT_S=${EMBED_PRIMARY_TIMEOUT_S:-3} - EMBED_MODEL=${EMBED_MODEL:-bge-m3} - SUMMARY_MODEL=${SUMMARY_MODEL:-claude-haiku-4-5} # python:3.12-slim has no curl/wget; same in-container check pattern as llm-gateway. healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8080/healthz', timeout=3).read()"] interval: 30s timeout: 10s retries: 5 start_period: 10s