Middleware (mware)

Описание

Обеспечивает функции переноса данных между внутренними сервисами внутри сайта, а также контроля корректности работы.

Разделена на микросервисы по доменам. Обеспечивает автоматическую синхронизацию работы между сайтами, обслуживающими домен.
Резервируется в режиме Active-Passive. Масштабируется разделением доменного дерева.

Сервисы:
* Telegram-бот мониторинга состояния системы (Подробнее о настройке).
* Обеспечение функционирования учетных записей sipuser, настроенных на работу без регистрации.
* Управление звонками через API (callmanager) (Calls, Conferences).
* Управление устройствами через API (devicemanager) (/api/devicemanager/v1/…​)
* Сервис публикации ролевых приложений.
* Сервис запуска служебных сценариев по расписанию. (Служебные задачи).
* Сервис критических секций (компонент сценариев "Мьютекс" и др.).
* Контроллер потоковой репликации PostgreSQL. (Подробнее о настройке ниже, параметр 'pg_controller'])
* Контроллер создания резервных копий (Подробнее о настройке ниже, параметр 'backup_controller').
* Сервис автоматической генерации SSL-сертификатов ACME LetsEncrypt (Подробнее о настройке).
* Мониторинг глобальных имен.
* Мониторинг состояния MEGACO-подключений между MGC и MG.
* Мониторинг работоспособности сервиса синхронизации файлов FSYNC.
* Сервис восстановления паролей пользователей (Подробнее).
* Сервис отправки приглашений новым пользователям (Подробнее).
* Сервис обслуживания самостоятельной регистрации пользователей (Подробнее).
* Сервис обеспечения регистрации при авторизации через OAuth и ЕСИА (Подробнее).
* Сервис сборка событий syslog и отправки SNMP trap (Подробнее о настройке).
* Общий лог микросервисов продуктового слоя, собираемый из сообщений стандартного вывода.
* Сервис стенографирования записей разговоров (Подробнее о настройке).
* Тестировочный сервис зеркалирования UDP пакетов.
* Сервис регистрации заказов на обратный зконок (компонент сценариев "Заказ на обратный звонок" и др.).
* Сервис обеспечения функциональности email_to_fax.
* Сервис отслеживания абонентов, вызываемых через Hunt-номера и личные очереди.
* Кеш внешних номеров, подлежащих отслеживанию состояний (Подробнее о настройке).
* Сервис поставщика CTI-событий, включая супервизор серверов-адаптеров для поддержки различных протоколов.

Table 1. Системные характеристики

Код

mware

Режим работы

Сервис

Режим резервирования

Active-Passive

Типы сайтов

Любые

Слой

Служебный

Размещение

Внутренний

Сохранение и восстановление состояния при перезагрузке

Да

Приложение

era_mware

Параметры

Table 2. Параметры
Имя Тип Умолчание Описание

name

str

required

Имя. Может состоять из латинских букв и цифр, должно начинаться с буквы.

roletype

str

required

Тип роли. Возможные значения: "mware".

iface

str

required

Алиас сетевого интерфейса сервера, на котором будет происходить внутреннее взаимодействие ролей между собой.

ext

json

empty

Дополнительные опции роли. Содержит json объект или список.

enabled

bool

empty

Флаг активности роли. При установке в false роль не участвует в валидации и не запускается.

group

int

required

Номер группы.
В рамках горизонтального масштабирования роль может быть разделена на несколько групп на сайте, в каждой из которых активен только один экземпляр, а остальные зарезервированы.
Ответственность между группами разделяется по доменным множествам. Вместе все группы обслуживают полное доменное множество. Все роли одной группы должны иметь одинаковую ответственность.
Целое число от 1 до 9999999.

order

int

required

Порядок экземпляра роли в рамках группы.
Определяет в каком порядке будет происходить перетекание в режиме Active-Passive.

include_domains

array<str>

empty

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

