version: '3.9' services: web: build: context: . dockerfile: apps/web/Dockerfile args: - NEXT_PUBLIC_DEMO_TOKEN=${DEMO_TOKEN} ports: - "3000:3000" environment: - SQLITE_PATH=/data/hermaquette.db - NODE_ENV=production - NEXT_PUBLIC_DEMO_TOKEN=${DEMO_TOKEN} - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY} - STRIPE_PUBLISHABLE_KEY=${STRIPE_PUBLISHABLE_KEY} - PUBLIC_BASE_URL=${PUBLIC_BASE_URL} - DEMO_TOKEN=${DEMO_TOKEN} - DEMO_ALLOW_PENDING_QUOTE=${DEMO_ALLOW_PENDING_QUOTE:-true} volumes: - sqlite_data:/data - artifacts:/artifacts networks: - hermaquette_net restart: unless-stopped healthcheck: test: ["CMD", "wget", "-q", "-O-", "http://localhost:3000/api/health"] interval: 30s timeout: 10s retries: 3 hermes-agent: build: context: . dockerfile: services/hermes-agent/Dockerfile environment: - SQLITE_PATH=/data/hermaquette.db - OPENAI_API_KEY=${OPENAI_API_KEY} - NEMOTRON_API_KEY=${NEMOTRON_API_KEY} - NEMOTRON_MODEL=${NEMOTRON_MODEL:-nvidia/llama-3.1-nemotron-70b-instruct} - NEMOTRON_BASE_URL=${NEMOTRON_BASE_URL:-https://integrate.api.nvidia.com/v1} - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY} - STRIPE_ISSUING_ENABLED=${STRIPE_ISSUING_ENABLED:-false} - NANOBANANA_API_KEY=${NANOBANANA_API_KEY} - FAL_KEY=${FAL_KEY} - FAL_BUDGET_USD=${FAL_BUDGET_USD:-10} - FAL_DEV_BUDGET_USD=${FAL_DEV_BUDGET_USD:-7} - DEMO_MODE=${DEMO_MODE:-false} - SCULPTEO_API_KEY=${SCULPTEO_API_KEY} - SCULPTEO_API_URL=${SCULPTEO_API_URL:-https://www.sculpteo.com/api} - AGENTMAIL_API_KEY=${AGENTMAIL_API_KEY} - CAD_DFM_URL=http://cad-dfm:8000 - ARTIFACTS_DIR=/artifacts - DEMO_TOKEN=${DEMO_TOKEN} - HAPPY_PATH=${HAPPY_PATH:-off} - TERMINAL_CWD=/app # Hermes gateways (started by start.sh inside this container) # Port 8642: primary (GPT-5.5/ChatGPT OAuth) Port 8643: Nemotron (NVIDIA) - HERMES_API_KEY=${HERMES_API_KEY:-hermaquette-local} - HERMES_LLM_PROVIDER=${HERMES_LLM_PROVIDER:-openai-codex} - HERMES_LLM_MODEL=${HERMES_LLM_MODEL:-gpt-5.5} - HERMES_LLM_MODEL_API_FALLBACK=${HERMES_LLM_MODEL_API_FALLBACK:-gpt-4o} - HERMES_REASONING_EFFORT=${HERMES_REASONING_EFFORT:-high} - HERMES_GATEWAY_URL=http://127.0.0.1:8642/v1 - HERMES_NEMOTRON_GATEWAY_URL=http://127.0.0.1:8643/v1 # ChatGPT OAuth: copy contents of ~/.hermes/auth.json after `hermes setup --portal` - HERMES_AUTH_JSON=${HERMES_AUTH_JSON:-} # DEMO flags - DEMO_ALLOW_PENDING_QUOTE=${DEMO_ALLOW_PENDING_QUOTE:-true} volumes: - sqlite_data:/data - artifacts:/artifacts # NOTE: do NOT bind-mount ./hermes here — the image already contains a fully # populated /hermes (SOUL.md, AGENTS.md, skills/) via `COPY hermes/`. On Coolify # the host ./hermes is near-empty, so a bind mount shadows the image and breaks # the persona/skill copies (cp /hermes/SOUL.md fails → crash-loop). MEMORY.md # lesson persistence is sacrificed (fine for the demo). depends_on: - cad-dfm networks: - hermaquette_net restart: unless-stopped healthcheck: test: ["CMD", "curl", "-sf", "http://127.0.0.1:8642/health"] interval: 30s timeout: 10s retries: 3 cad-dfm: build: context: ./services/cad-dfm dockerfile: Dockerfile # port 8000 intentionally not published to host — internal to hermaquette_net only volumes: - artifacts:/artifacts networks: - hermaquette_net restart: unless-stopped healthcheck: test: ["CMD", "wget", "-q", "-O-", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 volumes: sqlite_data: artifacts: networks: hermaquette_net: driver: bridge