feat(server): support dual-homed voice hosts and user-managed livekit.yaml

Servers reachable via both a LAN IP and a public IP could only serve voice
on one of them: config.yaml accepts a single voice.node_ip and OwnCord
regenerates data/livekit.yaml on every start, discarding manual edits.
LiveKit has no multi-IP list, but it does support advertising internal host
candidates alongside the external mapping.

- New voice.advertise_internal_ip (OWNCORD_VOICE_ADVERTISE_INTERNAL_IP):
  emits rtc.advertise_internal_ip: true so LAN clients get a reachable
  candidate while remote clients keep using node_ip.
- livekit.yaml escape hatch: if the file exists without the auto-generated
  marker header, OwnCord leaves it untouched, giving operators access to
  every LiveKit option (ips.includes, interfaces, stun_servers, ...). The
  generated header documents how to take ownership.

Closes #111

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LwtnpHAoSFr1ZibQgQkNQK
This commit is contained in:
Claude
2026-07-19 10:50:11 +00:00
parent 6f0a04113f
commit b9180bdbeb
7 changed files with 200 additions and 5 deletions
+5
View File
@@ -16,6 +16,11 @@ rtc:
node_ip: "YOUR_SERVER_PUBLIC_IP"
# use_external_ip: true # uncomment on cloud VMs instead of node_ip
# If the server is reachable via both a LAN IP and a public IP (dual-homed),
# uncomment this so LiveKit also advertises the internal address — clients on
# the local network then connect via LAN while remote clients use node_ip.
# advertise_internal_ip: true
keys:
# Must match LIVEKIT_API_KEY / LIVEKIT_API_SECRET in your .env file
YOUR_API_KEY: YOUR_API_SECRET