В этой статье мы рассмотрим процесс установки Asterisk 18 и FreePBX 16 в Ubuntu 22.04 LTS с учётом уже установленных в систему Apache2 и MariaDB. Это руководство также работоспособно на Ubuntu 20.04 LTS. Если есть какие-то нюансы, в нём они выделены для обоих версий.
В современном оцифровывающимся мире становятся нормой, а то и насущной необходимостью отказаться от старых технологий в пользу новых. Таким скачком стал переход на ip-телефонию нашего офиса.
Завершив установку Webmin с Virtualmin, включающих в себя, кроме удобных панелей, веб-сервер Apache, php-7.4-fpm, Postfix, Dovecot и многое другое составляющее наш сервер, мы переходим к установке сервера ip-телефонии.
Переключимся на суперпользователя с последующим вводом пароля root.
sudo suПодготовка системы
Если вы ещё не установили веб-сервер (в данной статье предполагается установленный Apache), php и MySQL, то необходимо сделать это сейчас. Для информации можете воспользоваться указанной выше статьёй.
Следующий шаг — создание виртуального подсервера в Virtualmin. Для этого также можно воспользоваться соответствующей статьёй нашего блога.
Открываем порты
iptables -I INPUT -p tcp --match multiport --dport 80,443 -j ACCEPT; iptables -I INPUT -p tcp --match multiport --dport 25,110,143,465,587,993,995,220 -j ACCEPT; iptables -I INPUT -p tcp --match multiport --dport 2222 -j ACCEPT; iptables -I INPUT -p udp --match multiport --dport 546,53,5353 -j ACCEPT; iptables -t filter -A INPUT -p tcp --dport 20:22 -j ACCEPT; iptables -t filter -A INPUT -p tcp --dport 49152:65535 -j ACCEPT; iptables -t filter -A INPUT -p tcp --dport 10000:20000 -j ACCEPTДля сохранения правил iptables, установим соответствующую утилиту (если не сделали это на этапе установки Webmin или LAMP) и сохраним их:
apt install iptables-persistent -y && netfilter-persistent saveufw allow 5060,5061/tcp; ufw allow 5060,5061/udp; ufw allow 10000:20000/udpУстановка необходимых пакетов
Утилиты для загрузки и распаковки файлов, а также пакеты аудио утилит
apt install wget tar curl sox mpg123 -yПрограммную платформу Node.js будем устанавливать из репозитория разработчика, потому что в стандартном имеется лишь версия 10, тогда, как нам нужна 16. Загрузите и импортируйте ключ Nodesource GPG:
apt-get update && apt-get install -y ca-certificates curl gnupg && mkdir -p /etc/apt/keyrings && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpgСоздадим репозиторий:
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.listУстановим саму платформу:
apt-get update && apt-get install nodejs -yЕсли этот способ оказался неработоспособным, то Node.js установим через NVM (Node Version Manager). Используя этот инструмент, можно устанавливать любые версии Node.js одновременно и свободно переключаться с одной на другую.
Если вы уже загружали какую-либо версию и не помните, то получить их список можно командой
nvm listЗагружаем скрипт:
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bashПерезагружаем конфигурацию оболочки:
source ~/.bashrcПолучаем список доступных версий:
nvm list-remoteЗагружаем самую последнюю версию из 16.х
nvm install v16.20.2Если вы устанавливали ранее другую версию Node.js, то приоритетную версию можно определить командой:
nvm use v16.20.2В том случае, если планируете использовать модуль XMPP FreePBX (нужен для работы чата в панели UCP), то также требуется установить MongoDB. Для Ubuntu 20.04 достаточно команды
apt install mongodbНа Ubuntu 22.04 установку можно произвести по инструкции на нашем сайте «Установка последней версии MongoDB в Ubuntu 22.04 LTS«.
Следующим шагом будет установка php-fpm вместе с другими модулями php.
Добавляем репозиторий:
add-apt-repository ppa:ondrej/php -yили с установкой зависимостей:
apt install software-properties-common ca-certificates lsb-release apt-transport-https -y
LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/phpТеперь мы готовы к его установке:
apt install php7.4-fpm php7.4-bcmath php7.4-gd php7.4-json php7.4-mbstring php7.4-mysql php-pear php7.4-snmp php7.4-zip php7.4-curl php7.4-xml php7.4-intl php7.4-common php7.4-cli -yПроверим версию PHP используемую по умолчанию:
php -vЕсли она отличается от 7.4, то установим нужную нам:
update-alternatives --config phpПереходим в Virtualmin, выбираем сервер на котором будем использовать FreePBX. Переходим в Конфигурацию серверов → Параметры PHP и выбираем из выпадающего списка нужную нам версию PHP, то есть 7.4

