Архитектура SVA

Архитектура SVA #

Общая схема компонентов #

arch_4.2.8-common.jpg

Брокер шины MQTT #

Взаимодействие компонентов SVA между собой преимущественно осуществляется через брокера шины по протоколу mqtt. Поддерживаются версии mqtt 3.1.1 и 5.

Если отсутствует собственный брокер шины mqtt, то для решения SVA предлагается использовать открытое ПО EMQX - одно из наиболее распространенных mqtt решений. Отличительными особенностями которого являются:

  • возможность крупномасштабного развертывания
  • отказоустойчивость и высокая доступность
  • горизонтальное масштабирование
  • высокая производительность и низкая задержка
  • поддержка различных методов аутентификации (включая корпоративные)
  • возможность тонкой настройки авторизации и прав доступа

БД MongoDB #

Основной БД решения является MongoDB - система управления базами данных, которая работает с докуметно-ориентированной моделью данных.

Возможно использование уже установленного экземпляра БД mongodb.

Основные возможности mongodb:

  • шардирование - работа с набором реплик, содержание двух или более копи1 данных на различных узлах
  • горизонтальное масштабирование
  • поддержка ad-hoc запросов и поиск по регулярным выражениям
  • поддержка ACID транзакций
  • поддержка JavaScript в запросах и функциях агрегации
  • множество официальных драйверов для большинства современных языков программирования и фреймворков

Базы данных #

Для платформы SVA создаются следующие БД:

  • v-chat - основная БД, содержащая настройки контура, оперативные и исторические данные
  • v-chat-stats - БД для сбора и хранения “сырых” статистических данных, используемых при построении отчетности

Рекомендуется регулярно производить резервное копирование данных обеих БД для избежания потери данных в случае непредвиденных ситуаций.

TURN сервер #

Используется для “пробивания” NAT клиентами SVA. WebRTC соединение между сервером и клиентом состоит из двух подключений:

  • клиент подключается к серверу (порты janus)
  • сервер подключается к клиенту

Если клиент находится за NAT, то прямое подключение сервера к клиенту может быть невозможным. Для решения этой проблемы используются протоколы:

  • STUN: Session Traversal Utilities for NAT (RFC 5389)
  • TURN: Traversal Using Relays around NAT (RFC 5766)

Рекомендуется использовать TURN сервер coturn. Его не обязательно устанавливать внутри контура, это может быть любой хост с публичным IP адресом.

Принципиальная схема работы TURN сервера в режиме relay:

sequenceDiagram actor client participant turn as turn server participant janus Note over client,turn: запрос ресурса (порта) client ->> turn: (19xxx tcp,udp) allocate turn ->> client: выделенные ip:port для SRTP client ->>janus: подключайся к ip:порт Note over client,janus: подключение медиа janus -->> turn: (ip:порт) SRTP turn -->> client: SRTP Note over client,turn: turn проксирует медиа трафик

Возможно использование уже развернутых TURN серверов. Требование - поддержка TURN REST API.

Компоненты SVA #

janus #

Медиа-шлюз Janus media-gateway это открытый WebRTC сервер общего назначения, позволяющий создавать приложения для работы с аудио, видео и дата каналами через браузерные веб приложения (и не только).

Сервер написан на языке C и отличается низким потреблением ресурсов и высокой производительностью.

В решении выполняет роль медиатора между участниками взаимодействия:

  • согласовывает параметры и устанавливает WebRTC соединение к браузеру клиентов
  • обеспечивает сигнализацию для WebRTC взаимодействий
  • соединяет (перенаправляет) медиа потоки между клиентами
  • осуществляет запись взаимодействий

В решении может использоваться более одного медиа-шлюза Janus для горизонтального масштабирования производительности, а также для отказоустойчивости: при выходе из строя одного медиа-шлюза, активные взаимодействия переключатся на другой.

Маркером необходимости масштабирования является сетевая нагрузка. Рекомендуется не допускать нагрузку более 300 Mbps на каждый запущенный экземпляр.

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
vc-history http, внутренний порт сохранение сообщений чата

vc-www #

Веб сервер платформы, на базе nginx. Выполняет следующие задачи:

  • публикация веб приложений
    • веб интерфейс администратора /console/
    • веб интерфейс агента /agent/
    • веб интерфейсы клиента
      • /user/ для мобильных браузеров
      • /desktop_user/ для прочих браузеров
    • статические страницы ошибок
  • http реверс-прокси для прочих компонентов SVA
    • валидация jwt токена при обращениях к api
  • терминирование https трафика (внутри контура SVA взаимодействие по http)

Может устанавливаться за балансировщиками нагрузки или другими реверс-прокси. В противном случае должен быть доступен из сети интернет для публичных пользователей.

Подключения к компонентам SVA

компонент SVA тип подключения описание и путь
vc-auth http реверс-прокси /auth-singlemethod/
vc-admin http реверс-прокси /admin/
vc-fileserver http реверс-прокси /fileservice/
vc-history http реверс-прокси /api/hist/
vc-msg http реверс-прокси /message-delivery/
vc-server http реверс-прокси /service-auth/
vc-stat http реверс-прокси /stat/
vc-statchart http реверс-прокси /statchart/
vc-surl http реверс-прокси /s/

Прозрачная валидация jwt токена #

sequenceDiagram actor client participant vc-www participant vc-auth participant vcs as vc-* api client ->> vc-www: http api request (jwt in x-auth header) vc-www -->> vc-auth: validate jwt alt Valid jwt vc-auth -->> vc-www: 200/OK vc-www ->> vcs: http api request vcs->>client: response else Invalid/missing jwt vc-auth -->> vc-www: 403/Forbidden vc-www ->> client: 403/Forbidden end

Формирование пути к интерфейсу Агента #

Как описано в ролевой модели есть 2 типа компаний:

  • основная root
  • прочие компании

Доступ к интерфейсу агента по пути /agent/ всегда ведет в основную компанию.

Для доступа к интерфейсу агента прочих компаний, необходимо добавить id компании в путь, например: /agent/#/agent/login/62234baf3645c16ea93497dc. Эту ссылку (для доступа агентов к интерфейсу) можно получить в административном интерфейсе в разделе “Информация о компании”.

vc-admin #

Предоставляет http интерфейс для API конфигурирования платформы SVA. Реализует CRUD модель доступа к параметрам конфигурации, также применяет фильтры авторизации доступа по ролям.

Также имеет отдельный endpoint /admin/api/v2/brands/ который должен быть всегда доступен публично. По нему в клиентский интерфейс загружаются параметры брендирования: логотипы, тексты для отображения страницы с требуемым оформлением.

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat

vc-auth #

Предоставляет http интерфейс для API авторизации платформы:

  • аутентификация пользователей по логину и паролю (все роли кроме public)
  • аутентификация клиентом (public) по параметрам ссылки (также проверяется наличие активного взаимодействия)
  • валидация авторизации при обращениях к прочим API платформы

Результатом успешной авторизации является получение jwt токена. При последующих запросах к любым API необходимо отправлять полученный токен в http заголовке x-auth-token.

В ответ на любой запрос к любым API может прийти обновленный токен в том же поле http заголовка. Это обновленный токен, выпускаемый, если старый токен истекает по времени. Его (токен) необходимо сохранить и использовать при дальнейших запросах.

Для метода аутентификации по данным УЗ включена защита от перебора паролей, основанная на Алгоритме текущего ведра

Если запрос аутентификации попадает в ограничение, то метод вернет ошибку 429.

vc-license #

Сервер лицензий SVA:

  • вычитывает и загружает файлы лицензий
  • рассчитывает потребление лицензий в реальном времени
  • обслуживает запросы на запрос лицензий для прочих сервисов

Все ответы сервера лицензий подписываются и эта подпись проверяется его клиентами.

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat

vc-server #

Основной сервер приложений платформы.

  • контролирует сессии подключений агентов и клиентов (вебсокет /service-auth/videochat)
  • предоставляет http API для управления взаимодействиями и опросами NPS (/service-auth/interaction)
  • управляет и авторизует взаимодействие интерфейсов агента и клиента с медиа-шлюзом janus (вебсокет /service-auth/janus)
  • контролирует аудио-визуальные взаимодействия

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat

Взаимодействие с janus #

sequenceDiagram actor client participant vc-www participant vc-server participant janus Note over client,vc-server: http вебсокет `janus` client ->> vc-www: подключение к медиашлюзу vc-www --> vc-www: валидация jwt токена vc-www ->> vc-server: проксирование соединения Note over vc-server,janus: шина mqtt vc-server ->> janus: создание сессии Note over client,janus: подключение клиента и janus client --) janus: сигнализация WebRTC janus --) client: сигнализация WebRTC

vc-surl #

Сервис, укорачивающий ссылки и разрешающих обратно.

Уменьшение длины ссылки решает 3 задачи:

  • визуальный комфорт
  • уменьшение числа символов в отправляемых смс сообщениях
  • сокрытие “технических” параметров исходной ссылки

Сервис может сокращать ссылку в короткий буквенно-цифровой код или в UUIDv4, настраивается в административном интерфейсе. Соответствие короткой ссылки и исходной, а также время жизни короткой ссылки сохраняется в БД.

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat

Общий процесс сокращения разрешения ссылки #

sequenceDiagram actor client participant vc-www Note over vc-server: начало взаимодействия vc-server ->> vc-surl: (mqtt) запрос короткой ссылки vc-surl ->> vc-server: (mqtt) короткая ссылка vc-server ->> vc-msg: (mqtt) запрос на отправку ссылки vc-msg ->> client: (smtp, sms, etc...) доставка короткой ссылки client ->> vc-www: (http) открытие короткой ссылки vc-www ->> vc-surl: (http) проксирование запроса vc-surl ->> vc-www: (http) полная ссылка vc-www --> vc-www: определение типа браузера по User-Agent vc-www ->> client: (http) redirect на полную ссылку

vc-msg #

Сервис доставки сообщений. Задачей сервиса является доставка короткой ссылки на конкретное взаимодействие до клиента.

Компонент vc-msg не занимается доставкой самостоятельно, но имеет набор коннекторов к различным провайдерам доставки сообщений. На текущий момент перечень поддерживаемых провайдеров следующий:

провайдер тип сообщений комментарий
SMSC.ru смс
Pulseem смс
SMTP e-mail отправка ссылки на e-mail
Telegram смс Телеграм-бот. Требует обязательно регистрации в боте для получения сообщений
Genesys Media Server смс, e-mail Genesys GMS Openmedia API

Также, возможна разработка коннекторов к любым провайдерам по запросу, и возможность получения статуса доставки (если поддерживается провайдером)

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat

vc-stat #

Сервис статистики:

  • подписывается на топики прочих сервисов в шине mqtt
  • сохраняет полученные события в БД v-chat-stats
  • по событию INTERACTION_COMPLETE рассчитывает и сохраняет статистику медиа-сессий
  • предоставляет http API для доступа к статистике из административного интерфейса

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat

vc-history #

Сервис истории сообщений чата.

  • Сохраняет историю сообщений чата в БД.
  • Возвращает историю сообщений:
    • в интерфейсах агента и клиента при перезагрузке страниц или переключения на другое устройство
    • в интерфейсе администратора в исторической отчетности

Открывает 2 http порта для входящих соединений:

  • trusted port 9117 доступен только внутри контура. Используется медиа-шлюзами Janus для сохранения сообщений чатов
  • публичный порт 9107 используется для получения истории обращений из публичных веб приложений. Требует авторизации

Подключения к компонентам SVA

компонент SVA тип подключения описание
mongodb mongodb подключение к БД v-chat

vc-geo #

Сервис обратного геокодирования, позволяет разрешать адреса по географическим координатам, а также ссылку на превью в Яндекс.Картах.

Для получения адреса из геоданных использует публично доступные сервисы. Поддерживаемые провайдеры геоданных:

провайдер описание
Nominatim используется по-умолчанию, бесплатный, исходные данные получает от OpenStreetMap
Яндекс Яндекс.Карты
Google Google карты
Dadata сервис “обратное геокодирование”
Geokeo бесплатный в небольших объемах

Общий процесс работы сервиса геокодирования

sequenceDiagram actor client participant vc-www participant vc-server participant vc-geo participant geoprovider client --> client: получение геолокации из браузера client ->> vc-www: отправка координат vc-www ->> vc-server: проксирование запроса vc-server ->> vc-geo: запрос адреса по координатам vc-geo ->> geoprovider: запрос обратного геокодирования geoprovider ->> vc-geo: разрешение адреса по координатам vc-geo --> vc-geo: сслыка-превью Яндекс.Карты vc-geo ->> vc-server: возращает обогащенные геоданные vc-server ->> mongodb: сохранение геоданных vc-server ->> client: возращает обогащенные геоданные client --> client: отображение адреса и ссылки на карту

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру

vc-fileserver #

Файл-сервер SVA предназначен для:

  • сохранения сделанных в процессе взаимодействия скриншоты
  • сохранения переданных в рамках взаимодействия (чат) файлы
    • для загруженных изображений автоматически создаются thumnails - уменьшенные версии изображений для отображения в чате и галерее Агента
  • сохранения видео и аудио записей взаимодействий
  • предоставляет http API для доступа к сохраненным файлам
    • в интерфейсе клиента и агента для скачивания файлов из чата
    • в интерфейсе агента также для скачивания и сохранения скриншотов
    • в интерфейсе администратора (в статистике) для скачивания как файлов и скриншотов, так и записей взаимодействий
  • авторизует полученные запросы на сохранение и получение файлов
  • осуществляет контроль над занимаемым файлами местом на дисках
    • сохраняет статистические данные о занимаемом месте
    • по расписанию удаляет файлы, выходящие за установленные лимиты

Для vc-fileserver рекомендуется подключать сетевое хранилище (FileStorage на схеме) и регулярно делать снимки/резервное копирование для избежания потери данных в случае непредвиденных ситуаций.

Открывает 2 http порта для входящих соединений:

  • trusted port 9118 доступен только внутри контура. Используется сервисом vc-records для сохранения обработанных видео и аудио записей взаимодействий
  • публичный порт 9108 публично доступное http API. Требует авторизации

Подключения к компонентам SVA

компонент SVA тип подключения описание
mongodb mongodb подключение к БД v-chat
FileStorage на уровне docker engine может быть как docker volume, так и bind mount

Процесс передачи файлов в чате #

sequenceDiagram actor client participant vc-www participant vc-fileserver participant FileStorage participant janus actor agent Note over client,agent: установленное WebRTC соединение, чат Note over client,agent: сообщения в чате передаются через WebRTC data-channel client --> client: отправка файла в чат client ->> janus: сообщение в чате: отправка файла janus ->> agent: сообщение в чате: отправка файла client ->> vc-www: (http) загрузка файла vc-www --> vc-www: проверка jwt vc-www ->> vc-fileserver: (http) проксирование запроса vc-fileserver -->> FileStorage: сохранение файла vc-fileserver ->> client: (http) медатанные сохраненного файла client ->> janus: сообщение в чате: файл отправлен janus ->> agent: сообщение в чате: файл отправлен (метаданные) agent ->> vc-www: (http) получение файла vc-www --> vc-www: проверка jwt vc-www ->> vc-fileserver: (http) проксирование запроса vc-fileserver -->> FileStorage: чтение файла vc-fileserver ->> agent: (http) отправка файла

vc-statchart #

Это вспомогательный сервис для отображения в веб интерфейсе администратора (раздел статистики) данных о качестве WebRTC соединения в виде графиков.

Данные получает из БД v-chat и v-chat-stats

Подключения к компонентам SVA

компонент SVA тип подключения описание
mongodb mongodb подключение к БД v-chat

vc-records #

Сервис контролирует процесс обработки записей медиа взаимодействий:

  • проверяет наличие записи у взаимодействия
  • запускает и контролирует процесс обработки записей
  • записывает стадии обработки записей в БД
  • загружает итоговую запись на vc-fileserver
  • удаляет исходные и временные файлы записей взаимодействий

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
mongodb mongodb подключение к БД v-chat
tmpRecStore на уровне docker engine может быть как docker volume, так и bind mount
vc-fileserver http, trusted port загрузка обработанных записей взаимодействий

vc-mediamerge #

Компонент SVA, который отвечает за обработку записей видеочата

  • шаг1: (convert) конвертирует записи из формата mjr в форматы, пригодные для обработки ffmpeg
  • шаг2: (merge) собирает файлы в mkv контейнер со следующими условиями:
    • видео только от клиента
    • аудио клиента в левом канале
    • аудио агента в правом канале
    • начало записи - начало первого из потоков (аудио агента или аудио/видео клиента)
    • окончание записи - окончание последнего из потоков (аудио агента или аудио/видео клиента)
    • отсутствие аудио с любой из сторон замещается “тишиной”
    • отсутствие видео не замещается ничем. В зависимости от проигрывателя это может быть последний кадр или черный экран

Подключения к компонентам SVA

компонент SVA тип подключения описание
mqtt mqtt подключение к mqtt брокеру
tmpRecStore на уровне docker engine может быть как docker volume, так и bind mount

Временное хранилище записей #

Сервисы janus, vc-recors и vc-mediamerge требуют доступа к одному и тому же диску (на схеме tmpRecStore). Это может быть и docker volume - в таком случае эти сервисы должны располагаться на одном docker хосте. При использовании shared docker volume или общего сетевого диска компоненты можно расположить на разных хостах.

Процесс записи взаимодействий и их последующей обработки:

sequenceDiagram participant vc-server participant janus Note over vc-server,janus: Подключение участника к взаимодействию vc-server ->> janus: (mqtt) запрос на запись participant tmp as records store Note over janus,tmp: запись в *.mjr.tmp файлы janus -->> tmp: сохранение медиа потоков Note over vc-server,janus: Окончание взаимодействия Note over janus,tmp: переименование файлов в *.mjr janus --x tmp: завершение записи participant vc-records vc-server ->> vc-records: (mqtt) INTERACTION_COMPLETE Note over vc-records,vc-mediamerge: Обработка записей vc-records -->> tmp: проверка файлов participant mongodb vc-records ->> mongodb: обновление статуса записи participant vc-mediamerge vc-records ->> vc-mediamerge: (mqtt) MEDIAMERGE_CONVERT vc-mediamerge ->> vc-records: (mqtt) MEDIAMERGE_CONVERSION_STARTED vc-mediamerge -->> tmp: конвертирование записей vc-mediamerge ->> vc-records: (mqtt) MEDIAMERGE_CONVERSION_COMPLETED vc-records ->> mongodb: обновление статуса записи vc-records ->> vc-mediamerge: (mqtt) MEDIAMERGE_START vc-mediamerge ->> vc-records: (mqtt) MEDIAMERGE_STARTED vc-mediamerge -->> tmp: слияние записей в контейнер mkv vc-mediamerge ->> vc-records: (mqtt) MEDIAMERGE_COMPLETED vc-records ->> mongodb: обновление статуса записи participant vc-fileserver Note over vc-records,vc-fileserver: Выгрузка записей vc-records ->> vc-fileserver: (http,9117) загрузка итогового файла vc-fileserver ->> vc-records: 200/OK vc-records ->> mongodb: обновление статуса записи vc-records --x tmp: удаление файлов

Дополнительно #

Порты сервисов #

Порты, используемые по-умолчанию.

Публичные порты #

Порты, которые необходимо открыть для доступа из публичной сети Internet

порт компонент назначение
20000-20299 tcp udp janus порты для WebRTC подключений. минимум 300 портов на каждый janus
19001,19002 tcp udp coturn STUN/TURN подключения
443(19443) tcp coturn TURNs (TURN over TLS), 443 рекомендован, но не обязателен
49152-65535 tcp udp coturn (см RFC 5389, 5766) SRTP turn сервера в режиме relay
443 tcp vc-www http сервер или прокси/балансировщик. WebRTC в браузерах работает ТОЛЬКО на защищенных сайтах
80 tcp vc-www опционально, для автоматического перевыпуска сертификатов по протоколу ACME

Внутренние порты #

Используемые внутри контура SVA

Компоненты SVA #

порт компонент описание
9101 vc-auth публичное http api
9102 vc-surl публичное http api
9103 vc-server публичное http api и websocket
9104 vc-stat публичное http api
9105 vc-admin публичное http api
9106 vc-msg api для получения отчетов о доставке
9107 vc-history публичное http api
9108 vc-fileserver публичное http api
9113 vc-statchart публичный веб сервер
9117 vc-history внутренний порт для сохранения сообщений чата от janus
9118 vc-fileserver внутренний порт для сохранения записей взаимодействий от vc-records

Прочие компоненты #

порт компонент описание
1883 mqtt(emqx) plain порт подключения mqtt
8883 mqtt(emqx) tls порт подключения mqtt
18083 mqtt(emqx) plain порт подключения к административному интерфейсу
18084 mqtt(emqx) tls порт подключения к административному интерфейсу
27017 mongodb порт для подключения к mongodb (поддерживает и tls и plain)
powered by Altuera