services: # livekit-agents 1.5 worker + token/API server voicecoach-agent: build: context: ./agent image: voicecoach-agent:latest container_name: voicecoach-agent restart: unless-stopped env_file: .env environment: - LIVEKIT_URL=ws://voicecoach-livekit:7880 - LIVEKIT_PUBLIC_URL=wss://voice.hobbs.farm - SPEACHES_URL=http://192.168.86.27:8000 - OPENCLAW_URL=http://voicecoach-openclaw:3100 - DB_PATH=/data/sessions.db - KOKORO_VOICE=af_nova volumes: - /mnt/docker-data/configs/voicecoach/sessions:/data networks: - voicecoach - voicecoach_v1 mem_limit: 1G memswap_limit: 1G labels: - "com.centurylinklabs.watchtower.enable=false" logging: driver: "json-file" options: max-size: "50m" max-file: "3" # SvelteKit web client voicecoach-web: build: context: ./web-client image: voicecoach-web-v2:latest container_name: voicecoach-web-v2 restart: unless-stopped ports: - "8085:80" depends_on: - voicecoach-agent networks: - voicecoach mem_limit: 128M labels: - "com.centurylinklabs.watchtower.enable=false" logging: driver: "json-file" options: max-size: "10m" max-file: "3" # LiveKit server — unchanged from v1 livekit-server: image: livekit/livekit-server:latest container_name: voicecoach-livekit restart: unless-stopped command: - --config - /etc/livekit/livekit.yaml - --keys - "${LIVEKIT_API_KEY}: ${LIVEKIT_API_SECRET}" ports: - "7880:7880" - "7881:7881" - "50000-50100:50000-50100/udp" volumes: - ./livekit/livekit.yaml:/etc/livekit/livekit.yaml:ro networks: - voicecoach mem_limit: 512M labels: - "com.centurylinklabs.watchtower.enable=false" logging: driver: "json-file" options: max-size: "50m" max-file: "3" # OpenClaw — LLM gateway with memory and tools voicecoach-openclaw: image: margaret-openclaw:latest container_name: voicecoach-openclaw restart: unless-stopped user: "0:0" ports: - "3100:3100" environment: - NODE_ENV=production - HOME=/home/glyptic - USER=glyptic - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - OPENCLAW_STATE_DIR=/home/glyptic/.voicecoach - OPENCLAW_CONFIG_PATH=/home/glyptic/.voicecoach/openclaw.json volumes: - /mnt/infrastructure/voicecoach:/home/glyptic/.voicecoach command: ["sh", "-c", "mkdir -p /home/glyptic && node --max-old-space-size=1500 /usr/local/lib/node_modules/openclaw/dist/index.js gateway --allow-unconfigured"] networks: - voicecoach mem_limit: 2G memswap_limit: 2G labels: - "com.centurylinklabs.watchtower.enable=false" logging: driver: "json-file" options: max-size: "50m" max-file: "3" # SpeechBrain — async vocal/emotion analysis (optional, agent falls back gracefully) speechbrain-service: build: context: ./speechbrain-service image: voicecoach-speechbrain:latest container_name: voicecoach-speechbrain restart: unless-stopped volumes: - /mnt/docker-data/configs/voicecoach/speechbrain-models:/app/models environment: - MODEL_DIR=/app/models networks: - voicecoach mem_limit: 3G memswap_limit: 3G labels: - "com.centurylinklabs.watchtower.enable=false" logging: driver: "json-file" options: max-size: "50m" max-file: "3" networks: voicecoach: driver: bridge # Join the v1 voicecoach network to reach the shared livekit + openclaw containers voicecoach_v1: external: true name: voicecoach_voicecoach