Создание пользователя
Для доступа веб-сервера к каталогам Asterisk нужен общий пользователь, от которого будут работать оба сервера. Создаём его командой
useradd asterisk -mИзменение настроек сервера и php
Далее, отредактируем файлы настроек apache2 и php-frm, указав в них пользователя и группу, от которых следует запускаться.
Это можно сделать через панель Webmin (не зря же мы её устанавливали!) или напрямую средствами Linux посредством терминала и текстового редактора. Рассмотрим оба варианта. Хотя, даже используя второй вариант, к Webmin обратиться нам придётся, чтобы узнать ID нашего подсайта.
Делаем это следующим образом.
-
В браузере запускаем Webmin
-
1. Переходим на вкладку Virtualmin
-
2. Сверху из списка выбираем подсервер, на который установим панель FreePBX
-
3. Далее, жмём «Редактировать»

и в открывшейся панели ищем «Domain ID» (выделено на скриншоте). Набор цифр напротив него и есть тот самый ID нашего подсайта. Можно его скопировать, чтобы позже сформировать путь.
Также переходим Server Configuration → PHP Options и смотрим, какая реализация php используется для нашего подсайта.

Теперь открываем вкладку Webmin → Tools → PHP Configuration

В нижнем поле выбираем путь вручную, нажав на значок 2 листочков или вбиваем
/etc/php/7.4/fpm/pool.d/ВАШ_Domain_ID.confи жмём кнопку Управление. В появившемся окне жмём Редактирование конфигурации вручную и в редакторе находим строки
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-dataв них меняем www-data на asterisk
user = asterisk
group = asterisk
listen.owner = asterisk
listen.group = asteriskЖмём кнопку в самом низу Вернуться к конфигурационные файлы и в то же поле, которое использовали вбиваем путь
/etc/apache2/envvarsгде меняем значения переменных APACHE_RUN_USER и APACHE_RUN_GROUP с www-data на asterisk. Оговорюсь сразу, у меня работает всё великолепно с дефолтными значениями в этом файле.
export APACHE_RUN_USER=asterisk
export APACHE_RUN_GROUP=asteriskЭто тот случае, когда Webmin не установлен.
Открываем файл настроек привычным нам редактором, например
gedit /etc/php/7.4/fpm/pool.d/www.confНайдите в нём строки:
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-dataи www-data измените на asterisk. Если позволяет функционал редактора, то это можно сделать функцией «Найти и заменить». В итоге файл должен выглядеть так:
user = asterisk
group = asterisk
listen.owner = asterisk
listen.group = asteriskТакже открываем /etc/apache2/envvars
gedit /etc/apache2/envvarsи меняем в нём значения переменных APACHE_RUN_USER и APACHE_RUN_GROUP с www-data на asterisk:
export APACHE_RUN_USER=asterisk
export APACHE_RUN_GROUP=asteriskПерезагружаем сервер и препроцессор:
systemctl restart apache2 && systemctl restart php7.4-fpmНа этом наши приготовления окончены, приступим к установке сервера и панели управления.
Установка Asterisk
Разработчиком сервера ip-телефонии является Sangoma Technologies. На текущий момент самая последняя версия Asterisk — 20-тая, но разработчиком поддерживаются более старшие версии сервера, начиная с 16. При этом, основной версией является 19-тая.

Загрузка и распаковка исходников
Чтобы не мусорить, создадим (если ещё не сделали этого при установке Webmin) в корне диска директорию src, в которую будем загружать архивы, распаковывать их и устанавливать Asterisk и FreePBX. Потом её можно будет удалить или оставить — решать вам.
mkdir /srcМы же на наш сервер установим 18-тую версию, как самую стабильную и наиболее проработанную (имхо). Идём на страницу загрузки сайта Sangoma Technologies, находим адрес загрузки Asterisk 18 LTS, копируем ссылку и вставляем в терминал с командой wget для загрузки установочного архива на наш сервер. Или воспользуемся уже готовой командой
cd /src && wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz && tar -xvf asterisk-*.tar.gz && cd asterisk*/Предустановка. Устранение зависимостей
Устраняем зависимости Asterisk
./contrib/scripts/install_prereq installНачнётся загрузка и установка и настройка необходимых пакетов, в процессе которой скорее всего появится окно настройки модуля Asterisk

