Запуск контейнеров janus media-gateway для контура SVA #
Платформа поддерживает горизонтальное масштабирование увеличением числа контейнеров медиа-шлюзов Janus. Один контейнер приблизительно может обслуживать до 60 вызовов при среднем качестве и 30 при FullHD. Метрикой необходимости масштабирования может являться сетевая нагрузка на один запущенный экземпляр, она не должна превышать 300 Mbps.
Поскольку каждый медиа-шлюз должен использовать собственный диапазон портов для подключения, то задача масштабирования не решается увеличением количества экземпляров одного сервиса, а требует создания нового сервиса на каждый экземпляр медиа-шлюза.
Каждый запущенный Janus должен иметь уникальное имя JANUS_SERVER_NAME.
Требования к конфигурации docker #
Janus требует анонсирования большого количества портов, что может сказаться на скорости запуска контейнера в docker.
Для увеличения скорости запуска контейнера рекомендуется установить параметр конфигурации docker engine userland-proxy в значение false.
Также можно запускать Janus с network_mode: host, в таком случае необходимо корректно настроить доступ Janus к vc-history и mqtt.
Переменные окружения #
Обязательные параметры:
JANUS_SERVER_NAME- имя экземпляра Janus (строка без пробелов). если не указан, то будет сгенерирован автоматически в форматеjanus-$HOSTNAME. также может быть задан через параметры командной строки-n|--server-nameJANUS_ADMIN_SECRET- пароль к admin api, по-умолчаниюjanusoverlord
Взаимодействие с другими сервисами #
При запуске Janus анонсирует своё состояние в шину mqtt, откуда vc-server “узнает” о старте нового экземпляра или об отключении имеющегося.
Настройка подключения к mqtt #
JANUS_MQTT=trueвключает MQTT транспорт и публикацию событий в шинуMQTT_SERVER_HOST- адрес сервера MQTT, по-умолчаниюmqtt(название сервиса в compose)MQTT_SERVER_PORT- порт сервера MQTT, по-умолчанию1883MQTT_VERSION- по умолчанию5, альтернативный вариант3.1.1MQTT_TLS_USE-trueвключает tls подключение к MQTTMQTT_CACERT_PATH- путь к файлу с доверенными CA сертификатами (формат PEM)MQTT_TLS_ALLOW_INVALID_HOSTNAMES-trueотключает валидацию hostname при подключении к MQTT с tls.MQTT_USER_NAMEиMQTT_PASSWORD- логин и пароль для авторизации в MQTT (при необходимости)
Сохранение истории сообщений чата #
Для сохранения истории чата Janus обращается к сервису vc-history по его имени в compose файле.
Если сервис vc-history расположен на другом хосте, то объявить его расположение через директиву extra_hosts:
extra_hosts:
vc-history: 192.168.10.15
Путь для записи вызовов #
Используется VOLUME records к пути /records внутри контейнера. Этот VOLUME или присоединенный вместо него диск должны быть доступны также для контейнеров vc-records и vc-mediamerge
Для организации постоянного хранения:
volumes:
- <volume name | absolute path>:/records
Требования к сети #
Для нормально работы медиа-шлюза Janus, должны выполняться следующие требования к подключениям:
- исходящие udp и tcp соединения на любые ip адреса в публичной сети internet
- входящие upd и tcp соединения на предопределённый диапазон портов
Задание диапазона портов для принятия входящих подключений #
ports:
- 20000-20299:20000-20299/udp
- 20000-20299:20000-20299
command:
- --rtp-port-range=20000-20299
Важно! Janus анонсирует свои порты “как есть” соответствие портов NAT должно быть 1-в-1.
Рекомендуется использовать порты из диапазона 20000-32768, поскольку порты, используемые для исходящих соединение (ephemeral ports) в linux могут быть как из диапазона как highports (49152-65535), так и из диапазона 32768-61000. (Почитать подробнее: https://unix.stackexchange.com/questions/65475/ephemeral-port-what-is-it-and-what-does-it-do)
На каждый вызов требуется до 6 udp портов, рекомендованная максимальная суммарная пропускная способность одного экземпляра Janus ~300 Mbps. Таким образом при битрейте в 5Mbps (достаточен для FullHD) один экземпляр справляется с 30 одновременными взаимодействиями и 300 udp портов на Janus достаточно (дополнительные порты могут быть задействованы при возможных переподключениях)
Настройка доступности NAT-1-1 (рекомендовано) #
Если настроен 1-1 NAT между контейнером Janus и маршрутизатором, то для анонсирования внешнего ip Janus необходимо использовать параметр nat-1-1=ip1,ip2,...,ipN. Заданный выше диапазон портов должен быть доступен через все вышеуказанные порты. Janus будет анонсировать все эти ip адресы в своих local-candidates.
command:
- --nat-1-1=150.10.20.30
Для работы одновременно в lan и wan
command:
- --nat-1-1=150.10.20.30,192.168.10.100
Настройка доступности через STUN сервер #
Если отсутствует возможность выделения статических IP, то следует использовать STUN server для определения внешнего ip адреса Janus сервера.
command:
- --stun-server=address:port
Важно(!), настройки NAT ДОЛЖНЫ позволять входящие соединения, на указанный выше диапазон портов с любых ip адресов.
Тестирование Janus (демо-режим) #
Рекомендуется использовать для проверки доступности из публичной сети интернет, а также для проверки месторасположения файлов записи вызовов и их прав.
По-умолчанию подключение происходит:
- с http страниц на порты 8088 и 7088 (WebRTC в браузерах не работает для небезопасных соединений)
- с https страниц на порты 8089 и 7889
JANUS_DEMO=true включает демо режим:
- Включает плагин echotest
- Включает веб сервер на портах 8080 и 8443(https)
- использует самоподписанные тестовые сертификаты
- для замены сертификатов положить их по пути
/certконтейнера, в следующем формате:cert_fullchain.pem- полная цепочка сертификатов в формате pemcert.key- ключ сертификта в формате pemcert_key_fullchain.pem=cat cert_fullchain.pem cert.key > cert_key_fullchain.pem
- включает демо-комнаты в videoroom и textroom
- включает http транспорт, на следующих портах
- REST API: 8088 и 8089(https)
- REST admin API: 7088 и 7889(https)
- Websocket API: 8188 и 8989(https)
- Websocket admin API: 7188 и 7989(https)
Использование демо-режима #
- открыть страницу плагина echotest
https://localhost:8443/echotest.html- заменить
localhost:8443на реальный адрес/ip и порт
- заменить
- нажать кнопку
Start - разрешить доступ к камере и микрофону
В результате в обоих окнах должна работать передача видео и аудио (слышно самого себя)
Примеры compose файлов #
Запуск в докере локально
services:
janus1:
image: cr.repo.altuera.ru/sva/prod/janus:${JANUS_VERSION}
restart: unless-stopped
ports:
- 20000-20020:20000-20020/udp
- 20000-20020:20000-20020
- 8080:8080
- 8443:8443
- 8088:8088
- 8089:8089
- 7088:7088
- 7889:7889
- 8188:8188
- 8989:8989
- 7188:7188
- 7989:7989
environment:
JANUS_DEMO: true
JANUS_MQTT: true
volumes:
- tmpRecStore:/records
command:
- --debug-level=5
- --rtp-port-range=20000-20020
- --nat-1-1=127.0.0.1
- --session-timeout=120
Установка SVA на один сервер
services:
janus1:
image: cr.repo.altuera.ru/sva/prod/janus:1.1.3
restart: unless-stopped
ports:
- 20000-20299:20000-20299/udp
- 20000-20299:20000-20299
environment:
JANUS_SERVER_NAME: mgw1
JANUS_ADMIN_SECRET: somesecret
JANUS_MQTT: true
volumes:
- /srv/records:/records
command:
- --debug-level=5
- --rtp-port-range=20000-20299
- --nat-1-1=127.0.0.1
- --session-timeout=300
Установка SVA на несколько серверов
services:
janus1:
image: cr.repo.altuera.ru/sva/prod/janus:${JANUS_VERSION}
ports:
- 20000-20299:20000-20299/udp
- 20000-20299:20000-20299
extra_hosts:
vc-history: ${HOST_APP}
environment:
JANUS_MQTT: true
MQTT_SERVER_HOST: ${HOST_DB}
MQTT_SERVER_PORT: 8883
MQTT_TLS_USE: true
MQTT_CACERT_PATH: /certificates/CA.crt
MQTT_USER_NAME: mqttuser
MQTT_PASSWORD: mqttpassword
volumes:
- tmpRecStore:/records
- /srv/certificates/CA.crt:/certificates/CA.crt:ro
command:
- --debug-level=5
- --rtp-port-range=20000-20299
- --nat-1-1=${PUBLIC_IP},${PRIVATE_IP}
- --session-timeout=120
janus2:
image: cr.repo.altuera.ru/sva/prod/janus:${JANUS_VERSION}
ports:
- 20300-20599:20300-20599/udp
- 20300-20599:20300-20599
extra_hosts:
vc-history: ${HOST_APP}
environment:
JANUS_MQTT: true
MQTT_SERVER_HOST: ${HOST_DB}
MQTT_SERVER_PORT: 8883
MQTT_TLS_USE: true
MQTT_CACERT_PATH: /certificates/CA.crt
MQTT_USER_NAME: mqttuser
MQTT_PASSWORD: mqttpassword
volumes:
- tmpRecStore:/records
- /srv/certificates/CA.crt:/certificates/CA.crt:ro
command:
- --debug-level=5
- --rtp-port-range=20300-20599
- --nat-1-1=${PUBLIC_IP},${PRIVATE_IP}
- --session-timeout=120