Updating from version 3.14.16 to 3.17

1 Preparatory actions on ecss2

  1. If the latest billing data is needed, the current CDR must be finalized and the CDR files must be downloaded to a remote server:
    /domain/test_domain/cdr/make_finalize_cdr 
    Created file(s): cdr_20260122_11_51_16_1_c.csv
  2. Enable the setting to automatically synchronize files that are in a split (based on the larger file size).
    sudo gluster volume set ecss_volume cluster.favorite-child-policy size
  3. Stop MySQL replication.
    Make sure that values of the Slave_IO_Running and Slave_SQL_Running parameters are No.
    sudo mysql -uroot -p -e 'STOP SLAVE;'

    sudo mysql -uroot -p -e 'SHOW SLAVE STATUS \G;' | grep -E "Slave_IO_Running:|Slave_SQL_Running:"

    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
    . . .
  4. When updating the cluster, update the servers one at a time. This ensures that one of the servers will always be running during the update, and service operation will not be interrupted. To split the cluster, use the ecss-control tool on both servers.

    SIP signaling is exchanged via the SIP-VRRP IP address. Similarly, the connection to MySQL is established via the MySQL-VRRP IP address. This functionality is implemented to enable IP address migration to another host in the event of a failure, shutdown, or maintenance of the primary host. IP address migration is monitored by the keepalive service on each host. To redirect traffic to the first server (ecss1), keepalive must be disabled on the second host (ecss2). In this case, both SIP-VRRP IP addresses, as well as the MySQL-VRRP IP address, will be located on the first host (ecss1). Execute the following command:

    sudo systemctl disable --now keepalived.service
  5. Use the `ifconfig` command to verify that all VRRP IP addresses are on ecss1 (VRRP-mysql/VRRP-SIP1/VRRP-SIP2).
    ifconfig
  6. It is necessary to mask all nodes on the server that will be updated first. Disable the nodes' automatic startup:
    sudo systemctl mask --now ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip
  7. On ecss1, split SSW into two independent servers using the following command:

    The ecss-control command uses the standard hostnames: ecss1/ecss2.


    sudo ecss-control detach
    Check the status:
    sudo ecss-control status

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

2 Preparing to update SSW services on ecss2

  1. Update the SSW repository:
    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"
  2. Perform the packet update:
    sudo apt update

