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).
    on ecss1
    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.
    on ecss1/ecss2
    sudo mysql -uroot -p -e 'STOP SLAVE;'

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

    Example
    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:

    on ecss2
    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).
    on ecss1
    ifconfig
  6. It is necessary to mask all nodes on the server that will be updated first. Disable the nodes' automatic startup:
    on ecss2
    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.


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

    Result
    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:
    on both hosts
    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:
    on both hosts
    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:

    on ecss1
    cat /etc/fstab
    Output example
    # /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:

    on both hosts
    sudo mkdir -p /srv/ecss/ecss-postgres-bdr-ssw

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

    on both hosts
    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):
    on both hosts
    sudo nano /etc/fstab
    Output example
    # /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):

    both hosts: 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):

    on all hosts
    sudo install -m 0755 -d /etc/apt/keyrings
    on all hosts
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    on all hosts
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    on all hosts
    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
    on all hosts
    sudo apt update
    on all hosts, first on ecss1, then on ecss2
    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:
    To check replication, run the following command on both hosts:
    cd /srv/ecss/ecss-postgres-bdr-ssw

    To check replication, run the following command on both hosts:
    sudo ./postgresbdr_ssw.sh check

    Output on ecss1/ecss2 hosts should be the same.


    Output example (shortened)
    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:

    on ecss2
    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:

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

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

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

    on ecss2
    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):

    on ecss2
    /usr/bin/migrate_cocon.exs

    The values in parentheses are the default ones. Enter your own values if they differ.

    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:

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

    on ecss2
    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
    on ecss2
    sudo systemctl start ecss-mycelium
    ecss-ds
    on ecss2
    sudo systemctl start ecss-ds
    ecss-core
    on ecss2
    sudo systemctl start ecss-core
    ecss-mediator
    on ecss2
    sudo systemctl start ecss-mediator

    DO NOT START PA-SIP YET!

  11. Check the service status by running the system-status command in CoCon:

    performed 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:
    performed in CoCon

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


    Output example
    /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:
    performed in CoCon
    /system/postgresql/migration/do <DATABASE> <TABLE>
    Check the migration using the following command:
    performed in CoCon
    /system/postgresql/migration/info <DATABASE> <TABLE>

    Output example
    /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 package.
    Accept all new configuration files using Y.

    on ecss2
    sudo apt install ecss-restfs
  14. Updating the ecss-media-server package.

    The Media Server analyzes the configuration in the files located in the /etc/ecss/ecss-media-server/ directory. Version 3.17 introduces a new feature for managing codec priorities. If, for any reason, the codec section in multiple files contains duplicate entries for the same codec, a conflict will occur after the update, and the Media Server will fail to start.

    Therefore, there must be no conflicts regarding codec priorities in the configuration files of a single Media Server (there should be only one entry for each codec, and it must not be duplicated in other files). It is up to the system administrator to determine which specific files need to be configured.


    First, disable registration on the production host ecss1. To do this, comment out the line containing the production host's realm (in the example, realm="sip:10.0.20.81:5000") in the configuration file by adding <!-- at the beginning of the line and --> at the end:
    on ecss2
    sudo nano /etc/ecss/ecss-media-server/conf.d/default.xml

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

    Perform the update:
    on ecss2
    sudo apt install ecss-media-server
    Refresh the configuration:
    on ecss2
    sudo dpkg-reconfigure ecss-media-server
    Check the file and, if necessary, edit it using the command:
    on ecss2
    sudo nano /etc/ecss/ecss-media-server/config.xml

    Example
    <?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. Updating the ecss-media-resources package:

    on ecss2
    sudo apt install ecss-media-resources
  16. Updating the ecss-web-conf package:

    on ecss2
    sudo apt install ecss-web-conf

  17. Updating the ecss-teleconference-ui package:

    on ecss2
    sudo apt install ecss-teleconference-ui

    Updating the ecss-crm-server package:

    on ecss2
    sudo apt install ecss-crm-server

    Updating the ecss-cc-ui package:

    on ecss2
    sudo apt install ecss-cc-ui

    Updating the ecss-call-api package:

    on ecss2
    sudo apt install ecss-call-api

    Updating the ecss-peeper-client package:

    on ecss2
    sudo apt install ecss-peeper-client
  18. Migrating current subscriber registrations:
    Before migrating keepalived to the updated host, you must copy the current ds database from ecss1 (otherwise, the registration database will be empty). Therefore, first back up the Mnesia database on ecss1:
    performed in CoCon
    /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"

    Stop the ecss-ds on ecss2:

    on ecss2
    sudo systemctl stop ecss-ds

    Use the scp command to copy backup from ecss1 to ecss2:

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

    Make the local copy of the running configuration:

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

    Replace the local configuration with the backup configuration from ecss1:

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

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

    Start ecss-ds and ecss-pa-sip (to load the latest subscriber registrations):


    on ecss2
    sudo systemctl start ecss-ds

    on ecss2
    sudo systemctl start ecss-pa-sip

    Check the status of services using the /system-status command;

    performed 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│
    │ │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  │
    └─────────────┴───────────┴─────────────┴───────────┴───────────┘
    Verify that active registrations have been transferred to the updated host. To do this, check the registered subscribers on the first (3.14.16) and second (1.7) hosts. Run the command in CoCon:
    performed in CoCon on 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 │
    └───────────────┘

    performed in CoCon on 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 │
    └───────────────┘
  19. Start the keepalived service:

    on ecss2
    sudo systemctl enable --now keepalived

