В предыдущих статьях мы обсудили основные преимущества и возможности Docker
. Сегодня я хочу рассказать о реализации сервера Webitel Collaboration
с помощью этой технологии. Напомню, что не так давно, с выходом bpm’online 7.4.1
, был анонсирован новый продукт для бесплатных внутренних коммуникаций. Вот его мы сегодня и разберем по кирпичиках.
Микросервисы
Помните, микросервисы в основе приложения? Именно эта идеология и заложена в Collaboration
. Мы разбили все компоненте на несколько небольших контейнеров в зависимости от выполняемой задачи. А какие основные задачи Collaboration
? Если вкратце, то это внутренние звонки. Здесь нет статистики, нет записей разговоров, нет внешней маршрутизации и провайдеров связи.
Архитектура решения
Сервис разнесен на два отдельных сервера:
- softswitch
- сервер приложений
Softswitch
Как Вы уже могли догадаться, в качестве softswitch
мы используем FreeSWITCH. На данном сервере запущены 3 контейнера, а именно:
- webitel/freeswitch-sound:ru — русскоязычные голосовые фразы.
- webitel/freeswitch-sound:moh — музыка на удержание.
- webitel/freeswitch:collaboration — сборка FreeSWITCH сервера с минимальной конфигурацией.
Для чего необходимо было разделять голосовые фразы и softswitch? Все очень просто — звуковые файлы не так часто обновляються, как FreeSWITCH, но весят намного больше. Что бы каждый раз при обновлениях образа Docker
не выкачивать заново аудио, мы их вынесли отдельно. Образ webitel/freeswitch
наследует с webitel/freeswitch-sound
все содержимое с помощью ключа —volumes-from
.
Сервер приложений
На стороне сервера приложений запущено 2 контейнера:
- webitel/wconsole:collaboration — сервер состояния Webitel. Основная задача — генерация XML конфигурации для сервера softswitch.
- webitel/core:collaboration — RESTFul API и WebSocket сервер.
Клиентская часть
bpm’online
устанавливает WebSocket соединение с сервером приложений и WebRTC соединение с softswitch с помощью клиентской JavaScript библиотеки.
Преимущества решения
Все построено на Docker
контейнерах, что позволяет в считаные минуты поднять новый сервер в любой Linux-среде. При обновление ПО, достаточно выкачать новый образ и пересоздать контейнеры.
Возникли дополнительные вопросы? Задавайте в комментариях!
А каким образом в докере пробрасывается сотни-тысячи портов для rtp? Из документации «понятно только то, что кажды порт требует свое правило. Неужли вы в контейнерах их все пишете/генерируете?
В случае с FreeSWITCH использую
--net=host
— Tells Docker to skip placing the container inside of a separate network stack. In essence, this choice tells Docker to not containerize the container’s networking!