3 Updating SSW services on ecss2

  1. Preparing the ecss1 partition for use with PostgreSQL:

    Viewing the partition mounting for ecss-mysql:

    cat /etc/fstab
    # /etc/fstab: static file system information.
    #
    # Use 'blkid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    # / was on /dev/sda4 during curtin installation
    /dev/disk/by-uuid/e2750125-8839-491d-b650-8e8cc33627b5 / ext4 defaults 0 1
    # /var/lib/mysql was on /dev/sda2 during curtin installation
    /dev/disk/by-uuid/cea75df1-541b-4b40-b943-a387ba8804e8 /var/lib/mysql ext4 defaults 0 1
    # /var/lib/ecss-mysql was on /dev/sda3 during curtin installation
    /dev/disk/by-uuid/162a2b8b-1e14-4bc7-bf40-dbb216ed2c61 /var/lib/ecss-mysql ext4 defaults 0 1

    Create a new /srv/ecss/ecss-postgres-bdr-ssw directory for PostgreSQL:

    sudo mkdir -p /srv/ecss/ecss-postgres-bdr-ssw

    Mount the partition into the new /srv/ecss/ecss-postgres-bdr-ssw directory for PostgreSQL:

    sudo mount --bind /var/lib/ecss-mysql /srv/ecss/ecss-postgres-bdr-ssw
    Update the /etc/fstab file → add a new directory to mount (/var/lib/ecss-mysql /srv/ecss/ecss-postgres-bdr-ssw none defaults,bind 0 0):
    sudo nano /etc/fstab
    # /etc/fstab: static file system information.
    #
    # Use 'blkid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    # / was on /dev/sda4 during curtin installation
    /dev/disk/by-uuid/e2750125-8839-491d-b650-8e8cc33627b5 / ext4 defaults 0 1
    # /var/lib/mysql was on /dev/sda2 during curtin installation
    /dev/disk/by-uuid/cea75df1-541b-4b40-b943-a387ba8804e8 /var/lib/mysql ext4 defaults 0 1
    # /var/lib/ecss-mysql was on /dev/sda3 during curtin installation
    /dev/disk/by-uuid/162a2b8b-1e14-4bc7-bf40-dbb216ed2c61 /var/lib/ecss-mysql ext4 defaults 0 1
    /var/lib/ecss-mysql /srv/ecss/ecss-postgres-bdr-ssw none defaults,bind 0 0
  2. Install the new Postgres database (first on ecss1, then on ecss2):

    sudo apt install ecss-postgres-bdr-ssw

    !!!If the following error occurs when installing the package:!!!


    ecss-postgres-bdr-ssw : Depends: docker-compose-plugin but it is not installable

    run the following commands (on all hosts):

    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    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/null
    sudo apt update
    sudo apt install ecss-postgres-bdr-ssw

    During the installation process, you will be asked the following questions:

    • Select a replication address from the list (on both hosts);
    • Confirm the installation in the cluster (on both hosts);
    • Specify “Yes, I am the master” (on ecss1) or “No, I am not the master” (on ecss2);
    • On ecss2, specify the master’s address (specified in the answer to question 1 for ecss1).
  3. Verify that the replication configuration is correct.
    During installation, the postgresbdr_ssw.sh script is installed in the /srv/ecss/ecss-postgres-bdr-ssw directory.
    To check replication, run the following commands:
    cd /srv/ecss/ecss-postgres-bdr-ssw

    sudo ./postgresbdr_ssw.sh check

    Output on ecss1/ecss2 hosts should be the same.


    node table on master via ecss_storekeeper_db
    node table on slave via ecss_storekeeper_db
    connection table for master via 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)
    
    connection table for slave via 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)
  4. Updating the ecss-dns-env package:

    wsudo apt install ecss-dns-env

    When updating, you must apply the new configuration files (confirm with -Y).

    After the update, the configuration should be updated by running the command below. The answers to the questions are the same as during the installation procedure:

    sudo dpkg-reconfigure ecss-dns-env
  5. Update the ecss-user package:

    sudo apt install ecss-user
  6. Update the ecss-utils package:

    sudo apt install ecss-utils
  7. Update the ecss-node package:

    sudo apt install ecss-node

    ecss-node installation questions:

    • ECSS-node ID in DNS format: <According to the license>.
    • Default configuration: yes
    • Global config: yes

    Accept all configuration file changes.

  8. Perform СoCon users migration (audit_database):

    /usr/bin/migrate_cocon.exs

    MySQL database hostname (cocon.mysql.ecss):
    MySQL database port (3306):
    ecss_audit database username (audit):
    ecss_audit database password (audit):
  9. Enable the nodes.

    Enable the SSW services using the following commands:

    sudo systemctl unmask ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip

    sudo systemctl enable ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip
  10. Starting SSW on ecss2. Enable the following services:
    ecss-mycelium
    sudo systemctl start ecss-mycelium
    ecss-ds
    sudo systemctl start ecss-ds
    ecss-core
    sudo systemctl start ecss-core
    ecss-mediator
    sudo systemctl start ecss-mediator

    DO NOT START PA-SIP YET!

  11. Check the service status by running the system-status command in 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  │
    └─────────────┴───────────┴─────────────┴───────────┴───────────┘
  12. Migrate the database tables
    To check, which data is available for migration, use the following command:

    /system/postgresql/migration/check <DATABASE> *
    where DATABASE is:
    address_book, audit, calls, dialer, history, meetings, subscribers.


    /system/postgresql/migration/check address_book *              
    ┌────────────┬────────────────┬────────────────────────────────────┬───────────────────────────────┐
    │     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                  │                               │
    └────────────┴────────────────┴────────────────────────────────────┴───────────────────────────────┘

    Perform migration using the following command:
    /system/postgresql/migration/do <DATABASE> <TABLE>
    Check the migration using the following command:
    /system/postgresql/migration/info <DATABASE> <TABLE>

    /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    │                   │                   │
    └────┴────────────┴────────────────────┴──────────┴────────────────┴───────────────────┴───────────────────┘
  13. Updating the ecss-restfs packet.
    Accept all new configuration files using Y.

    sudo apt install ecss-restfs
  14. Обновление пакета 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"), добавив <!-- в начале строки и --> в конце:
    sudo nano /etc/ecss/ecss-media-server/conf.d/default.xml

    <?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>
    Выполнить обновление:
    sudo apt install ecss-media-server
    Актуализировать конфигурацию:
    sudo dpkg-reconfigure ecss-media-server
    Выполнить проверку, и при необходимости отредактировать файл командой:
    sudo nano /etc/ecss/ecss-media-server/config.xml

    <?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>
  15. Обновление пакета ecss-media-resources:

    sudo apt install ecss-media-resources
  16. Обновление пакета ecss-web-conf:

    sudo apt install ecss-web-conf

  17. Обновление пакета ecss-teleconference-ui:

    sudo apt install ecss-teleconference-ui

    Обновление пакета ecss-crm-server:

    sudo apt install ecss-crm-server

    Обновление пакета ecss-cc-ui:

    sudo apt install ecss-cc-ui

    Обновление пакета ecss-call-api:

    sudo apt install ecss-call-api

    Обновление пакета ecss-peeper-client:

    sudo apt install ecss-peeper-client
  18. Переносим актуальные регистрации абонентов:
    Перед переводом keepalived на обновленный хост необходимо скопировать актуальную базу ds с ecss1 (иначе база регистраций будет пустая). Поэтому сначала делаем backup БД Mnesia на ecss1:
    /node/ds1@ecss1/oasys/backup

    /node/ds1@ecss1/oasys/backup      
    Backup was successfully created at the path: "/var/lib/ecss/oasys/Mnesia.ds1@ecss1_20250930081517"

    Останавливаем ecss-ds на ecss2:

    sudo systemctl stop ecss-ds

    Командой scp копируем backup c ecss1 на ecss2:

    scp -r ecss@ecss1:/var/lib/ecss/oasys/Mnesia.ds1@ecss1_20250930081517 /var/lib/ecss/oasys

    Выполняем локальную копию текущей конфигурации:

    sudo cp -a /var/lib/ecss/oasys/Mnesia.ds1@ecss2 /var/lib/ecss/oasys/Mnesia.ds1@ecss2-bkp

    Заменяем локальную конфигурацию на конфигурацию backup c ecss1:

    sudo mv /var/lib/ecss/oasys/Mnesia.ds1@ecss1_20250930081517 /var/lib/ecss/oasys/Mnesia.ds1@ecss2

    sudo chown -R ssw:ssw /var/lib/ecss/oasys

    Запустить ecss-ds и ecss-pa-sip (чтобы подгрузились актуальные регистрации абонентов):


    sudo systemctl start ecss-ds

    sudo systemctl start ecss-pa-sip

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

    /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  │
    └─────────────┴───────────┴─────────────┴───────────┴───────────┘
    Проверить перенос активных регистраций на обновлённый хост. Для этого выполнить контроль зарегистрированных абонентов на одном (3.14.16) и втором (3.17) хостах. Выполнить команду в CoCon:
    /domain/test_domain/sip/user/registered sip *            
    450 make users list ...
    [**********************************************************************] 28mks    
    450 users information read ...
    [**********************************************************************] 1ms      
    Executed on the sip1@ecss2
    ┌───────────────┐
    │ elements: 436 │
    └───────────────┘

    /domain/test_domain/sip/user/registered sip *            
    450 make users list ...
    [**********************************************************************] 28mks    
    450 users information read ...
    [**********************************************************************] 1ms      
    Executed on the sip1@ecss1
    ┌───────────────┐
    │ elements: 438 │
    └───────────────┘
  19. Запуск сервиса keepalived:

    sudo systemctl enable --now keepalived

4 Подготовительные действия на ecss1

  1. Подготовить ecss1 к обновлению: для этого перевести весь трафик на ecss2 (команда выполняется на ecss1):

    sudo systemctl disable --now keepalived.service
  2. Командой ifconfig проверьте, что все VRRP-адреса (VRRP IP-mysql / VRRP IP-SIP1 / VRRP IP-SIP2) находятся на ecss2:

    ifconfig
  3. После разделения кластера необходимо выключить все ноды на сервере ecss1:
    sudo systemctl mask --now ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip
  4. Выполнить миграции таблиц DB (подробное описание).
    Проверить, какие данные доступны для переноса, можно командой:

    /system/postgresql/migration/check <DATABASE> *
    где DATABASE:

    • address_book
    • audit
    • calls
    • dialer
    • history
    • meetings
    • subscribers

    /system/postgresql/migration/check address_book *          
    ┌────────────┬────────────────┬────────────────────────────────────┬───────────────────────────────┐
    │     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                  │                               │
    └────────────┴────────────────┴────────────────────────────────────┴───────────────────────────────┘

    Миграцию выполнить командой:
    /system/postgresql/migration/do <DATABASE> <TABLE>
    Проверить прохождение миграции можно командой:
    /system/postgresql/migration/info <DATABASE> <TABLE>

    /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    │                   │                   │
    └────┴────────────┴────────────────────┴──────────┴────────────────┴───────────────────┴───────────────────┘

