diff --git a/deploy/docker/docker-compose.yml b/deploy/docker/docker-compose.yml index 5e7d263..9c73110 100644 --- a/deploy/docker/docker-compose.yml +++ b/deploy/docker/docker-compose.yml @@ -312,17 +312,15 @@ services: - it0-network # ===== LiveKit Infrastructure ===== + # NOTE: livekit-server, voice-agent, voice-service use host networking + # to eliminate docker-proxy overhead for real-time audio (WebRTC UDP). + # Bridge mode created 600+ docker-proxy processes for port-range mappings. livekit-server: image: livekit/livekit-server:latest container_name: it0-livekit-server restart: unless-stopped + network_mode: host command: --config /etc/livekit.yaml - ports: - - "17880:7880" - - "17881:7881" - - "3478:3478/udp" - - "30000-30100:30000-30100/udp" - - "50000-50200:50000-50200/udp" volumes: - ./livekit.yaml:/etc/livekit.yaml:ro healthcheck: @@ -330,22 +328,21 @@ services: interval: 10s timeout: 5s retries: 3 - networks: - - it0-network voice-agent: build: context: ../../packages/services/voice-agent container_name: it0-voice-agent restart: unless-stopped + network_mode: host volumes: - ../../data/voice-models/huggingface:/root/.cache/huggingface - ../../data/voice-models/torch-hub:/root/.cache/torch/hub environment: - - LIVEKIT_URL=ws://livekit-server:7880 + - LIVEKIT_URL=ws://127.0.0.1:7880 - LIVEKIT_API_KEY=devkey - LIVEKIT_API_SECRET=devsecret - - AGENT_SERVICE_URL=http://agent-service:3002 + - AGENT_SERVICE_URL=http://127.0.0.1:13002 - STT_PROVIDER=${STT_PROVIDER:-local} - TTS_PROVIDER=${TTS_PROVIDER:-local} - WHISPER_MODEL=${WHISPER_MODEL:-base} @@ -362,24 +359,21 @@ services: condition: service_healthy agent-service: condition: service_healthy - networks: - - it0-network - # ===== Voice Service (legacy WebSocket + Twilio) ===== + # ===== Voice Service (LiveKit token + Twilio) ===== voice-service: build: context: ../../packages/services/voice-service container_name: it0-voice-service restart: unless-stopped - ports: - - "13008:3008" + network_mode: host volumes: - ../../data/voice-models/huggingface:/root/.cache/huggingface - ../../data/voice-models/torch-hub:/root/.cache/torch/hub environment: - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} - ANTHROPIC_BASE_URL=${ANTHROPIC_BASE_URL} - - AGENT_SERVICE_URL=http://agent-service:3002 + - AGENT_SERVICE_URL=http://127.0.0.1:13002 - WHISPER_MODEL=${WHISPER_MODEL:-base} - KOKORO_MODEL=${KOKORO_MODEL:-kokoro-82m} - KOKORO_VOICE=${KOKORO_VOICE:-zf_xiaoxiao} @@ -393,7 +387,7 @@ services: - OPENAI_TTS_VOICE=${OPENAI_TTS_VOICE:-coral} - LIVEKIT_API_KEY=devkey - LIVEKIT_API_SECRET=devsecret - - LIVEKIT_WS_URL=ws://154.84.135.121:17880 + - LIVEKIT_WS_URL=ws://154.84.135.121:7880 healthcheck: test: ["CMD-SHELL", "python3 -c \"import urllib.request; urllib.request.urlopen('http://localhost:3008/docs')\""] interval: 30s @@ -402,8 +396,6 @@ services: start_period: 120s depends_on: - agent-service - networks: - - it0-network # ===== Frontend ===== web-admin: diff --git a/it0_app/lib/core/config/app_config.dart b/it0_app/lib/core/config/app_config.dart index 9ad6244..6897db6 100644 --- a/it0_app/lib/core/config/app_config.dart +++ b/it0_app/lib/core/config/app_config.dart @@ -16,14 +16,14 @@ class AppConfig { factory AppConfig.development() => const AppConfig( apiBaseUrl: 'http://10.0.2.2:18000', wsBaseUrl: 'ws://10.0.2.2:18000', - livekitUrl: 'ws://10.0.2.2:17880', + livekitUrl: 'ws://10.0.2.2:7880', environment: 'development', ); factory AppConfig.production() => const AppConfig( apiBaseUrl: 'http://154.84.135.121:18000', wsBaseUrl: 'ws://154.84.135.121:18000', - livekitUrl: 'ws://154.84.135.121:17880', + livekitUrl: 'ws://154.84.135.121:7880', environment: 'production', ); }