# Local-only stack for the Doormile AI retrieval sidecar. # # This is DEV TOOLING. The production image is still the static nginx build in # Dockerfile — nothing here is deployed, and the console works with this stack # absent (the bot falls back to its deterministic matcher when REACT_APP_AI_URL # is unset or unreachable). # # docker compose up -d start Chroma + the sidecar # npm --prefix services/ai run seed build the collections # services: chroma: image: chromadb/chroma:latest container_name: doormile-chroma ports: - '8000:8000' volumes: # Bind-mounted so embeddings survive a container rebuild. Gitignored. - ./.chroma:/chroma/chroma environment: - IS_PERSISTENT=TRUE - ANONYMIZED_TELEMETRY=FALSE healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:8000/api/v2/heartbeat'] interval: 10s timeout: 5s retries: 5 ai-sidecar: image: node:20 container_name: doormile-ai working_dir: /app command: sh -c "npm install --no-audit --no-fund && node index.js" ports: - '8787:8787' volumes: - ./services/ai:/app # The MiniLM weights (~25MB) are downloaded once and cached here rather # than re-fetched on every container start. - ./.cache/transformers:/app/.cache environment: - CHROMA_URL=http://chroma:8000 - PORT=8787 - TRANSFORMERS_CACHE=/app/.cache depends_on: chroma: condition: service_healthy