Установка Asterisk + FreePBX на Rocky Linux

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: Asterisk, FreePBX, Rocky Linux, NGINX.

Самый быстрый способ установить Asterisk + FreePBX — использовать ISO-образ FreePBX Distro. Но мы рассмотрим установку данной сборки на Linux Rocky «с нуля».

Данная инструкция написана на примере установки Asterisk 20 LTS и FreePBX 17. Она протестирована для Rocky Linux версий 8 и 9. В качестве веб-сервера для FreePBX мы будем использовать NGINX.

Подготовка системы

Для корректной работы сервера необходимо настроить системное время, открыть порты в брандмауэре и отключить SELinux. Также мы установим несколько пакетов и создадим учетную запись, от которой будет работать Asterisk.

1. Время

Задаем часовой пояс:

timedatectl set-timezone Europe/Moscow

* в данном примере московское время. Список всех зон можно посмотреть командой timedatectl list-timezones.

Устанавливаем сервис для синхронизации времени:

yum install chrony

И запускаем его с разрешением автозапуска:

systemctl enable chronyd --now

2. Настройка firewall

Мы должны открыть порты:

  • 5060 — SIP.
  • 5061 — SIP over TLS.
  • 80 — http.
  • 443 — https.
  • 10000-20000 — диапазон для динамических портов.

В Rocky для управления брандмауэром может использоваться firewalld или iptables. Рассмотрим настройку и того, и другого.

Firewalld

Разрешаем порты для работы asterisk:

firewall-cmd --permanent --add-port={5060,5061}/{tcp,udp}

firewall-cmd --permanent --add-port=10000-20000/udp

... и веб-сервера NGINX:

firewall-cmd --permanent --add-service={http,https}

Для применения настроек перезапускаем правила:

firewall-cmd --reload

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 --match multiport --dports 80,443 -j ACCEPT

iptables -I INPUT -p udp --dport 10000:20000 -j ACCEPT

Для сохранения правил установим:

yum install iptables-services

И разрешим автозапуск сервиса:

systemctl enable iptables

Теперь сохраняем сами правила:

service iptables save

* правила будут сохранены в файл /etc/sysconfig/iptables.

3. Отключение SELinux

Для отключения SELinux вводим две команды:

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

4. Установка пакетов

Выполним установку пакетов:

dnf install wget tar glibc-langpack-ru

* где:

  • wget — утилита для загрузки файлов по сети.
  • tar — для распаковки архивов.
  • glibc-langpack-ru — русская локаль. Она нужна, чтобы у нас была возможность выбрать русский интерфейс во FreePBX.

5. Создание пользователя

Нам нужен общий пользователь, от которого будет работать Asterisk и веб-сервер. Это необходимо, чтобы веб-сервер имел доступ к каталогам астериска.

Создаем пользователя командой:

useradd asterisk -m

Настройка веб-сервера

Для работы FreePBX нам необходим веб-сервер и СУБД. В нашем примере мы установим связку NGINX + PHP + MariaDB + NodeJS.

Сервер баз данных

Устанавливаем сервер mariadb:

dnf install mariadb-server mariadb-connector-odbc

Стартуем сервис и разрешаем его автозапуск:

systemctl enable mariadb --now

Сразу создадим базы и пользователя. Входим в оболучку SQL:

mysql

Создаем базы asterisk и asteriskcdrdb:

> CREATE DATABASE asterisk DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

> CREATE DATABASE asteriskcdrdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

Создаем пользователя и даем права на базы:

> CREATE USER 'asterisk'@'localhost' IDENTIFIED BY 'asterisk_123';

> GRANT ALL PRIVILEGES ON asterisk.* TO 'asterisk'@'localhost';

> GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'asterisk'@'localhost';

Готово, можно выходить из SQL:

> QUIT

NGINX

Для установки веб-сервера вводим команду:

dnf install nginx

Открываем конфигурационный файл:

vi /etc/nginx/nginx.conf

В секции http добавим опцию:

client_max_body_size 128M;

* данный параметр разрешает загрузку файлов размером 128 Мб.

