services: openclaw: build: context: deploy/openclaw args: OPENCLAW_VERSION: ${OPENCLAW_VERSION:-2026.5.7} CODING_CLI: ${CODING_CLI:-pi} volumes: - openclaw-data:/root/.openclaw # Bundled OpenVoiceUI agent skills (./skills) in OpenClaw's managed skills dir. # Read-only; `git pull` updates them (live via OpenClaw's skills watcher, or on restart). # Your own skills go in /root/.openclaw/skills// or the workspace skills/ dir. # See docs/SKILLS.md. - ./skills:/root/.openclaw/skills/openvoiceui:ro # Dual-mount pattern: both paths resolve to the same volume so agents # can't put files in the wrong place — both paths are the right place. - canvas-pages:/app/runtime/canvas-pages - canvas-pages:/root/.openclaw/workspace/canvas-pages - uploads:/app/runtime/uploads - uploads:/root/.openclaw/workspace/uploads # transcripts: the agent must be able to READ its own voice transcripts. They are # written by the OpenVoiceUI app (runtime/transcripts) but the agent only sees its # workspace — so a transcript/note "sent to the AI" is invisible to it without this # shared volume. Dual-mounted like the others. - transcripts:/app/runtime/transcripts - transcripts:/root/.openclaw/workspace/transcripts - generated-music:/app/runtime/generated_music - generated-music:/root/.openclaw/workspace/generated_music - music:/app/runtime/music - music:/root/.openclaw/workspace/music ports: - "18791:18791" - "${PORT:-5001}:${PORT:-5001}" restart: unless-stopped healthcheck: test: ["CMD", "node", "-e", "const h=require('http');h.get('http://localhost:18791',r=>{process.exit(r.statusCode<500?0:1)}).on('error',()=>process.exit(1))"] interval: 30s timeout: 10s retries: 3 start_period: 30s supertonic: build: deploy/supertonic restart: unless-stopped healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8765/health')"] interval: 30s timeout: 10s retries: 5 start_period: 120s openvoiceui: build: . network_mode: "service:openclaw" env_file: - .env environment: - CLAWDBOT_GATEWAY_URL=ws://127.0.0.1:18791 - SUPERTONIC_API_URL=http://supertonic:8765 volumes: - openvoiceui-runtime:/app/runtime - canvas-pages:/app/runtime/canvas-pages - uploads:/app/runtime/uploads - transcripts:/app/runtime/transcripts - generated-music:/app/runtime/generated_music - music:/app/runtime/music depends_on: openclaw: condition: service_healthy supertonic: condition: service_healthy restart: unless-stopped healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5001/health/ready', timeout=5)"] interval: 30s timeout: 10s retries: 3 start_period: 20s volumes: openclaw-data: openvoiceui-runtime: canvas-pages: uploads: transcripts: generated-music: music: