Manual Setup Guide for Kamailio with PostgreSQL for Kazoo/2600Hz

This guide will help you manually set up a Kamailio Session Border Controller (SBC) with PostgreSQL for Kazoo/2600Hz. Since the 2600hz provided database for kamailio (Kazoo_DB) is not open source, we have to replace it with PostgreSQL.

This is an improvement anyway, as KazooDB has issues with presence/BLF at larger scales without putting it on a ramdisk.

Overview

The Kamailio SBC acts as the entry point for SIP traffic in a Kazoo platform. It handles tasks like:

  • SIP signaling management
  • Load balancing
  • Security and authentication
  • Registration handling

Prerequisites

  • Debian/Ubuntu system (Debian 11 Bullseye recommended), or RHEL 8/9 (Almalinux, Rocky Linux, etc.)
  • Basic understanding of SIP, PostgreSQL, and Kazoo

1. PostgreSQL Installation

Debian:

# Add PostgreSQL repository
apt-key add https://www.postgresql.org/media/keys/ACCC4CF8.asc
echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/postgresql.list

# Update and install PostgreSQL 13
apt update
apt install -y postgresql-13 postgresql-client-13 postgresql-contrib-13 \
    python3-psycopg2 postgresql-server-dev-13

RHEL:

dnf module enable postgresql:13
dnf install postgresql-server

2. PostgreSQL Configuration

Edit PostgreSQL configuration files:

# Configure PostgreSQL access
nano /etc/postgresql/13/main/pg_hba.conf

Add these lines:

# IPv4 local connections:
host    all             all             127.0.0.1/32            password

Configure main PostgreSQL settings:

Debian:

nano /etc/postgresql/13/main/postgresql.conf

RHEL:

nano /var/lib/pgsql/data/pg_hba.conf

Key settings to update:

# Basic settings
listen_addresses = '127.0.0.1'
port = 5432

# Memory
shared_buffers = 512MB
max_connections = 400
superuser_reserved_connections = 10

# For Kamailio performance
datestyle = 'iso, dmy'
timezone = 'UTC'  # Or your timezone

Restart PostgreSQL:

systemctl restart postgresql@13-main

3. Kamailio Installation

Add Kamailio Repository

Debian:

apt-key add https://deb.kamailio.org/kamailiodebkey.gpg
echo "deb http://deb.kamailio.org/kamailio55 bullseye main" > /etc/apt/sources.list.d/kamailio.list
echo "deb-src http://deb.kamailio.org/kamailio55 bullseye main" >> /etc/apt/sources.list.d/kamailio.list
apt update

RHEL:

Add the repository:

yum config-manager --add-repo https://rpm.kamailio.org/centos/kamailio.repo

Enable the correct version repo:

nano /etc/yum.repos.d/kamailio.repo

Disable the “latest” repo by setting it to enabled=0. Enable the 5.5.7 repo by setting enabled=1.

Install Kamailio Packages

Debian:

apt install -y kamailio kamailio-postgres-modules kamailio-kazoo-modules \
    kamailio-outbound-modules kamailio-presence-modules kamailio-tls-modules \
    kamailio-utils-modules kamailio-websocket-modules kamailio-extra-modules \
    kamailio-xmpp-modules

RHEL:

(All these Kamailio modules aren’t strictly necessary, but they don’t take up much space and you may want to use some later for custom scenarios.)

dnf install kamailio kamailio-auth-ephemeral kamailio-auth-xkeys kamailio-carrierroute kamailio-cnxcc kamailio-cpl kamailio-crypto kamailio-debugsource kamailio-dialplan kamailio-dmq_userloc kamailio-evapi kamailio-gzcompress kamailio-http_async_client kamailio-http_client kamailio-ims kamailio-jansson kamailio-json kamailio-kazoo kamailio-lcr kamailio-ldap kamailio-lost kamailio-lua kamailio-lwsc kamailio-outbound kamailio-perl kamailio-phonenum kamailio-postgresql kamailio-presence kamailio-python kamailio-rabbitmq kamailio-regex kamailio-rtjson kamailio-ruby kamailio-sctp kamailio-secfilter kamailio-sipcapture-daemon-config kamailio-sipdump kamailio-sipjson kamailio-snmpstats kamailio-sqlang kamailio-sqlite kamailio-statsd kamailio-tcpops kamailio-tls kamailio-unixodbc kamailio-utils kamailio-uuid kamailio-websocket kamailio-xhttp-pi kamailio-xmlops kamailio-xmlrpc kamailio-xmpp