Стартуем nginx:

systemctl enable nginx --now

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открыться страница приветствия NGINX:

Стартовая страница NGINX

* страница может иметь другой вид. Это зависит от сборки Linux и версии.

Веб-сервер установлен.

PHP и компоненты

Прежде чем начать установку, необходимо изучить документацию к устанавливаемой версии FreePBX в части требований версии PHP. Например, для 17-й версии это можно сделать на странице с инструкцией по развертыванию.

Чтобы правильно выбрать нужную версию FreePBX и подходящую к ней версию Asterisk, воспользуемся таблицей с сайта разработчика.

Также имейте ввиду, что для каждой версии дистрибутива Ubuntu характерна установка своей версии PHP. Иногда, для установки определенной версии нам потребуется подключить дополнительный репозиторий.

Смотрим, какую версию PHP предлагают установить встроенные репозитории:

dnf list --showduplicates php

Если версия не соответствует требованию, то подключаем дополнительный репозиторий и настраиваем нужную версию PHP. Для этого используем инструкцию Установка PHP разных версий на CentOS или Rocky.

Установим интерпретатор php и компоненты, необходимые для работы FreePBX:

dnf install php php-fpm php-bcmath php-gd php-json php-mbstring php-mysqlnd php-pear php-snmp php-zip

В процессе установки php на Rocky устанавливается apache, но нам он не нужен — вводим команду для запрета его автозапуска:

systemctl disable httpd

Открываем настройки для php:

vi /etc/php.ini

Правим значения для следующих опций:

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-fpm.d/asterisk.conf

[asterisk]
user = asterisk
group = asterisk

listen = /run/php-fpm/asterisk.sock
listen.acl_users = asterisk,apache,nginx

pm = dynamic
pm.max_children = 10
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6

* FreePBX должен работать с файлами в каталоге /etc/asterisk. Владельцем этого каталога будет пользователь asterisk, поэтому обработка php должна выполняться тоже от данного пользователя, чтобы иметь соответствующие права на редактирование конфигурационных файлов.

Запускаем php-fpm:

systemctl enable php-fpm --now

NGINX + PHP

Свяжем наш веб-сервер с php. Для этого откроем конфигурационный файл:

vi /etc/nginx/nginx.conf

Добавим следующие строки в разделы http - server:

...
http {
    ...
    server {
        ...
        server_name  192.168.1.15;
        ...
        location ~ \.php$ {
            set $root_path /usr/share/nginx/html;
            fastcgi_pass unix:/run/php-fpm/asterisk.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;
        }
        ...

* в данном примере мы задаем настройку для server_name — указываем имя хоста или IP-адрес, по которому мы будем подключаться к FreePBX. Также мы создаем секцию location для обработки php через php-fpm.

Перезапустим nginx:

nginx -t && nginx -s reload

Создадим файл php в домашней директории nginx:

vi /usr/share/nginx/html/index.php

<?php phpinfo(); ?>

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница с информацией об установленной версии php и всех компонентах:

Информационная страница phpinfo

NodeJS

Последний компонент для нашего веб-сервера — NodeJS. Согласно системным требованиям, нам нужна версия 18:

dnf module enable nodejs:18

Выполняем команду:

dnf install nodejs

Убедиться в установке можно командой просмотра версии:

node --version

Наш веб-сервер готов к работе.

Установка Asterisk

Мы будем устанавливать 20-ю версию Asterisk. На странице загрузки мы можем посмотреть все версии АТС и ссылки на них.

Сначала установим пакеты, необходимые для сборки:

dnf install libedit-devel

dnf --enablerepo=devel install jansson-devel unixODBC-devel

После скачиваем Asterisk:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz

Распаковываем архив и переходим в него:

tar -xvf asterisk-*.tar.gz

cd asterisk-*/

Устанавливаем зависимости для астериска:

./contrib/scripts/install_prereq install

Мы должны увидеть:

Complete!
#############################################
## 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 -j$(nproc)

Мы должны увидеть сообщение об успешной сборке:

 +--------- 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 samples

cp contrib/systemd/asterisk.service /etc/systemd/system/asterisk.service

Ранее мы создали пользователя 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

и проверяем настройки:

asterisk -c

Мы должны увидеть Asterisk Ready:

Проверка запуска Asterisk

... значит наш сервер готов к запуску. Все ошибки и предупреждения нам не помешают, однако их можно устранить разными способами, как правило, отключив неиспользуемые модули.

После успешной проверки, можно запустить Asterisk в качестве демона:

systemctl enable asterisk

systemctl start asterisk

Установка FreePBX

Возвращаемся в домашнюю папку пользователя:

cd ~

Установим пакеты:

yum install sox mpg123

* где:

  • sox — консольная утилита для преобразования аудиофайлов из одного формата в другой.
  • mpg123 — аудиопроигрыватель/декодер реального времени.

Скачиваем портал для управления астериском:

wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-17.0-latest.tgz

Распаковываем скачанный архив:

tar -zxf freepbx-*.tgz

Переходим в распакованный каталог:

cd freepbx

Запускаем скрипт проверки работы Asterisk:

./start_asterisk start

Если видим:

STARTING ASTERISK
Asterisk is already running

... запускаем установку:

./install -n --dbuser=asterisk --dbpass=asterisk_123 --webroot=/var/www/freepbx

* в данном примере мы указали учетные данные для подключения к СУБД (логин asterisk и пароль asterisk_123, которые мы создали вместе с базой); также мы указываем путь /var/www/freepbx.

Начнется установка — в конце мы должны увидеть:

You have successfully installed FreePBX

Установим компонент pm2:

fwconsole ma install pm2

Обновим все компоненты:

fwconsole ma updateall

Перезапустим конфигурацию:

fwconsole reload --verbose

Открываем браузер и заходим по адресу http:<IP-адрес сервера> — должна открываться страница конфигурирования FreePBX. Задаем настройки:

Задаем стартовые настройки 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 -rx "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

То есть, проблема в отсутствии необходимой бибилиотеки при подключении к базе данных.

Нам необходимо выполнить 2 действия:

  1. Установить коннектор ODBC.
  2. Изменить драйвер для подключения к СУБД в odbc.ini.

Так как в данной инструкции мы используем в качестве севера баз данных MariaDB, нам необходим соответствующий коннектор. Для его установки воспользуемся инструкцией Настройка в Linux подключения к MariaDB из PHP с помощью ODBC.

После открываем файл:

vi /etc/odbc.ini

Задаем новое значение для параметра driver:

driver=MariaDB

* список доступных драйвером можно посмотреть в файле /etc/odbcinst.ini.

Перезапускаем asterisk:

systemctl restart asterisk

После можно проверить, что Asterisk подключился к базе:

asterisk -rx "odbc show"

Мы должны увидеть:

ODBC DSN Settings
-----------------

  Name:   asteriskcdrdb
  DSN:    MySQL-asteriskcdrdb
    Number of active connections: 1 (out of 5)
    Logging: Disabled

Возможные проблемы

Рассмотрим решение некоторых проблем, с которыми мы можем столкнуться в процессе настройки.

1. Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory

Ошибка отображается при просмотре статуса сервиса, сразу после его запуска:

systemctl status asterisk

...
... systemd[1]: asterisk.service: Can't open PID file /var/run/asterisk/asterisk.pid (yet?) after start: No such file or directory
... 

Данное сообщение не является ошибкой. Скорее, это сообщение от системы при запуске.

Убедиться в наличие данного файла можно командой:

ls -l /var/run/asterisk/asterisk.pid

Мы должны увидеть:

-rw-r--r--. 1 asterisk asterisk 6 Nov  5 09:45 /var/run/asterisk/asterisk.pid

* где видно, что файл существует. Его владелец — пользователь asterisk.

Читайте также

Вам могут быть полезны следующие инструкции:

1. Установка Asterisk LTS на CentOS 7

2. Установка и базовая настройка сервера Asterisk на Ubuntu

# Rocky Linux # Серверы # Телефония
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет