Обновление с версии 3.14.14 на 3.14.15

Рекомендуется производить обновление с новой установки операционный системы (Ubuntu Server 18.04.x LTS 64bit) и новой разметки дискового пространства. 

В данном разделе описан процесс обновления операционной системы и программных компонентов ECSS-10, когда по каким-либо причинам новая установка невозможна.

Подготовка к обновлению системы

Выполнить полный «бэкап» (см. «Регламентное обслуживание и резервное копирование»).

Если нужны последние данные биллинга, то необходимо финализировать текущую cdr и скачать в надежное место, например:

/domain/bsk.test/cdr/make_finalize_cdr bsk3         
Created file(s): cdrbsk3_20210330_11_05_38_t.csv

Посмотреть, сколько зарегистрированных абонентов, пример:

/domain/bsk.test/sip/user/registered *
....
┌───────────────┐
│ elements: 320 │
└───────────────┘

При обновлении кластера следует обновлять сервера по очереди. Таким образом, при обновлении один из серверов будет всегда запущен и работа сервисов не будет прервана. Для разделения кластера следует использовать инструмент ecss-control на обоих серверах (Описание команд утилиты приведено в «Приложении Н»).

Переведите трафик на второй сервер, выключив keepalive на первом хосте:

на ecss1

sudo systemctl stop keepalived.service
CODE

Командой ifconfig проверьте, что все IP-адреса находятся на ecss2.

Выполните разделение SSW на два независимых сервера следующей командой:

на ecss1

sudo ecss-control detach
CODE


sudo ecss-control detach
detach host: ecss2, ip: 10.10.0.2
complete
sudo ecss-control status
locked ip: 10.10.0.2

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

на ecss1

sudo systemctl stop ecss-mediator.service
sudo systemctl stop ecss-pa-sip.service
sudo systemctl stop ecss-core.service
sudo systemctl stop ecss-ds.service
sudo systemctl stop ecss-mycelium.service
CODE

Выполнить обновление:

на ecss1

sudo apt update
CODE

Установка ECSS-10 версии 3.14.15

Подробнее в разделе «Инсталляция пакетов ECSS».

Установка ecss-mysql

Обновите ecss-mysql на первом хосте:

sudo apt install ecss-mysql

Если возникла проблема с какой-либо базой данных, следует произвести перезагрузку сервиса aparmor, затем удалить базу данных из mysql, а после снова установить ecss-mysql:

sudo systemctl restart apparmor.service
mysql -uroot -p<root_mysql_password> -e 'DROP DATABASE <проблемная база данных>'
sudo apt install ecss-mysql
  • Произведите мониторинг состояния реплики с помощью SHOW SLAVE STATUS; и дождитесь, пока показатель Seconds_Behind_Master станет равным "0"; 

Установка ecss-node

Установить пакет ecss-node:

sudo apt install ecss-node

В процессе установки будут задаваться вопросы о сохранении текущих версий конфигурационных файлов. Рекомендуется ставить новые, т. е. отвечать «Y».

на ecss1

во время установки пакета ecss-node , система сбросит конфигурацию кластера на дефолтное значение. Поэтому потребуется отредактировать файл /etc/ecss/ecss-mycelium/mycelium1.config.

выполните команду :

sudo nano /etc/ecss/ecss-mycelium/mycelium1.config
CODE

пропишите имя кластера, в примере "test_cluster"

