Архитектура SVA #
Общая схема компонентов #

Брокер шины 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 | |
| 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 port9117 доступен только внутри контура. Используется медиа-шлюзами Janus для сохранения сообщений чатов- публичный порт 9107 используется для получения истории обращений из публичных веб приложений. Требует авторизации
Подключения к компонентам SVA
| компонент SVA | тип подключения | описание |
|---|---|---|
| mongodb | mongodb | подключение к БД v-chat |
vc-geo #
Сервис обратного геокодирования, позволяет разрешать адреса по географическим координатам, а также ссылку на превью в Яндекс.Картах.
Для получения адреса из геоданных использует публично доступные сервисы. Поддерживаемые провайдеры геоданных:
| провайдер | описание |
|---|---|
| Nominatim | используется по-умолчанию, бесплатный, исходные данные получает от OpenStreetMap |
| Яндекс | Яндекс.Карты |
| 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 port9118 доступен только внутри контура. Используется сервисом 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) |