4 Preparatory actions on ecss1

  1. Prepare ecss1 for the update: To do this, redirect all traffic to ecss2 (run this command on ecss1):

    on ecss1
    sudo systemctl disable --now keepalived.service
  2. Use the ifconfig command to verify that all VRRP addresses (VRRP IP-mysql / VRRP IP-SIP1 / VRRP IP-SIP2) are on ecss2:

    on ecss2
    ifconfig
  3. After splitting the cluster, shut down all nodes on the ecss1 server:
    on ecss1
    sudo systemctl mask --now ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip
  4. Perform database table migrations.
    Use the following command to check which data is available for transfer:
    performed in CoCon

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

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

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

    Migration is performed using the following command:
    performed in CoCon
    /system/postgresql/migration/do <DATABASE> <TABLE>
    You can check the migration status using the command:
    performed in CoCon
    /system/postgresql/migration/info <DATABASE> <TABLE>

    Example
    /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 Updating SSW servcies on ecss1

  1. Perform clustering on ecss2:
    on ecss2
    sudo ecss-control attach
  2. Enable the keepalived service:
    on ecss1
    sudo systemctl enable --now keepalived
  3. Updating the ecss-dns-env package:

    on ecss1
    sudo apt install ecss-dns-env

    Accept new configuration files during an update using Y.

    After the update, refresh the configuration using the command:
    on ecss1
    sudo dpkg-reconfigure ecss-dns-env
  4. Updating the ecss-user package:

    on ecss1
    sudo apt install ecss-user
  5. Updating the ecss-utils package:

    on ecss1
    sudo apt install ecss-utils
  6. Updating the ecss-node package:

    on ecss1
    sudo apt install ecss-node

    on ecss1

    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 !

  7. Enable SSW services:

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

    on ecss1
    sudo systemctl enable ecss-ds ecss-mycelium ecss-mediator ecss-core ecss-pa-sip
  8. On ecss1, start the mycelium service and use CoCon to verify that the service is running and that the mycelium nodes of the ecss1 and ecss2 hosts are visible:

    on ecss1
    sudo systemctl start ecss-mycelium

    performed 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 │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. Before starting ecss-ds on ecss1, the /var/lib/ecss/oasys directory should be renamed (after creating a backup) in order to load the current database from another host.

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

    After that, ecss-ds on the ecss1 host will load the database from ecss2.



  10. On ecss1, start the ds service and use CoCon to verify that the ds service is available on both ecss1 and ecss2:
    on ecss1
    sudo systemctl start ecss-ds

    performed 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        │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. Next, follow the same steps to start the following services: ecss-mediator, ecss-pa-sip, and ecss-core using the following commands:
    on ecss1
    sudo systemctl start ecss-core

    on ecss1
    sudo systemctl start ecss-mediator

    on ecss1
    sudo systemctl start ecss-pa-sip
    Check the status in CoCon:
    Result:
    /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. Updating the ecss-restfs package:
    on ecss1
    sudo apt install ecss-restfs
  13. Updating the ecss-media-server package:
    on ecss1
    sudo apt install ecss-media-server
    Refresh the configuration:
    on ecss1
    sudo dpkg-reconfigure ecss-media-server

    Check the /etc/ecss/ecss-media-server/config.xml file and manually correct it if necessary.

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


    Also, to register the media server from ecss2 to ecss1, you need to remove the previously added comments from the /etc/ecss/ecss-media-server/conf.d/default.xml file on 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>
    And then restart the service:
    on ecss2
    sudo systemctl restart ecss-media-server.service
  14. Updating the ecss-media-resources package:

    on ecss1
    sudo apt install ecss-media-resources
  15. Updating the ecss-web-conf package:

    on ecss1
    sudo apt install ecss-web-conf
  16. Updating the ecss-teleconference-ui package:

    on ecss1
    sudo apt install ecss-teleconference-ui

    Updating the ecss-crm-server package:

    on ecss1
    sudo apt install ecss-crm-server

    Updating the ecss-cc-ui package:

    on ecss1
    sudo apt install ecss-cc-ui

    Updating the ecss-call-api package:

    on ecss2
    sudo apt install ecss-call-api

    Updating the ecss-peeper-client package:

    on ecss2
    sudo apt install ecss-peeper-client

6. Checking the update

After updating check the SSW servcies operation.

7. Deleting MySQL

  1. Delete MySQL, using the following commands:
    on both hosts
    sudo apt purge ecss-mysql

    Regarding questions about deleting databases → answer “yes” to the questions – delete all databases


  • Нет меток