Сейчас практически вся современная телефонная связь в офисах сферы малого и среднего бизнеса осуществляется по протоколу ip. Установка asterisk и панели управления freepbx на сервер под управлением CentOS 8 тема моего очередного повествования. Мы последовательно выполним все шаги по конфигурированию и сборке исходных текстов устанавливаемых продуктов.
Цели статьи
Кратко рассказать о том, что такое asterisk и freepbx.
Собрать asterisk из исходников.
Установить панель управления Freepbx.
Проверить, что все работает.
Введение
Asterisk — бесплатное решение для организации voip телефонии. Он обладает всеми возможностями обычных АТС, но предоставляет более богатый функционал по управлению звонками. За относительную простоту настройки, по сравнению с цифровыми АТС, бесплатность и широкие возможности он и снискал такую популярность.
Freepbx — бесплатный веб интерфейс для управления астериском. Он существенно упрощает работу с конфигурациями, позволяет выполнять некоторые функции людям, вообще далеким от астериска. Например, с его помощью практически любого можно научить управлять учетными записями пользователей.
Лично я больше люблю настраивать asterisk вручную, нежели с помощью готовой панели. Да, конфигов астериск очень много, они объемные, работать с ними не удобно. Тем не менее, чистый астериск предоставляет практически неограниченную возможность по конфигурированию. С готовой панелью вы будете ограничены ее возможностями. Но если они вас полностью удовлетворяют, то лучше использовать ее.
Дальнейшая установка FreePBX будет проходить по следующей схеме:
Подготовка системы.
Настройка Web сервера.
Установка NodeJS.
Сборка Asterisk из исходников.
Установка Freepbx.
Сразу важное замечание. Официально Freepbx еще не поддерживает Centos 8. После установки панели, она будет показывать в статусе, что версию системы, на которую она установлена, не может определить. Учитывайте этот нюанс. С таким раскладом для прода она еще не готова. Но в целом, если поставить, попробовать и убедиться, что она работает, можно использовать. По сути, эта панель привязана не к системе, а к версиям софта (php, nodejs, asterisk).
Следующая проблема в том, что стабильной считается 14-я версия, но она работает нормально только на php 5.6, для которого уже кончилась поддержка и ставить ее как-то не с руки. Есть 15-я версия, которая нормально работает на php 7, но она все еще в статусе бета, хоть и работает достаточно стабильно. Что ставить себе, решайте сами. Если непременно нужна Centos 8, то в закрытый контур я бы поставил 14-ю версию на php 5.6. Если версия с доступом из инета, то я бы ставил 15-ю на php 7.
Подготовка системы
Прежде чем мы начнем устанавливать asterisk, нам надо выполнить целый ряд подготовительных действий. Первым делом отключаем selinux. Для этого открываем файл:
1 |
nano /etc/sysconfig/selinux |
и устанавливаем значение SELINUX=disabled. После этого применяем настройку без перезагрузки сервера:
1 |
setenforce 0 |
Рекомендация по отключению selinux дается в официальной инструкции по установке freepbx, так как это может привести к нарушению процесса инсталляции.
Дальше обновляем систему и ставим пакеты Development Tools:
1 2 |
dnf update dnf groupinstall core base "Development Tools" |
И еще некоторые зависимости, которые будут нужны.
1 |
dnf install tftp-server ncurses-devel sendmail sendmail-cf newt-devel libxml2-devel libtiff-devel gtk2-devel subversion kernel-devel git crontabs cronie cronie-anacron wget sqlite-devel net-tools gnutls-devel unixODBC |
В своей работе FreePBX использует базу данных Mysql. В качестве mysql сервера будем использовать mariadb. Для Freepbx версия не критична, так что будем ставить 10.3 из базового репозитория.
1 |
dnf module install mariadb |
Запускаем mysql сервер.
1 2 |
systemctl start mariadb systemctl enable mariadb |
Устанавливаем Jansson и pjsip
1 2 3 4 5 6 7 8 9 10 11 12 13 |
cd ~ git clone https://github.com/akheron/jansson.git cd jansson autoreconf -i ./configure --prefix=/usr/ make && make install cd ~ git clone https://github.com/pjsip/pjproject.git cd pjproject ./configure CFLAGS="-DNDEBUG -DPJ_HAS_IPV6=1" --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-video --disable-sound --disable-opencore-amr make dep && make && make install ldconfig |
Установка Astersik 16
Я буду устанавливать LTS версию Asterisk 16. Советую для долгосрочного использования всегда использовать LTS версии. Они в целом стабильнее и дольше срок поддержки. Идем на страницу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions и копируем ссылку на нужную версию. Загружаем ее на сервер.
1 2 3 4 5 6 |
cd ~ wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz tar xfz asterisk-16-current.tar.gz cd asterisk-16*/ contrib/scripts/install_prereq install contrib/scripts/get_mp3_source.sh |
Устанавливаем свежие версии libedit и libedit-devel.
1 2 |
dnf install https://rpmfind.net/linux/fedora/linux/releases/29/Everything/x86_64/os/Packages/l/libedit-3.1-24.20170329cvs.fc29.x86_64.rpm dnf install https://rpmfind.net/linux/fedora/linux/releases/29/Everything/x86_64/os/Packages/l/libedit-devel-3.1-24.20170329cvs.fc29.x86_64.rpm |
Возможно, когда вы будете ставить, они появятся в репах и ставить их отдельно не будет необходимости.
Собираем asterisk.
1 2 |
./configure --libdir=/usr/lib64 make menuselect |
Выбирайте необходимые модули и звуки, в зависимости от того, что вам нужно. Я в общем случае указываю:
1 2 3 4 |
Add-ons: format_mp3, res_config_mysql. Core Sound Packages: русские звуки RU-WAV. Music On Hold File Packages: звук WAV. Extras Sound Packages: английский EN-WAV, русского к сожалению нет. |
Все остальные настройки оставляем по-умолчанию. Ставится много модулей. Все они не нужны, но мало ли, пригодится что-то в будущем. Неиспользуемые модули можно будет потом отключить в конфигурации.
Продолжаем установку:
1 2 |
make && make install && make samples && make config ldconfig |
Создание пользователя asterisk и запуск
По-умолчанию, asterisk установлен от root и будет запускаться от него же. Я предлагаю для этого создать отдельного пользователя и запускать астериск от него. Для этого создаем пользователя и добавляем его в некоторые группы.
1 2 3 4 |
groupadd asterisk useradd -r -d /var/lib/asterisk -g asterisk asterisk usermod -aG audio,dialout asterisk chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk |
Настраиваем Asterisk на запуск под этим пользователем. Для этого добавляем в конфиг /etc/sysconfig/asterisk параметры:
1 2 |
AST_USER="asterisk" AST_GROUP="asterisk" |
Теперь добавим примерно то же самое в сам конфиг астера
1 |
nano /etc/asterisk/asterisk.conf |
1 2 |
runuser = asterisk rungroup = asterisk |
Пробуем запустить asterisk:
1 |
systemctl start asterisk |
Если нет сообщений об ошибке, скорее всего все в порядке. Проверяем статус службы.
1 |
systemctl status asterisk |
Asterisk запустился, но есть небольшие ошибки.
1 |
radcli: rc_read_config: rc_read_config: can't open /etc/radiusclient-ng/radiusclient.conf: No such file or directory |
Связаны с тем, что в конфигах неверно указан путь к radiusclient. Сейчас исправим это.
1 2 3 |
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 и убеждаемся, что ошибок нет. Проверим, все ли в порядке, зайдя в консоль:
1 |
asterisk -r |
Добавим asterisk в автозагрузку.
1 |
systemctl enable asterisk |
Настройка Web сервера
Для работы панели FreePBX нужен web сервер с php. Я буду использовать версию php 7.2 из базового репозитория.
Устанавливаем веб сервер apache:
1 |
dnf install @httpd |
Удаляем стартовую страницу.
1 |
rm -f /var/www/html/index.html |
Запускаем httpd и добавляем в автозагрузку.
1 |
systemctl enable --now httpd |
Открываем порты на firewalld, если вы ранее не настраивали iptables.
1 2 |
firewall-cmd --add-service={http,https} --permanent firewall-cmd --reload |
Устанавливаем необходимые php расширения.
1 |
dnf install wget @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 |
Изменяем максимально допустимый размер файла для загрузки и лимит по памяти для скриптов.
1 2 |
sed -i 's/\(^upload_max_filesize = \).*/\100M/' /etc/php.ini sed -i 's/\(^memory_limit = \).*/\512M/' /etc/php.ini |
Теперь нам нужно изменить некоторые параметры httpd — запустить его от пользователя asterisk и включить опцию AllowOverride. Это можно сделать руками в файле /etc/httpd/conf/httpd.conf, либо автоматически с помощью sed.
1 2 |
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf |
Мы просто выставили следующие параметры:
1 2 3 |
User asterisk Group asterisk AllowOverride All |
И так же в php-fpm меняем пользователя на asterisk в конфигурации пула /etc/php-fpm.d/www.conf
1 2 |
sed -i 's/^\(user\|group\).*/\1 = asterisk/' /etc/php-fpm.d/www.conf sed -i 's/^\(listen.acl_users\).*/\1 = asterisk/' /etc/php-fpm.d/www.conf |
Запускаем httpd и php-fpm.
1 2 |
systemctl enable --now php-fpm httpd systemctl restart php-fpm httpd |
Поверяем статус запущенных служб.
1 |
systemctl status php-fpm httpd |
Установка NodeJS
Для работы Freepbx требуется сервер NodeJS. Установим его на Centos 8. Нам нужна будет 10-я версия, и она есть в базовом репозитории. Так что ставится все очень просто.
1 |
dnf module install nodejs:10 |
После завершения установки проверяем версию.
1 2 |
node --version v10.16.3 |
Установка Freepbx 15 на Centos 8
Начнем с самого простого 15-я версия на php 7. Качаем архив с официального сайта.
1 2 |
cd ~ wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-15.0-latest.tgz |
Распаковываем архив.
1 |
tar xfz freepbx-15.0-latest.tgz |
Устанавливаем Freepbx 15 на Centos 8.
1 2 3 |
cd freepbx ./start_asterisk start ./install -n |
Если на mysql установили пароль root, то запускать установку следует с указанием пароля.
1 |
./install -n --dbuser root --dbpass password |
Перезапустите httpd.
1 |
systemctl restart httpd |
На этом установка freepbx закончена. Можно идти в веб интерфейс и проверять. Сначала создадите учетную запись администратора freepbx, потом зайдете под ней в панель управления asterisk. Рекомендую выбрать английский язык. Перевод на русский так себе, с ним иногда бывает сложно понять суть настроек.
Я заметил небольшую проблему. Во время входа панель обращается к какому-то внешнему ресурсу, который с моего сервера плохо доступен. Из-за этого очень долго выполняется вход, потом вылетает ошибка бэкенда и загружается dashboard. В логах apache при этом была ошибка:
1 |
[proxy_fcgi:error] [pid 12015:tid 140317076465408] (70007)The timeout specified has expired: [client 10.20.1.1:51742] AH01075: Error dispatching request to : (polling), referer: http://10.20.1.23/admin/config.php |
Не хватает дефолтного времени в параметре RequestReadTimeout. Ошибка пропала и вход стал выполняться нормально после того, как я увеличил таймауты, добавив в
1 |
nano /etc/httpd/conf/httpd.conf |
1 |
RequestReadTimeout header=20-600,MinRate=500 body=20,MinRate=500 |
Не забудьте после этого перезапустить httpd.
1 |
systemctl restart httpd |