%%% -*- mode:erlang -*-
%%% Warning - this config file *must* end with <dot><whitespace>
[
    {mycelium_broker, [
        {cluster_name, test_cluster},
        %{cluster_nodes, []}, % additional nodes
        %{tcp_port, 5672},
        %{auto_discoverer, true},
        {compress_module, elx_data_nif}, %% elx_data_nif | elx_data
        {session_gc_timeout, 3000},
        {queue_gc_timeout, infinity}
        %{info_realm, {local, "/ssw", "ssw", "ssw", 1, [{localhost, 0, {host, "localhost"}, 5672, 10}]}},
        %{bind_ip_addresses, [{127,0,0,1}]} % do not forget to include lo interface
        ]},


Установка остальных пакетов

Установить пакеты, содержащие основные подсистемы:

sudo apt upgrade

При установке ecss-media-server рекомендуется ответить на вопрос о конфигурировании утвердительно. 

В процессе установки будут задаваться вопросы о сохранении текущих версий конфигурационных файлов. Рекомендуется ставить новые, т. е. отвечать «Y».

Запустите сервисы следующими командами:

на ecss1

sudo systemctl start ecss-mycelium.service
sudo systemctl start ecss-ds.service
sudo systemctl start ecss-core.service
sudo systemctl start ecss-pa-sip.service
sudo systemctl start ecss-mediator.service
CODE

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

systemctl is-active ecss-core ecss-pa-sip ecss-ds ecss-mediator ecss-mycelium
CODE


Проверить состояние сервисов в CoCon:

выполняется в CoCon

/system-status   
Checking...
┌─┬───────────────┬──────────────────────────┬───────────────┬────────────┬──────┐
│ │     Node      │         Release          │ Erlang nodes  │Mnesia nodes│Uptime│
├─┼───────────────┼──────────────────────────┼───────────────┼────────────┼──────┤
│ │core1@ecss1    │ecss-core-3.14.15.1163    │core1@ecss1    │not running │3m 45s│
│ │ds1@ecss1      │ecss-ds-3.14.15.1163      │ds1@ecss1      │ds1@ecss1   │3m 51s│
│ │md1@ecss1      │ecss-mediator-3.14.15.1163│md1@ecss1      │md1@ecss1   │3m 32s│
│ │mycelium1@ecss1│ecss-mycelium-3.14.15.1163│mycelium1@ecss1│not running │3m 58s│
│ │sip1@ecss1     │ecss-pa-sip-3.14.15.1163  │sip1@ecss1     │sip1@ecss1  │3m 39s│
└─┴───────────────┴──────────────────────────┴───────────────┴────────────┴──────┘

All services are started.

  Active media resource selected list specific:
┌─────────────┬───────────┬─────────────┬───────────┬───────────┐
│    Node     │    MSR    │     MSR     │ Cc-status │ Cc-uptime │
│             │           │   version   │           │           │
├─────────────┼───────────┼─────────────┼───────────┼───────────┤
│ core1@ecss1 │ msr.ecss1 │ 3.14.15.221 │ connected │ 00:02:28  │
│             │ msr.ecss2 │ 3.14.14.24  │ connected │ 00:02:28  │
└─────────────┴───────────┴─────────────┴───────────┴───────────┘
CODE

В версии 3.14.15 появилась возможность использовать любые имена хостов, поэтому нужно указать какие имена мы будем использовать, для этого выполните следующую команду (в примере имена хостов ecss1/ecss2):

выполняется в CoCon

/system/clusters/set [ecss1, ecss2]
CODE
/system/clusters/set [ecss1, ecss2]
Success: System initialized on hosts: ["ecss2","ecss1"]


/system/clusters/list              
┌────────┬──────────────┬──────────────┐
│  Role  │   Cluster    │    Nodes     │
├────────┼──────────────┼──────────────┤
│storage │ds1           │ds1@ecss2     │
│        │              │ds1@ecss1     │
│core    │core1         │core1@ecss2   │
│        │              │core1@ecss1   │
│adapter │sip1          │sip1@ecss2    │
│        │              │sip1@ecss1    │
│adapter │megaco1       │megaco1@ecss2 │
│        │              │megaco1@ecss1 │
│adapter │sigtran1      │sigtran1@ecss2│
│        │              │sigtran1@ecss1│
│adapter │sorm1         │sorm1@ecss2   │
│        │              │sorm1@ecss1   │
│mediator│md1           │md1@ecss2     │
│        │              │md1@ecss1     │
│virtual │.system_bridge│              │
│virtual │.virtual      │              │
└────────┴──────────────┴──────────────┘

В случае использования для сигнальной сети нескольких vlan-ов , необходимо скорректировать конфигурационный файл /etc/ecss/ecss-media-server/config.xml описав параметр "via":

via — задается список интерфейсов, которые могут быть отправлены в сообщении "SIP REGISTER" поле "Via":

  • dynamic-ifaces — значение = "yes" или "no";
    если dynamic-ifaces="no":
    - при мастер-регистрации всё как раньше
    - в ином случае регистрация проходит ТОЛЬКО если интерфейс перечислен в списке via в конфиге
    если dynamic-ifaces="yes" или атрибут не указан, то остаётся поведение, реализованное ранее.
  • iface name — имя интерфейса;
  • ip — ip адрес интерфейса.
    - если указанный в конфиге в разделе via ip-адрес не существует, он не обрабатывается (пропускается)
    - если указан верный ip, то он прикрепляется для регистрации в заголовок Via
    - при отсутствии интерфейса в конфиге в via при мастер-регистрации указывается bind-address из конфига, при при не-мастер регистрации поведение прежнее.

пример для одиночного хоста

<?xml version="1.0" encoding="utf-8"?>
<config date="14:39:00 10.03.2023">
  <general log-level="3" log-rotate="yes" max-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="192.168.1.40" 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"/>
  <codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" 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:192.168.1.40:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password">
       <via dynamic-ifaces="no">
          <iface name="bond1.75" ip="192.168.1.27"/>
          <iface name="bond1.20" ip="192.168.1.28"/>
          <iface name="bond1.35" ip="192.168.1.29"/>
          <iface name="bond1.36" ip="192.168.1.30"/>
       </via>
     </dynamic>
  </accounts>
  <pbyte>
    <mcc bind-addr="192.168.1.40" port="5700"/>
  </pbyte>
  <conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
  <rtp>
    <auto addr-v4=""/>
  </rtp>
</config>
CODE

пример для кластерной конфигурации

<?xml version="1.0" encoding="utf-8"?>
<config date="14:39:00 10.03.2023">
  <general log-level="3" log-rotate="yes" max-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="192.168.1.40" 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"/>
  <codec pcma="1" pcmu="2" ilbc="0" gsm="0" g722="3" 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:192.168.1.40:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password">
       <via dynamic-ifaces="no">
          <iface name="bond1.75" ip="192.168.1.27"/>
          <iface name="bond1.20" ip="192.168.1.28"/>
          <iface name="bond1.35" ip="192.168.1.29"/>
          <iface name="bond1.36" ip="192.168.1.30"/>
       </via>
     </dynamic>
     <dynamic msr_name="msr.name" realm="sip:192.168.1.50:5000" dtmf_mode="rfc+inband+info" auth_name="user" auth_password="password">
       <via dynamic-ifaces="no">
          <iface name="bond1.75" ip="192.168.1.27"/>
          <iface name="bond1.20" ip="192.168.1.28"/>
          <iface name="bond1.35" ip="192.168.1.29"/>
          <iface name="bond1.36" ip="192.168.1.30"/>
       </via>
     </dynamic>
  </accounts>
  <pbyte>
    <mcc bind-addr="192.168.1.40" port="5700"/>
  </pbyte>
  <conf_dir path="/etc/ecss/ecss-media-server/conf.d"/>
  <rtp>
    <auto addr-v4=""/>
  </rtp>
</config>
CODE

Хост ecss1 обновлен , активизируем трафик командой:

на ecss1

sudo systemctl start keepalived.service
CODE

Обновление второго сервера, если система в кластере

Чтобы перевести трафик на обновленный сервер, нужно на втором сервере остановить службу keepalived:

на ecss2

sudo systemctl stop keepalived.service
CODE

Если нужны последние данные биллинга, то необходимо финализировать текущую cdr и скачать в надежное место, например:

admin@mycelium1@ecss1:/$ domain/bsk.test/cdr/make_finalize_cdr bsk3         
Created file(s): cdrbsk3_20220128_10_06_40_t.csv

Выключить все ноды на сервере, который будет обновляться вторым:

на ecss2

sudo systemctl stop ecss-mediator.service
sudo systemctl stop ecss-pa-sip.service
sudo systemctl stop ecss-core.service
sudo systemctl stop ecss-ds.service
sudo systemctl stop ecss-mycelium.service
CODE

Выполнить обновление:

на ecss2

sudo apt update
CODE

Установка ecss-mysql

Обновите ecss-mysql на втором хосте:

на ecss2

sudo apt install ecss-mysql
CODE

Если возникла проблема с какой-либо базой данных, следует произвести перезагрузку сервиса aparmor, затем удалить базу данных из mysql, а после снова установить ecss-mysql:

sudo systemctl restart apparmor.service
mysql -uroot -p<root_mysql_password> -e 'DROP DATABASE <проблемная база данных>'
sudo apt install ecss-mysql
  • Произведите мониторинг состояния реплики с помощью SHOW SLAVE STATUS; и дождитесь, пока показатель Seconds_Behind_Master станет равным "0";

Установка ecss-node

Установить пакет ecss-node:

на ecss2

sudo apt install ecss-node
CODE

В процессе установки будут задаваться вопросы о сохранении текущих версий конфигурационных файлов. Рекомендуется ставить новые, т. е. отвечать «Y».

на ecss2

Во время установки пакета ecss-node система сбросит конфигурацию кластера на дефолтное значение. Поэтому потребуется отредактировать файл /etc/ecss/ecss-mycelium/mycelium1.config.

Выполните команду:

sudo nano /etc/ecss/ecss-mycelium/mycelium1.config
CODE

Пропишите имя кластера, в примере "test_cluster":

%%% -*- mode:erlang -*-
%%% Warning - this config file *must* end with <dot><whitespace>
[
    {mycelium_broker, [
        {cluster_name, test_cluster},
        %{cluster_nodes, []}, % additional nodes
        %{tcp_port, 5672},
        %{auto_discoverer, true},
        {compress_module, elx_data_nif}, %% elx_data_nif | elx_data
        {session_gc_timeout, 3000},
        {queue_gc_timeout, infinity}
        %{info_realm, {local, "/ssw", "ssw", "ssw", 1, [{localhost, 0, {host, "localhost"}, 5672, 10}]}},
        %{bind_ip_addresses, [{127,0,0,1}]} % do not forget to include lo interface
        ]},

Установка остальных пакетов

Установите пакеты, содержащие основные подсистемы:

на ecss2

sudo apt upgrade
CODE

При установке ecss-media-server рекомендуется ответить на вопрос о конфигурировании утвердительно. 

В процессе установки будут задаваться вопросы о сохранении текущих версий конфигурационных файлов. Рекомендуется ставить новые, т. е. отвечать «Y».

Проверьте статус сервисов командой:

на ecss2

systemctl is-active ecss-core ecss-pa-sip ecss-ds ecss-mediator ecss-mycelium
CODE

Сервисы должны быть в статусе "inactive":

/systemctl is-active ecss-core ecss-pa-sip ecss-ds ecss-mediator ecss-mycelium
inactive
inactive
inactive
inactive
inactive

Сборка кластера

После действий в предыдущем разделе можно открывать серверы друг другу, чтобы свести в кластер. На первом сервере выполните команду sudo ecss-control attach. Описание команд утилиты приведено в «Приложении Н».

Пример:

на ecss1

sudo ecss-control attach
unlock ip: 10.10.0.2, rules: 7
complete
sudo ecss-control status
all nodes attached
CODE

Запустите сервисы следующими командами:

на ecss2

sudo systemctl start ecss-mycelium.service
sudo systemctl start ecss-ds.service
sudo systemctl start ecss-core.service
sudo systemctl start ecss-pa-sip.service
sudo systemctl start ecss-mediator.service
CODE

Проверка работы системы в кластере

Проверьте выполнение обновления. Команда CLI system-status должна показать, что все ноды в кластере, версии подсистем одинаковые.

выполняется в CoCon
/system-status 
Checking...
┌─┬───────────────┬──────────────────────────┬───────────────────────────────┬─────────────────────┬──────┐
│ │     Node      │         Release          │         Erlang nodes          │    Mnesia nodes     │Uptime│
├─┼───────────────┼──────────────────────────┼───────────────────────────────┼─────────────────────┼──────┤
│ │core1@ecss1    │ecss-core-3.14.15.1163    │core1@ecss1,core1@ecss2        │not running          │1h 5m │
│ │core1@ecss2    │ecss-core-3.14.15.1163    │core1@ecss1,core1@ecss2        │not running          │3m 8s │
│ │ds1@ecss1      │ecss-ds-3.14.15.1163      │ds1@ecss1,ds1@ecss2            │ds1@ecss1,ds1@ecss2  │1h 5m │
│ │ds1@ecss2      │ecss-ds-3.14.15.1163      │ds1@ecss1,ds1@ecss2            │ds1@ecss1,ds1@ecss2  │59s   │
│ │md1@ecss1      │ecss-mediator-3.14.15.1163│md1@ecss1,md1@ecss2            │md1@ecss1,md1@ecss2  │1h 5m │
│ │md1@ecss2      │ecss-mediator-3.14.15.1163│md1@ecss1,md1@ecss2            │md1@ecss1,md1@ecss2  │2m 53s│
│ │mycelium1@ecss1│ecss-mycelium-3.14.15.1163│mycelium1@ecss1,mycelium1@ecss2│not running          │1h 5m │
│ │mycelium1@ecss2│ecss-mycelium-3.14.15.1163│mycelium1@ecss1,mycelium1@ecss2│not running          │3m 17s│
│ │sip1@ecss1     │ecss-pa-sip-3.14.15.1163  │sip1@ecss1,sip1@ecss2          │sip1@ecss1,sip1@ecss2│1h 5m │
│ │sip1@ecss2     │ecss-pa-sip-3.14.15.1163  │sip1@ecss1,sip1@ecss2          │sip1@ecss1,sip1@ecss2│2m 57s│
└─┴───────────────┴──────────────────────────┴───────────────────────────────┴─────────────────────┴──────┘

All services are started.

  Active media resource selected list specific:
┌─────────────┬───────────┬─────────────┬───────────┬───────────┐
│    Node     │    MSR    │     MSR     │ Cc-status │ Cc-uptime │
│             │           │   version   │           │           │
├─────────────┼───────────┼─────────────┼───────────┼───────────┤
│ core1@ecss1 │ msr.ecss1 │ 3.14.15.221 │ connected │ 01:04:13  │
│             │ msr.ecss2 │ 3.14.15.221 │ connected │ 00:15:04  │
│ core1@ecss2 │ msr.ecss1 │ 3.14.15.221 │ connected │ 00:01:59  │
│             │ msr.ecss2 │ 3.14.15.221 │ connected │ 00:01:57  │
└─────────────┴───────────┴─────────────┴───────────┴───────────┘

Хост ecss2 обновлен, запустите трафик командой:

на ecss2

sudo systemctl start keepalived.service
CODE

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

выполняется в CoCon
/domain/bsk.test/sip/user/registered *            
320 make users list ...
[**********************************************************************] 223mks   
320 users information read ...
[**********************************************************************] 22ms     
Executed on the sip1@ecss1
┌──────────────────┬────────┬─────────┬─────────────────────────────────────────────────────────────────────┬────────────────────────────────────────────────────────────────────┐
│     Interface    │ Number │ Dynamic │                               Contact                               │                         Registration info                          │
├──────────────────┼────────┼─────────┼─────────────────────────────────────────────────────────────────────┼────────────────────────────────────────────────────────────────────┤
...
┌───────────────┐
│ elements: 320 │
└───────────────┘

Вызовы проходят во всех направлениях, CFC проигрывает сообщения, Web-conf и прочие web-сервисы запускаются, в системный журнал не пишется ошибок. Команда shell:

journalctl -f

Деинсталляция компонентов ECSS

Удаление ecss-mysql

Для удаления пакета ecss-mysql с сохранением используйте команду:

sudo apt remove ecss-mysql 

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

Для полного удаления пакета вместе с базами и конфигурационными файлами используйте ключ purge:

sudo apt purge ecss-mysql

При этом по каждой базе нужно подтверждение удаления. После этого каталог /var/lib/ecss-mysql/ будет очищен.

Если нужно полностью удалить все пакеты mysql* :

Удаление пакетов mysql-* удалит также пакеты ecss-web-conf и ecss-restfs.

При удалении ecss-restfs задается вопрос об удалении записей разговоров:

А также об удалении всех БД MySQL:

sudo apt purge mysql-*

Удаление пакета ecss-node

Для удаления пакета используйте команду:

sudo apt purge ecss-node

Удаление пакета ecss-media-server

Для удаления пакета с сохранением конфигурационных файлов используйте команду:

sudo apt remove ecss-media-server

При этом в каталоге /etc/ecss/ecss-media-server/ остаются файлы конфигурации.

Для полного удаления используйте команду:

sudo apt purge ecss-media-server 

Удаление ненужных пакетов

Для удаления остальных пакетов, которые больше не требуются, используйте ключ autoremove:

sudo apt autoremove

Удаление пакетов по маске

Для удаления сразу нескольких пакетов можно пользоваться масками (см. man apt).

Пример команды для удаления всех пакетов ecss:

sudo apt purge ecss-*

Команды полной деинсталляции ECSS

Для полного удаления всех компонентов ECSS выполните 3 команды:

sudo apt purge ecss-*
sudo apt purge mysql-*
sudo apt autoremove

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

В каталоге /var/log/ecss/security/ в служебных целях остаются логи. Их нельзя удалить штатными средствами. Если необходима очистка этого каталога, следует обратиться в техническую поддержку.

Debconf

В некоторых случаях вместо переустановки пакета требуется только изменение конфигурации. Здесь следует применять команду dpkg-reconfigure <имя_пакета>. Также при необходимости можно использовать команды пакета debconf-utils.

Описание приведено на странице «Приложение В».