2026-09-19
Хранение конфигов Asterisk в MySQL/MariaDB на Ubuntu: RealTime через ODBC

Хранение конфигов Asterisk в MySQL/MariaDB на Ubuntu: RealTime через ODBC

Asterisk умеет хранить конфигурацию не в файлах, а в СУБД — это называется RealTime. Изменения в базе применяются без перезапуска АТС. В этой инструкции настроим связку Asterisk + MariaDB через ODBC-коннектор: пиры, диалплан и CDR.

Подразумевается, что Asterisk уже установлен (см. базовую инструкцию). Пример — Asterisk 22 LTS.


Установка СУБД

apt install mariadb-server
systemctl enable mariadb
systemctl start mariadb
mysqladmin -u root password

В современных дистрибутивах служба называется mariadb, а не mysql.


Сборка Asterisk с поддержкой MySQL

Если Asterisk уже установлен, но собирался без MySQL, пересобираем. Смотрим версию:

asterisk -V
cd /usr/src

Скачиваем исходник (ссылку берём на странице загрузок):

wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
tar -zxf asterisk-*.tar.gz
cd asterisk-*/

Конфигурируем с опцией работы с MySQL — --with-mysqlclient:

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/lib64 
  --with-dahdi --with-pri --with-iconv --with-libcurl --with-speex --with-mysqlclient

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

make menuselect

Раздел Add-ons → модули res_config_odbc, cdr_adaptive_odbc и прочие. Нажимаем Save & Exit.

make
make install

Настройка

СУБД

mysql -u root -p
> CREATE DATABASE asterisk DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
> CREATE USER 'asteruser'@'localhost' IDENTIFIED BY 'asterpassword123';
> GRANT ALL PRIVILEGES ON asterisk.* TO 'asteruser'@'localhost';

Создана база asterisk и пользователь asteruser / asterpassword123.

Загружаем схемы:

> use asterisk
> source /usr/src/asterisk-22.11.0/contrib/realtime/mysql/mysql_config.sql
> source /usr/src/asterisk-22.11.0/contrib/realtime/mysql/mysql_cdr.sql
> source /usr/src/asterisk-22.11.0/contrib/realtime/mysql/mysql_voicemail.sql
> q

Путь /usr/src/asterisk-22.11.0 — каталог распакованного исходника.

ODBC-коннектор

Для MariaDB используем коннектор libmaodbc из пакетов (вместо устаревшего MySQL Connector/ODBC):

apt install mariadb-plugin-odbc odbcinst unixodbc

Устанавливаем драйвер и DSN:

odbcinst -i -d -f /usr/share/mariadb-connector-odbc/odbcinst.ini

Либо создаём вручную. Драйвер в /etc/odbcinst.ini:

[MariaDB]
Description     = ODBC for MariaDB
Driver          = /usr/lib/x86_64-linux-gnu/libmaodbc.so
FileUsage       = 1

DSN в /etc/odbc.ini:

[Asterisk]
Driver   = MariaDB
SERVER   = 127.0.0.1
DATABASE = asterisk
UID      = asteruser
PWD      = asterpassword123

где MariaDB — имя драйвера; asterisk, asteruser, asterpassword123 — база, пользователь и пароль.

Проверяем подключение:

isql Asterisk
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                     |
| quit                                  |
+---------------------------------------+
SQL> show tables
SQL> quit

Asterisk

vi /etc/asterisk/modules.conf
preload => res_odbc.so
preload => res_config_odbc.so

Настраиваем подключение к базе:

vi /etc/asterisk/res_odbc.conf
[asterisk-conf]
enabled         => yes
dsn             => Asterisk
username        => asteruser
password        => asterpassword123
pre-connect     => yes
max_connections => 100
sanitysql       => select 1
systemctl restart asterisk
asterisk -r
> odbc show

Добавление настроек в базу

Пока Asterisk читает файлы. Настроим использование СУБД.

Пиры (sippeers)

vi /etc/asterisk/extconfig.conf
[settings]
sipusers => odbc,asterisk-conf,sippeers
sippeers => odbc,asterisk-conf,sippeers

Говорим Asterisk искать пиры через ODBC в настройке asterisk-conf.

systemctl restart asterisk

Теперь номера из базы работают в реальном времени — без перезапуска АТС.

mysql -uasteruser -pasterpassword123
> INSERT INTO asterisk.sippeers
(`name`, `defaultuser`, `host`, `type`, `context`, `secret`, `nat`, `callgroup`,
 `language`, `disallow`, `allow`, `regexten`, `call-limit`)