pg_controller

array<object>

empty

Настройки для контроллера серверов PostgreSQL, находящихся в режиме потоковой репликации (версия pgsql 12+).
Список содержит объекты-группы. Каждая группа содержит список из двух серверов, находящихся в режиме потоковой репликации.
Сервис mware обеспечивает в каждой группе наличие 1 мастера, автоматически приводя к состоянию 1+1.
Если обнаруживаются два мастера - один из них переводится в режим recovery. Изначально мастером выбирается первый из серверов в списке. В дальнейшем тот, кто выполнял функцию мастера последним.
Если экземпляр-мастер становится недоступен, то в течение минуты-двух recovery-сервер превращается в мастер.
Если предыдущий мастер появляется снова, то он переводится в режим recovery путем остановки и полного бэкапа данных с текущего мастера.
В лог middleware трассируется вся активность сервиса.
Работа с состояниями экземпляров серверов БД производится через SSH, для чего в свойствах сервера должны быть указаны соответствующие опции.
Операция перевода в режим recovery сопровождается перемещением каталога с данными в указанную папку для бэкапов. По умолчанию /tmp/pg_backups.
Перевод в режим master только после истечения 30 секунд после потери текущего мастера.
Перевод в режим recovery возможен только при наличии активного мастера.

Настройки значений для групп:

  • key - уникальный строковый ключ группы. При отсутствии генерируется автоматически.

  • referee - адрес внешнего арбитражного сервера. При одновременной активности двух экземпляров действовать может только тот, кому этот сервер доступен для пинга (кворум).

  • servers - список серверов, входящих в группу.

Настройки значений для серверов:

  • ssh_host - ssh host of postgresql (default as pg_host).

  • ssh_port - ssh port of postgresql server (default 22).

  • ssh_user - ssh user of postgresql host.

  • ssh_pwd - ssh password of postgresql host.

  • pg_host - actual current postgresql host address, available for replicas (default as ssh_host).

  • pg_port - actual current postgresql port, available for replicas (default 5432). Recommended to set the same value to all replicas.

  • pg_replica_user - actual current postgresql replica user login, available for replicas. Should be the same on all replicas.

  • pg_replica_pwd - actual current postgresql replica user password, available for replicas. Should be the same on all replicas.

  • pg_ctl_command - available for ssh user command (name, path or alias) to pg_ctl of current postgresql version.

  • pg_basebackup_command - available for ssh user command (name, path or alias) to pg_basebackup of current postgresql version.

  • pg_database - actual current postgresql initial database to connect to as replica user and save state (default postgres).

  • pg_data_folder - postgresql instance data folder. Recommended to set the same value to all replicas.

  • pg_backup_folder - postgresql instance backups folder.

  • pg_log_filepath - postgresql instance log file.

  • pg_signal_filepath - recovery signal file to make master. Recommended to set the same value to all replicas.

Указанное значение этого параметра не проверяется валидатором конфигурации в роли mic, однако проходит через фильтр в рантайме. В случае выявления некорретных настроек группа исключается. При отсутствии корректно настроенных групп контроллер бездействует и ожидает изменений в конфигурации.

Все роли системы автоматически переключаются в работу с новым мастером, указанным в конфигурации, вне зависимости от данной настройки.

Ведет выделенный лог-журнал "pgctrl_*.log".

=Настройка PostgreSQL=

Для того, чтобы сервис контроллера работал корректно, требуется предварительная настройка экземпляров PostgreSQL.
Серверы могут быть установлены с помощью скрипта платформы, в этом случае они получают эту настройку автоматически.

Версия PostgreSQL не ниже 12.
Для репликации создана учетная запись (например, replicator), ей разрешено 10 или более подключений.
В конфигурационных файлах произведены следующие настройки (значения отдельных параметров могут варьироваться по усмотрению администратора):

postgresql.conf
listen_addresses = '*'
hot_standby = on
wal_level = replica
max_wal_senders = 10
wal_keep_segments = 32
promote_trigger_file = '/var/lib/postgresql/12/era_instance_01/master.signal'
pg_hba.conf
host	all	            era_replica     	0.0.0.0/0		md5

Если второй сервер настроен в режиме мастера, то после первого запуска контроллер автоматически переведет одного из них в режим репликации.

Дополнительно некоторые настройки можно задать в параметрах мастер-домена (подробнее…​).

backup_controller

object

empty

Настройки для контроллера создания архивных копий.
При настройке необходимо указать список дней недели (weekdays) и интервал часов дня (hours_interval), за пределами которых сервис неактивен. Часы задаются в UTC.
Сервис активируется не чаще одного раза в сутки. При перезапуске микросервиса middleware стартует не ранее чем через 15 минут. Ведет выделенный лог-журнал "bkp_*.log".
Создает резервную копию указанных СУБД PostgreSQL (версии 12+) и синхронизационного каталога :SYNC.
В результате работы создаются файлы архивы для каждого указанного экземпляра СУБД, и одна для каталога :SYNC с исключениями.
Файлы-архивы заливаются через указанные подключения ssh на внешний сервер-хранилище в указанную папку. Каждый архив может быть отправлен на свой сервер и/или в свою папку.
Настройки доступа к серверу-хранилищу имеют параметр определения пути к каталогу назначения (в режиме ssh это путь относительно домашней папки пользователя). Путь может содержать шаблоны:

  • weekday - подставляется номер дня недели (1-7).

  • day - подставляется номер текущего дня месяца в формате '00' (01-31).

  • month - подставляется номер текущего месяца в формате '00' (01-12).

  • year - подставляется текущий год в формате '0000'.

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

Если операция создания резервной копии завершается неудачей, то весь процесс прерывается, и это отражается в состоянии системы. Следующая попытка будет предпринята в соответствии с расписанием не раньше чем через 20 минут.

Контроллер может создавать резервные архивные копии для нескольких экземпляров СУБД PostgreSQL. Для этого их надо указывать в списке.
Каждый экземпляр СУБД PostgreSQL может иметь одну или несколько реплик (разные серверы в режиме потоковой репликации).
При необходимости указания реплик в объекте настройки экземпляра должен использоваться параметр servers, содержащий список индивидуальных настроек из общего раздела экземпляра.
В этом случае сбой операции по одной из реплик приводит к переходу к следующей.
Удачное завершение создания резервного архива по любой из реплик прерывает работу над экземпляром и переходит к следующему экземпляру.
Неудачное завершение создания резервного архива по всем репликам прерывает с ошибкой всю операцию резервного копирования.

При создании архива с резервной копией данных экземпляра СУБД PostgreSQL используется утилита 'pg_basebackup'.
Требуется, чтобы в настройках экземпляра в файле 'pg_hba.conf' были установлены разрешения для репликации.
При установке системы с помощью инсталлятора и выборе установки PostgreSQL в хост эти параметры прописываются автоматически для пользователя 'era_replica'.
В этом случае именно его учетную запись и следует указывать.

Настройки значений для экземпляра СУБД PostgreSQL:

  • ssh_host - хост, в котором установлен экземпляр 'postgresql' и для которого разрешен доступ к целевому экземпляру СУБД для репликации с помощью 'pg_hba.conf'. Также там должны быть доступны 'zip', 'ssh', 'ssh-keygen', 'ssh-keyscan', 'sshpass', 'scp', 'rm'.

  • ssh_port - порт для подключения по ssh.

  • ssh_user - имя пользователя для подключения по ssh. Преимущественно postgres.

  • ssh_pwd - пароль пользователя для подключения по ssh (если настроен доступ с помощью открытого ключа из всех контейнеров текущего сайта, где может размещаться роль 'middleware', то параметр можно не задавать).

  • pg_host - хост целевого экземпляра СУБД PostgreSQL, с которого необходимо произвести репликацию и создание резервного архива данных.

  • pg_port - порт целево го экземпляра СУБД PostgreSQL (по умолчанию 5432 - не совпадает с портом, задаваемым по умолчанию инсталлером системы).

  • pg_replica_user - имя пользователя PostgreSQL для подключения с целью репликации. Должно быть занесено в 'pg_hba.conf'.

  • pg_replica_pwd - пароль пользователя PostgreSQL.

  • destination_folder - путь к временному каталогу. Создается и по завершении удаляется. По умолчанию используется каталог '/tmp/backup_temp/pgdb/'.

  • pg_basebackup_command - команда для запуска 'pg_basebackup' из под учетной записи указанного ssh_user. По умолчанию "pg_basebackup".

  • send_mode - режим синхронизации. По умолчанию 'rsync'.

    • zip_cmd - упаковывает в zip-архив на хосте под учетной записью указанного ssh_user и отправляет его в хранилище с помощью 'scp'.

    • rsync - отправляет файлы с помощью rsync без сжатия, но используя механизм сравнения идентичности. Предполагает использование статического пути без шаблонов в хранилище, либо наладку внешнего автоматического удаления устаревших архивных копий.

  • zip_command - команда для запуска 'zip' из под учетной записи указанного ssh_user. По умолчанию "zip". Используется только в режиме send_mode = "zip_cmd"

  • ssh_command - команда для запуска 'ssh' из под учетной записи указанного ssh_user. По умолчанию "ssh".

  • sshpass_command - команда для запуска 'sshpass' из под учетной записи указанного ssh_user. По умолчанию "sshpass".

  • sshkeygen_command - команда для запуска 'ssh-keygen' из под учетной записи указанного ssh_user. По умолчанию "ssh-keygen".

  • sshkeyscan_command - команда для запуска 'ssh-keyscan' из под учетной записи указанного ssh_user. По умолчанию "ssh-keyscan".

  • rsync_command - команда для запуска 'rsync' из под учетной записи указанного ssh_user. По умолчанию "rsync". Используется только в режиме send_mode = "rsync"

  • scp_command - команда для запуска 'scp' из под учетной записи указанного ssh_user. По умолчанию "scp". Используется только в режиме send_mode = "zip_cmd"

  • rm_command - команда для запуска 'rm' из под учетной записи указанного ssh_user. По умолчанию "rm".

  • storage_ssh_host - хост удаленного сервера хранилища для размещения созданного архива.

  • storage_ssh_port - порт удаленного сервера хранилища.

  • storage_ssh_user - имя пользователя для подключения к серверу хранилища по ssh.

  • storage_ssh_pwd - пароль пользователя для подключения к серверу хранилища по ssh (если настроен доступ с помощью открытого ключа из всех хостов, указанных параметром ssh_host, то параметр можно не задавать).

  • storage_ssh_path - путь к каталогу на сервере хранилища (относительно домашнего каталога пользователя storage_ssh_user), куда следует разместить созданный архив. Могут использоваться шаблоны подстановки для хранения файлов, созданных в разные дни и организации перезаписи по кругу. При сборке архивов с нескольких экземпляров СУБД и размещении на одном и том же хранилище, следует устанавливать различные пути во избежании перезаписи одного архива другим.

  • servers - список реплик (массив объектов, содержащих индивидуальные значения указанных выше параметров).

Архивный файл имеет формат zip. Примерный алгоритм восстановления:

  1. Предварительно остановить службу экземпляра PostgreSQL, находящуюся в целевом каталоге данных и конфигурации (pg_ctl -D $DataFolder stop).

  2. Скопировать архив на целевую машину и распаковать в целевой каталог.

  3. При необходимости изменить параметры в конфигурационном файле экземпляра "postgresql.conf

pg_hba.conf" (если архив собран с системы, имеющей иные настройки - порт, интерфейсы, параметры доступа и репликации).
4. Убедиться, что в настройках "postgresql.conf" параметр promote_trigger_file выставлен на слежение за сигнальным файлом master.signal в целевом каталоге.
5. Задать всем распакованным файлам в каталоге владельца, который необходим для работы в целевой системе (chown -R postgres:postgres $DataFolder).
6. Запустить службу экземпляра PostgreSQL в целевом каталоге данных и конфигураций (pg_ctl -D $DataFolder start).
7. Преобразовать его в master (touch master.signal).
 — Контроллер может создавать резервную архивную копию каталога :SYNC.
Формирует zip-архив, исключая каталог 'standardexpressions', распакованные данные ролевых приложений (сами архивы упаковываются).

* excluded_paths - список исключаемых каталогов в форме масок для путей (прим. '/roleapps/'). С помощью исключений можно сокращать размер архива устраняя временные и статические данные. Также на многосайтовой системе можно исключать общий раздел, оставляя ответственность за его резервное копирование лишь центральному сайту.
* send_mode - режим синхронизации. По умолчанию 'rsync'.
zip_cmd - упаковывает каталог в zip-архив на локальном хосте (контейнере с установленной era) и отправляет его в хранилище с помощью 'scp'.
rsync - отправляет файлы с помощью rsync без сжатия, но используя механизм сравнения идентичности. Предполагает использование статического пути без шаблонов в хранилище, либо наладку внешнего автоматического удаления устаревших архивных копий.
* zip_command - команда для запуска 'zip'. По умолчанию "zip". Используется только в режиме send_mode = "zip_cmd"
* ssh_command - команда для запуска 'ssh'. По умолчанию "ssh".
* sshkeygen_command - команда для запуска 'ssh-keygen'. По умолчанию "ssh-keygen".
* sshkeyscan_command - команда для запуска 'ssh-keyscan'. По умолчанию "ssh-keyscan".
* rsync_command - команда для запуска 'rsync'. По умолчанию "rsync". Используется только в режиме send_mode = "rsync"
* scp_command - команда для запуска 'scp'. По умолчанию "scp". Используется только в режиме send_mode = "zip_cmd"
* rm_command - команда для запуска 'rm'. По умолчанию "rm". Используется только в режиме send_mode = "zip_cmd"
* storage_ssh_host - хост удаленного сервера хранилища для размещения созданного архива.
* storage_ssh_port - порт удаленного сервера хранилища.
* storage_ssh_user - имя пользователя для подключения к серверу хранилища по ssh.
* storage_ssh_pwd - пароль пользователя для подключения к серверу хранилища по ssh (если настроен доступ с помощью открытого ключа из всех хостов, указанных параметром ssh_host, то параметр можно не задавать).
* storage_ssh_path - путь к каталогу на сервере хранилища (относительно домашнего каталога пользователя storage_ssh_user), куда следует разместить созданный архив. Могут использоваться шаблоны подстановки для хранения файлов, созданных в разные дни и организации перезаписи по кругу. При сборке архивов с нескольких экземпляров СУБД и размещении на одном и том же хранилище, следует устанавливать различные пути во избежании перезаписи одного архива другим.

Для восстановления достаточно распаковать/скопировать в каталог ':SYNC' на любом из серверов сайта.


Общий вид объекта на примере
----

