Хранение конфигов 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');
Созданы номера 1001–1004 с контекстом 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 22chan_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.