Обновление с версии 3.14.16 на 3.17
Обновление с версии 3.14.16 на 3.17
1. Подготовка хостов к обновлению
В процессе обновления с версии 3.14.16 на версию 3.17 будет заменена База Данных с MySQL на PostgreSQL. Для работы PostgreSQL требуется отдельный раздел дискового пространства – партиция, которая должна быть смонтирована в директорию → "/srv/ecss/ecss-postgres-bdr-ssw". В версии 3.14.16 такая партиция не предусматривалась, поэтому ее требуется создать. Размерность данной партиции от 100G и более.
Вариантов несколько:
- При наличии нераспределенного пространства на HDD/SSD → создать новую партицию с файловой системой ext4.
- Подключить еще один физический (в случае виртуализации виртуальный) диск. Создать на нем партицию postgres с точкой монтирования "/srv/ecss/ecss-postgres-bdr-ssw".
Данную операцию необходимо выполнить для двух хостов поочередно (порядок не важен).
2. Подготовительные действия на ecss2
- Если нужны последние данные биллинга, то необходимо финализировать текущую cdr и скачать cdr-файлы на удаленный сервер:
/domain/test_domain/cdr/make_finalize_cdr Created file(s): cdr_20260122_11_51_16_1_c.csv
- Включить настройку для автоматической синхронизации файлов, находящихся в сплите (по большему размеру). Подробнее см. "Проблемы, связанные с возникновением split-brain".на ecss1
sudo gluster volume set ecss_volume cluster.favorite-child-policy size
- Остановить репликации MySQL.
Убедитесь, что значения параметровSlave_IO_RunningиSlave_SQL_RunningравныNo.на ecss1/ecss2
sudo mysql -uroot -p -e 'STOP SLAVE;'CODEна ecss1/ecss2
sudo mysql -uroot -p -e 'SHOW SLAVE STATUS \G;' | grep -E "Slave_IO_Running:|Slave_SQL_Running:"CODEПример:sudo mysql -uroot -p -e 'SHOW SLAVE STATUS \G;' | grep -E "Slave_IO_Running:|Slave_SQL_Running:" . . . Slave_IO_Running: No Slave_SQL_Running: No . . . - При обновлении кластера следует обновлять сервера по очереди. Таким образом, при обновлении один из серверов будет всегда запущен и работа сервисов не будет прервана. Для разделения кластера следует использовать инструмент ecss-control на обоих серверах (описание команд утилиты приведено в «Приложении М»).
Обмен SIP-сигнализацией происходит через SIP-VRRP IP-адрес. Аналогичным образом, через MySQL-VRRP IP-адрес, происходит подключение к MySQL. Этот функционал реализован для возможности миграции IP-адреса на другой хост в случае падения/отключения/техобслуживания основного хоста. Контроль миграции IP-адресов осуществляется сервисом keepalive на каждом хосте. Для перевода трафика на первый сервер (ecss1) необходимо выключить keepalive на втором хосте (ecss2). В этом случае оба SIP-VRRP IP-адреса, а также MySQL-VRRP IP-адрес будут находится на первом хосте (ecss1). Выполните следующую команду:на ecss2
sudo systemctl disable --now keepalived.serviceCODE - Командой ifconfig проверить, что все VRRP IP-адреса находятся на ecss1 (VRRP-mysql/VRRP-SIP1/VRRP-SIP2).
на ecss1
ifconfigCODE - Необходимо замаскировать все ноды на сервере, который будет обновляться первым, отключите автозапуск нод:
на ecss2
sudo systemctl mask --now ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip ecss-sormCODE - На ecss1 выполните разделение SSW на два независимых сервера следующей командой:
Команда ecss-control работает со стандартными именами хостов: ecss1/ecss2.
Проверьте статус:на ecss1
sudo ecss-control detachCODEна ecss1
sudo ecss-control statusCODEРезультат:sudo ecss-control detach detach host: ecss2, ip: 10.0.10.82 complete sudo ecss-control status locked ip: 10.0.10.82
Нода sorm идет одна на кластер. В случае её работы на ecss1 при выполнении приложенной команды будет уведомление.
Unit /etc/systemd/system/ecss-sorm.service is masked, ignoring.
Данное сообщение не является ошибкой. Продолжить выполнение процедуры.
3. Подготовка к обновлению сервисов SSW на ecss2
- Актуализировать репозиторий ssw:
на обоих хостах
sudo sh -c "echo deb [arch=amd64] http://archive.eltex.org/ssw/jammy/3.17 stable main extras external > /etc/apt/sources.list.d/eltex-ecss10-stable.list"CODE - Выполнить обновление пакетов:
на обоих хостах
sudo apt updateCODE
4. Обновление сервисов SSW на ecss2
- Установите новую БД Postgres (сначала на ecss1, далее на ecss2).
на обоих хостах, сначала на ecss1, потом на ecss2
sudo apt install ecss-postgres-bdr-sswCODEЕсли при установки пакета, выдается!
ecss-postgres-bdr-ssw : Depends: docker-compose-plugin but it is not installable --> выполнить следующие команды:
на всех хостах
sudo install -m 0755 -d /etc/apt/keyringsCODEна всех хостах
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascCODEна всех хостах
sudo chmod a+r /etc/apt/keyrings/docker.ascCODEна всех хостах
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullCODEна всех хостах
sudo apt updateCODEна обоих хостах, сначала на ecss1, потом на ecss2
sudo apt install ecss-postgres-bdr-sswCODEВ процессе установки будут заданы вопросы:
-- Выбираем адрес для репликации из списка (на двух хостах )
-- хотим установку в кластере (на двух хостах)
-- да я мастер (на ecss1)/ нет я не мастер (на ecss2)
-- на ecss2, указываем адрес мастера, (указанный в ответе на вопрос 1 для ecss1) - Проверьте корректность настройки репликации.
Во время установки в директорию /srv/ecss/ecss-postgres-bdr-ssw устанавливается скрипт postgresbdr_ssw.sh.
Для проверки репликации выполните следующие команды:Для проверки репликации выполнить команду на обоих хостах:
cd /srv/ecss/ecss-postgres-bdr-sswCODEДля проверки репликации выполнить команду на обоих хостах:
sudo ./postgresbdr_ssw.sh checkCODEВывод на хостах ecss1/ecss2 должен быть одинаковый.Пример:sudo ./postgresbdr_ssw.sh check Enter master ip please Like 10.150.150.15 10.0.10.81 Enter slave ip please 10.0.10.82 Press enter with empty password Просто щелкайте Enter, не вводя пароль q - выход из просмотра таблицы (если необходимо) таблица нод на мастере по ecss_storekeeper_db таблица нод на слейве по ecss_storekeeper_db таблица коннекций на мастер по ecss_storekeeper_db conn_sysid | conn_dsn ---------------------+--------------------------------------------------------------------------------------- 7569499877813944343 | host=10.0.10.81 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1 7569514001040228374 | host=10.0.10.82 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1 (2 rows) таблица коннекций на слейве по ecss_storekeeper_db conn_sysid | conn_dsn ---------------------+--------------------------------------------------------------------------------------- 7569499877813944343 | host=10.0.10.81 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1 7569514001040228374 | host=10.0.10.82 port=5439 dbname=ecss_storekeeper_db user=postgres password=postgres1 (2 rows) - Обновление пакета ecss-dns-env:
на ecss2
sudo apt install ecss-dns-envCODEПосле обновления нужно актуализировать конфигурацию, выполнив команду. Ответы на вопросы аналогичны процедуре инсталляции:При обновлении нужно применить новые конфигурационные файлы (подтверждением -Y).
на ecss2
sudo dpkg-reconfigure ecss-dns-envCODE - Выполните обновление пакета ecss-user:
на ecss2
sudo apt install ecss-userCODE - Выполните обновление пакета ecss-utils:
на ecss2
sudo apt install ecss-utilsCODE - Выполните обновление пакета ecss-node:
на ecss2
sudo apt install ecss-nodeCODEВопросы на установку ecss-node:
* ECSS-node ID in DNS format: <Согласно лицензии>.
* Default configuration: yes
* Global config: yesПримите все изменения файлов конфигурации.
- Выполните миграцию пользователей cocon (audit_database):
на ecss2
/usr/bin/migrate_cocon.exsCODEБудет предложен список вопросов для настройки параметров подключения к MySQL:
Параметр Описание Значение по умолчанию MySQL database hostname Адрес БД MySQL cocon.mysql.ecss MySQL database port Порт БД MySQL 3306 ecss_audit database name Изменённое имя БД ecss_audit ecss_audit database username
Имя пользователя MySQL для доступа к базе ecss_audit audit ecss_audit database password Пароль пользователя MySQL для доступа к базе ecss_audit audit Скрипт:
- подготовит базу данных PostgreSQL к работе с SSW 3.17
- произведет подключения к базам данных MySQL и PostgreSQL
- выполнит миграции Ecto (команды DDL, такие как создание таблиц)
- перенесет необходимые для работы CoCon данные из MySQL в PostgreSQL
После успешного выполнения скрипта в базе PostgreSQL будут находится все необходимые данные для входа в CoCon на SSW 3.17
- Включите ноды.
Включить сервисы ssw следующими командами:на ecss2
sudo systemctl unmask ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip ecss-sormCODEна ecss2
sudo systemctl enable ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip ecss-sormCODE - Запуск SSW на ecss2. Запустите следующие сервисы:
ecss-myceliumecss-dsна ecss2
sudo systemctl start ecss-myceliumCODEecss-coreна ecss2
sudo systemctl start ecss-dsCODEecss-mediatorна ecss2
sudo systemctl start ecss-coreCODEна ecss2
sudo systemctl start ecss-mediatorCODEЕсли лицензия поддерживает СОРМ3, то запустить также сервис ecss-sorm.
на ecss2
sudo systemctl start ecss-sormCODEЕсли сервис ecss-sorm оказался замаскирован, то выполните следующие команды:
на ecss2
sudo systemctl unmask ecss-sorm sudo systemctl start ecss-sormCODEДля корректной работы SORM3 необходимо выполнить коррекцию команды для sorm-экстрактора. Данную команду необходимо выполнить для каждого домена в SSW.
выполняется в CoCon
/domain/<Имя_домена>/sorm3/set extractor_node sorm1@ecss2CODEДля примера:/domain/test_domain/sorm3/info┌──────────────────┬───────────┬───────────┐│ Property │ Domain │ Value │├──────────────────┼───────────┼───────────┤│adaptation │test_domain│undefined ││enabled │test_domain│false ││entrypoint_profile│test_domain│ ││extractor_ip │test_domain│127.0.0.1 ││extractor_node │test_domain│sorm1@ecss1│└──────────────────┴───────────┴───────────┘/domain/test_domain/sorm3/set extractor_node sorm1@ecss2Property "extractor_node" successfully changed from:sorm1@ecss1tosorm1@ecss2./domain/test_domain/sorm3/info┌──────────────────┬───────────┬───────────┐│ Property │ Domain │ Value │├──────────────────┼───────────┼───────────┤│adaptation │test_domain│undefined ││enabled │test_domain│false ││entrypoint_profile│test_domain│ ││extractor_ip │test_domain│127.0.0.1 ││extractor_node │test_domain│sorm1@ecss2│└──────────────────┴───────────┴───────────┘Команду повторить для всех доменов в SSW.
Пока не следует запускать PA-SIP!
- Проверьте статус сервисов, для этого выполните в CoCon команду system-status:выполняется в CoCon
/system-status Checking... ┌─┬───────────────┬────────────────────────────┬───────────────┬────────────┬──────┐ │ │ Node │ Release │ Erlang nodes │Mnesia nodes│Uptime│ ├─┼───────────────┼────────────────────────────┼───────────────┼────────────┼──────┤ │ │core1@ecss2 │ecss-core-3.17.1.0.1771 │core1@ecss2 │not running │2m 27s│ │ │ds1@ecss2 │ecss-ds-3.17.1.0.1771 │ds1@ecss2 │ds1@ecss2 │2m 32s│ │ │md1@ecss2 │ecss-mediator-3.17.1.0.1771 │md1@ecss2 │md1@ecss2 │2m 16s│ │ │mycelium1@ecss2│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss2│not running │2m 39s│ │ │sorm1@ecss2 │ecss-sorm-3.17.1.0.1771 │sorm1@ecss2 │not running │1m 56s│ └─┴───────────────┴────────────────────────────┴───────────────┴────────────┴──────┘ All services are started. Active media resource selected list specific: ┌─────────────┬───────────┬─────────────┬───────────┬───────────┐ │ Node │ MSR │ MSR │ Cc-status │ Cc-uptime │ │ │ │ version │ │ │ ├─────────────┼───────────┼─────────────┼───────────┼───────────┤ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.1.0 │ connected │ 00:00:10 │ │ │ msr.ecss2 │ 3.14.16.1.0 │ connected │ 00:00:10 │ └─────────────┴───────────┴─────────────┴───────────┴───────────┘
Описание команд миграции и рекомендации
Миграция статистики- Так как таблицы статистики динамические, каждые 5 минут агрегируются данные и удаляются старые, то вместо размера таблицы при команде /check используется index последней записи.
Рекомендации
- Промигрировать всю статистику с активного работающего хоста с MySQL на новый неактивный c PostgresSQL.
- Чтобы избежать неконсистентности данных не включайте статистику на новом хосте до полного завершения миграции. После ввода в работу нового хоста основная часть данных уже будет промигрирована. Нужно будет запустить миграцию остаточных данных, которые успели появится на MySQL-хосте. В зависимости от скорости переключения хостов будет до 10 пятиминуток, так что потери по времени будут минимальны.
- Чтобы избежать потери данных с MySQL-хоста, желательно выдержать пятиминутную паузу после вывода этого хоста из работы и запустить миграцию на PostgresSQL-хосте чтобы забрать оставшиеся данные, иначе можно потерять одну пятиминутную запись.
- Лучше мигрировать данные в порядке следующего приоритета таблиц:
- intrahour
- hour
- daily
- weekly
- monthly
Таблицы, которые должны мигрироваться строго после полной миграции зависимостей.
База данных Таблица Таблицы-зависимости audit ecss_role_group - ecss_groups
- ecss_roles
ecss_groups_users - ecss_groups
- ecss_users
ecss_role_settings - ecss_roles
ecss_user_settings2 - ecss_users
ecss_audit_commands_requests - ecss_audit_sessions
ecss_audit_commands_answers - ecss_audit_sessions
- ecss_audit_commands_requests
calls ss - tolltickets
address_book contact
- source
email
- contact
phone
- contact
- label
Выполните миграции таблиц DB:
Проверьте, какие данные доступны для переноса, можно командой:выполняется в CoCon/system/postgresql/migration/check <DATABASE> <* | table> [options]где DATABASE:address_bookauditcallsdialerhistorymeetingssubscribers
где Options:--hostname, адрес хоста с БД--port--database, имя базы данных данное в опциях для этой БД--username, имя пользователя БД--password, пароль пользователя БД
Пример:/system/postgresql/migration/check address_book * --hostname ecss1 --username ******* --password ******* ┌────────────┬────────────────┬────────────────────────────────────┬───────────────────────────────┐ │ DB │ Table │ Status │ Description │ ├────────────┼────────────────┼────────────────────────────────────┼───────────────────────────────┤ │address_book│contact │Needs migration. │Depends on: `source`. │ │ │ │Meegrated: 0 / 1785 │ │ │ │ │ │ │ │- │label │Needs migration. │No dependencies. │ │ │ │Meegrated: 0 / 5 │ │ │ │ │ │ │ │- │phone │Needs migration. │Depends on: `contact`, `label`.│ │ │ │Meegrated: 0 / 2493 │ │ │ │ │ │ │ │- │changes │Needs migration. │No dependencies. │ │ │ │Meegrated: 0 / 5 │ │ │ │ │ │ │ │- │email │Needs migration. │Depends on: `contact`. │ │ │ │Meegrated: 0 / 588 │ │ └────────────┴────────────────┴────────────────────────────────────┴───────────────────────────────┘
Миграцию выполните командой:Команда создаёт задачу миграции.выполняется в CoCon
/system/postgresql/migration/do <DATABASE> <TABLE> --hostname ecss1CODE
Задача имеет 3 статуса: migrating, finished, failed.
При запуске команды проверяется текущий размер таблицы и сверяется с данными последней миграции этой таблицы. При необходимости миграции данных задача запускается и уходит в фон. Размер таблицы фиксируется на моменте старта задачи миграции. Offset автоматически берётся с последней записи миграции таблицы, действуя как чек поинт.
Флаги offset/limit использовать только для ручного устранении проблем при миграции.Выполните cocon-команды для переноса данных из MySQL в PostgreSQL.
Используя команду check, для каждой БД промигрируйте таблицы баз данных. В командах работает автодополнение для всех ДБ и их таблиц.
Проверьте прохождение миграции командой:выполняется в CoCon
/system/postgresql/migration/info <DATABASE> <TABLE>CODEПример:/system/postgresql/migration/info address_book ┌────┬────────────┬────────────────────┬──────────┬────────────────┬───────────────────┬───────────────────┐ │ ID │ DB │ Table │ Status │ Props │ Start Time │ End Time │ ├────┼────────────┼────────────────────┼──────────┼────────────────┼───────────────────┼───────────────────┤ │1 │address_book│source │finished │current: 2 │22.01.2026 13:14:20│22.01.2026 13:14:20│ │ │ │ │ │overall: 2 │ │ │ │2 │address_book│label │failed │current: 0 │22.01.2026 13:14:30│22.01.2026 13:14:30│ │ │ │ │ │overall: 5 │ │ │ │3 │address_book│changes │failed │current: 0 │22.01.2026 13:14:49│22.01.2026 13:14:49│ │ │ │ │ │overall: 5 │ │ │ │4 │address_book│contact │finished │current: 1785 │22.01.2026 13:14:56│22.01.2026 13:14:56│ │ │ │ │ │overall: 1785 │ │ │ │5 │address_book│phone │finished │current: 2493 │22.01.2026 13:15:03│22.01.2026 13:15:03│ │ │ │ │ │overall: 2493 │ │ │ │6 │address_book│email │finished │current: 588 │22.01.2026 13:15:07│22.01.2026 13:15:07│ │ │ │ │ │overall: 588 │ │ │ └────┴────────────┴────────────────────┴──────────┴────────────────┴───────────────────┴───────────────────┘
- Обновление пакета ecss-restfs.Принять все новые конфигурационные файлы, выбирая Y.
на ecss2
sudo apt install ecss-restfsCODE - Обновление пакета ecss-media-server.
Media Server анализирует конфигурацию в файлах находящихся в директории /etc/ecss/ecss-media-server/. В версии 3.17 реализована новая функция контроля приоритетности кодеков. Если по какой то причине в нескольких файлах присутствует секция "codec", в которой несколько раз прописывается один и тот же кодек, то после обновления возникнет конфликт, и Media Server работать не будет.
Поэтому в конфигурационных файлах одного Media Server не должно быть конфликтов по приоритетам кодеков (запись об одном кодеке должна быть одна и не повторяться в других файлах). Решение, на какие именно фалы требуется сконфигурировать, остается на усмотрение администратора системы.
Предварительно отключите регистрацию на рабочий хост ecss1. Для этого закомментируйте в конфигурационном файле строку с realm рабочего хоста (в примере realm="sip:10.0.20.81:5000"), следующей командой (добавьте <!- - вначале строки, и - -> в конце строки), следующей командой:на ecss2
sudo nano /etc/ecss/ecss-media-server/conf.d/default.xmlCODEВыполните обновление:пример<?xml version="1.0"?> <config> <accounts> <!--<dynamic msr_name="msr.ecss2" realm="sip:10.0.20.81:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>--> <dynamic msr_name="msr.ecss2" realm="sip:10.0.20.82:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/> </accounts> </config>Актуализируйте конфигурацию:на ecss2
sudo apt install ecss-media-serverCODEВыполните проверку, и, при необходимости, отредактируйте файл командой:на ecss2
sudo dpkg-reconfigure ecss-media-serverCODEна ecss2
sudo nano /etc/ecss/ecss-media-server/config.xmlCODEпример
<?xml version="1.0" encoding="utf-8"?> <config date="16:54:35 20.02.2025"> <general log-level="3" log-rotate="yes" max-calls="8192" max-vid-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" calls-delta="100" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" enable-ice-transport="no" ice-update="no" aggressive-ice="yes" stun-server="" suspicious-mode="no"/> <transport bind-addr="10.0.20.80" port="5040" transport="udp+tcp"/> <!-- By default configured public TURN-server --> <turn-server use-turn="no" host="numb.viagenie.ca" user="webrtc@live.com" password="muazkh"/> <media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" vid-enc-threads="2" vid-dec-threads="2" video-conf-layout="evenly" keyframe-interval="1000" vid-decode-delay="100" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="640" video-enc-height="360" finalsilence="1000" rtcp-stat-dump="yes" dtmf-tg-fpc-loop="10" dtmf-tg-fit="1" dtmf-tg-fot="2" dtmf-tg-volume="12288"/> <codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="0" speex="0" l16="0" g7221="0" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/> <accounts> <!-- <dynamic msr_name="msr.name" realm="sip:127.0.0.1:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" /> --> </accounts> <pbyte> <mcc bind-addr="10.0.20.82" port="5700"/> </pbyte> <conf_dir path="/etc/ecss/ecss-media-server/conf.d"/> <metrics enable="no" msr_name="msr" port="8100"/> <rtp> <auto addr-v4=""/> </rtp> </config>CODE - Обновление пакета ecss-media-resources:
на ecss2
sudo apt install ecss-media-resourcesCODE - Обновление пакета ecss-web-conf
на ecss2
sudo apt install ecss-web-confCODE Обновление пакета ecss-teleconference-ui
на ecss2
sudo apt install ecss-teleconference-uiCODEОбновление пакета ecss-crm-server
на ecss2
sudo apt install ecss-crm-serverCODEОбновление пакета ecss-cc-ui
на ecss2
sudo apt install ecss-cc-uiCODEОбновление пакета ecss-call-api
на ecss2
sudo apt install ecss-call-apiCODEОбновление пакета ecss-peeper-client
на ecss2
sudo apt install ecss-peeper-clientCODE- Перенесите актуальные регистрации абонентов:
Перед переводом keepalived на обновленный хост необходимо скопировать актуальную базу ds с ecss1 (иначе база регистраций будет пустая). Поэтому сначала делаем backup БД Mnesia на ecss1:выполняется в CoCon
/node/ds1@ecss1/oasys/backupCODEОстановите ecss-ds на ecss2:/node/ds1@ecss1/oasys/backup Backup was successfully created at the path: "/var/lib/ecss/oasys/Mnesia.ds1@ecss1_20250930081517"
Командой scp копируйте backup c ecss1 на ecss2.на ecss2
sudo systemctl stop ecss-dsCODEВыполните локальную копию текущей конфигурации:на ecss2
scp -r ecss@ecss1:/var/lib/ecss/oasys/Mnesia.ds1@ecss1_20250930081517 /var/lib/ecss/oasysCODEЗамените локальную конфигурацию на конфигурацию backup c ecss1:на ecss2
sudo cp -a /var/lib/ecss/oasys/Mnesia.ds1@ecss2 /var/lib/ecss/oasys/Mnesia.ds1@ecss2-bkpCODEна ecss2
sudo mv /var/lib/ecss/oasys/Mnesia.ds1@ecss1_20250930081517 /var/lib/ecss/oasys/Mnesia.ds1@ecss2CODEЗапустите ecss-ds и ecss-pa-sip (чтобы подгрузились актуальные регистрации абонентов):на ecss2
sudo chown -R ssw:ssw /var/lib/ecss/oasysCODEна ecss2
sudo systemctl start ecss-dsCODEПроверьте статус сервисов командой /system-status :на ecss2
sudo systemctl start ecss-pa-sipCODEВыполните проверку переезда активных регистраций на обновленный хост. Для этого выполните контроль зарегистрированных абонентов на одном (3.114.16) и втором (3.17) хостах. Выполните команду в CoCon:выполняется в CoCon
/system-status Checking... ┌─┬───────────────┬────────────────────────────┬───────────────┬────────────┬──────┐ │ │ Node │ Release │ Erlang nodes │Mnesia nodes│Uptime│ ├─┼───────────────┼────────────────────────────┼───────────────┼────────────┼──────┤ │ │core1@ecss2 │ecss-core-3.17.1.0.1771 │core1@ecss2 │not running │2m 27s│ │ │ds1@ecss2 │ecss-ds-3.17.1.0.1771 │ds1@ecss2 │ds1@ecss2 │2m 32s│ │ │md1@ecss2 │ecss-mediator-3.17.1.0.1771 │md1@ecss2 │md1@ecss2 │2m 16s│ │ │mycelium1@ecss2│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss2│not running │2m 39s│ │ │sip1@ecss2 │ecss-pa-sip-3.17.1.0.1771 │sip1@ecss2 │sip1@ecss2 │2m 22s│ │ │sorm1@ecss2 │ecss-sorm-3.17.1.0.1771 │sorm1@ecss2 │not running │1m 56s│ └─┴───────────────┴────────────────────────────┴───────────────┴────────────┴──────┘ All services are started. Active media resource selected list specific: ┌─────────────┬───────────┬─────────────┬───────────┬───────────┐ │ Node │ MSR │ MSR │ Cc-status │ Cc-uptime │ │ │ │ version │ │ │ ├─────────────┼───────────┼─────────────┼───────────┼───────────┤ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.1.0 │ connected │ 00:00:10 │ │ │ msr.ecss2 │ 3.17.1.0.28 │ connected │ 00:00:10 │ └─────────────┴───────────┴─────────────┴───────────┴───────────┘CODEвыполняется в CoCon на ecss2
/domain/test_domain/sip/user/registered sip * 450 make users list ... [**********************************************************************] 28mks 450 users information read ... [**********************************************************************] 1ms Executed on the sip1@ecss2 ┌───────────────┐ │ elements: 436 │ └───────────────┘CODEвыполняется в CoCon на ecss1
/domain/test_domain/sip/user/registered sip * 450 make users list ... [**********************************************************************] 28mks 450 users information read ... [**********************************************************************] 1ms Executed on the sip1@ecss1 ┌───────────────┐ │ elements: 438 │ └───────────────┘CODE - Запустие сервиса keepalived:
на ecss2
sudo systemctl enable --now keepalivedCODE
5. Подготовительные действия на ecss1
- Подготовьте ecss1 к обновлению, для этого переведите весь трафик на ecss2 (команда выполняется на ecss1):
на ecss1
sudo systemctl disable --now keepalived.serviceCODE - Командой ifconfig проверьте, что все VRRP-адреса (VRRP IP-mysql/VRRP IP-SIP1/VRRP IP-SIP2) находятся на ecss2.
на ecss2
ifconfigCODE - После разделения кластера выключите все ноды на сервере ecss1:
на ecss1
sudo systemctl mask --now ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip ecss-sormCODE - Выполните миграции таблиц DB, как описывалось ранее:
Проверьте, какие данные доступны для переноса командой:выполняется в CoCon/system/postgresql/migration/check <DATABASE> *где DATABASE:address_bookauditcallsdialerhistorymeetingssubscribers
Пример:/system/postgresql/migration/check address_book * --username ******* --password ******* ┌────────────┬────────────────┬────────────────────────────────────┬───────────────────────────────┐ │ DB │ Table │ Status │ Description │ ├────────────┼────────────────┼────────────────────────────────────┼───────────────────────────────┤ │address_book│contact │Needs migration. │Depends on: `source`. │ │ │ │Meegrated: 0 / 1785 │ │ │ │ │ │ │ │- │label │Needs migration. │No dependencies. │ │ │ │Meegrated: 0 / 5 │ │ │ │ │ │ │ │- │phone │Needs migration. │Depends on: `contact`, `label`.│ │ │ │Meegrated: 0 / 2493 │ │ │ │ │ │ │ │- │changes │Needs migration. │No dependencies. │ │ │ │Meegrated: 0 / 5 │ │ │ │ │ │ │ │- │email │Needs migration. │Depends on: `contact`. │ │ │ │Meegrated: 0 / 588 │ │ └────────────┴────────────────┴────────────────────────────────────┴───────────────────────────────┘
Миграцию выполните командой:Проверьте прохождение миграции командой:выполняется в CoCon
/system/postgresql/migration/do <DATABASE> <TABLE>CODEвыполняется в CoCon
/system/postgresql/migration/info <DATABASE> <TABLE>CODEПример:/system/postgresql/migration/info address_book ┌────┬────────────┬────────────────────┬──────────┬────────────────┬───────────────────┬───────────────────┐ │ ID │ DB │ Table │ Status │ Props │ Start Time │ End Time │ ├────┼────────────┼────────────────────┼──────────┼────────────────┼───────────────────┼───────────────────┤ │1 │address_book│source │finished │current: 2 │22.01.2026 13:14:20│22.01.2026 13:14:20│ │ │ │ │ │overall: 2 │ │ │ │2 │address_book│label │failed │current: 0 │22.01.2026 13:14:30│22.01.2026 13:14:30│ │ │ │ │ │overall: 5 │ │ │ │3 │address_book│changes │failed │current: 0 │22.01.2026 13:14:49│22.01.2026 13:14:49│ │ │ │ │ │overall: 5 │ │ │ │4 │address_book│contact │finished │current: 1785 │22.01.2026 13:14:56│22.01.2026 13:14:56│ │ │ │ │ │overall: 1785 │ │ │ │5 │address_book│phone │finished │current: 2493 │22.01.2026 13:15:03│22.01.2026 13:15:03│ │ │ │ │ │overall: 2493 │ │ │ │6 │address_book│email │finished │current: 588 │22.01.2026 13:15:07│22.01.2026 13:15:07│ │ │ │ │ │overall: 588 │ │ │ └────┴────────────┴────────────────────┴──────────┴────────────────┴───────────────────┴───────────────────┘
6. Обновление сервисов SSW на ecss1
- Выполните на ecss2 объединение в кластер:
на ecss2
sudo ecss-control attachCODE - Активируйте сервис Keepalived.
на ecss1
sudo systemctl enable --now keepalivedCODE - Обновите пакет ecss-dns-env.
на ecss1
sudo apt install ecss-dns-envCODEПосле обновления актуализируйте конфигурацию командой:При обновлении принимать новые конфигурационные файлы -Y.на ecss1
sudo dpkg-reconfigure ecss-dns-envCODE - Обновите пакет ecss-user:
на ecss1
sudo apt install ecss-userCODE - Обновите пакет ecss-utils:
на ecss1
sudo apt install ecss-utilsCODE - Обновите пакет ecss-node:
на ecss1
sudo apt install ecss-nodeCODEна ecss1
ВОПРОСЫ НА УСТАНОВКУ ecss-node:
* ECSS-node ID in DNS format: <Согласно лицензии>.
* Default configuration: yes
* Global config: yesПримите все изменения файлов конфигурации!
- Включите сервисы ssw:
на ecss1
sudo systemctl unmask ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip ecss-sormCODEна ecss1
sudo systemctl enable ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip ecss-sormCODE - Сервис ecss-sorm на ecss1 сразу замаскируйте, так как по умолчанию заявлена работа ecss-sorm на одном хосте в кластере.
на ecss1
sudo systemctl mask ecss-sormCODE - На ecss1 запустите сервис mycelium и в CoCon проверьте, что сервис поднялся и видно ноды mycelium хостов ecss1/ ecss2:
на ecss1
sudo systemctl start ecss-myceliumCODEвыполняется в CoCon/system-status Checking... ┌─┬───────────────┬────────────────────────────┬───────────────────────────────┬────────────┬───────┐ │ │ Node │ Release │ Erlang nodes │Mnesia nodes│Uptime │ ├─┼───────────────┼────────────────────────────┼───────────────────────────────┼────────────┼───────┤ │ │core1@ecss2 │ecss-core-3.17.1.0.1771 │core1@ecss2 │not running │3h 5m │ │ │ds1@ecss2 │ecss-ds-3.17.1.0.1771 │ds1@ecss2 │ds1@ecss2 │3h 5m │ │ │md1@ecss2 │ecss-mediator-3.17.1.0.1771 │md1@ecss2 │md1@ecss2 │3h 5m │ │ │mycelium1@ecss1│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss1,mycelium1@ecss2│not running │10m 42s│ │ │mycelium1@ecss2│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss1,mycelium1@ecss2│not running │3h 5m │ │ │sip1@ecss2 │ecss-pa-sip-3.17.1.0.1771 │sip1@ecss2 │sip1@ecss2 │3h 5m │ │ │sorm1@ecss2 │ecss-sorm-3.17.1.0.1771 │sorm1@ecss2 │not running │3h 5m │ └─┴───────────────┴────────────────────────────┴───────────────────────────────┴────────────┴───────┘ All services are started. Active media resource selected list specific: ┌─────────────┬───────────┬───────────────┬───────────┬───────────┐ │ Node │ MSR │ MSR │ Cc-status │ Cc-uptime │ │ │ │ version │ │ │ ├─────────────┼───────────┼───────────────┼───────────┼───────────┤ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.1.0 │ connected │ 00:21:09 │ │ │ msr.ecss2 │ 3.17.1.0.28 │ connected │ 00:00:59 │ └─────────────┴───────────┴───────────────┴───────────┴───────────┘
- Перед запуском ecss-ds на ecss1 сделайте backup директории /var/lib/ecss/oasys и удалите ее, для того чтобы с другого хоста загрузить актуальную БД. Сделайте это, переименовав существующую директорию:
После этого ecss-ds на хосте ecss1 загрузит БД с хоста ecss2.
на ecss1
sudo mv /var/lib/ecss/oasys /var/lib/ecss/oasys-$(date +%Y%m%d-%H_%M)CODE - На ecss1 запустите сервис ds и в CoCon проверьте, что сервис ds доступен на обоих хостах ecss1/ ecss2:
на ecss1
sudo systemctl start ecss-dsCODEвыполняется в CoCon/system-status Checking... ┌─┬───────────────┬────────────────────────────┬───────────────────────────────┬───────────────────┬───────┐ │ │ Node │ Release │ Erlang nodes │ Mnesia nodes │Uptime │ ├─┼───────────────┼────────────────────────────┼───────────────────────────────┼───────────────────┼───────┤ │ │core1@ecss2 │ecss-core-3.17.1.0.1771 │core1@ecss2 │not running │3h 13m │ │ │ds1@ecss1 │ecss-ds-3.17.1.0.1771 │ds1@ecss1,ds1@ecss2 │ds1@ecss1,ds1@ecss2│12s │ │ │ds1@ecss2 │ecss-ds-3.17.1.0.1771 │ds1@ecss1,ds1@ecss2 │ds1@ecss1,ds1@ecss2│3h 13m │ │ │md1@ecss2 │ecss-mediator-3.17.1.0.1771 │md1@ecss2 │md1@ecss2 │3h 13m │ │ │mycelium1@ecss1│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss1,mycelium1@ecss2│not running │18m 33s│ │ │mycelium1@ecss2│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss1,mycelium1@ecss2│not running │3h 13m │ │ │sip1@ecss2 │ecss-pa-sip-3.17.1.0.1771 │sip1@ecss2 │sip1@ecss2 │3h 13m │ │ │sorm1@ecss2 │ecss-sorm-3.17.1.0.1771 │sorm1@ecss2 │not running │3h 12m │ └─┴───────────────┴────────────────────────────┴───────────────────────────────┴───────────────────┴───────┘ All services are started. Active media resource selected list specific: ┌─────────────┬───────────┬───────────────┬───────────┬───────────┐ │ Node │ MSR │ MSR │ Cc-status │ Cc-uptime │ │ │ │ version │ │ │ ├─────────────┼───────────┼───────────────┼───────────┼───────────┤ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.1.0 │ connected │ 00:29:01 │ │ │ msr.ecss2 │ 3.17.1.0.28 │ connected │ 00:08:50 │ └─────────────┴───────────┴───────────────┴───────────┴───────────┘
- Такими же действиями, что и выше, запустите сервисы: ecss-mediator, ecss-pa-sip, ecss-core следующими командами:
на ecss1
sudo systemctl start ecss-coreCODEна ecss1
sudo systemctl start ecss-mediatorCODEПроверьте статус в CoCom:на ecss1
sudo systemctl start ecss-pa-sipCODEРезультат:/system-status Checking... ┌─┬───────────────┬────────────────────────────┬───────────────────────────────┬─────────────────────┬──────┐ │ │ Node │ Release │ Erlang nodes │ Mnesia nodes │Uptime│ ├─┼───────────────┼────────────────────────────┼───────────────────────────────┼─────────────────────┼──────┤ │ │core1@ecss1 │ecss-core-3.17.1.0.1771 │core1@ecss1,core1@ecss2 │not running │3m 50s│ │ │core1@ecss2 │ecss-core-3.17.1.0.1771 │core1@ecss1,core1@ecss2 │not running │3h 22m│ │ │ds1@ecss1 │ecss-ds-3.17.1.0.1771 │ds1@ecss1,ds1@ecss2 │ds1@ecss1,ds1@ecss2 │9m 42s│ │ │ds1@ecss2 │ecss-ds-3.17.1.0.1771 │ds1@ecss1,ds1@ecss2 │ds1@ecss1,ds1@ecss2 │3h 22m│ │ │md1@ecss1 │ecss-mediator-3.17.1.0.1771 │md1@ecss1,md1@ecss2 │md1@ecss1,md1@ecss2 │5m 22s│ │ │md1@ecss2 │ecss-mediator-3.17.1.0.1771 │md1@ecss1,md1@ecss2 │md1@ecss1,md1@ecss2 │3h 22m│ │ │mycelium1@ecss1│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss1,mycelium1@ecss2│not running │28m 4s│ │ │mycelium1@ecss2│ecss-mycelium-3.17.1.0.1771 │mycelium1@ecss1,mycelium1@ecss2│not running │3h 23m│ │ │sip1@ecss1 │ecss-pa-sip-3.17.1.0.1771 │sip1@ecss1,sip1@ecss2 │sip1@ecss1,sip1@ecss2│4m 40s│ │ │sip1@ecss2 │ecss-pa-sip-3.17.1.0.1771 │sip1@ecss1,sip1@ecss2 │sip1@ecss1,sip1@ecss2│3h 22m│ │ │sorm1@ecss2 │ecss-sorm-3.17.1.0.1771 │sorm1@ecss2 │not running │3h 22m│ └─┴───────────────┴────────────────────────────┴───────────────────────────────┴─────────────────────┴──────┘ All services are started. Active media resource selected list specific: ┌─────────────┬───────────┬───────────────┬───────────┬───────────┐ │ Node │ MSR │ MSR │ Cc-status │ Cc-uptime │ │ │ │ version │ │ │ ├─────────────┼───────────┼───────────────┼───────────┼───────────┤ │ core1@ecss1 │ msr.ecss1 │ 3.14.16.1.0 │ connected │ 00:02:37 │ │ core1@ecss2 │ msr.ecss1 │ 3.14.16.1.0 │ connected │ 00:38:31 │ │ │ msr.ecss2 │ 3.17.1.0.28 │ connected │ 00:18:20 │ └─────────────┴───────────┴───────────────┴───────────┴───────────┘
- Обновите пакет ecss-restfs:
на ecss1
sudo apt install ecss-restfsCODE - Обновите пакет ecss-media-server:Актуализируйте конфигурацию:
на ecss1
sudo apt install ecss-media-serverCODEПроверьте и, при необходимости, исправьте вручную файл → /etc/ecss/ecss-media-server/config.xmlна ecss1
sudo dpkg-reconfigure ecss-media-serverCODEДля регистрации media-server`a с ecss2 на ecss1 уберите ранее добавленные комментирование из файла /etc/ecss/ecss-media-server/conf.d/default.xml на ecss2:на ecss1<?xml version="1.0" encoding="utf-8"?> <config date="05:27:38 07.12.2024"> <general log-level="3" log-rotate="yes" max-calls="8192" max-vid-calls="8192" max-in-group="512" load-sensor="media" load-delta="10" calls-delta="100" spool-dir-size="100M" log-name="msr.log" log-path="/var/log/ecss/media-server" use-srtp="disabled" enable-ice-transport="no" ice-update="no" aggressive-ice="yes" stun-server="" suspicious-mode="no"/> <transport bind-addr="10.0.20.82" port="5040" transport="udp+tcp"/> <!-- By default configured public TURN-server --> <turn-server use-turn="no" host="numb.viagenie.ca" user="webrtc@live.com" password="muazkh"/> <media mixer-clock-rate="8000" use-vad="no" cng-level="0" jb-size="60" rtcp-timeout="0" rtp-timeout="350" udp-src-check="no" cn-multiplier="3" port-start="12000" port-range="2048" tias-in-sdp="no" thread-cnt="2" vid-enc-threads="2" vid-dec-threads="2" video-conf-layout="evenly" keyframe-interval="1000" vid-decode-delay="100" silence-threshold="-30" dtmf-flash-disable="no" video-dscp="0" other-dscp="0" dummy-video-src="/usr/share/ecss-media-server/video/dummy_video.yuv" video-enc-width="640" video-enc-height="360" finalsilence="1000" rtcp-stat-dump="yes" dtmf-tg-fpc-loop="10" dtmf-tg-fit="1" dtmf-tg-fot="2" dtmf-tg-volume="12288"/> <codec pcma="3" pcmu="2" ilbc="0" gsm="0" g722="3" g726="0" g729="1" speex="5" l16="0" g7221="6" opus="0" h264="1" h263-1998="2" t38="1" tel-event-pt="0"/> <accounts> <!-- <dynamic msr_name="msr.name" realm="sip:127.0.0.1:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password" /> --> </accounts> <pbyte> <mcc bind-addr="10.0.20.82" port="5700"/> </pbyte> <conf_dir path="/etc/ecss/ecss-media-server/conf.d"/> <metrics enable="no"/> <rtp> <auto addr-v4=""/> </rtp> </config>После чего перезапустите сервис:<?xml version="1.0"?> <config> <accounts> <!--<dynamic msr_name="msr.ecss2" realm="sip:10.0.20.81:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/>--> <dynamic msr_name="msr.ecss2" realm="sip:10.0.20.82:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password"/> </accounts> </config>на ecss2
sudo systemctl restart ecss-media-server.serviceCODE - Обновите пакет ecss-media-resources:
на ecss1
sudo apt install ecss-media-resourcesCODE - Обновите пакет ecss-web-conf:
на ecss1
sudo apt install ecss-web-confCODE Обновите пакет ecss-teleconference-ui
на ecss1
sudo apt install ecss-teleconference-uiCODEОбновите пакет ecss-crm-server
на ecss1
sudo apt install ecss-crm-serverCODEОбновите пакет ecss-cc-ui
на ecss1
sudo apt install ecss-cc-uiCODEОбновите пакет ecss-call-api
на ecss2
sudo apt install ecss-call-apiCODEОбновите пакет ecss-peeper-client
на ecss2
sudo apt install ecss-peeper-clientCODE
7. Проверка обновления
- После выполнения обновления проверьте работу всех сервисов SSW.