VALUES
('1001', '1001', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1001', '4'),
('1002', '1002', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1002', '4'),
('1003', '1003', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1003', '4'),
('1004', '1004', 'dynamic', 'friend', 'outcalling', '1234', 'no', '1', 'ru', 'all', 'alaw,ulaw', '1004', '4');

Созданы номера 10011004 с контекстом outcalling и паролем 1234.

Обновление записи:

> UPDATE asterisk.sippeers SET `secret`='password' WHERE `name`='1001';

Проверка абонентов:

asterisk -r
*CLI> sip show peers

Для PJSIP-номеров таблицы и команды будут иными (ps_endpoints, pjsip show endpoints). Таблица sippeers относится к устаревшему chan_sip; для новых инсталляций используйте RealTime-схему PJSIP.

Правила вызова (диалплан)

vi /etc/asterisk/extconfig.conf
[settings]
extensions => odbc,asterisk-conf,extensions
vi /etc/asterisk/extensions.conf
[outcalling]
switch => Realtime/outcalling@extensions
systemctl restart asterisk
mysql -uasteruser -pasterpassword123
> INSERT INTO asterisk.extensions VALUES (NULL, 'outcalling', '_XXXX', '1', 'DIAL', 'PJSIP/${EXTEN},,m');

Call Detail Record (CDR)

Храним журнал вызовов в базе.

vi /etc/asterisk/cdr_adaptive_odbc.conf
[cdr]
connection=asterisk-conf
table=cdr
alias src => source
alias channel => source_channel
alias dst => dest
alias dstchannel => dest_channel
systemctl restart asterisk

После звонка смотрим записи:

mysql -uasteruser -pasterpassword123 -e "SELECT * FROM asterisk.cdr"

Пример строки:

| src | dst | dcontext | clid | channel | dstchannel | lastapp | start | answer | end | duration | billsec | disposition |
| 1001| 1004| outcalling| "1001"| PJSIP/1001-...| PJSIP/1004-...| Dial | 2026-... | NULL | 2026-... | 7 | 0 | NO ANSWER |

Расшифровка основных полей:

Поле Описание
src Кто звонит
dst Кому звонили
dcontext Контекст (группа правил)
clid Caller ID (имя и номер)
channel Канал входящего вызова
dstchannel Канал исходящего вызова
lastapp Диалплан-приложение
start Начало звонка
answer Время поднятия трубки (NULL — не подняли)
end Окончание звонка
duration Длительность, сек
billsec Время разговора, сек
disposition Состояние: ANSWERED, NO ANSWER, BUSY, CONGESTION/FAILED
uniqueid Уникальный ID канала звонящего
linkedid Связанный ID канала

Для просмотра CDR в графическом интерфейсе есть веб-приложения, например Asterisk CDR Viewer.


Тонкости и подводные камни

  • sippeers — только для chan_sip. В Asterisk 22 chan_sip отсутствует; для PJSIP используйте таблицы ps_endpoints, ps_auths, ps_aors и extconfig.conf с ps_endpoints => odbc,....
  • MariaDB вместо MySQL Connector — пакет mysql-connector-odbc для старых Ubuntu недоступен; используйте libmaodbc.
  • Версия Asterisk и схемы SQL — путь /usr/src/asterisk-*/contrib/realtime/mysql зависит от распакованной версии.
  • CDR через cdr_adaptive_odbc — предпочтительнее старого cdr_odbc; поддерживает маппинг колонок через alias.
  • RealTime — не для всех конфигов — часть настроек (например, asterisk.conf) остаётся в файлах.
  • Права на ODBC-сокет — при проблемах проверяйте /tmp/mysql.sock и Server в odbc.ini.

Шпаргалка

apt install mariadb-server mariadb-plugin-odbc odbcinst unixodbc
mysql -u root -p
# CREATE DATABASE asterisk; CREATE USER 'asteruser'@'localhost' ...; GRANT ...
# source contrib/realtime/mysql/mysql_{config,cdr,voicemail}.sql

# сборка asterisk с mysql
./configure ... --with-mysqlclient
make menuselect   # включить res_config_odbc, cdr_adaptive_odbc
make && make install

# /etc/odbc.ini -> [Asterisk] Driver=MariaDB ...
# /etc/asterisk/res_odbc.conf -> [asterisk-conf] dsn => Asterisk
# /etc/asterisk/extconfig.conf -> extensions => odbc,asterisk-conf,extensions
systemctl restart asterisk

Проверено на: Ubuntu 22.04/24.04/26.04 + Asterisk 22 LTS, MariaDB 10.11+.
Дата: Сентябрь 2026.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *