Skip to content

--node-ip flag is ignored when rtc.use_external_ip is true in config file (v1.9.2) #4049

Description

@XxCodoxX

Description

When running livekit-server (v1.9.2) in Docker, the --node-ip command-line flag is ignored if rtc.use_external_ip: true is also set in the loaded livekit.yaml config file. The server continues to use STUN to discover an external IP instead of using the IP provided in the flag.

Expected behavior:
The --node-ip command-line flag should have the highest priority and override any network discovery settings in the livekit.yaml file.

Environment

  • LiveKit Server Version: 1.9.2
  • Deployment: Docker on a Linux VM (Ubuntu)
  • Networking Setup: The VM has two network interfaces (NICs):
    • ens33 (192.168.10.2): Main interface
    • ens34 (192.168.14.2): Dedicated interface for SIP traffic

The goal is to force LiveKit to advertise the SIP interface IP (192.168.14.2) for all media.

Steps to Reproduce

  1. Create a docker-compose.yaml file that uses the --node-ip flag:

    services:
      livekit:
        image: livekit/livekit-server:latest
        command: --config /etc/livekit.yaml --node-ip 192.168.14.2
        restart: unless-stopped
        network_mode: "host"
        volumes:
          - ./livekit.yaml:/etc/livekit.yaml
    # ... other services
  2. Create a livekit.yaml file with use_external_ip: true:

    rtc:
      tcp_port: 7881
      port_range_start: 50000
      port_range_end: 60000
      use_external_ip: true
    # ... other settings
  3. Run the server with sudo docker compose up -d.

  • ** Public IP means my server IP
  1. Check the server startup logs.

Logs / Evidence

2025-11-03T11:58:53.323Z INFO livekit redis/redis.go:144 connecting to redis {"simple": true, "addr": "localhost:6379"}
2025-11-03T11:58:53.381Z INFO livekit rtcconfig/ip.go:195 found external IP via STUN {"localAddr": "172.17.0.1:55952", "stunServer": "global.stun.twilio.com:3478", "externalIP": "Public IP"}
2025-11-03T11:58:53.382Z INFO livekit rtcconfig/ip.go:195 found external IP via STUN {"localAddr": "192.168.10.2:55952", "stunServer": "global.stun.twilio.com:3478", "externalIP": "Public IP"}
2025-11-03T11:58:58.329Z WARN livekit rtcconfig/ip.go:278 could not validate external IP {"ip": "Public IP", "from": "172.17.0.1:55952", "error": "context canceled"}
2025-11-03T11:58:58.329Z WARN livekit rtcconfig/ip.go:278 could not validate external IP {"ip": "Public IP", "from": "192.168.10.2:55952", "error": "context canceled"}
2025-11-03T11:58:58.407Z INFO livekit rtcconfig/webrtc_config.go:284 failed to get external ip {"local": "192.168.10.2", "err": "context canceled"}
2025-11-03T11:58:58.407Z INFO livekit rtcconfig/webrtc_config.go:284 failed to get external ip {"local": "192.168.14.2", "err": "context canceled"}
2025-11-03T11:58:58.407Z INFO livekit rtcconfig/webrtc_config.go:284 failed to get external ip {"local": "172.17.0.1", "err": "context canceled"}
2025-11-03T11:58:58.407Z INFO livekit rtcconfig/webrtc_config.go:99 no external IPs found, using node IP for NAT1To1Ips {"ip": "Public IP"}
2025-11-03T11:58:58.408Z INFO livekit service/turn.go:145 Starting TURN server {"turn.relay_range_start": 30000, "turn.relay_range_end": 40000, "turn.portTLS": 5349, "turn.externalTLS": true, "turn.portUDP": 3478}
2025-11-03T11:58:58.410Z INFO livekit service/server.go:264 starting LiveKit server {"portHttp": 7880, "nodeID": "ND_VLguBxPXyFM8", "nodeIP": "Public IP", "version": "1.9.2", "bindAddresses": [""], "rtc.portTCP": 7881, "rtc.portICERange": [50000, 60000]}
2025-11-03T11:58:58.724Z INFO livekit.agents service/agentservice.go:298 worker registered {"namespace": "", "jobType": "JT_ROOM", "agentName": "inbound-agent", "workerID": "AW_icWkoHNpNnx4"}

2025-11-03T11:59:54.021Z INFO livekit service/roomallocator.go:166 selected node for room {"room": "open-room", "selectedNodeID": "ND_VLguBxPXyFM8"}
2025-11-03T11:59:54.029Z INFO livekit service/roommanager.go:408 starting RTC session {"room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "participant": "sip_0758238588", "pID": "PA_JBViM64TNBcQ", "remote": false, "room": "open-room", "nodeID": "ND_VLguBxPXyFM8", "numParticipants": 0, "participantInit": {"Identity": "sip_0758238588", "Reconnect": false, "ReconnectReason": "RR_UNKNOWN", "AutoSubscribe": false, "Client": {"sdk": "GO", "version": "2.9.1", "protocol": 16, "os": "linux"}, "Grants": {"Identity": "sip_0758238588", "Kind": "sip", "Video": {"RoomCreate": false, "RoomList": false, "RoomRecord": false, "RoomAdmin": false, "RoomJoin": true, "Room": "open-room", "CanPublish": true, "CanSubscribe": true, "CanPublishData": true, "CanPublishSources": [], "CanUpdateOwnMetadata": true, "IngressAdmin": false, "Hidden": false, "Recorder": false, "Agent": false, "CanSubscribeMetrics": "not-set", "DestinationRoom": ""}, "SIP": {}, "Agent": {}, "Inference": {}, "Observability": {}, "RoomConfig": {"agents": [{"agentName": "inbound-agent"}]}, "RoomPreset": ""}, "Region": "", "AdaptiveStream": false, "ID": "", "SubscriberAllowPause": "not-set", "DisableICELite": false, "CreateRoom": {"name": "open-room", "agents": [{"agentName": "inbound-agent"}]}, "AddTrackRequests": [], "PublisherOffer": {}, "SyncState": {}, "UseSinglePeerConnection": false}}
2025-11-03T11:59:54.031Z INFO livekit service/roommanager.go:994 created TURN password {"username": "RNmQORFN20UaWJkSfKIo47MkCKq8whoyayI0UKJoCC", "password": "kGttYBScgt7hcbM5uqtXQdXodUffJBAj9wCFhPSk6Rx"}
2025-11-03T11:59:54.050Z INFO livekit rtc/room.go:507 participant active {"room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "participant": "sip_0758238588", "pID": "PA_JBViM64TNBcQ", "remote": false, "subscriberCandidates": ["[local][selected:1][trickle] udp4 host Public IP:55743 (resolved: Public IP:55743)", "[local][trickle] tcp4 host Public IP:7881 (resolved: Public IP:7881)", "[local][trickle] udp4 host Public IP:58210 (resolved: Public IP:58210)", "[local][trickle] udp4 host Public IP:57082 (resolved: Public IP:57082)", "[remote][trickle] udp4 host 192.168.10.2:52553", "[remote][trickle] udp4 host 192.168.14.2:40325", "[remote][selected:1][trickle] udp4 host 172.17.0.1:57679", "[remote][trickle] udp4 relay 123.231.30....:36105 related 192.168.10.2:55066"], "connectionType": "udp", "clientInfo": {"sdk": "GO", "version": "2.9.1", "protocol": 16, "os": "linux"}}
2025-11-03T11:59:54.234Z INFO livekit.agents service/agentservice.go:407 assigned job to worker {"jobID": "AJ_Ac8gcB6UrTKQ", "namespace": "", "agentName": "inbound-agent", "jobType": "JT_ROOM", "room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "workerID": "AW_icWkoHNpNnx4"}
2025-11-03T11:59:54.294Z INFO livekit service/roommanager.go:408 starting RTC session {"room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "participant": "agent-AJ_Ac8gcB6UrTKQ", "pID": "PA_KSLvmbtLhDTp", "remote": false, "room": "open-room", "nodeID": "ND_VLguBxPXyFM8", "numParticipants": 1, "participantInit": {"Identity": "agent-AJ_Ac8gcB6UrTKQ", "Reconnect": false, "ReconnectReason": "RR_UNKNOWN", "AutoSubscribe": true, "Client": {"sdk": "PYTHON", "version": "1.0.17", "protocol": 16}, "Grants": {"Identity": "agent-AJ_Ac8gcB6UrTKQ", "Kind": "agent", "Video": {"RoomCreate": false, "RoomList": false, "RoomRecord": false, "RoomAdmin": false, "RoomJoin": true, "Room": "open-room", "CanPublish": true, "CanSubscribe": true, "CanPublishData": true, "CanPublishSources": [], "CanUpdateOwnMetadata": true, "IngressAdmin": false, "Hidden": false, "Recorder": false, "Agent": true, "CanSubscribeMetrics": false, "DestinationRoom": ""}, "SIP": {}, "Agent": {}, "Inference": {}, "Observability": {}, "RoomConfig": {}, "RoomPreset": ""}, "Region": "", "AdaptiveStream": false, "ID": "", "SubscriberAllowPause": "not-set", "DisableICELite": false, "CreateRoom": {"name": "open-room"}, "AddTrackRequests": [], "PublisherOffer": {}, "SyncState": {}, "UseSinglePeerConnection": false}}
2025-11-03T11:59:54.296Z INFO livekit service/roommanager.go:994 created TURN password {"username": "wRFRoxEdi1mdMN1SfKIo47MkCKq8whoyayI0UKJoCC", "password": "6ef01LEgKghgFrmRfyFUprFNB0jWPWV8Hple6k4D9XvA"}
2025-11-03T11:59:54.507Z INFO livekit rtc/room.go:507 participant active {"room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "participant": "agent-AJ_Ac8gcB6UrTKQ", "pID": "PA_KSLvmbtLhDTp", "remote": false, "subscriberCandidates": ["[local][selected:1][trickle] udp4 host Public IP:52940 (resolved: Public IP:52940)", "[local][trickle] tcp4 host Public IP:7881 (resolved: Public IP:7881)", "[local][trickle] udp4 host Public IP:57728 (resolved: Public IP:57728)", "[local][trickle] udp4 host Public IP:58176 (resolved: Public IP:58176)", "[remote][selected:1][trickle] udp4 host 192.168.10.2:51678", "[remote][trickle] udp4 host 192.168.14.2:36665"], "connectionType": "udp", "clientInfo": {"sdk": "PYTHON", "version": "1.0.17", "protocol": 16}}
2025-11-03T11:59:54.892Z INFO livekit.pub rtc/participant.go:2360 mediaTrack published {"room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "participant": "agent-AJ_Ac8gcB6UrTKQ", "pID": "PA_KSLvmbtLhDTp", "remote": false, "kind": "audio", "trackID": "TR_AMwDCNPyv9ePgd", "webrtcTrackID": "70b5952e-86a6-4ff2-b381-c1d9c7f11727", "rid": "", "SSRC": 1367498788, "mime": "audio/red", "trackInfo": {"sid": "TR_AMwDCNPyv9ePgd", "type": "AUDIO", "name": "roomio_audio", "source": "MICROPHONE", "mimeType": "audio/red", "mid": "0", "codecs": [{"mimeType": "audio/red", "mid": "0", "cid": "70b5952e-86a6-4ff2-b381-c1d9c7f11727", "videoLayerMode": "MODE_UNUSED"}], "encryption": "NONE", "stream": "camera", "version": {"unixMicro": 1762171194888710}, "backupCodecPolicy": "PREFER_REGRESSION"}, "fromSdp": true, "isReceiverAdded": true, "sdpRids": ["", "", ""]}
2025-11-03T11:59:55.075Z INFO livekit.pub rtc/participant.go:2360 mediaTrack published {"room": "open-room", "roomID": "RM_5eGpgZvYMwfq", "participant": "sip_0758238588", "pID": "PA_JBViM64TNBcQ", "remote": false, "kind": "audio", "trackID": "TR_AMJtoQphiUgLh9", "webrtcTrackID": "audio", "rid": "", "SSRC": 907341504, "mime": "audio/opus", "trackInfo": {"sid": "TR_AMJtoQphiUgLh9", "type": "AUDIO", "name": "sip_0758238588", "source": "MICROPHONE", "mimeType": "audio/opus", "mid": "0", "codecs": [{"mimeType": "audio/opus", "mid": "0", "cid": "audio", "videoLayerMode": "MODE_UNUSED"}], "encryption": "NONE", "stream": "camera", "version": {"unixMicro": 1762171195074420}, "backupCodecPolicy": "PREFER_REGRESSION"}, "fromSdp": true, "isReceiverAdded": true, "sdpRids": ["", "", ""]}
2025-11-03T11:59:59.029Z INFO livekit agent/client.go:148 not dispatching agent job since no worker is available {"agentName": "inbound-agent", "jobType": "JT_PARTICIPANT", "room": "open-room", "roomID": "RM_5eGpgZvYMwfq"}
2025-11-03T11:59:59.029Z INFO livekit agent/client.go:148 not dispatching agent job since no worker is available {"agentName": "inbound-agent", "jobType": "JT_PUBLISHER", "room": "open-room", "roomID": "RM_5eGpgZvYMwfq"}

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions