Thank you for reading this post, don't forget to subscribe!
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.
Таким образом, если вам нужна максимальная стабильность, то разумнее всего сейчас использовать Centos 7, php 5.6 и Freepbx 14
Я покажу 3 примера установки Freepbx:
- 15-я версия на php 7.2
- 14-я версия на php 7.2
- 14-я версия на php 5.6
Подготовка системы
Прежде чем мы начнем устанавливать asterisk, нам надо выполнить целый ряд подготовительных действий. Первым делом отключаем selinux. Для этого открываем файл:
1 |
# mcedit /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 3 |
# systemctl start mariadb # systemctl enable mariadb |
Теперь нам нужно установить asterisk
Устанавливаем Jansson и pjsip
1 2 3 4 5 6 |
# cd ~ # git clone https://github.com/akheron/jansson.git # cd jansson # autoreconf -i # ./configure --prefix=/usr/ # make && make install |
1 2 3 4 5 6 |
# 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 |
Установка Asterisk 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 |
Устанавливаем на centos 8 пакет libedit-devel.
1 2 |
# dnf config-manager --set-enabled PowerTools # dnf install libedit-devel |
Собираем asterisk.
1 2 |
# ./configure --libdir=/usr/lib64 # make menuselect |
Выбирайте необходимые модули и звуки, в зависимости от того, что вам нужно. Я в общем случае указываю:
- 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" |
Теперь добавим примерно то же самое в сам конфиг астера /etc/asterisk/asterisk.conf.
1 2 |
runuser = asterisk rungroup = asterisk |
Пробуем запустить asterisk:
1 2 |
# 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 |
Добавим его теперь в автозагрузку.
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 5.6, то сразу переходите в самый конец статьи, в соответствующий раздел. Ниже будем ставить дефолтную версию php 7.2 из базового репозитория Centos 8. Устанавливаем необходимые 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 |
Мы просто выставили следующие параметры:
- 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. Ошибка пропала и вход стал выполняться нормально после того, как я увеличил таймауты, добавив в /etc/httpd/conf/httpd.conf.
1 |
RequestReadTimeout header=20-600,MinRate=500 body=20,MinRate=500 |
Не забудьте после этого перезапустить httpd.
Так же у меня была ошибка с отображением системной информации в виджете System Overview. Вместо полезной информации там была ошибка:
There was an error asking for Overview. Check the error logs for more information.
Как ее исправить, я так и не разобрался.
Установка Freepbx 14 на Centos 8
Теперь покажу, как установить Freepbx 14 на php 7.2, которая в базовом репозитории Centos 8. Делаем все то же самое, что и выше, только для 14-й версии.
Качаем архив с официального сайта.
1 2 |
# cd ~ # wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-14.0-latest.tgz |
Распаковываем архив.
1 |
# tar xfz freepbx-14.0-latest.tgz |
Устанавливаем Freepbx 14 на 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 14 закончена. Можно идти в веб интерфейс и проверять.
Доступ в web интерфейс Freepbx
Переходим в браузере по ip адресу или доменному имени сервера и создаем учетную запись администратора Freepbx. При первом заходе в 14-ю версию я увидел ошибку.
Текст ошибки.
1 2 |
Whoops \ Exception \ ErrorException (E_DEPRECATED) Methods with the same name as their class will not be constructors in a future version of PHP; gui_hidden has a deprecated constructor in /var/www/html/admin/libraries/components.class.php on line 571 |
Насколько я понял, это сообщение о том, что используется какая-то конструкция, которая объявлена Deprecated и скоро не будет работать. Что с этим делать сейчас, я не понял. Нашел баг репорт с этой ошибкой — https://issues.freepbx.org/browse/FREEPBX-19941 Он почему-то отклонен, помещен как дублирующий, но найти эту же ошибку в трекере я не смог.
Если взять версию php 5.6, то там этой ошибки не будет. Freepbx 14 официально поддерживает только 5.6, но откатываться на нее совсем не хочется.
Я решил просто отключить обработчик ошибок bootstrap. Для этого открываем конфиг freepbx и добавляем туда новое значение.
1 |
# mcedit /etc/freepbx.conf |
1 |
$bootstrap_settings['freepbx_error_handler'] = false; |
Заходим в web интерфейс freepbx еще раз и создаем администратора.
Потом, используя созданную учетку, логинимся в панель и указываем начальные настройки. Рекомендую выбрать английский язык. Как я уже говорил, перевод на русский так себе, с ним иногда бывает сложно понять суть настроек.
После этого оказываетесь в веб панели Freepbx. Нажмите сверху на Dashboard и увидите сводную информацию по системе. Теперь можно начинать ее настройку
Установка Freepbx 14 с php 5.6 на Centos 8
Для этого подключаем репозиторий remi и epel.
1 2 |
# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm # dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm |
Устанавливаем php 5.6
1 |
# dnf install php56 php56-php-fpm php56-php-pear php56-php-cgi php56-php-common php56-php-curl php56-php-mbstring php56-php-gd php56-php-mysqlnd php56-php-gettext php56-php-bcmath php56-php-zip php56-php-xml php56-php-json php56-php-process php56-php-snmp --skip-broken |
Php 5.6 в Centos 8 устанавливается в /opt. Конфиг php.ini лежит по адресу /etc/opt/remi/php56/php.ini, конфиг пула /etc/opt/remi/php56/php-fpm.d/www.conf. Их нам надо так же отредактировать, как и для 7-й версии. Увеличить лимиты и заменить пользователя на asterisk. Читайте об этом в разделе про настройку web сервера.
Запускается php 5.6 командой:
1 |
# systemctl enable --now php56-php-fpm |
Добавьте path с php5.6 в окружение.
1 |
# source /opt/remi/php56/enable |
Чтобы после перезагрузки они снова применились, добавьте их в профиль.
1 |
# cat /opt/remi/php56/enable >> ~/.bash_profile |
Установите права на директорию с сессиями php для пользователя asterisk.
1 |
# chown -R asterisk. /var/opt/remi/php56/lib/php/session |
Дальше устанавливается точно так же Freepbx 14 и настраивается.