5 Обновление сервисов SSW на ecss1

  1. Выполнить на ecss2 объединение в кластер:
    sudo ecss-control attach
  2. Активация сервиса keepalived:
    sudo systemctl enable --now keepalived
  3. Обновление пакета ecss-dns-env:

    sudo apt install ecss-dns-env

    При обновлении принимать новые конфигурационные файлы -Y.
    После обновления актуализировать конфигурацию командой:
    sudo dpkg-reconfigure ecss-dns-env
  4. Обновление пакета ecss-user:

    sudo apt install ecss-user
  5. Обновление пакета ecss-utils:

    sudo apt install ecss-utils
  6. Обновление пакета ecss-node:

    sudo apt install ecss-node

    ВОПРОСЫ НА УСТАНОВКУ ecss-node:

    • ECSS-node ID in DNS format: <Согласно лицензии>.
    • Default configuration: yes
    • Global config: yes

    Принимаем все изменения файлов конфигурации !

  7. Включить сервисы SSW:

    sudo systemctl unmask ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip

    sudo systemctl enable ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip
  8. На ecss1 запустите сервис mycelium и в CoCon проверьте, что сервис поднялся и видны ноды mycelium хостов ecss1/ecss2:

    sudo systemctl start ecss-mycelium

    /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  │
    └─────────────┴───────────┴───────────────┴───────────┴───────────┘
  9. Перед запуском ecss-ds на ecss1 необходимо переименовать директорию /var/lib/ecss/oasys (создав резервную копию), чтобы загрузить актуальную БД с другого хоста.

    sudo mv /var/lib/ecss/oasys /var/lib/ecss/oasys-$(date +%Y%m%d-%H_%M)

    После этого ecss-ds на хосте ecss1 загрузит БД с ecss2.



  10. На ecss1 запустите сервис ds и в CoCon проверить, что сервис ds доступен на обоих хостах ecss1/ ecss2:
    sudo systemctl start ecss-ds

    /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  │
    └─────────────┴───────────┴───────────────┴───────────┴───────────┘
  11. Далее такими же действиями запустить сервисы: ecss-mediator, ecss-pa-sip, ecss-core следующими командами:
    sudo systemctl start ecss-core

    sudo systemctl start ecss-mediator

    sudo systemctl start ecss-pa-sip
    Проверить статус в CoCon:
    /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  │
    └─────────────┴───────────┴───────────────┴───────────┴───────────┘
  12. Обновление пакета ecss-restfs:
    sudo apt install ecss-restfs
  13. Обновление пакета ecss-media-server:
    sudo apt install ecss-media-server
    Актуализировать конфигурацию:
    sudo dpkg-reconfigure ecss-media-server

    Проверить и при необходимости исправить вручную файл /etc/ecss/ecss-media-server/config.xml.

    <?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>


    Также, для регистрации media-сервера с ecss2 на ecss1 надо убрать ранее добавленные комментарии из файла /etc/ecss/ecss-media-server/conf.d/default.xml на ecss2:
    <?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>
    После чего перезапустить сервис:
    sudo systemctl restart ecss-media-server.service
  14. Обновление пакета ecss-media-resources:

    sudo apt install ecss-media-resources
  15. Обновление пакета ecss-web-conf:

    sudo apt install ecss-web-conf
  16. Обновление пакета ecss-teleconference-ui:

    sudo apt install ecss-teleconference-ui

    Обновление пакета ecss-crm-server:

    sudo apt install ecss-crm-server

    Обновление пакета ecss-cc-ui:

    sudo apt install ecss-cc-ui

    Обновление пакета ecss-call-api:

    sudo apt install ecss-call-api

    Обновление пакета ecss-peeper-client:

    sudo apt install ecss-peeper-client

6. Проверка обновления

После выполнения обновления проверить работу всех сервисов SSW.

7. Удаление MySQL

  1. Удалите MySQL, выполнив следующие команды:
    sudo apt purge ecss-mysql

    На вопросы об удалении БД → положительно отвечаем на вопросы - удалить все базы данных