Files
skills/orchestrator/compose.yml
T
Kevin Veen-BirkenbachandClaude Opus 5.5 64c63efc26 feat(orchestrator): mount the host's agents-council state read-only as /kept
The W4 resources view reads gates.db and the resources/ files of the host sampler. The installer creates ~/.local/state/agents-council/resources and writes KVB_ORCHESTRATOR_KEPT into .env; compose binds it read-only at /kept without creating the host path, and the server passes --kept to the hub.

🎯 Fix: 90 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 87
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 22:50:49 +00:00

141 lines
3.9 KiB
YAML

name: kvb-orchestrator
services:
hub:
build: .
image: kvb-orchestrator:local
restart: unless-stopped
init: true
user: "${KVB_ORCHESTRATOR_USER:?written into .env by scripts/install.sh}"
read_only: true
environment:
TMPDIR: /scratch
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
mem_limit: 2g
pids_limit: 256
healthcheck:
interval: 30s
timeout: 5s
retries: 3
ports:
- "127.0.0.1:${KVB_ORCHESTRATOR_PORT:?set in .env}:8080"
extra_hosts:
- "host.docker.internal:host-gateway"
command:
- --bind
- 0.0.0.0
- --listen-port
- "8080"
- --public-port
- "${KVB_ORCHESTRATOR_PORT:?set in .env}"
- --council
- /tmp/agents-council
- --pages
- /tmp/kvb-git-diff
- --state
- /state
- --host-state
- "${KVB_ORCHESTRATOR_STATE:?written into .env by scripts/install.sh}"
- --skills
- /skills
- --transcripts
- /projects
- --templates
- /app/templates
- --tree-file
- /tree/branch-tree.json
- --timers
- /timers
- --kept
- /kept
- --vendor
- /app/vendor
- --cleanup
- /state/cleanup
- --offices
- /state/offices
- --llm-url
- "${KVB_ORCHESTRATOR_LLM_URL}"
- --llm-model
- "${KVB_ORCHESTRATOR_LLM_MODEL}"
- --llm-key-file
- /run/kvb-orchestrator/llm.key
- --piper
- /opt/piper/bin/piper
- --voices
- /opt/voices
- --operator-voice
- "${KVB_ORCHESTRATOR_OPERATOR_VOICE:?set in .env}"
- --whisper
- /opt/whisper/whisper-cli
- --whisper-model
- /opt/whisper/ggml-base-q8_0.bin
- --scratch
- /scratch
- --approvers
- /approvers/approvers.json
tmpfs:
- /scratch:size=64m,mode=1777,noexec,nosuid,nodev
volumes:
- type: bind
source: /tmp
target: /tmp
read_only: true
- type: bind
source: "${KVB_ORCHESTRATOR_COUNCIL:?written into .env by scripts/install.sh}"
target: /tmp/agents-council
bind:
create_host_path: false
- type: bind
source: "${KVB_ORCHESTRATOR_SKILLS:?written into .env by scripts/install.sh}"
target: /skills
read_only: true
bind:
create_host_path: false
- type: bind
source: "${KVB_ORCHESTRATOR_PROJECTS:?written into .env by scripts/install.sh}"
target: /projects
read_only: true
bind:
create_host_path: false
- type: bind
source: "${KVB_ORCHESTRATOR_STATE:?written into .env by scripts/install.sh}"
target: /state
bind:
create_host_path: false
- type: bind
# the directory, not the file: pkgmgr replaces the file, and a file mount keeps showing the old inode
source: "${KVB_ORCHESTRATOR_TREE:?written into .env by scripts/orchestrator.sh}"
target: /tree
read_only: true
bind:
create_host_path: false
- type: bind
source: "${KVB_ORCHESTRATOR_TIMERS:?written into .env by scripts/install.sh}"
target: /timers
read_only: true
bind:
create_host_path: false
- type: bind
source: "${KVB_ORCHESTRATOR_KEPT:?written into .env by scripts/install.sh}"
target: /kept
read_only: true
bind:
create_host_path: false
- type: bind
source: "${KVB_ORCHESTRATOR_APPROVERS:?written into .env by scripts/install.sh}"
target: /approvers
read_only: true
bind:
create_host_path: false
- type: bind
# /dev/null is an empty key file, which server.py --llm-key-file reads as no key
source: "${KVB_ORCHESTRATOR_LLM_KEY_FILE:-/dev/null}"
target: /run/kvb-orchestrator/llm.key
read_only: true
bind:
create_host_path: false