Вводим код своей страны (для России — 7) и дожидаемся, когда пройдёт этот процесс и появится сообщение о завершении.

После установки зависимостей у нас остались временные файлы. Удалим их.
make distcleanДобавим библиотеку для работы с mp3:
./contrib/scripts/get_mp3_source.shНастроим установщик.
./configureПо завершению этого этапа, увидим псевдографический логотип Asterisk.

Настройка сборщика. Выбор модулей
Теперь выберем требуемые нам модули Asterisk.
make menuselectПосле чего запустится окно выбора модулей. Можно, конечно, оставить по умолчанию, нажав кнопку «Save & Exit», но в этом случае в процессе работы с Astrisk придётся снова запускать установщик с этого шага и выбирать необходимые для правильной работы модули.

Навигацию в этом окне производим кнопками направления (лево-право-верх-низ) или Tab, отказаться — Esc, принять — F12
Что выбираю я:
- из Add-ons (See README-addons.txt) — поддержка mp3 и драйвер MySQL + поддержка CDR
- из Applications выбираю app-macro — макросы планов набора.
- в Channel Drivers проверить, отмечен ли chan_sip, если планируете использовать старый интерфейс.
- в разделе Core Sound Packages — CORE-SOUNDS-RU-WAV (для подключения основного набора звуковых файлов на русском языке). Можно выбрать все форматы, где есть «-RU-«, или другой язык или необходимые вам.
- в Extras Sound Packages отсутствует русский язык, потому выбираем английский — EXTRA-SOUNDS-EN-WAV или других форматов
Сборка дистрибутива
По окончанию выбора жмём F12 или переходим на кнопку «Save & Exit» и жмём её. Настройка установщика завершена, начинаем сборку пакета
makeСборка занимает продолжительное время. По её завершении видим соответствующее объявление скрипта установки Asterisk.

Установка Asterisk
Следуя его призыву, запускаем установку Asterisk
make installи дожидаемся её завершения, которое будет отмечено следующим объявлением установщика

Преднастройка сервера ip-телефонии
Подготовим директории, установим скрипты и готовые конфигурационные файлы.
make config && make samplesИзменяем права на директории в пользу пользователя и группы asterisk:
chown -R asterisk:asterisk /etc/asterisk && chown -R asterisk:asterisk /var/{lib,log,spool}/asteriskОткрываем основной конфигурационный файл Asterisk
/etc/asterisk/asterisk.confи раскомментируем следующие строки:
runuser = asterisk
rungroup = asterisk
defaultlanguage = enа также изменим строки
defaultlanguage = en
documentation_language = en_USприведя к следующему виду:
defaultlanguage = ru
documentation_language = ru_RUОткрываем файл конфигурации модулей
/etc/asterisk/modules.confищем строку
chan_sip.soи убираем «no» из «noload», приведя к виду.
load = chan_sip.soПроверяем настройки командой
asterisk -cAsterisk вывалит кучу заметок, ошибок и предупреждений, не пугайтесь, так и должно быть — ведь он ещё не настроен. Главное, чтоб в конце вы увидели сообщение, что он готов:

Первый запуск
Теперь запускаем наш телефонный сервер, устанавливая его автозапуск при каждой загрузке системы и проверяем состояние:
systemctl enable asterisk && systemctl start asterisk && systemctl status asteriskДолжно быть таким:

Если при первом запуске у вас возникла такая же ошибка, как на скриншоте выше, то откройте
/etc/asterisk/cdr.confНайдите строку (она в самом низу)
;radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.confраскомментируйте её и измените путь на актуальный:
radiuscfg => /etc/radcli/radiusclient.confТакже может быть закомментирован сам раздел [radius], раскомменируйте и его.
То же самое сделайте с файлом /etc/asterisk/cel.conf
/etc/asterisk/cel.confПерезапускаем сервер и убеждаемся, что он успешно запущен без ошибок. Но, по сути, на эти ошибки не стоит обращать внимание, после установки FreePBX они исчезнут.
Проверка прав доступа
Также проверим настройки доступа по пути к нашему сайту, на котором будет установлена панель управления (например, если она установлена в поддомен, как у меня):
namei -mol /home/ИМЯ_ПОЛЬЗОВАТЕЛЯ/domains/ПОДДОМЕН/wwwВ идеале должно быть как-то так:

Если прав на чтение и выполнения для всех нет, то добавьте их начиная с пути отсутствия, например:
chmod -R 755 /home && find /home -type d -exec chmod -R 755 {} \; && find /home -type f -exec chmod -R 644 {} \;Установим для директории tmp, где размещаются файлы сессий, права 775 и изменим владельца и группу на asterisk
chmod -R 775 /home/ВАШ_ПУТЬ_ДО_ДИРЕКТОРИИ_САЙТА/tmp; chown -R asterisk:asterisk /home/ВАШ_ПУТЬ_ДО_ДИРЕКТОРИИ_САЙТА/tmpУстановка FreePBX
Загрузка и установка панели управления
Переходим в директорию src, качаем архив панели управления сервером телефонии Asterisk, распаковываем его и переходим в директорию установщика:
cd /src && wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-16.0-latest.tgz && tar zxf freepbx-*.tgz && cd freepbxЗапускаем скрипт проверки работы Asterisk
./start_asterisk startДолжно появиться сообщение

если это так, то запускаем скрипт установки
./install -n --dbuser root --dbpass PASS --webroot=/var/www/htmlвместо PASS поставьте пароль суперпользователя (root) от MariaDB. Если хотите установить web-интерфейс FreePBX в другой каталог, например, чтоб запускать доменом с адресной строки, то укажите его вместо /var/www/html в параметре —webroot
Начнется установка и в конце мы должны увидеть

Установим модуль управления сертификатами
fwconsole ma downloadinstall certmanОбновим компоненты FreePBX
fwconsole ma updateallПерезапустим конфигурацию:
fwconsole reload --verboseПервый запуск FreePBX
Открываем браузер и заходим по адресу http:IP-адрес сервера или адрес сайта, если установили в папку домена. Если всё сделано верно, то открываться страница преднастройки FreePBX. Заполняем поля логин и пароль для пользователя, под которым мы будем заходить в панель управления FreePBX и email адрес.

Жмём Setup System и выходим на запрос языка и региональных настроек.

После установки откроется главное окно панели управления

Открываем конфигурационный файл менеджера Asterisk
/etc/asterisk/manager.confнаходим строки
#include manager_additional.conf
#include manager_custom.confи заменяем в них # на ;
;include manager_additional.conf
;include manager_custom.confПерезапускаем сервер Asterisk
systemctl restart asteriskСкрипт автозапуска FreePBX
Создадим скрипт запуска FreePBX
/etc/systemd/system/freepbx.serviceи впишем туда следующее:
[Unit]
Description=FreePBX VoIP Server
After=mariadb.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/fwconsole start -q
ExecStop=/usr/sbin/fwconsole stop -q
[Install]
WantedBy=multi-user.targetСохраним файл и установим его в автозагрузку:
systemctl enable freepbx.serviceТеперь можно запускать, перезапускать и останавливать сервис обычными командами systemctl.
На этом всё, наши Asterisk и FreePBX установлены. Следующим этапом будет установка необходимых модулей и настройка сервера.
Основные настройки панели
Если пока не хотите вникать в настройки транков и внутренних номеров через драйвер PjSIP, то при первом запуске сразу отключаем его. Выбираем в меню Общие настройки → Дополнительные настройки пункт SIP Channel Driver и из списка устанавливаем chan_sip. Сохраняем изменения кнопкой Сохранить, переходим в Общие настройки → Установки Asterisk для SIP. В пункте Внешний адрес жмём Детектировать сетевые настройки. Далее, во вкладке SIP Legacy Settings [chan_sip] в нижней части страницы находим пункт Порт и меняем его с 5160 на 5060. Сохраняем изменения кнопкой Сохранить и применяем кнопкой Применить изменения в вверху странице.
На этом этапе уже можно создавать транки и внутренние номера и определять маршрутизацию. Если этого покажется мало и предполагается использовать очереди, параметры по времени, IVR-меню и другое из огромного функционала Asterisk, то необходимо доустанавливать соответствующие модули. Это можно сделать в меню Админ → Управление модулями.
Настройка CDR
Посредством использования CDR осуществляется фиксирование входящих и исходящих звонков в базе данных и использования этих данных для формирования отчёта в FreePBX.
Отображение даты и времени
Сперва настроим формат отображения даты и времени в отчётах CDR, так как по умолчанию время будет отображаться не в 24-х часовом а в 12-ти часовом. В панели FreePBX выбираем в меню Общие настройки → Дополнительные настройки пункт Date and Time Format и значение llll меняем на
dddd DD.MM.YYYY HH:mmгде dddd — день недели, DD — число, MM — месяц, YYYY — год, HH — часы, mm — минуты. Подробнее о форматах можно почитать у разработчика JavaScript-библиотеки Moment. js.
В свою очередь, мне больше понравился такой вот формат:
HH:mm ..... DD MMMM YYYY (dddd)Вот как это выглядит в отчёте:

Так что эта настройка очень гибкая и сделать под себя для лучшей читабельности не составит труда.
Загрузка и установка дайвера
Первоначально в Ubuntu, если и есть поддержка CDR, то она неработоспособна. Для использования этой технологии, следует выполнить загрузку коннектора, а также его установку и настройку.
Для Ubuntu 22.04 работоспособным оказался коннектор с сайта разработчика MariaDB. Заходим на него, выбираем из списка нашу версию Ubuntu и внизу появляется ссылка на архив коннектора.

Далее, командой wget скачиваем его, распаковываем и переходим в директорию установки:
cd /src && wget https://dlm.mariadb.com/3286256/Connectors/odbc/connector-odbc-3.1.19/mariadb-connector-odbc-3.1.19-ubuntu-jammy-amd64.tar.gz && tar -xvf mariadb-connector*.tar.gz && cd mariadb-connector*/Для Ubuntu 20.04 же работоспособным оказался коннектор с сайта разработчика MariaDB. Заходим на него и выбираем mariadb-connector-odbc-3.1.9-ubuntu-bionic-amd64.tar.gz

Далее, командой wget скачиваем его, распаковываем и переходим в директорию установки:
cd /src && wget https://downloads.mariadb.com/Connectors/odbc/latest/mariadb-connector-odbc-3.1.9-ubuntu-bionic-amd64.tar.gz && tar -xvf mariadb-connector*.tar.gz && cd mariadb-connector*/Копируем коннектор
cp -r lib/mariadb /usr/lib64Настройка коннектора
Теперь приступаем к настройке установленного коннектора CDR.
Для редактирования файлов удобно использовать Webmin. Переходим через вкладку Webmin → Tools → PHP Configuration и в нижнем поле выбираем путь вручную, нажав на значок 2 листочков или вводим
/etc/odbc.iniВместо содержимого вносим
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asteriskcdrdb' database
Trace = Yes
TraceFile = /tmp/odbc.log
driver=MariaDB
server=localhost
User=freepbxuser
Password=ПАРОЛЬ_К_БД
database=asteriskcdrdb
Port=3306
Socket=/var/run/mysqld/mysqld.sock
option=3
Charset=utf8ПАРОЛЬ_К_БД берём из файла /etc/freepbx.conf в строке $amp_conf[‘AMPDBPASS’] без кавычек.
Теперь настроем сам драйвер.
/etc/odbcinst.iniВместо имеющихся записей вставьте
[MariaDB]
Description = ODBC for MariaDB
Driver = /usr/lib/mariadb/libmaodbc.so
Driver64 = /usr/lib64/mariadb/libmaodbc.so
FileUsage = 1Также отредактируем конфигурационный файл Asterisk
/etc/asterisk/cdr_odbc.confМожно раскомментировать строки и поправить dsn или просто вставить ниже них
[global]
dsn=asteriskcdrdb
loguniqueid=yes
dispositionstring=yes
table=cdr
usegmtime=no
hrtime=yes
newcdrcolumns=yesПерезагружаем asterisk и freepbx
systemctl restart asterisk && systemctl start freepbxПроверка работы коннектора
Теперь проверим соединение командой
isql MySQL-asteriskcdrdb
Если вы получили такой же ответ, значит всё сделано правильно и соединение присутствует. В случае возникновения ошибки, наберите ту же команду, но с параметром -v
isql -v MySQL-asteriskcdrdbТеперь проверим подключение к БД через драйвер ODBC. Запустим CLI Asterisk
asterisk -rи введём команду
odbc showОтвет должен быть таким:

Теперь можно пользоваться отчётом о звонках в FreePBX. Перейдём в панель и выберем Отчёты → Отчёты CDR

Нажмите Искать и, если уже были осуществлены звонки через сервер Asterisk, то FreePBX выдаст

На этом наш сервер и панель управления нами установлены и настроены.