Установка Asterisk и FreePBX на AlmaLinux

Asterisk — бесплатное решение для организации voip телефонии. Он обладает всеми возможностями обычных АТС, но предоставляет более богатый функционал по управлению звонками. За относительную простоту настройки, бесплатность и большие возможности он приобрел широкую популярность.

FreePBX — бесплатный веб интерфейс для управления астериском. Он существенно упрощает работу с конфигурациями.

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

dnf update -y

Удаление SELinux

dnf remove -y selinux*

Установка репозитория EPEL, REMI, MySQL

dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm

Установка утилит

dnf install -y wget mc net-tools unzip tar htop

Настройка брандмауэра

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

Удаление Firewalld

Остановка сервиса firewalld:

systemctl stop firewalld

Выключение сервиса автозагрузки firewalld:

systemctl disable firewalld

Удаление firewalld:

dnf remove -y firewalld

Установка iptables:

dnf install -y iptables-services

Включение сервиса iptables в автозагрузку:

systemctl enable iptables

Запуск сервиса iptables:

systemctl start iptables

Проверка статуса службы iptables:

systemctl status iptables

Перезагрузка системы:

reboot

Для работы asterisk и freepbx необходимо открыть порты:

5060 - SIP.
5061 - SIP over TLS.
80 - http.
443 - https.

Создадим файл настроек iptables:

mcedit iptables.sh

и внесем в него следующее содержимое:

#!/bin/sh
# - Очищаем таблицы
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# - Политики по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# - Разрешить трафик по петлевому интерфейсу
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# - Разрешим передавать пакеты, относящиеся к уже установленным соединениям
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# - Разрешить входящий PING
iptables -A INPUT -p icmp -j ACCEPT
# - Разрешить все исходящие
iptables -I OUTPUT 1 -j ACCEPT
# - Доступ по SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# - Разрешить доступ к WEB серверу
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# - Разрешить доступ к SIP серверу
iptables -A INPUT -p tcp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp --dport 5061 -j ACCEPT
# - Сохранить настройки
service iptables save

Сохраняем и назначаем права на выполнение:

chmod +x iptables.sh

Выполняем скрипт:

./iptables.sh

Посмотреть список правил iptables можно командой:

iptables --line-numbers -L -v -n

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

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

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

useradd asterisk -m

Установка Apache (httpd)

Устанавливаем Apache:

Теперь нужно изменить значения опций Apache для запуска его от имени пользователя asterisk и изменить значение параметра AllowOverride для этого открываем конфигурационный файл:

mcedit /etc/httpd/conf/httpd.conf

меняем значение:

User apache
Group apache

на

User asterisk
Group asterisk

меняем значение:

AllowOverride None

на

AllowOverride All

Изменения можно внести с помощью потокового редактора sed. Его можно использовать для поиска, вставки, замены и удаления фрагментов в файле. С помощью этой утилиты вы можете редактировать файлы не открывая их.

Выполним команды:

sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf

sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf

Заменили следующие параметры:

User asterisk
Group asterisk
AllowOverride All

Так как php будет работать в режиме mod_php, а apache по умолчанию настроен на работу с модулем mpm_event, а модуль mod_php поддерживает только модуль mpm_prefork, с другим модулем он работать не будет. Таким образом, чтобы нормально заработал php, надо вместо модуля mpm_event подключить модуль mpm_prefork. Для этого в конфигурационном файле 00-mpm.conf закомментируем подключение mpm_event и раскомментируем mpm_prefork.

Открываем файл 00-mpm.conf:

mcedit /etc/httpd/conf.modules.d/00-mpm.conf

Включение сервиса Apache в автозагрузку:

systemctl enable httpd

Запуск сервиса Apache:

systemctl start httpd

Проверка статуса сервиса Apache:

systemctl status httpd

Установка MySQL

Устанавливаем MySQL с временным отключением репозитория AppStream, чтобы установить MySQL из репозитория MySQL Dev Community.

dnf install -y --disablerepo=appstream mysql-server

Включение сервиса mysql в автозагрузку:

systemctl enable mysqld

Запуск сервиса mysql:

systemctl start mysqld

Проверим статус сервиса mysql:

systemctl status mysqld

При установке mysqld генерирует временный пароль и сохраняет его в лог-файл /var/log/mysqld.log. Посмотреть пароль можно выполнив команду:

grep 'password' /var/log/mysqld.log

Изменим пароль для учетной записи root:

mysqladmin -u root -p password

Вводим временный пароль, в данном примере: «rebCPdmWV3<f». После авторизации вводим новый пароль, например:

Ekyj6ZfHabq97MvQ64Nc3@

Отключим проверку пароля MySQL 8.0, но делать это не обязательно. Войдем в консоль MySQL от имени пользователя root:

mysql -u root -p

Выполним:

UNINSTALL COMPONENT 'file://component_validate_password';

Установка PHP

Будет установлена PHP 7.4 из репозитория remi:

dnf module install -y php:remi-7.4 php

Выполним установку модуля php:

dnf install -y php

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

dnf install -y php-{mysql,mysqlnd,zip,bcmath,imap,gd,snmp,curl,odbc,sysvsem}

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

mcedit /etc/php.ini

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

upload_max_filesize = 128M

post_max_size = 128M

date.timezone = "Asia/Yekaterinburg"

memory_limit = 512M

Изменения можно внести с помощью потокового редактора sed, выполнив команды:

sed -i 's/\(^upload_max_filesize = \).*/\1128M/' /etc/php.ini

sed -i 's/\(^post_max_size = \).*/\1128M/' /etc/php.ini

sed -i 's/\(^memory_limit = \).*/\1512M/' /etc/php.ini

sed -i "s|;date.timezone =.*|date.timezone = Asia/Yekaterinburg|" /etc/php.ini

Установка Node.js

Устанавливаем Node.js:

dnf install -y nodejs

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

node --version

Установка ODBC

Использование ODBC в PHP позволяет делать SQL-запросы независимо от типа СУБД, в данном случаи подключение к MySQL.

Устанавливаем ODBC:

dnf install -y unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel

Что бы не было противоречивых пакетов временно отключим репозиторий AppStream, чтобы установить ODBC connector из репозитория MySQL Dev Community.

dnf install -y --disablerepo=appstream mysql-connector-odbc mysql-devel mysql-libs

При установки пакета ODBC connector из репозитория AppStream версия MySQL будет выше версии ODBC connector.

Установка Asterisk

Будем устанавливать 18 версию Asterisk. На странице загрузки мы можем посмотреть все версии Asterisk и ссылки на них.

Включим репозиторий PowerTools:

dnf config-manager --set-enabled powertools

Скачиваем Asterisk:

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

tar -xvf asterisk-*.tar.gz

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

cd asterisk-*/

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

./contrib/scripts/install_prereq install

Получил ошибку при загрузке пакетов:

xmlstarlet-1.6.1-11.el8.x86_64: Cannot download, all mirrors were already tried without success

Устанавливаю в ручную пакет xmlstarlet:

dnf install -y http://mirror.centos.org/centos/8-stream/PowerTools/x86_64/os/Packages/xmlstarlet-1.6.1-20.el8.x86_64.rpm

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

Выполнено!
#############################################
## install completed successfully
#############################################

Чистим временные файлы, которые появились после установки зависимостей:

make distclean

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

./contrib/scripts/get_mp3_source.sh

Конфигурируем исходник:

./configure --disable-asteriskssl --with-jansson-bundled

Запускаем меню для выбора параметров:

make menuselect

Сдесь нужно включить зависимости, переходим в раздел Applications и включаем app_macro.

[*] app_macro

Переходим в раздел Core Sound Packages и включаем:

[*] CORE-SOUNDS-RU-WAV
[*] CORE-SOUNDS-RU-ULAW
[*] CORE-SOUNDS-RU-ALAW
[*] CORE-SOUNDS-RU-GSM

Нажимаем: «сохранить и выйти».

Теперь можно запустить сборку астериска:

make

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

make install

Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:

make config

make samples

Настроим запуск астериска от пользователя asterisk.

Для этого откроем, и изменим скрипт запуска /usr/sbin/safe_asterisk.

Откроем на редактирование файл скрипта:

mcedit /usr/sbin/safe_asterisk

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

ASTARGS="-U asterisk"

Изменения можно внести с помощью потокового редактора sed.

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

sed -i 's/ASTARGS=""/ASTARGS="-U asterisk"/g' /usr/sbin/safe_asterisk

Назначаем владельца на директории:

chown -R asterisk:asterisk /var/run/asterisk
chown -R asterisk:asterisk /etc/asterisk
chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk
chown -R asterisk:asterisk /usr/lib/asterisk

Включение сервиса asterisk в автозагрузку:

systemctl enable asterisk

Запуск сервиса asterisk:

systemctl start asterisk

Проверим статус сервиса asterisk:

systemctl status asterisk

Устраняем ошибки:

авг 23 23:27:26 pbx.mailns.local asterisk[49410]: radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory

авг 23 23:27:26 pbx.mailns.local asterisk[49410]: radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory

Отредактируем конфигурационные файлы asterisk, заменив в некоторых строках пути на правильные.

Открываем файл:

mcedit /etc/asterisk/cdr.conf

Заменим:

;[radius]

;radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf

на

[radius]

radiuscfg => /etc/radcli/radiusclient.conf

Открываем:

mcedit /etc/asterisk/cel.conf

Заменим:

;radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf

на

radiuscfg => /etc/radcli/radiusclient.conf

Изменения можно внести с помощью потокового редактора sed, выполнив команды:

sed -i 's";\[radius\]"\[radius\]"g' /etc/asterisk/cdr.conf

sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cdr.conf

sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cel.conf

Перезапустим службу asterisk:

systemctl restart asterisk

Проверим статус сервиса asterisk:

systemctl status asterisk

Установка FreePBX

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

cd

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

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

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

tar zxvf freepbx-*.tgz

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

cd freepbx

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

./start_asterisk start

Должен быть ответ:

STARTING ASTERISK
Asterisk is already running

Созданим базы данных asterisk,  asteriskcdrdb и пользователя freepbxuser с паролем 1234567890, с назначением прав к базам данных.

Войдем в консоль MySQL от имени пользователя root:

mysql -u root -p

Выполним:

CREATE DATABASE asterisk DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
CREATE DATABASE asteriskcdrdb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
CREATE USER 'freepbxuser'@'localhost' IDENTIFIED BY '1234567890';
GRANT ALL ON asterisk.* TO 'freepbxuser'@'localhost';
GRANT ALL ON asteriskcdrdb.* TO 'freepbxuser'@'localhost';
exit

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

./install -n --dbname asterisk --cdrdbname asteriskcdrdb --dbuser freepbxuser --dbpass 1234567890

В данном примере мы указали имена баз данных и учетные данные для подключения к ним.

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

You have successfully installed FreePBX

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

Достаточно указать логин и пароль для пользователя, под которым мы будем заходить в панель управления FreePBX и email адрес.

После аутентификации увидел предупреждение:

System is missing SOX

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

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

Подключение драйвера ODBC

Подключимся к астериску:

asterisk -r

Проверим подключения к базе данных:

odbc show

Видем что, нет подключения к базе данных asteriskcdrdb.

mcedit /etc/odbcinst.ini

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

mcedit /etc/odbcinst.ini

Выбираем актуальный драйвер:

MySQL ODBC 8.0 ANSI Driver

После открываем файл /etc/odbc.ini и меняем значение параметра driver на MySQL ODBC 8.0 ANSI Driver:

mcedit /etc/odbc.ini

Проверим наличие подключения к базе данных:

asterisk -r

odbc show

Установка веб-панели WebCDR

WebCDR является бесплатным веб-приложением от российских разработчиков, предназначенным для создания удобного интерфейса для доступа к базе данных звонков и их аудиозаписей, генерируемых сервером Asterisk.

Для запуска и работы WebCDR необходимо наличие nodejs, но так как приложение написано давно, то из коробки не будет работать с nodejs 16-й версии. В AlmaLinux по умолчанию устанавливается nodejs 10-й версии и с ней существует проблема подключения к MySQL 8-й версии, так что буду устанавливать nodejs 14-й версии.

Установка зависимостей

Удаляем установленную версию nodejs:

dnf remove -y nodejs

Отключим текущий модуль nodejs командой:

dnf module reset -y nodejs

Выведем список доступных модулей nodejs:

dnf module list nodejs

После включаем новый поток nodejs:

dnf module enable -y nodejs:14

Устанавливаем nodejs 14-й версии:

dnf install -y nodejs

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

dnf install -y python2

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

dnf install -y git

Установка WebCDR

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

npm -g install bower browserify

Скачиваем WebCDR в каталог /var/www/html/.

wget -P /var/www/html/ https://github.com/ipoddubny/webcdr/archive/refs/heads/master.zip

Переходим в каталог:

cd /var/www/html/

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

unzip master.zip

Переименовываем каталог:

mv webcdr-master ./webcdr

Переходим в каталог:

cd /var/www/html/webcdr/public

Установим зависимости bower:

bower install

Переходим в каталог webcdr:

cd ..

Установим зависимости npm:

npm install

Производим сборку интерфейса:

npm run build

Настройка MySQL

Войдем в консоль MySQL от имени пользователя root:

mysql -u root -p

База данных asteriskcdrdb уже существует, создадим пользователя webcdr для доступа к базе данных и назначим ему права:

CREATE USER 'webcdr'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO 'webcdr'@'%';
FLUSH PRIVILEGES;

Внесем небольшие изменения в базу данных asteriskcdrdb.

Для этого откроем файл /var/www/html/webcdr/install/db.sql:

mcedit /var/www/html/webcdr/install/db.sql

и заменим в нем содержимое на:

CREATE TABLE IF NOT EXISTS `webuser` (
   `id` INT(11) UNSIGNED COLLATE utf8mb4_general_ci NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
   `username` VARCHAR(100) COLLATE utf8mb4_general_ci NOT NULL UNIQUE,
   `password` VARCHAR(100) COLLATE utf8mb4_general_ci NOT NULL,
   `acl` VARCHAR(1024) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
   `created_at` TIMESTAMP COLLATE utf8mb4_general_ci NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `admin` INT(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 0,
   `acl_in` INT(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 0,
   `auth_ad` INT(1) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 0,
   PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO `webuser` (`name`,`username`,`password`,`admin`) VALUES ('Administrator','admin','admincdr',1);

ALTER TABLE `cdr` ADD `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`);

ALTER TABLE `cdr` ADD `record` VARCHAR(50) NOT NULL DEFAULT '';

Импортируем данные в базу данных asteriskcdrdb:

mysql asteriskcdrdb -u webcdr -p < /var/www/html/webcdr/install/db.sql

Конфигурация подключения модуля WebCDR находится в файле config.ini, для успешного обеспечения связи с MySQL необходимо задать параметры подключения и учетные данные.

Откроем файл config.ini и внесем изменения:

mcedit /var/www/html/webcdr/config.ini

Для работы WebCDR откроем порт на брандмауэре:

iptables -A INPUT -p tcp --dport 9030 -j ACCEPT
service iptables save

Запустим сервер:

node server.js

После чего страница WebCDR будет доступна по адресу вашего сервера и порту 9030 (по умолчанию). Учетная запись для доступа к панели admin/admincdr.

Для того чтобы добавить WebCDR в автозагрузку, создадим файл конфигурации сервиса:

mcedit /etc/systemd/system/webcdr.service

добавим содержимое в файл и сохраняем:

[Unit]
Description=WebCDR

[Service]
ExecStart=/usr/bin/node /var/www/html/webcdr/server.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=webcdr
User=asterisk
Group=asterisk

[Install]
WantedBy=multi-user.target

Включение сервиса WebCDR в автозагрузку:

systemctl enable webcdr

Запуск сервиса WebCDR:

systemctl start webcdr

Проверим статус сервиса WebCDR:

systemctl status webcdr

Ссылки:

Установка Asterisk + FreePBX на CentOS 8
Установка asterisk и freepbx на CentOS 7
FreePBX 16.0
CDR web interface for Asterisk
Обзор и установка веб-панели WebCDR