Медиа-шлюз Janus

Запуск контейнеров 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-name
  • JANUS_ADMIN_SECRET - пароль к admin api, по-умолчанию janusoverlord

Взаимодействие с другими сервисами #

При запуске Janus анонсирует своё состояние в шину mqtt, откуда vc-server “узнает” о старте нового экземпляра или об отключении имеющегося.

Настройка подключения к mqtt #

  • JANUS_MQTT=true включает MQTT транспорт и публикацию событий в шину
  • MQTT_SERVER_HOST - адрес сервера MQTT, по-умолчанию mqtt (название сервиса в compose)
  • MQTT_SERVER_PORT - порт сервера MQTT, по-умолчанию 1883
  • MQTT_VERSION - по умолчанию 5, альтернативный вариант 3.1.1
  • MQTT_TLS_USE - true включает tls подключение к MQTT
  • MQTT_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 - полная цепочка сертификатов в формате pem
      • cert.key - ключ сертификта в формате pem
      • cert_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
powered by Altuera