SEMS node installation

Install packages

# apt update && apt install sems sems-modules-yeti

Configuration files

/etc/sems/sems.conf

Add new Point of Presensce using web interface. Use id of newly created PoP as value for pop_id parameter.

Add new Node using web interface. Use id of newly created Node as value for node_id parameter.

Replace <SIGNALLING_IP>, <MEDIA_IP> with correct values for your server :

general {
    stderr = no
    syslog_loglevel = 2
    syslog_facility = LOCAL0

    node_id = 8

    shutdown_mode {
        code = 508
        reason = "Yeti node in shutdown mode"
        allow_uac = true
    }

    media_processor_threads = 4
    rtp_receiver_threads = 4
    session_processor_threads = 20
    sip_udp_server_threads = 2
    sip_tcp_server_threads = 2

    dead_rtp_time = 30

    default_bl_ttl = 0

    symmetric_rtp_mode = packets
    symmetric_rtp_packets = 20
}

signaling-interfaces {
    interface primary {
        default-media-interface = primary
        ip4 {
            sip-udp {
                address = <SIGNALLING_IP>
                port = 5060
                use-raw-sockets = off
            }
            sip-tcp {
                address = <SIGNALLING_IP>
                port = 5060
                connect-timeout = 2000
                static-client-port = on
                idle-timeout=900000
                use-raw-sockets = off
            }
        }
    }
}

media-interfaces {
    interface primary {
        ip4 {
            rtp {
                address = <MEDIA_IP>
                low-port = 16384
                high-port = 32769
                dscp = 46
                use-raw-sockets = off
            }
        }
    }
}

modules {
    module "di_log" {}

    module "mp3" {}
    module "opus" {}
    module "wav" {}
    module "gsm" {}
    module "ilbc" {}
    module "adpcm" {}
    module "l16" {}
    module "g722" {}

    module "registrar_client" {}
    module "postgresql" {}

    module "session_timer" {}
    module "jsonrpc" {
        listen{
            address = 127.0.0.1
            port = 7080
        }
        server_threads = 1
    }

    module "http_client" {}

    module-global "uac_auth" {}
    module "options_prober" {}

    module "radius_client" {}

    module "redis" {
        max_batch_size = 10
        batch_timeout = 100
        max_queue_size = 1000
    }

    module "registrar" {
        redis {
            use_functions = no
            write {
                hosts = { 127.0.0.1:6379 }
            }
            read {
                hosts = { 127.0.0.1:6379 }
            }
       }
    }

    module "yeti" {
        pop_id = <POP_ID>
        lega_cdr_headers {
            header(p-charge-info, string)
            header(diversion, array)
        }

        auth {
            realm = yeti-switch
        }

        msg_logger_dir = /var/spool/sems/dump
        audio_recorder_dir = /var/spool/sems/records
        audio_recorder_compress = false

        db_refresh_interval = 5
        ip_auth_reject_if_no_matched = true

        routing {
            schema = switch21
            function = route_release
            init = init
            pass_input_interface_name = true
            master_pool {
                host = 127.0.0.1
                port = 5432
                name = yeti
                user = yeti
                pass = somepassword
                size = 4
                check_interval = 10
                max_exceptions = 0
                statement_timeout = 3000
            }
            failover_to_slave = false
            slave_pool {
                host = 127.0.0.1
                port = 5432
                name = yeti
                user = yeti
                pass = somepassword
                size = 4
                check_interval = 10
                max_exceptions = 0
                statement_timeout = 3000
            }
        }
        cdr {
            dir = /var/spool/sems/cdrs
            completed_dir = /var/spool/sems/cdrs/completed
            pool_size = 2
            auth_pool_size = 2
            schema = switch
            function = writecdr
            master {
                host = 127.0.0.1
                port = 5433
                name = cdr
                user = cdr
                pass = somepassword
            }
            failover_to_slave = false
            slave {
                host = 127.0.0.1
                port = 5433
                name = cdr
                user = cdr
                pass = somepassword
            }
            failover_requeue = true
            failover_to_file = false
            serialize_dynamic_fields = true
            batch_size = 1
            batch_timeout = 5000
            auth_batch_size = 1
            auth_batch_timeout = 20000
        }
        resources {
            reject_on_error = false
            reduce_operations = true
            write {
                hosts = { 127.0.0.1:6379 }
                timeout = 500
            }
            read {
                hosts = { 127.0.0.1:6379 }
                timeout = 1000
            }
        }
        registrations {
            check_interval = 5000
        }
        rpc {
            calls_show_limit = 10000
        }
        core_options_handling = yes
    }
}

routing {
    application = yeti
}

Warning

JRPC interface allows shutdown SEMS node or make it non-operational. JRPC interface should be secured by firewall to prevent connections from not trusted hosts. In YETI systems only two components should have ability to connect to RPC - WEB interface and yeti-cli console

Launch traffic switch

Launch configured traffic switch instance:

# systemctl sems start

In case of errors it’s useful to use sems -E -D3 command which will launch daemon in foreground with debug logging level

Checks

Check if sems process exists and signaling/media/rpc sockets are opened:

# systemctl status sems
● sems.service - SEMS for YETI project
     Loaded: loaded (/lib/systemd/system/sems.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-12-05 20:21:52 UTC; 5 days ago
       Docs: https://yeti-switch.org/docs/
   Main PID: 68166 (sems)
      Tasks: 84 (limit: 154132)
     Memory: 3.3G
        CPU: 2d 18h 15min 51.113s
     CGroup: /system.slice/sems.service
             └─68166 /usr/bin/sems -f /etc/sems/sems.conf
# pgrep sems
29749
# netstat -lpn | grep sems
tcp 0    0 127.0.0.1:8090 0.0.0.0:*  LISTEN 29749/sems
udp 0    0 127.0.0.1:5061 0.0.0.0:*         29749/sems
raw 2688 0 0.0.0.0:17     0.0.0.0:*  7      29749/sems

Check logs using for possible errors:

# journalctls -u sems