4. Database Setup for Kamailio

Create kamailio database and user:

sudo -u postgres psql -c "CREATE DATABASE kamailio;"
sudo -u postgres psql -c "CREATE USER kamailio WITH PASSWORD 'your_secure_password';"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE kamailio TO kamailio;"

5. Kazoo Configuration

Clone Kamailio Configuration Repository

mkdir -p /etc/kazoo
git clone https://github.com/kazoo-classic/kazoo-configs-kamailio.git /etc/kazoo

Initialize Kamailio Database

# Create necessary directories
mkdir -p /etc/kazoo/kamailio/db
chown kamailio:kamailio /etc/kazoo/kamailio -R

# Initialize Kamailio database
sudo -u postgres psql -U kamailio -d postgres://kamailio:your_secure_password@127.0.0.1/kamailio \
  -f /etc/kazoo/kamailio/db_scripts/kamailio_initdb_postgres.sql

6. Configure Kamailio

System Configuration

Create/edit the Kamailio system config:

Debian:

nano /etc/default/kamailio

Add the recommended values:

# Kamailio startup options
SHM_MEMORY=64
PKG_MEMORY=8
DUMP_CORE=no
CFGFILE=/etc/kazoo/kamailio/kamailio.cfg

RHEL:

nano /lib/systemd/system/kamailio.service

Change this line:

Environment='CFGFILE=/etc/kamailio/kamailio.cfg'

to this:

Environment='CFGFILE=/etc/kazoo/kamailio/kamailio.cfg'

Reload the systemd service file:

systemctl daemon-reload

Create Local Configuration

Edit the local configuration file for Kamailio:

nano /etc/kazoo/kamailio/local.cfg

Uncomment the roles you want to enable near the top of the file.

Set your server information:

#!substdef "!MY_HOSTNAME!sbc.z1.your-domain.com!g"
#!substdef "!MY_IP_ADDRESS!YOUR_SBC_IP_ADDRESS!g"

Point AMQP at your RabbitMQ Server. You can add more zones and secondary/terniary urls:

#!substdef "!MY_AMQP_ZONE!z1!g"
#!substdef "!MY_AMQP_URL!zone=z1;amqp://guest:guest@rabbitmq.your-domain.com:5672!g"

Configure your postgres connection

#!trydef KZ_DB_MODULE postgres
#!substdef "!KAMAILIO_DBMS!postgres!g"
#!substdef "!KAZOO_DB_URL!postgres://kamailio:your_secure_password@127.0.0.1/kamailio!g"

Set your SIP bindings:

#!substdef "!UDP_SIP!udp:MY_IP_ADDRESS:5060!g"
#!substdef "!TCP_SIP!tcp:MY_IP_ADDRESS:5060!g"
#!substdef "!UDP_ALG_SIP!udp:MY_IP_ADDRESS:7000!g"
#!substdef "!TCP_ALG_SIP!tcp:MY_IP_ADDRESS:7000!g"

listen=UDP_SIP
listen=TCP_SIP
listen=UDP_ALG_SIP
listen=TCP_ALG_SIP

7. Configure Logging

Configure rsyslog

mkdir -p /var/log/kamailio
chown kamailio:kamailio /var/log/kamailio

# Create rsyslog configuration
cat > /etc/rsyslog.d/10-kamailio.conf << 'EOF'
if $programname == 'kamailio' then /var/log/kamailio/kamailio.log
& ~
EOF

# Create logrotate configuration
cat > /etc/logrotate.d/kamailio << 'EOF'
/var/log/kamailio/kamailio.log {
    daily
    size 500M
    nodateext
    missingok
    notifempty
    rotate 31
    maxage 5
    create
    compress
    delaycompress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
EOF

# Restart rsyslog
systemctl restart rsyslog

8. Final Configuration and Start

Start and Enable Services

# Start PostgreSQL
systemctl enable postgresql
systemctl start postgresql

# Start Kamailio
systemctl enable kamailio
systemctl start kamailio

Verify Configuration

# Check Kamailio status
systemctl status kamailio

# Verify logs
tail -f /var/log/kamailio/kamailio.log

# Check SIP ports are open
netstat -tulpn | grep kamailio