Установка Asterisk + FreePBX на Ubuntu


Используемые термины: Asterisk, FreePBX, Ubuntu, NGINX.
Самый быстрый способ установить Asterisk + FreePBX — использовать ISO-образ FreePBX Distro. Но мы рассмотрим установку данной сборки на Linux Ubuntu «с нуля».
Данная инструкция написана на примере установки Asterisk 18/20 LTS и FreePBX 16/17. В качестве веб-сервера для FreePBX мы будем использовать NGINX.
Готовим систему
Настраиваем компоненты веб-сервера
СУБД MariaDB
NGINX
PHP
Настройка связки PHP с NGINX
NodeJS
Устанавливаем сервер телефонии
Запускаем портал FreePBX
Настройка CDR
Решение возможных проблем
Дополнительные материалы
Подготовка системы
Для корректной работы сервера необходимо настроить системное время, открыть порты в брандмауэре и создать пользователя asterisk. Также мы установим несколько пакетов и создадим учетную запись, от которой будет работать Asterisk.
1. Установка пакетов
Выполним установку пакетов:
apt update
apt install wget tar language-pack-ru ca-certificates curl gnupg cron
* где:
- wget — утилита для загрузки файлов по сети.
- tar — для распаковки архивов.
- language-pack-ru — русская локаль. Она нужна, чтобы у нас была возможность выбрать русский интерфейс во FreePBX.
- ca-certificates — набор корневых сертификатов.
- curl — утилита для отправки запросов к веб-серверу. Будем использовать для загрузки файлов.
- gnupg — для шифровки и дешифровки цифровых подписей. Нужна для работы с репозиториями.
- cron — планировщик и запуск заданий по расписанию.
2. Время
Задаем часовой пояс:
timedatectl set-timezone Europe/Moscow
* в данном примере московское время. Список всех зон можно посмотреть командой timedatectl list-timezones.
Устанавливаем сервис для синхронизации времени:
apt install chrony
И запускаем его с разрешением автозапуска:
systemctl enable chrony --now
3. Настройка firewall
Мы должны открыть порты:
- 5060 (tcp/udp) — SIP.
- 5061 (tcp/udp) — SIP over TLS.
- 80 (tcp) — http.
- 443 (tcp) — https.
- Диапазон от 10000 до 20000 (udp) — голосовой трафик.
В Ubuntu для управления брандмауэром, как правило, использоваться iptables. Рассмотрим настройку.
Открываем порты для астериска и веб-сервера:
iptables -I INPUT -p tcp --match multiport --dports 5060,5061 -j ACCEPT
iptables -I INPUT -p udp --match multiport --dports 5060,5061 -j ACCEPT
iptables -I INPUT -p tcp --match multiport --dports 80,443 -j ACCEPT
iptables -I INPUT -p udp --dport 10000:20000 -j ACCEPT
Для сохранения правил установим:
apt install iptables-persistent
netfilter-persistent save
4. Создание пользователя
Нам нужен общий пользователь, от которого будет работать Asterisk и веб-сервер. Это необходимо, чтобы веб-сервер имел доступ к каталогам астериска.
Создаем пользователя командой:
useradd asterisk -m
Настройка веб-сервера
Для работы FreePBX нам необходим веб-сервер и СУБД. В нашем примере мы установим связку NGINX + PHP + MariaDB + NodeJS.
Сервер баз данных
Устанавливаем mariadb:
apt install mariadb-server
Стартуем сервис и разрешаем его автозапуск:
systemctl enable mariadb --now
Задаем пароль для суперпользователя СУБД:
mysqladmin -u root password
NGINX
Для установки веб-сервера вводим команду:
apt install nginx
Открываем конфигурационный файл:
vi /etc/nginx/nginx.conf
В секции http добавим опцию:
client_max_body_size 128M;
* данный параметр разрешает загрузку файлов размером до 128 Мб.
Перезапускаем nginx и разрешаем автозапуск:
systemctl enable nginx
systemctl restart nginx
Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открыться страница приветствия NGINX:
Веб-сервер установлен.
PHP и компоненты
Прежде чем начать установку, необходимо изучить документацию к устанавливаемой версии FreePBX в части требований версии PHP. Например, для 17-й версии это можно сделать на странице с инструкцией по развертыванию.
Чтобы правильно выбрать нужную версию FreePBX и подходящую к ней версию Asterisk, воспользуемся таблицей с сайта разработчика.
Также имейте ввиду, что для каждой версии дистрибутива Ubuntu характерна установка своей версии PHP. Иногда, для установки определенной версии нам потребуется подключить дополнительный репозиторий.
Для удобства работы зададим в переменной версию PHP, которая требуется для FreePBX:
PHP_VER=7.4
Смотрим, какую версию PHP предлагают установить встроенные репозитории:
apt search --names-only '^php[.0-9]{3}$'
а) Если требуемая версия PHP устанавливается в системе без дополнительного репозитория:
apt install php php-fpm php-bcmath php-gd php-json php-mbstring php-mysqlnd php-pear php-snmp php-zip php-curl php-xml --no-install-recommends
б) Если для установки требуемой версии PHP требуется подключить дополнительный репозиторий:
Для установки альтернативной версии PHP следуем одной из инструкций:
1. Установка разных версий PHP на Linux Ubuntu.
2. Установка разных версий PHP на Linux Debian.
После устанавливаем сам PHP и его компоненты:
apt install php${PHP_VER}-fpm php${PHP_VER}-bcmath php${PHP_VER}-gd php${PHP_VER}-json php${PHP_VER}-mbstring php${PHP_VER}-mysqlnd php${PHP_VER}-snmp php${PHP_VER}-zip php${PHP_VER}-curl php${PHP_VER}-xml --no-install-recommends
Теперь открываем настройки для php командой:
vi /etc/php/${PHP_VER}/fpm/php.ini
* где вместо ${PHP_VER} подставится версия php.
Правим значения для следующих опций:
upload_max_filesize = 128M
...
post_max_size = 128M
...
date.timezone = "Europe/Moscow"
...
memory_limit = 512M
* где:
- upload_max_filesize — максимальный объем загружаемого файла.
- post_max_size — максимальный объем всех загружаемых файлов за один раз.
- date.timezone — временная зона.
- memory_limit — максимальный объем памяти, который может использовать интерпретатор.
Открываем настройки php-fpm:
vi /etc/php/${PHP_VER}/fpm/pool.d/www.conf
Задаем значения для следующих опций:
user = asterisk
group = asterisk
* FreePBX должен работать с файлами в каталоге /etc/asterisk. Владельцем этого каталога будет пользователь asterisk, поэтому обработка php должна выполняться тоже от данного пользователя, чтобы иметь соответствующие права на редактирование конфигурационных файлов.
Разрешаем php-fpm и перезапускаем сервис:
systemctl enable php${PHP_VER}-fpm
systemctl restart php${PHP_VER}-fpm
NGINX + PHP
Свяжем наш веб-сервер с php. Для этого откроем конфигурационный файл:
vi /etc/nginx/sites-enabled/default
Добавим следующие строки в разделы http - server:
...
http {
...
server {
...
root /var/www/html;
...
index index.php ...
...
location ~ \.php$ {
set $root_path /var/www/html;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SERVER_NAME $host;
}
...
* в данном примере мы создаем секцию location для обработки php через php-fpm. Обратите внимание, что в моем случае для взаимодействия используется сокет /run/php/php7.4-fpm.sock. Для другой версии PHP путь будет другим. Также обратите внимание на директивы root и index. В первой мы указали путь до домашнего каталога настраиваемого виртуального домена nginx, а во второй задаем первым файл, который будет искать веб-сервер, если путь до скрипта не указан явно в URL.
Выполним проверку конфигурации nginx и перезапустим его:
nginx -t && nginx -s reload
Создадим файл php в домашней директории nginx:
vi /var/www/html/index.php
<?php phpinfo(); ?>
* где путь /var/www/html соответствует тому, что мы указали в nginx с помощью директивы root.
Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница с информацией об установленной версии php и всех компонентах:
Мы готовы идти дальше.
NodeJS
Последний компонент для нашего веб-сервера — NodeJS.
В стандартном репозитории Ubuntu может быть очень старая версия данного компонента. Установим репозиторий для nodejs 18. Для начала создадим переменную с желаемой версией NODEJS:
export NODE_VER=18
* в нашем случае, 18.
Теперь создадим файл с настройкой репозитория:
curl -sL https://deb.nodesource.com/setup_${NODE_VER}.x | sudo bash -
Можно выполнить установку nodejs:
apt install nodejs
Убедиться в установке можно командой просмотра версии:
node --version
Наш веб-сервер готов к работе.
Установка Asterisk
Мы будем устанавливать 20-ю версию Asterisk. На странице загрузки мы можем посмотреть все версии АТС и ссылки на них, например:
* пусть вас не смущает версия 18 на скриншоте. Это пример.
Скачивая Asterisk, учитывайте совместимость его версии с версией FreePBX.
Используя скопированную ссылку, вводим команду:
wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz
Распаковываем архив и переходим в него:
tar -zxf asterisk-*.tar.gz
cd asterisk-*/
Устанавливаем зависимости для астериска:
./contrib/scripts/install_prereq install
Если система запросит телефонный код страны, вводим 7 (если мы настраиваем телефонию для России).
В итоге, мы должны увидеть:
#############################################
## install completed successfully
#############################################
Чистим временные файлы, которые появились после установки зависимостей:
make distclean
Добавляем библиотеку для работы с mp3:
./contrib/scripts/get_mp3_source.sh
Конфигурируем исходник:
./configure
* в данном примере мы конфигурируем исходник без дополнительных опций. Полный перечень опций и что они означают можно посмотреть командой ./configure -h.
Мы должны увидеть:
...
configure: Menuselect build configuration successfully completed
.$$$$$$$$$$$$$$$=..
.$7$7.. .7$$7:.
.$$:. ,$7.7
.$7. 7$$$$ .$$77
..$$. $$$$$ .$$$7
..7$ .?. $$$$$ .?. 7$$$.
$.$. .$$$7. $$$$7 .7$$$. .$$$.
.777. .$$$$$$77$$$77$$$$$7. $$$,
$$$~ .7$$$$$$$$$$$$$7. .$$$.
.$$7 .7$$$$$$$7: ?$$$.
$$$ ?7$$$$$$$$$$I .$$$7
$$$ .7$$$$$$$$$$$$$$$$ :$$$.
$$$ $$$$$$7$$$$$$$$$$$$ .$$$.
$$$ $$$ 7$$$7 .$$$ .$$$.
$$$$ $$$$7 .$$$.
7$$$7 7$$$$ 7$$$
$$$$$ $$$
$$$$7. $$ (TM)
$$$$$$$. .7$$$$$$ $$
$$$$$$$$$$$$7$$$$$$$$$.$$$$$$
$$$$$$$$$$$$$$$$.
configure: Package configured for:
configure: OS type : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : pc : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu :
Продолжаем настройку — запускаем меню для выбора параметров:
make menuselect
Можно оставить значения по умолчанию и сохранить настройки.
Теперь можно запустить сборку астериска:
make
Мы должны увидеть сообщение об успешной сборке:
+--------- Asterisk Build Complete ---------+
+ Asterisk has successfully been built, and +
+ can be installed by running: +
+ +
+ make install +
+-------------------------------------------+
После выполняем установку:
make install
Мы увидим:
+---- Asterisk Installation Complete -------+
+ +
+ YOU MUST READ THE SECURITY DOCUMENT +
+ +
...
Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:
make config
make samples
Ранее мы создали пользователя asterisk, от которого должен запуститься наш сервер телефонии. Для этого откроем файл:
vi /etc/asterisk/asterisk.conf
Снимаем комментарий с опций:
runuser = asterisk
rungroup = asterisk
... и снимем комментарий с последующим редактированием:
defaultlanguage = ru
documentation_language = ru_RU
Задаем владельца для следующих каталогов:
chown -R asterisk:asterisk /var/run/asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /var/log/asterisk
Откроем файл с настройкой модулей:
vi /etc/asterisk/modules.conf
Можно добавить модуль chan_sip:
load = chan_sip.so
* обратите внимание, что модуль chan_sip является устаревшим и в последних версиях Asterisk не работает. Используйте chan_pjsip.
Проверяем настройки:
asterisk -c
Мы должны увидеть Asterisk Ready:
... значит наш сервер готов к запуску. Все ошибки и предупреждения нам не помешают, однако их можно устранить разными способами, как правило, отключив неиспользуемые модули.
После успешной проверки, можно запустить Asterisk в качестве демона:
systemctl enable asterisk
systemctl start asterisk
Установка FreePBX
Возвращаемся в домашнюю папку пользователя:
cd ~
Установим пакеты:
apt install sox mpg123
* где:
- sox — консольная утилита для преобразования аудиофайлов из одного формата в другой.
- mpg123 — аудиопроигрыватель/декодер реального времени.
Скачиваем портал для управления астериском:
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-16.0-latest.tgz
* мы скачаем freepbx версии 16.
Распаковываем скачанный архив:
tar -zxf freepbx-*.tgz
Переходим в распакованный каталог:
cd freepbx
Запускаем скрипт проверки работы Asterisk:
./start_asterisk start
Если видим:
STARTING ASTERISK
Asterisk is already running
... запускаем установку:
./install -n --dbuser root --dbpass <password> --webroot=/var/www/html
* в данном примере мы указали учетные данные для подключения к СУБД (логин root и пароль <password>, который мы создали после установки MariaDB); также мы указываем путь /var/www/html, который является домашней директорией веб-сервера NGINX.
Начнется установка — в конце мы должны увидеть:
You have successfully installed FreePBX
Устанавливаем дополнительные модули:
fwconsole ma install pm2 cdr
* где:
- pm2 — для работы с приложениями nodejs посредством менеджера pm2.
- cdr — отчеты о звонках.
Обновим все компоненты:
fwconsole ma updateall
Перезапустим конфигурацию:
fwconsole reload --verbose
Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница конфигурирования FreePBX. Задаем настройки:
* достаточно указать логин и пароль для пользователя, под которым мы будем заходить в панель управления FreePBX и email адрес.
После входим в панель администратора под созданной учетной записью. Система нас запросит региональные настройки:
Теперь открываем конфигурационный файл:
vi /etc/asterisk/manager.conf
Находим строки:
#include manager_additional.conf
#include manager_custom.conf
... и меняем их на:
;include manager_additional.conf
;include manager_custom.conf
Перезапускаем сервис Asterisk:
systemctl restart asterisk
Asterisk + FreePBX настроен.
CDR и подключение к базе данных
В моем случае, не работало ведение CDR, а при вводе в консоли asterisk команды:
asterisk -r
> odbc show
... я увидел:
ODBC DSN Settings
-----------------
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Last fail connection attempt: 2021-05-08 10:25:52
Number of active connections: 0 (out of 5)
Logging: Disabled
То есть, нет подключения к базе данных asteriskcdrdb. А при попытке подключиться к нужному DSN из командной строки:
isql -v MySQL-asteriskcdrdb
... в результате система может выдать одну из ошибок:
[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib64/libmyodbc5.so' : file not found
[IM002][unixODBC][Driver Manager]Data source name not found and no default driver specified
[ISQL]ERROR: Could not SQLConnect
Если при попытке ввести команду isql мы получаем ошибку:
-bash: isql: command not found
Убедимся, что у нас установлены пакеты:
apt install unixodbc odbcinst
То есть, проблема в отсутствии необходимой библиотеки при подключении к базе данных.
Нам необходимо выполнить 2 действия:
- Установить коннектор ODBC.
- Изменить драйвер для подключения к СУБД в odbc.ini.
Так как в данной инструкции мы используем в качестве севера баз данных MariaDB, нам необходим соответствующий коннектор. Для его установки воспользуемся инструкцией Настройка в Linux подключения к MariaDB из PHP с помощью ODBC.
После открываем файл:
vi /etc/odbc.ini
В разделе MySQL-asteriskcdrdb задаем новое значение для параметра driver, а также проверяем что есть директива Server со значением нашего сервера баз данных, а если есть директива Socket, комментируем ее:
[MySQL-asteriskcdrdb]
...
driver=MariaDB
...
Server=127.0.0.1
#Socket=
* список доступных драйвером можно посмотреть в файле /etc/odbcinst.ini.
Открываем конфигурационный файл:
vi /etc/odbcinst.ini
Проверяем наличие следующей записи (если ее нет, добавляем):
[MariaDB]
Description = ODBC for MariaDB
Driver = /usr/lib/libmaodbc.so
Driver64 = /usr/lib64/libmaodbc.so
FileUsage = 1
* в данном примере описано подключение к СУБД с драйвером MariaDB и путем до файла с библиотекой (отдельно для 32- и 64-разрядной версии).
В зависимости от релиза Ubuntu, библиотека libmaodbc.so может находиться по другому пути. Найти ее можно командой:
find / -name libmaodbc.so
Перезапускаем asterisk:
systemctl restart asterisk
После можно проверить, что Asterisk подключился к базе:
asterisk -r
> odbc show
Мы должны увидеть:
ODBC DSN Settings
-----------------
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Number of active connections: 1 (out of 5)
Logging: Disabled
Возможные ошибки
The user asterisk cannot use this program (crontab)
Во время установки FreePBX выскакивает ошибка:
Cron line added didn't remain in crontab on final check. Check /var/spool/asterisk/tmp/cron.error for reason.
Если посмотреть файл лога /var/spool/asterisk/tmp/cron.error, то в нем мы увидим ошибку:
The user asterisk cannot use this program (crontab)
Причина: пользователю asterisk запрещено использовать cron.
Решение: открываем файл:
vi /etc/cron.deny
И удаляем из него строку, где указан asterisk.
don't understand Storage database
Во время установки FreePBX выскакивают ошибки:
Coding Error - don't understand ': Storage database:' from /etc/asterisk/voicemail.conf
The command "/usr/sbin/fwconsole ma install core dashboard sipsettings voicemail certman" failed.
Причина: В конфигурационном файле /etc/asterisk/voicemail.conf разработчики допустили ошибку. Строка Storage database закомментирована не символом ;, а символом :.
Решение: открываем файл:
vi /etc/asterisk/voicemail.conf
Находим:
: Storage database:
и меняем на:
; Storage database:
Удалям файлы и базы после неправильной инсталляции:
rm -rf /var/www/html/*
* где /var/www/html — каталог, куда мы разворачивали FreePBX.
mysql
> drop database asterisk;
> drop database asteriskcdrdb;
> quit
И запускаем установку FreePBX по новой:
./install -n --dbuser root --dbpass <password> --webroot=/var/www/html
Читайте также
Вам могут быть полезны следующие инструкции:
1. Установка и базовая настройка сервера Asterisk на Ubuntu.