Asterisk — бесплатное решение для организации voip телефонии. Он обладает всеми возможностями обычных АТС, но предоставляет более богатый функционал по управлению звонками. За относительную простоту настройки, бесплатность и большие возможности он приобрел широкую популярность.
FreePBX — бесплатный веб интерфейс для управления астериском. Он существенно упрощает работу с конфигурациями.
Подготовка системы
dnf update -y
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
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
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
dnf install -y python2
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 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