18.11.2023 | 10 минут чтения

Установка FreePBX 16 и Asterisk 18 на Rocky Linux 9

Данная статья является пошаговой инструкцией по установке Asterisk 18 и веб интерфейса FreePBX 16 на операционную систему Rocky Linux 9
Обновить все пакеты в системе

sudo dnf -y update
Отключим SELINUX
FreePBX требуется, чтоб SELINUX был отключён. После отключения не забудьте выполнить перезагрузку сервера.

sudo sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/sysconfig/selinux &&
sudo sed -i 's/\(^SELINUX=\).*/\SELINUX=disabled/' /etc/selinux/config &&
sudo reboot
Убедитесь, что SELINUX отключен

# sestatus
SELinux status:                 disabled
Базовая конфигурация Firewalld
В предыдущих версиях для драйвера chan_SIP назначались по умолчанию порты 5060 и 5061, а порты 5160 и 5161 назначались для chan_PJSIP. В последней версии FreePBX эти настройки противоположны. (5060 и 5061 для chan_PJSIP и 5160 и 5161 для chan_SIP)
  • 80, 443/tcp: FreePBX administration interface
  • 5060/udp: FreePBX chan_SIP signaling
  • 5061/tcp: FreePBX chan_SIP secure signaling
  • 5160/udp: FreePBX chan_PJSIP signaling
  • 5161/tcp: FreePBX chan_PJSIP secure signaling
  • 8001, 8003/tcp: UCP NodeJS Server
  • 8088-8089/tcp: Asterisk Builtin mini-HTTP server

firewall-cmd --zone=public --add-port=80/tcp --permanent &&
firewall-cmd --zone=public --add-port=443/tcp --permanent &&
firewall-cmd --zone=public --add-port=5060/udp --permanent &&
firewall-cmd --zone=public --add-port=5061/tcp --permanent &&
firewall-cmd --zone=public --add-port=5160/udp --permanent &&
firewall-cmd --zone=public --add-port=5161/tcp --permanent &&
firewall-cmd --zone=public --add-port=8001/tcp --permanent &&
firewall-cmd --zone=public --add-port=8003/tcp --permanent &&
firewall-cmd --zone=public --add-port=8088-8089/tcp --permanent &&
firewall-cmd --reload
Добавим репозиторий EPEL
FreePBX требует Extra Package for Enterprise Linux (EPEL)

sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
Затем, разрешим Code Ready Builder, crb (эквивалент Powertools для Rocky Linux 8)

sudo dnf config-manager --set-enabled crb
Установим пакеты разработчика
Установите пакеты, необходимые для процесса сборки

sudo yum group -y install "Development Tools"

sudo dnf -y install git wget emacs-nox subversion net-tools kernel-devel sqlite-devel psmisc ncurses-devel newt-devel libxml2-devel libtiff-devel gtk2-devel libtool libuuid-devel crontabs cronie-anacron libedit libedit-devel gnutls-devel sox sox-devel unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
Установим MariaDB Database Server
Установка Mariadb для базы данных FreePBX

sudo dnf -y install mariadb mariadb-server &&
sudo systemctl enable --now mariadb
Затем настроим безопасность MariaDB

sudo su
cd ~
mysql_secure_installation
  Switch to unix_socket authentication [Y/n] n
  Change the root password? [Y/n] n
  Remove anonymous users? [Y/n] Y
  Disallow root login remotely? [Y/n] Y
  Remove test database and access to it? [Y/n] Y
  Reload privilege tables now? [Y/n] Y
Установим ODBC и MariaDB ODBC Connector
Приведенные ниже пакеты необходимы для правильной работы статистики вызовов (CDR)

sudo dnf -y install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel
Установим последнюю версию MariaDB ODBC Connector

sudo dnf -y install mariadb-connector-odbc
Настроим ODBC и MariaDB ODBC connector
Файл конфигурации ODBC для FreePBX16: /etc/asterisk/res_odbc_additional.conf и выглядит так:

;--------------------------------------------------------------------------------;
;          Do NOT edit this file as it is auto-generated by FreePBX.             ;
;--------------------------------------------------------------------------------;
; For information on adding additional paramaters to this file, please visit the ;
; FreePBX.org wiki page, or ask on IRC. This file was created by the new FreePBX ;
; BMO - Big Module Object. Any similarity in naming with BMO from Adventure Time ;
; is totally deliberate.                                                         ;
;--------------------------------------------------------------------------------;
[asteriskcdrdb]
enabled=>yes
dsn=>MySQL-asteriskcdrdb
pre-connect=>yes
max_connections=>5
username=>freepbxuser
password=>63juy7827821r783097t4h4587202154
database=>asteriskcdrdb
В приведенном выше файле в качестве dsn имени, по умолчанию, указано MySQL-asteriskcdrdb, но при установке MariaDB по умолчанию будет указан драйвер MySQL, который не позволяет работать с CDR(так как он будет указывать на драйвер [MySQL], /usr/lib/libmyodbc8.so который будет отсутствовать. Таким образом, функция CDR не будет работать должным образом)

# Driver from the mysql-connector-odbc package in Fedora >=29
# Setup from the unixODBC package
[MySQL]
Description     = ODBC for MySQL 8
# mysql-connector-odbc package provides shared libraries with "w" or "a" suffix.
# 'w' stands for 'wide' or 'unicode' character set, 'a' stands for 'ANSI'
# Symlinks used in the configuration below lead to the 'w' variant by default
Driver          = /usr/lib/libmyodbc8.so
Driver64        = /usr/lib64/libmyodbc8.so
FileUsage       = 1
Чтобы избежать проблемы CDR, явно определите следующие два файла:

/etc/odbcinst.ini
  
  [MariaDB]
  Description=ODBC for MariaDB
  Driver=/usr/lib64/libmaodbc.so
  FileUsage=1
  UsageCount=3

/etc/odbc.ini
  [MySQL-asteriskcdrdb]
  Description=MariaDB connection to 'asteriskcdrdb' database
  Driver=MariaDB
  server=localhost
  database=asteriskcdrdb
  Port=3306
  Socket=/var/lib/mysql/mysql.sock
  Option=3
  Charset=utf8
  UsageCount=1
Создание каталога для сборки проекта
И Asterisk и FreePBX мы будем собирать из исходного кода. Создадим сначала каталог(/opt/app/usr/src) в котором будем производить сборку и разархивирование

sudo mkdir -p /opt/app/usr/src &&
cd /opt/app/usr/src

Установка Asterisk 18
Поскольку FreePBX 16 не поддерживает Asterisk 20 по состоянию на 18.11.2023, загрузим и установим Asterisk 18

cd /opt/app/usr/src &&
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz &&
tar zxvf asterisk-18-current.tar.gz &&
cd asterisk-18.*/
Установим необходимые пакеты для сборки Asterisk

sudo ./contrib/scripts/install_prereq install &&
sudo ./contrib/scripts/get_mp3_source.sh
Поскольку и jannson (библиотека C, необходимая для кодирования/декодирования мультимедиа), и PJSIP включены в сценарий установки Asterisk, просто добавим ключ --with-jansson-bundled и ключ --with-pjproject-bundled при запуске configure

./configure --prefix=/usr --libdir=/usr/lib64 --with-jansson-bundled --with-pjproject-bundled --with-ssl=ssl
Настройка параметров меню Asterisk

make menuselect
[Примечание]:
  • Когда появится всплывающее меню, установите (Core Sound Files)
  • Так как в Asterisk 18 модуль app_macro.so имеет статус dedicated, а FreePBX его все еще использует, то его приходится так же выбрать

Add-ons (See README-addons.txt)
 +--> Select format_mp3
Applications
 +--> Select app_macro
Bridging Modules
Channel Event Logging
Channel Drivers
Codec Translators
 +---> Select all External Codecs
Format Interpreters
Dialplan Functions
PBX Modules
Resource Modules
Test Modules
Compiler Flags
Utilities
AGI Samples
Core Sound Packages
 +--> Select WAV, ULAW, ALAW, GSM, G729, G722
Music On Hold File Packages
 +--> Select WAV, ULAW, ALAW, GSM, G729, G722
MENUSELECT_EXTRA_SOUNDS
 +--> Select WAV, ULAW, ALAW, GSM, G729, G722
Теперь всё готово для сборки Asterisk

make &&
make install
После завершения сборки Asterisk необходимо создать фиктивную конфигурацию для корректной установки FreePBX.
Перед выполнением make config необходимо, чтоб пакет chkconfig был установлен. По умолчанию он не установлен в Rocky Linux 9 (в Rocky Linux 8 он установлен по умолчанию).

mv /etc/init.d /tmp &&
dnf -y install chkconfig &&
cp /tmp/init.d/* /etc/init.d
[Примечание]:
Директорию /etc/init.d необходимо временно переместить, чтобы избежать ошибки установки

make basic-pbx &&
make config &&
ldconfig
Добавим пользователя и группу Asterisk

sudo groupadd asterisk &&
sudo useradd -r -d /opt/app/home/asterisk -g asterisk asterisk &&
sudo usermod -aG audio,dialout asterisk &&
sudo chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk &&
mkhomedir_helper asterisk
[Примечание]:
Команда mkhomedir_helper гарантирует, что домашний каталог asterisk находится в папке /opt/app/home/asterisk.

Выполним команды указанные ниже, чтоб быть уверенными что процесс asterisk запускается от пользователя asterisk

echo AST_USER="asterisk" >> /etc/sysconfig/asterisk &&
echo AST_GROUP="asterisk" >> /etc/sysconfig/asterisk &&
echo "runuser = asterisk" >> /etc/asterisk/asterisk.conf &&
echo "rungroup = asterisk" >> /etc/asterisk/asterisk.conf
Установка FreePBX 16
Установим NodeJS (версия 10.24.1)
Rocky Linux 9 поставляется с NodeJS версии 18

sudo dnf module list nodejs
Для модуля ucp требуется определенная версия модуля node(иначе на панели dashboard будет сообщение об ошибке UCP)
После проб и ошибок версия 10.24.1 позволит успешно установить модуль, поэтому специально устанавливайте эту версию.

Не используйте dnf для установки nodejs, а используйте менеджер пакетов n. Обратитесь по ссылке к https://github.com/tj/n и выполните следующее:

sudo su &&
export N_PREFIX=/usr/local/n &&
curl -L https://bit.ly/n-install | bash
Затем установите версию 10.24.1

/usr/local/n/bin/n install 10.24.1
ln -s /usr/local/n/bin/node /usr/bin/node
ln -s /usr/local/n/bin/npm /usr/bin/npm


Убедитесь что у вас установилась именно версия node 10.24.1

# node -v
v10.24.1
# npm -v
6.14.12
[Примечание]: создайте символьную ссылку для подавления ошибки node при открытии dashboard панели

ln -s /usr/local/n/bin/node /usr/bin/node
ln -s /usr/local/n/bin/npm /usr/bin/npm


Установим Apache Web Server для работы FreePBX GUI

#Install httpd
sudo dnf -y install httpd

#remove default index.html page
sudo rm -f /var/www/html/index.html &&

#Start httpd and enable it to be starting automatically on system boot
sudo systemctl enable --now httpd &&

#If running an active firewall, ensure to open httpd
sudo firewall-cmd --add-service={http,https} --permanent &&
sudo firewall-cmd --reload
Если вы планируете настроить работу Apache по протоколу https(иначе можете пропустить):
Установим mod_ssl

dnf -y install mod_ssl
[Необязательно]: Модифицируем файл /etc/httpd/conf.d/ssl.conf
Если у хоста уже есть сертификат, настройте его. Измените параметры ниже(измените расположение и имена файлов domain.crt и domain.key в соответствии с вашим окружением)

SSLCertificateFile /etc/pki/tls/certs/domain.crt
SSLCertificateKeyFile /etc/pki/tls/private/domain.key
Обновите сертификата CA

update-ca-trust
Создайте /etc/httpd/conf.d/https_redirect.conf

tee /etc/httpd/conf.d/https_redirect.conf << EOF
# Redirect all requests to port 80 to port 443 SSL via mod_rewrite
# Make sure the module is loaded and switched on
<IfModule !mod_rewrite.c>
  LoadModule rewrite_module /usr/lib/httpd/modules/mod_rewrite.so
</IfModule>

<IfModule mod_rewrite.c>
  RewriteEngine on

    # The line below sets the rewrite condition for mod_rewrite.so.
    # That is, if the server port does not equal 443, then this condition is true
    ReWriteCond %{SERVER_PORT} !^443$

  # redirect rule
  RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
</IfModule>
EOF
Перезапустите сервер Apache

systemctl restart httpd.service
Установка PHP (PHP 7.4)
FreePBX требователен к версии PHP. Установим версию PHP 7.4

sudo dnf -y install yum-utils &&
sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm &&
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
По умолчанию в дистрибутиве устанавливается PHP 8.1. Установим версию remi-7.4

sudo dnf module -y reset php &&
sudo dnf module -y install php:remi-7.4

# dnf module list php
Last metadata expiration check: 0:26:07 ago on Mon 03 Apr 2023 06:03:19 AM CDT.
Rocky Linux 9 - AppStream
Name     Stream          Profiles                          Summary
php      8.1             common [d], devel, minimal        PHP scripting language

Remi's Modular repository for Enterprise Linux 9 - x86_64
Name     Stream          Profiles                          Summary
php      remi-7.4 [e]    common [d] [i], devel, minimal    PHP scripting language
php      remi-8.0        common [d], devel, minimal        PHP scripting language
php      remi-8.1        common [d], devel, minimal        PHP scripting language
php      remi-8.2        common [d], devel, minimal        PHP scripting language
Затем установим необходимые расширения

sudo dnf install -y php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysqlnd php-gettext php-bcmath php-zip php-xml php-json php-process php-snmp php-ldap php-pdo php-opcache php-intl php-soap &&
sudo pear install Console_Getopt
Установим максимальный размер загрузки файлов для PHP на 120 МБ.

sudo sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini
Затем включим и запустим службу PHP-FPM (FastCGI Process Manager)

systemctl enable php-fpm &&
systemctl start php-fpm

sudo sed -i 's/\(^memory_limit = \).*/\1128M/' /etc/php.ini &&
sudo sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf &&
sudo sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf &&
sudo sed -i 's/\(^user = \).*/\1asterisk/' /etc/php-fpm.d/www.conf &&
sudo sed -i 's/\(^group = \).*/\1asterisk/' /etc/php-fpm.d/www.conf &&
sudo sed -i 's/\(^listen.acl_users = \).*/\1apache,nginx,asterisk/' /etc/php-fpm.d/www.conf
Установим Freepbx 16
Скачаем и установим последнюю версию FreePBX 16:

cd /opt/app/usr/src &&
wget http://mirror.freepbx.org/modules/packages/freepbx/7.4/freepbx-16.0-latest.tgz &&
tar zxvf freepbx-16.0-latest.tgz &&
cd freepbx
Запустим скрипт установки:

cd /opt/app/usr/src/asterisk-18.* &&
make basic-pbx &&
make config &&
ldconfig &&
cd /opt/app/usr/src/freepbx &&
./start_asterisk restart &&
ps aux | grep asterisk &&
rm -f /etc/asterisk/asterisk.conf &&
./install -n
Установим все модули Freepbx

fwconsole ma disablerepo commercial &&
fwconsole ma enablerepo extended &&
fwconsole ma installall &&
fwconsole ma delete firewall &&
fwconsole chown &&
fwconsole reload &&
fwconsole restart
Перезагрузим web сервисы

sudo systemctl restart httpd php-fpm
FreePBX Systemd Startup скрипт
Создадим systemd unit для автоматического запуска службы.

sudo tee /etc/systemd/system/freepbx.service << EOF
[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
EOF
Включим и запустим службу FreePBX

sudo systemctl daemon-reload &&
sudo systemctl enable freepbx &&
sudo systemctl start freepbx
Проверка функционирования Asterisk CDR
Убедимся, что CDR подключение установлено правильно

# asterisk -rx "cdr show status"

Call Detail Record (CDR) settings
----------------------------------
  Logging:                    Enabled
  Mode:                       Simple
  Log calls by default:       Yes
  Log unanswered calls:       No
  Log congestion:             No

  Ignore bridging changes:    No

  Ignore dial state changes:  No

* Registered Backends
  -------------------
    Adaptive ODBC

# asterisk -rx "odbc show"

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

  Name:   asteriskcdrdb
  DSN:    MySQL-asteriskcdrdb
    Number of active connections: 1 (out of 5)
    Logging: Disabled
Если после установки не стартует Asterisk и ругается на модуль srtp:

wget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz
./configure --enable-openssl
make shared_library
make install
Связанные статьи
Преимущества и недостатки обоих типов подключения.
Отличие виртуально АТС от невиртуальной
Интеграция CRM-системы с телефонией, как лучший способ продаж.
Как IP-телефония вместе с CRM развивает ваш бизнес?