egress is failing as soon as it starts in our self...
# ask-ai
m
egress is failing as soon as it starts in our self hosted livekit setup
t
Thanks for reaching out, arijit. I'm an AI assistant and I'm here to help. Give me a moment while I research this topic.
Thanks — I’m sorry you’re hitting this. I’ll help diagnose why egress fails immediately in your self-hosted LiveKit. Quick question to narrow this down: which egress type are you using — Room Composite, Track Composite, or Track Egress? Please share the following (redact secrets): • The egress request payload you’re sending. • Recent logs or error lines from both the egress service and the LiveKit server (copy-paste the errors around the time egress starts). • Whether your egress service is deployed separately and connected to the same Redis instance as the LiveKit server. • Your output type (S3, RTMP, file) and any relevant config (S3 bucket/region, RTMP URL, file path). • LiveKit + egress service versions and whether this is a new setup or something that recently broke. If you prefer, paste the most relevant log excerpt and the egress request and I’ll point out the likely cause and next steps. Sources: Universal Egress | server-sdk-js | livekit/livekit_composite | DeepWiki | server-sdk-go | livekit/livekit_composite | DeepWiki | server-sdk-ruby | livekit/livekit_composite | DeepWiki
m
here are the logs from the livekit server {"unixMicro": 1766584245068581}, "backupCodecPolicy": "PREFER_REGRESSION"}, "fromSdp": true} 2025-12-24T135045.069Z INFO livekit.pub rtc/participant.go:1930 mediaTrack published {"room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP", "participant": "+16263141017", "pID": "PA_Ru6gVaimKR4m", "remote": false, "kind": "audio", "trackID": "TR_AM8zdHR9j9SyfY", "webrtcTrackID": "audio", "rid": "", "SSRC": 3938309329, "mime": "audio/opus", "trackInfo": {"sid": "TR_AM8zdHR9j9SyfY", "type": "AUDIO", "name": "+16263141017", "source": "MICROPHONE", "mimeType": "audio/opus", "mid": "0", "encryption": "NONE", "stream": "camera", "version": {"unixMicro": 1766584245068475}, "backupCodecPolicy": "PREFER_REGRESSION"}, "fromSdp": true} 2025-12-24T135047.319Z INFO livekit agent/client.go:146 not dispatching agent job since no worker is available {"agentName": "sandbox_agent", "jobType": "JT_PARTICIPANT", "room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP"} 2025-12-24T135047.319Z INFO livekit agent/client.go:146 not dispatching agent job since no worker is available {"agentName": "sandbox_agent", "jobType": "JT_PUBLISHER", "room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP"} 2025-12-24T135052.901Z INFO livekit.api service/twirp.go:128 API SIP.CreateSIPParticipant {"service": "SIP", "method": "CreateSIPParticipant", "room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "participant": "+16263141017", "toUser": "+16263141017", "trunkID": "ST_p9rVLLmUkc9E", "callID": "SCL_HPWKZf5f5Exz", "fromUser": "+18444671810", "toHost": "aca76c8d146425686fbb66ea700e77ac4c-feather-trunk.pstn.twilio.com", "duration": "8.132782698s", "status": "200"} 2025-12-24T135053.015Z INFO livekit.sub sfu/forwarder.go:2101 starting with dummy forwarding {"room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP", "participant": "+16263141017", "pID": "PA_Ru6gVaimKR4m", "remote": false, "trackID": "TR_AMb9nA6oTA6aEx", "relayed": false, "subscriberID": "PA_Ru6gVaimKR4m:1766584252893259718", "sequenceNumber": 44755, "timestamp": 2280431475, "preStartTime": "2025-12-24T135053.015Z"} 2025-12-24T135053.247Z INFO livekit.sub sfu/forwarder.go:1794 calculating dummyStartTSOffset {"room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP", "participant": "+16263141017", "pID": "PA_Ru6gVaimKR4m", "remote": false, "trackID": "TR_AMb9nA6oTA6aEx", "relayed": false, "subscriberID": "PA_Ru6gVaimKR4m:1766584252893259718", "preStartTime": "2025-12-24T135053.015Z", "extFirstTS": 2280431475, "timeSinceFirst": "231.739244ms", "rtpDiff": 11123, "extRefTS": 2280442598, "incomingTS": 833062222, "referenceLayerSpatial": 0, "dummyStartTSOffset": 1447380376} 2025-12-24T135053.484Z INFO livekit.api service/twirp.go:128 API Egress.StartRoomCompositeEgress {"service": "Egress", "method": "StartRoomCompositeEgress", "room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "baseUrl": "", "outputType": "file", "egressID": "EG_qsT57KdWj7fs", "duration": "559.1708ms", "status": "200"} 2025-12-24T135053.497Z INFO livekit.webhook webhook/resource_url_notifier.go:295 sent webhook {"event": "egress_started", "id": "EV_yM6sP6VGsUyM", "webhookTime": 1766584253, "url": "https://sandbox.featherhq.com/lk/webhook", "egressID": "EG_qsT57KdWj7fs", "status": "EGRESS_STARTING", "queueDuration": "7.934µs", "sendDuration": "50.50975ms"} 2025-12-24T135053.591Z INFO livekit.pub rtc/participant.go:1930 mediaTrack published {"room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP", "participant": "agent-AJ_Q8yU62bbz9ei", "pID": "PA_6yyuRY3jEzJ4", "remote": false, "kind": "audio", "trackID": "TR_AKakm8rrJuuyP", "webrtcTrackID": "dcb69aa7-4518-4821-83be-b261de920a0d", "rid": "", "SSRC": 4044040044, "mime": "audio/red", "trackInfo": {"sid": "TR_AKakm8rrJuuyP", "type": "AUDIO", "name": "background_audio", "source": "UNKNOWN", "mimeType": "audio/red", "mid": "2", "encryption": "NONE", "stream": "unknown", "version": {"unixMicro": 1766584253591828}, "backupCodecPolicy": "PREFER_REGRESSION"}, "fromSdp": true} 2025-12-24T135054.595Z INFO livekit service/ioservice.go:159 received egress metrics {"egressID": "EG_qsT57KdWj7fs", "avgCpu": 0.6850508, "maxCpu": 1.3401015} 2025-12-24T135129.892Z WARN livekit.transport rtc/transport.go:851 error reading data channel {"room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP", "participant": "+16263141017", "pID": "PA_Ru6gVaimKR4m", "remote": false, "transport": "PUBLISHER", "label": "_lossy", "error": "[0x4001a3a780] abort chunk, with following errors: (User Initiated Abort: )"} 2025-12-24T135129.892Z WARN livekit.transport rtc/transport.go:851 error reading data channel {"room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "roomID": "RM_wPbQaWv7tsiP", "participant": "+16263141017", "pID": "PA_Ru6gVaimKR4m", "remote": false, "transport": "PUBLISHER", "label": "_reliable", "error": "[0x4001a3a780] abort chunk, with following errors: (User Initiated Abort: )"}
t
Thanks — that server log is helpful. I see the Room Composite egress was started (EG_qsT57KdWj7fs) and an
egress_started
webhook was sent, but there are no egress-worker errors in those logs — only later data-channel warnings and a note that no agent worker was available. To continue diagnosing, please provide the following so I can pinpoint why the egress stops immediately: • Egress worker logs (stdout/stderr) around 2025-12-24T135053 — this is the most important missing piece. • The exact egress request payload you sent (redact secrets). You started a Room Composite per the server log; please confirm. • Egress service and LiveKit server versions (image tags or git tags). • How the egress service is deployed (separate pod/container, same host) and whether it shares the same Redis as LiveKit. • Output type and config (file/S3/RTMP) and confirmation that the destination is reachable/writable from the egress worker. • Whether egress ever worked in this environment or if this is a fresh setup. If you paste the egress worker log excerpt and the egress request, I’ll identify the likely cause and give exact next steps.
m
00000.773542936 31 0x5641c46fc040 WARN cudaloader gstcudaloader.c169gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory 00000.773585886 31 0x5641c46fc040 WARN nvcodec plugin.c94plugin_init: Failed to load cuda library 00000.874587596 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x120000: 'AVR (Audio Visual Research)' is not mapped 00000.874609736 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x180000: 'CAF (Apple Core Audio File)' is not mapped 00000.874617596 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x100000: 'HTK (HMM Tool Kit)' is not mapped 00000.874632806 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0xc0000: 'MAT4 (GNU Octave 2.0 / Matlab 4.2)' is not mapped 00000.874640807 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0xd0000: 'MAT5 (GNU Octave 2.1 / Matlab 5.0)' is not mapped 00000.874648497 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x210000: 'MPC (Akai MPC 2k)' is not mapped 00000.874655557 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x230000: 'MPEG-1/2 Audio' is not mapped 00000.874664207 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0xe0000: 'PVF (Portable Voice Format)' is not mapped 00000.874672207 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x160000: 'SD2 (Sound Designer II)' is not mapped 00000.874682797 31 0x5641c46fc040 WARN default gstsfelement.c97gst_sf_create_audio_template_caps: format 0x190000: 'WVE (Psion Series 3)' is not mapped 2025-12-24T090921.252Z DEBUG egress uploader/s3.go:79 setting S3 config {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9", "maxRetries": 3, "maxDelay": "5s", "minDelay": "100ms"} 2025-12-24T090921.269Z DEBUG egress gstreamer/bin.go:66 adding src audio to pipeline {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.272Z DEBUG egress gstreamer/bin.go:72 adding sink file to pipeline {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.274Z DEBUG egress pipeline/controller.go:214 waiting for start signal {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.309Z INFO egress source/web.go:283 chrome: END_RECORDING {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.309Z DEBUG egress pipeline/controller.go:386 sending EOS {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.309Z DEBUG egress gstreamer/state.go:75 pipeline state building -> stopping {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.310Z DEBUG egress gstreamer/state.go:75 pipeline state stopping -> finished {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.310Z DEBUG egress pipeline/controller.go:439 closing source {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.310Z DEBUG egress source/web.go:113 closing chrome {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.384Z DEBUG egress source/web.go:119 closing X display {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.394Z DEBUG egress source/web.go:126 unloading pulse module {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9"} 2025-12-24T090921.400Z DEBUG egress sink/file.go:73 removing temporary directory {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_zkEZQfQMKruB", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9", "path": "/home/egress/tmp/EG_RT8jKLuTXXb9/"} 2025-12-24T090921.407Z INFO egress service/io.go:75 egress updated {"nodeID": "NE_jibG58nmY7ZA", "clusterID": "", "egressID": "EG_RT8jKLuTXXb9", "requestType": "room_composite", "outputType": "file", "status": "EGRESS_ABORTED"} 2025-12-24T135052.930Z DEBUG egress stats/monitor.go:173 cpu check {"nodeID": "NE_jibG58nmY7ZA", "clusterID": "", "total": 2, "pending": 0, "used": 0, "required": 1, "available": 2, "activeRequests": 0, "canAccept": true} 2025-12-24T135053.440Z DEBUG egress stats/monitor.go:173 cpu check {"nodeID": "NE_jibG58nmY7ZA", "clusterID": "", "total": 2, "pending": 0, "used": 0, "required": 1, "available": 2, "activeRequests": 0, "canAccept": true} 2025-12-24T135053.440Z INFO egress server/server_rpc.go:54 request received {"nodeID": "NE_jibG58nmY7ZA", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135053.447Z INFO egress server/server_rpc.go:71 request validated {"nodeID": "NE_jibG58nmY7ZA", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "requestType": "room_composite", "outputType": "file", "room": "dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020", "request": {"RoomComposite":{"room_name":"dispatch-audio-call-d415a0b6-f708-44ed-abd4-5ed9eef5c020","audio_only":true,"Output":null,"Options":null,"file_outputs":[{"file_type":2,"filepath":"30175f6c-9219-40f9-893d-1ca4917d1c07/d415a0b6-f708-44ed-abd4-5ed9eef5c020.ogg","Output":{"S3":{"access_key":"{access_key}","secret":"{secret}","region":"us-east-1","bucket":"sandbox-featherhq-audio-recordings"}}}]}}} 2025-12-24T135053.471Z DEBUG egress server/main.go:177 handler launched {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135053.471Z INFO egress redis/redis.go:142 connecting to redis {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "simple": true, "addr": "livekit-redis-sandbox-redis-headless.default.svc.cluster.local:6379"} 2025-12-24T135053.483Z DEBUG egress source/web.go:147 creating pulse sink {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135053.499Z DEBUG egress source/web.go:171 creating X display {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "display": ":1830641719", "dims": "1280x720x24"} 2025-12-24T135053.503Z DEBUG egress source/web.go:202 launching chrome {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "url": "http://localhost:7980/?layout=&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NjY2NzA2NTMsImlzcyI6IkFQSTI1NTEwZTI5ODJjMDMwZDciLCJraW5kIjoiZWdyZXNzIiwibmJmIjoxNzY2NTg0MjUzLCJzdWIiOiJFR19xc1Q1N0tkV2o3ZnMiLCJ2aWRlbyI6eyJjYW5QdWJsaXNoIjpmYWxzZSwiY2FuUHVibGlzaERhdGEiOmZhbHNlLCJjYW5TdWJzY3JpYmUiOnRydWUsImhpZGRlbiI6dHJ1ZSwicmVjb3JkZXIiOnRydWUsInJvb20iOiJkaXNwYXRjaC1hdWRpby1jYWxsLWQ0MTVhMGI2LWY3MDgtNDRlZC1hYmQ0LTVlZDllZWY1YzAyMCIsInJvb21Kb2luIjp0cnVlfX0.gqX6XFUwVtEM6VlLQoxve5DzY4QwKscWQau6cFDu_wo&url=ws%3A%2F%2Flivekit.default.svc.cluster.local%3A7880", "sandbox": false, "insecure": true} 2025-12-24T135054.428Z DEBUG egress uploader/s3.go:79 setting S3 config {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "maxRetries": 3, "maxDelay": "5s", "minDelay": "100ms"} 2025-12-24T135054.448Z DEBUG egress gstreamer/bin.go:66 adding src audio to pipeline {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.449Z DEBUG egress gstreamer/bin.go:72 adding sink file to pipeline {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.451Z DEBUG egress pipeline/controller.go:214 waiting for start signal {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.484Z INFO egress source/web.go:283 chrome: END_RECORDING {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.484Z DEBUG egress pipeline/controller.go:386 sending EOS {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.484Z DEBUG egress gstreamer/state.go:75 pipeline state building -> stopping {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.484Z DEBUG egress pipeline/controller.go:439 closing source {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.484Z DEBUG egress source/web.go:113 closing chrome {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.485Z DEBUG egress gstreamer/state.go:75 pipeline state stopping -> finished {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.558Z DEBUG egress source/web.go:119 closing X display {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.565Z DEBUG egress source/web.go:126 unloading pulse module {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs"} 2025-12-24T135054.575Z DEBUG egress sink/file.go:73 removing temporary directory {"nodeID": "NE_jibG58nmY7ZA", "handlerID": "EGH_C6VWzPy2kqXn", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "path": "/home/egress/tmp/EG_qsT57KdWj7fs/"} 2025-12-24T135054.582Z INFO egress service/io.go:75 egress updated {"nodeID": "NE_jibG58nmY7ZA", "clusterID": "", "egressID": "EG_qsT57KdWj7fs", "requestType": "room_composite", "outputType": "file", "status": "EGRESS_ABORTED"}
t
Thanks — this is very helpful. I’m responding to the Room Composite egress (EG_qsT57KdWj7fs) that starts then immediately becomes EGRESS_ABORTED. What the logs show (brief) • The egress handler launches, connects to Redis, launches Chrome, then immediately logs
chrome: END_RECORDING
and sends EOS — the pipeline goes stopping → finished and the egress becomes EGRESS_ABORTED. • Early warnings show missing CUDA (
libcuda.so.1
) and many unmapped audio formats (warnings only). • The behavior (Chrome ends recording right after launch) usually means Chrome couldn’t capture any media or the recorder exited immediately (no audio input, missing PulseAudio/X display, or Chrome not present/usable). NVENC/CUDA warnings are not fatal by themselves but can indicate a misconfigured GPU setup. Next steps to fix — please try these in order and tell me what changes/outputs you see: 1) Verify Chrome is available and runnable inside the egress container • Exec into the egress container and run
google-chrome --version
or
chromium --version
. If Chrome is missing, install it or use the official egress image that includes Chrome. 2) Ensure a display server + audio sink is available for Chrome • Confirm Xvfb or an X server is available and the
DISPLAY
is set (logs show an X display was created, but confirm it actually runs). • Install and run PulseAudio in the container (or ensure PulseAudio is available on the host and accessible). The egress uses Pulse to capture audio for Room Composite; if Pulse is missing the recorder can end immediately. 3) If you don’t use GPU encoding, disable NVENC to avoid GPU dependency • Either remove GPU flags or force software encoding in the egress request/config (set
video_encoder: "software"
if applicable). The
libcuda.so.1
error indicates CUDA libs aren’t present; software encoding avoids that. 4) Confirm there is active audio in the room when egress starts • You have
audio_only: true
. If no participant audio is present at start, Chrome may end recording. Start egress while a participant is publishing audio and retry. 5) Check temporary directory permissions • Ensure
/home/egress/tmp/<egress-id>/
is writable by the egress process (logs show it removes the tmp dir, but verify permissions). 6) Test with a minimal egress request and local file output first • Use a simple Room Composite request that writes to a local file (not S3) to isolate S3 issues. If local file works, re-enable S3. If you try steps 1–4, please paste: • The egress worker log lines around the new run (especially any Chrome / pulse / gstreamer errors). • The exact minimal egress request you used (redact secrets). I’ll continue from the new logs and tell you the exact config change to fix it.
m
egress@livekit-egress-sandbox-6694986fdf-jx65q:/$ google-chrome --version Google Chrome 125.0.6422.60 egress@livekit-egress-sandbox-6694986fdf-jx65q:/$ chromium --version bash: chromium: command not found egress@livekit-egress-sandbox-6694986fdf-jx65q:/$
t
Thanks — good confirmation that Chrome is present. Next, please run these checks inside the egress container and paste the outputs: 1) DISPLAY • echo $DISPLAY 2) X server running • ps aux | grep -E "Xvfb|Xorg" | grep -v grep 3) PulseAudio availability • pulseaudio --version • pactl list short sinks 4) Verify an active audio track in the room at egress start • From the LiveKit server logs, confirm a published audio track timestamp just before you start egress (you already have examples; check for a publish within ~5s before egress). If any command is missing or returns no display/sinks, tell me which ones so I can give exact install/run commands or a short configuration to get Chrome recording (e.g., start Xvfb and PulseAudio or configure host Pulse).
m
echo $DISPLAY returned empty ps aux | grep -E "Xvfb|Xorg" | grep -v grep returned empty pulseaudio 16.1 4 auto_null module-null-sink.c s16le 2ch 44100Hz SUSPENDED
t
Thanks — this pinpoints the issue. Summary of what I’m responding to: you ran checks inside the egress container and it has no X display (DISPLAY empty, no Xvfb/Xorg) and PulseAudio exists but only the auto_null sink is SUSPENDED. What to do next (minimal steps): 1) Start a virtual X display (Xvfb) • Install if missing: apt-get update && apt-get install -y xvfb • Start before egress worker:
Copy code
Xvfb :99 -screen 0 1280x720x24 &
  export DISPLAY=:99
• Verify: echo $DISPLAY -> :99 and ps aux | grep Xvfb 2) Ensure PulseAudio has an active sink • Create an active null sink if needed:
Copy code
pactl load-module module-null-sink sink_name=egress_sink
  pactl set-default-sink egress_sink
• Verify: pactl list short sinks should show
egress_sink
and not SUSPENDED. 3) Restart the egress worker after Xvfb and PulseAudio are running, then retry the Room Composite egress. What I’ll watch for in the logs after you retry: • Chrome should no longer log END_RECORDING immediately. • Pipeline should transition from building → playing, and final status should be EGRESS_COMPLETE (or S3 upload progress if using S3). If you run those commands and paste the new short egress-worker log excerpt (lines around Chrome start and pipeline state), I’ll confirm the next steps.
m
I am using the official helm chart, will these changes be necessary?
t
Thanks — I’m glad you asked. You’re right to check if the Helm chart already covers this. Short answer: the official egress Helm chart does not automatically provide a virtual X server for Chrome. You will need to supply an X server (and ensure PulseAudio has an active sink) for Room Composite egress to record via Chrome. Two practical options (pick one): • Build a small custom egress image (recommended) a. Install Xvfb in the image and add an entrypoint script that starts Xvfb (e.g.,
Xvfb :99 -screen 0 1280x720x24 &
), exports
DISPLAY=:99
, and then runs the egress binary. b. Configure the Helm chart to use your custom image. c. Ensure PulseAudio is available (either start it in the container or point
PULSE_SERVER
to a host/sidecar Pulse). • Run Xvfb as a sidecar a. Add an Xvfb sidecar container in the pod spec that starts Xvfb on :99. b. Share the DISPLAY environment variable and any necessary IPC/volumes with the egress container. c. Provide an active PulseAudio sink (sidecar or host Pulse) and set
PULSE_SERVER
if needed. Quick checks after deploying: •
echo $DISPLAY
in the egress container should return the display (e.g.,
:99
). •
ps aux | grep Xvfb
should show Xvfb running. •
pactl list short sinks
should show a non-suspended sink. • Egress logs should show Chrome launching without immediate
END_RECORDING
and the pipeline moving to playing. If you want, tell me which approach you prefer (custom image or sidecar) and I’ll provide a minimal Dockerfile + entrypoint script for the custom-image route or the exact sidecar pod snippet to add to the Helm values.