Коротко — причин может быть много. Ниже собрал список самых типичных проблем с LiveKit + набор действий для быстрой диагностики. Выполните проверку и пришлите (сюда) логи livekit-server и livekit-jwt + вывод из консоли браузера (WebRTC/Network), тогда помогу точнее.
Что проверить первым делом
1. Совпадают ли apiKey/apiSecret
- JWT, который генерирует контейнер livekit-jwt, должен быть подписан тем же apiKey/apiSecret, что в конфиге самого livekit-server. Несовпадение даёт "unauthorized" и подключение не проходит.
2. Логи серверов
- Посмотрите логи livekit-server и livekit-jwt (docker logs ...). В логах livekit-server обычно видно, если токен неправильный, если ICE/DTLS не проходит или проблемы с TURN. Пришлите эти строки.
3. Браузер: разрешения и консоль
- Откройте DevTools → Console и Network → WebSocket, а также chrome://webrtc-internals (или аналог в Firefox). Какие ошибки по getUserMedia (permission denied), ICE (ICE failed), DTLS, или "connection failed"? Присылайте строчки ошибок.
4. HTTPS / wss / secure context
- WebRTC getUserMedia и secure origin: если страница не в https (и не localhost), браузер может блокировать доступ к микрофону/камере и/или блокировать wss. Убедитесь, что Element X подключается по wss/https если нужно.
5. ICE / STUN / TURN / NAT
- Частая причина: сервер отдает кандидаты, которые недоступны извне (NAT), а TURN не настроен — в результате ICE не сходится (ICE failed). Проверьте конфигурацию public/external IP в livekit-server config и наличие доступного TURN (coturn или встроенный relay).
- Если вы тестируете в закрытой сети/Docker, убедитесь, что UDP-порты для RTP/RTCP открыты/проброшены или настроен TCP/TURN.
6. Проверка токена
- Декодируйте JWT (jwt.io) — проверьте claims: identity, room, ttl/grants. Убедитесь, что в токене есть права на join/room и что срок действия валиден.
7. Проверка самого живого сервера (health/admin)
- Попробуйте выполнить health-check / admin запросы к livekit-server (если enabled) — это подтвердит, что сервер работает и доступен.
8. Тест с официальным демо-клиентом
- Попробуйте подключиться к вашему livekit-server с официального примера/демо-клиента LiveKit (или sample web client). Это помогает изолировать проблему — на стороне Element X или на стороне LiveKit.
Типичные сообщения в логах и что они значат
- "unauthorized" или "invalid token" — ключ/секрет не совпадают или токен malformed.
- "ICE failed" или "no compatible candidates" — проблемы с STUN/TURN/NAT.
- "DTLS handshake failed" — сертификаты/TLS или несовместимые DTLS параметры.
- "no local tracks" — браузер не дал доступ к mic/camera или их не публикуют.
Конкретные команды/действия которые сделают диагностику проще
- docker logs <livekit-server-container> — посмотреть ошибки.
- docker logs <livekit-jwt-container> — посмотреть, как генерируется токен.
- В браузере: открыть DevTools → Console и Network(WebSocket) → сделать скрин/копию ошибок.
- Декодировать JWT (полученный из livekit-jwt) на jwt.io — посмотреть payload.
- Попробовать подключиться demo-client’ом к вашему URL (включая wss/https).
Что пришлите мне для более точной помощи
- Выдержки из логов livekit-server и livekit-jwt (ошибки вокруг времени попытки звонка).
- JWT (можно только payload, без private secret) или строка токена.
- Скрин/копию ошибок из консоли браузера (webrtc-internals, console).
- Конфигурация livekit-server (фрагмент с apiKey/apiSecret, public/external_ip/turn config — если не хотите выкладывать секрет, скрывайте секрет, но покажите ключи и поля).
Если хотите, могу написать короткий тестовый Node/Python-скрипт для генерации токена (чтобы проверить, что токен валиден) или подсказать, как включить/сконфигурировать TURN в docker-compose.