Bedrud использует LiveKit для обработки видео- и аудиосвязи в реальном времени. LiveKit предоставляет медиасервер SFU (Selective Forwarding Unit), а Bedrud обеспечивает аутентификацию, управление комнатами и административное управление.
Встроенный или внешний режим
Bedrud поддерживает два режима развёртывания LiveKit:
- Встроенный режим (по умолчанию): Бэкенд запускает и управляет процессом сервера LiveKit внутренне. Дополнительная инфраструктура не требуется - бэкенд управляет жизненным циклом процесса LiveKit.
- Внешний режим: Bedrud подключается к отдельному серверу или кластеру LiveKit. Это полезно для горизонтального масштабирования или при использовании управляемого экземпляра LiveKit Cloud.
Настройка внешнего режима
Для использования внешнего сервера LiveKit установите следующие ключи в config.yaml:
livekit:
host: "livekit.example.com:7880"
api_key: "your-api-key"
api_secret: "your-api-secret"
embedded: falseКогда embedded равно false, Bedrud пропускает запуск встроенного бинарного файла LiveKit. API-ключ и секрет должны совпадать с учётными данными внешнего сервера.
Для настройки кластера LiveKit и конфигурации обратитесь к документации LiveKit.
Как это работает
1. Создание комнаты
Когда пользователь создаёт комнату в Bedrud, сервер не создаёт комнату LiveKit немедленно. Комнаты LiveKit создаются по требованию, когда присоединяется первый участник.
2. Токены присоединения
Когда пользователь присоединяется к встрече:
-
Фронтенд отправляет запрос на
/api/room/join. -
Бэкенд проверяет, что у пользователя есть право присоединиться к этой комнате.
-
Бэкенд использует свой API Key и Secret для генерации подписанного JWT (Join Token).
-
Токен содержит:
- Имя комнаты.
- Идентификацию пользователя (отображаемое имя).
- Разрешения - например, может ли пользователь публиковать аудио или демонстрировать экран.
-
Фронтенд получает этот токен и подключается напрямую к медиапорту LiveKit (по умолчанию
7880).
3. Управление комнатой (администрирование)
Бэкенд использует LiveKit Go SDK для выполнения административных действий:
- Исключение: Отключает участника.
- Отключение микрофона: Принудительно отключает микрофон участника.
- Разрешения: Изменяет возможности участника в реальном времени.
Сетевая архитектура
- API-порт (8090/443): Обрабатывает HTTP-запросы и WebSocket-сигнализацию для настройки звонков.
- Медиапорт (7880): Обрабатывает видео- и аудиоданные с использованием протоколов WebRTC. Резервный ICE/TCP использует порт 7881, когда UDP заблокирован.
- TURN-порт (3478 UDP / 5349 TLS): Ретранслирует медиа для клиентов за строгими NAT или файрволами. См. Руководство по TURN-серверу.
Для требований к файрволу и портам см. Подключение WebRTC.
Обработка ошибок
LiveKit недоступен
Если сервер LiveKit недоступен, генерация токена может всё ещё пройти успешно (токены создаются локально с использованием API-ключа и секрета). Однако клиент не сможет подключиться к медиасерверу. Симптомы:
- Клиент получает действительный токен присоединения, но WebRTC-соединение истекает по таймауту.
- LiveKit SDK генерирует событие
Reconnectingили ошибку соединения.
Проверка: Убедитесь, что сервер LiveKit запущен (systemctl status livekit) и хост/порт в config.yaml указан правильно.
Сбой встроенного процесса LiveKit
Во встроенном режиме, если дочерний процесс LiveKit падает:
- API-сервер Bedrud продолжает работать (комнаты можно просматривать, пользователи могут входить).
- Активные встречи теряют медиаподключение.
- Новые запросы на присоединение будут генерировать токены, но клиенты не смогут подключиться.
Проверка: Проверьте логи в /var/log/bedrud/bedrud.log или выполните journalctl -u livekit -f для подробностей сбоя.
Истечение срока действия токена
Токены присоединения LiveKit имеют короткий срок действия. Если клиент слишком долго ждёт между получением токена и подключением, токен истечёт. Клиент должен запросить новый токен через /api/room/join.
См. также
- Руководство по TURN-серверу - архитектура TURN, конфигурация, TLS и устранение неполадок
- Подключение WebRTC - полный стек подключения STUN/ICE/TURN/SFU
- Обзор архитектуры - полная системная архитектура