{
"hours_interval": [20, 3],
"weekdays": [2,4,7],
"sync_folder": {
"send_mode": "rsync",
"excluded_paths": ["
/common/temp/
"],
"storage_ssh_host": "storage.local",
"storage_ssh_port": 8022,
"storage_ssh_user": "user414",
"storage_ssh_pwd": "…​",
"storage_ssh_path": "backup/dow_%weekday"
},
"pgdb": [
{
"servers": [
{
"ssh_host": "192.168.0.191",
"pg_host": "192.168.0.191"
}, {
"ssh_host": "192.168.0.192",
"pg_host": "192.168.0.192"
}
],
"ssh_port": 9022,
"ssh_user": "postgres",
"ssh_pwd": "…​",
"pg_port": 5420,
"pg_replica_user": "era_replica",
"pg_replica_pwd": "…​",
"storage_ssh_host": "storage.local",
"storage_ssh_port": 8022,
"storage_ssh_user": "user414",
"storage_ssh_pwd": "…​",
"storage_ssh_path": "backup/dow_%weekday"
},
…​
]
}
----

cti_servers

array<object>

empty

Пример конфигурации

Управление конфигурацией производится в приложении, доступном для администраторов мастер-домена. Приложение скрывает полное содержание конфигурации, однако тем не менее оно доступно через API.

Конфигурация содержит раздел для описания всех экземпляров всех ролей. Параметры определяются для каждого конкретного экземпляра роли.

Пример узла
{
  "name": "mware2",
  "roletype": "mware",
  "iface": "eth0",

  "pg_controller": [
    {
      "key": "general",
     "servers": [
       {
        "ssh_host": "192.168.0.123",
        "ssh_port": 9022,
        "ssh_user": "postgres",
        "ssh_pwd": "123456",
        "pg_host": "192.168.0.123",
        "pg_port": 5420,
        "pg_replica_user": "era_replica",
        "pg_replica_pwd": "654321",
        "pg_database": "postgres",
        "pg_ctl_command": "/usr/lib/postgresql/12/bin/pg_ctl",
        "pg_basebackup_command": "pg_basebackup",
        "pg_data_folder": "/var/lib/postgresql/12/instance01",
        "pg_backup_folder": "/var/lib/postgresql/12/backups/instance01",
        "pg_log_filepath": "/var/log/postgresql/postgresql-12-instance01.log",
        "pg_signal_filepath": "/var/lib/postgresql/12/instance01/master.signal"
       },
       {
        "ssh_host": "192.168.0.124",
        "ssh_port": 9022,
        "ssh_user": "postgres",
        "ssh_pwd": "123456",
        "pg_host": "192.168.0.124",
        "pg_port": 5420,
        "pg_replica_user": "era_replica",
        "pg_replica_pwd": "654321",
        "pg_database": "postgres",
        "pg_ctl_command": "/usr/lib/postgresql/12/bin/pg_ctl",
        "pg_basebackup_command": "pg_basebackup",
        "pg_data_folder": "/var/lib/postgresql/12/instance01",
        "pg_backup_folder": "/var/lib/postgresql/12/backups/instance01",
        "pg_log_filepath": "/var/log/postgresql/postgresql-12-instance01.log",
        "pg_signal_filepath": "/var/lib/postgresql/12/instance01/master.signal"
       }
     ]
    }
  ],

  "backup_controller": {
    "hours_interval": [20, 3],
    "weekdays": [1,2,3,4,5,6,7],
    "storage_ssh_host": "storage.local",
    "storage_ssh_port": 8022,
    "storage_ssh_user": "user414",
    "storage_ssh_pwd": "pwd414",
    "storage_ssh_path": "backup/dow_%weekday",
    "sync_folder": {
      "send_mode": "rsync",
      "excluded_paths": ["**/common/fax/*", "**/some_temp_files/*"]
    },
    "pgdb": [
      {
        "servers": [
          {
            "ssh_host": "192.168.0.123",
            "pg_host": "192.168.0.123"
          },        {
            "ssh_host": "192.168.0.124",
            "pg_host": "192.168.0.124"
          }
        ],
        "ssh_port": 9022,
        "ssh_user": "postgres",
        "ssh_pwd": "123456",
        "pg_port": 5420,
        "pg_replica_user": "era_replica",
        "pg_replica_pwd": "654321"
      }
    ]
  },

  "group": 11120,
  "order": 10
}

См. также