Настройка Web сервера
Для работы панели FreePBX нужен web сервер с php. Я буду использовать версию php 7.1. Более подробно про настройку web срвера на Centos вы можете прочитать отдельно. Сейчас же коротко пройдем по шагам весь процесс.
Подключаем репозиторий epel, если еще не сделали это ранее.
# yum install epel-release
Подключаем remi репозиторий для centos 7.
# rpm -Uhv http://rpms.remirepo.net/enterprise/remi-release-7.rpm
Ставим пакет yum-utils.
# yum install yum-utils
Активируем репу remi-php71, для этого выполняем команду.
# yum-config-manager --enable remi-php71
Устанавливаем необходимые пакеты для работы сервера voip.
# yum install wget php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysql php-gettext php-bcmath php-zip php-xml php-imap php-json php-process php-snmp
Далее установим httpd. Он, по идее, должен установиться в качестве зависимости на предыдущем шаге, но на всякий случай проверьте.
# yum install httpd
Теперь нам нужно изменить некоторые параметры httpd — запустить его от пользователя asterisk и включить опцию AllowOverride. Это можно сделать руками в файле /etc/httpd/conf/httpd.conf, либо автоматически с помощью 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
Httpd запускать пока не надо, так как пользователя asterisk мы еще не создали. Сделаем это после установки asterisk.
Изменим параметр php, который отвечает за максимальный размер загружаемого файла. Дефолтное значение слишком низкое для freepbx. Для этого в /etc/php.ini устанавливаем параметр.
upload_max_filesize = 120M
Сделать это можно либо руками, либо автоматически с помощью sed.
# sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini
С веб сервером закончили. Продолжаем подготовку к установке FreePBX на CentOS.
Smithing Copr
Jared Smith has created an Asterisk packages for CentOS 8 repository that contains a few packages used by Asterisk that are currently missing from the other repositories mentioned. If you can’t find the package you are looking for in another repository you might want to check for it in this one.
DISCLAIMER: This repository has been created, and is currently maintained by Jared Smith as an open source contributor. The current existence of this repository, and the packages within makes no claim to any future existence of this repository or its packages, or others like it.
That said, Jared is working to get some of the packages located in his repository into one of the “base” repositories. For instance, libresample. In the meantime though if you’d like to use a package from his repository you can enable it using the following:
$ dnf copr enable jsmith/Asterisk_17_Centos_8
As a note, it says “Asterisk_17”, but it should work against other releases of Asterisk. For instance, I was able to use a few of the packages to build against Asterisk 16.
Подготовка к инсталляции FreePBX
5.1. Запуск и проверка MariaDB
Запустите СУБД Maria DB:
systemctl enable mariadb.service systemctl start mariadb
Проверка:
Примерный ожидаемый вывод:
mysql 7160 1 1 10:44 ? 00:00:00 /usr/libexec/mysqld --basedir=/usr root 7227 8399 0 10:44 pts/0 00:00:00 grep --color=auto mysql
5.2. Настройка, запуск и проверка Apache
Внесите правки в конфигурационные файлы Apache:
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf sed -i 's/AllowOverride none/AllowOverride All/' /etc/httpd/conf/httpd.conf
Запустите web-сервер Apache:
systemctl enable httpd.service systemctl start httpd
Проверка:
Примерный ожидаемый вывод:
root 6674 1 0 09:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 6676 6674 0 09:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 6677 6674 0 09:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 6678 6674 0 09:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 6679 6674 0 09:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 6680 6674 0 09:33 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
Загрузите и установите NodeJS:
curl -sL https://rpm.nodesource.com/setup_10.x | bash - yum -y install nodejs
5.4. Корректировка владельца процессов PHP-FPM
sed -i 's/user = apache/user = asterisk/' /etc/php-fpm.d/www.conf sed -i 's/user = root/user = asterisk/' /etc/php-fpm.d/www.conf sed -i 's/group = apache/group = asterisk/' /etc/php-fpm.d/www.conf sed -i 's/group = root/group = asterisk/' /etc/php-fpm.d/www.conf
5.5. Запуск скрипта безопасной работы MySQL
Запустите скрипт:
В ходе интерактивной работы скрипта ответьте на вопросы следующим образом:
Enter current password for root (enter for none): <Нажмите Enter> Set root password? [Y/n] Y New password: Qwerty123456 Re-enter new password: Qwerty123456 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
5.6. Замена драйвера ODBC
Драйвер ODBC, входящий в состав дистрибутива Asterisk, некорректно поддерживает кодировку UTF-8, что приводит к неправильному отображению кириллицы в БД CDR. Для исправления данной проблемы необходимо заменить стандартный драйвер (UNICODE) на драйвер ANSI.
Загрузите, установите и активируйте yum-репозиторий MySQL:
cd /usr/src mkdir mysql-community-release cd mysql-community-release wget https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm rpm -Uvh mysql80-community-release-el8-1.noarch.rpm yum config-manager --set-enabled mysql80-community
Установите корректную версию драйвера ODBC из репозитория MySQL community:
Отредактируйте файл
Найдите в указанном файле секцию
Добавьте в конец данной секции следующую строку:
Убедитесь, что для всех остальных секций, присутствующих в файле, установлено значение
Данная корректировка позволит избежать нежелательного обновления сервера БД при обновлении системы.
Замена драйвера ODBC
Проверьте наличие строк в файле
Driver=/usr/lib64/libmyodbcXa.so
В случае отсутствия данных строк, следует загрузить библиотеку и добавить указанные выше строки вручную.
В контексте данного пункта X – номер версии, x – номер подверсии коннектора ODBC.
5.7. Задание директории для записей разговоров
Измените директорию, в которой будут храниться записи разговоров:
rmdir /var/spool/asterisk/monitor mkdir /home/asterisk/monitor/ ln -s /home/asterisk/monitor/ /var/spool/asterisk/ chown -R asterisk:asterisk /home/asterisk/
5.8. Настройка автоматического удаления записей вызовов
Запустите редактор файла crontab:
Добавьте в файл следующие строки:
31 3 * * * find /home/asterisk/monitor/ -type f -mtime +120 -exec rm -rf {} \; 32 3 * * * find /home/asterisk/monitor/ -type d -exec rmdir -p {\} \;
Сохраните изменения:
Онлайн курс «Сетевой инженер»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные сети, рекомендую познакомиться с онлайн-курсом «Сетевой инженер» в OTUS. Это авторская программа в сочетании с удалённой практикой на реальном оборудовании и академическим сертификатом Cisco! Студенты получают практические навыки работы на оборудовании при помощи удалённой онлайн-лаборатории, работающей на базе партнёра по обучению — РТУ МИРЭА: маршрутизаторы Cisco 1921, Cisco 2801, Cisco 2811; коммутаторы Cisco 2950, Cisco 2960.
Особенности курса:
- Курс содержит две проектные работы.;
- Студенты зачисляются в официальную академию Cisco (OTUS, Cisco Academy, ID 400051208) и получают доступ ко всем частям курса «CCNA Routing and Switching»;
- Студенты могут сдать экзамен и получить вместе с сертификатом OTUS ещё сертификат курса «CCNA Routing and Switching: Scaling Networks»;
Проверьте себя на вступительном тесте и смотрите программу детальнее по .
Доступ в web интерфейс Freepbx
Переходим в браузере по ip адресу или доменному имени сервера и создаем учетную запись администратора Freepbx. При первом заходе в 14-ю версию я увидел ошибку.
Текст ошибки.
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 и добавляем туда новое значение.
# mcedit /etc/freepbx.conf
$bootstrap_settings = false;
Заходим в web интерфейс freepbx еще раз и создаем администратора.
Потом, используя созданную учетку, логинимся в панель и указываем начальные настройки. Рекомендую выбрать английский язык. Как я уже говорил, перевод на русский так себе, с ним иногда бывает сложно понять суть настроек.
После этого оказываетесь в веб панели Freepbx. Нажмите сверху на Dashboard и увидите сводную информацию по системе. Теперь можно начинать ее настройку, но это тема отдельной статьи. Возможно, до нее у меня когда-нибудь дойдут руки.
Mariadb
Centos 7 comes with Mariadb instead of Mysql.
1. Install mariadb if not already present
yum install mariadb-server
2. Setup mariadb to start on boot:
systemctl enable mariadb
3. Start mariadb:
systemctl start mariadb
4. Secure the installation by running following script and answering with defaults:
/usr/bin/mysql_secure_installation
Output:
usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] Y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
Заведение пользователя
Создадим наш первый диалплан (правило обработки звонков):
exten => _XXX,1,Dial(SIP/$,,m)
* в данном примере мы создаем контекст с именем outcaling для трехзначных номеров (XXX) с вызовом по SIP по внутреннему номеру.
Теперь создадим два внутренних номера:
(!) type=friend context=outcaling host=dynamic disallow=all allow=alaw allow=ulaw language=ru qualify=yes canreinvite=yes call-limit=4 nat=no
(public) regexten=101 secret=1234 callerid=»101″ callgroup=1 pickupgroup=1
(public) regexten=102 secret=5678 callerid=»102″ callgroup=1 pickupgroup=1
* сначала мы создали шаблон public, в который занесли общие параметры. Шаблон мы применили к создаваемым коротким номерам. * где:
- , — имена для обозначения номеров.
- type — типы проверки номеров. Могут быть peer, user или friend. Peer — вызовы сопоставляются с IP-адресами и номерами портов. User — проверка username. Friend — включает возможности peer и user (проверка username и IP-адреса источника) и лучше всего подходит для телефонов и телефонных программ.
- regexten — добавочный номер. Если не задан, используется имя.
- secret — пароль для аутентификации.
- context — контекст или группа правил.
- host — IP-адрес или имя клиента. Для автоматической регистрации используем dynamic.
- callerid — идентификатор пользователя при звонке.
- disallow — запрещает кодеки (задается перед параметром allow).
- allow — разрешает кодеки. alaw и ulaw — алгоритмы для кодеков g711.
- language — код используемого языка.
- callgroup — задает группу устройства (для возможности перехвата).
- pickupgroup — задает перечень групп, которые можно перехватывать.
- qualify — включает или отключает периодическую проверку подключенного клиента.
- canreinvite — включает или отключает прохождение голосового RTP трафика через Asterisk. Устанавливать, только если клиент поддерживает функцию SIP re-invites.
- call-limit — ограничение количества одновременных вызовов.
- nat — устанавливается в yes, если клиент находиться за NAT.
systemctl restart asterisk
Установка
Установку можно выполнить с помощью команды apt install asterisk. Но в данной инструкции мы разберем установку путем сборки из исходников.
Рекомендуется установить Asterisk с DAHDI (драйверы плат интерфейсов телефонии) и LibPRI (библиотека для работы с потоковыми TDM-интерфейсами). Сначала необходимо собрать DAHDI, затем LibPRI и только потом — Asterisk.
Устанавливаем пакеты, необходимые для корректной сборки DAHDI и LibPRI:
apt install make gcc
Сборка DAHDI
Распаковываем его и переходим в распакованный каталог:
tar -xvf dahdi-linux-complete-current.tar.gz
Собираем пакет и устанавливаем его:
Выходим из каталога dahdi:
tar -xvf libpri-current.tar.gz
Собираем и устанавливаем:
Выходим из каталога libpri:
Установка Asterisk
* в моем случае, последняя версия была 15.
Распаковываем архив и переходим в папку, появившуюся после распаковки:
tar -xvf asterisk-*.tar.gz
Устанавливаем библиотеки для работы с mp3:
./configure —prefix=/usr —sysconfdir=/etc —localstatedir=/var —libdir=/usr/lib64 —with-dahdi —with-pri —with-iconv —with-libcurl —with-speex
- —with-dahdi — с драйверами DAHDI.
- —with-pri — с библиотекой PRI.
- —with-iconv — с возможностью конвертации кодировок (будет не лишним для поддержки русских символов).
- —with-libcurl — возможность извлекать данные посредством CURL-запросов (по http).
- —with-speex — дополнительный VBR-кодек (используется на многих софт-фонах).
** список всех доступных опций можно посмотреть командой ./configure -h.
Мы должны увидеть логотип астериска:
Вызываем оконное меню настройки модулей:
Для большинства случаев, настройки можно оставить по умолчанию. В противном случае рекомендуется изучить опции и выбрать необходимые. После нажимаем Save & Exit.
Затем собираем исходник:
И выполняем установку:
Установим примеры конфигурационных файлов и документацию:
Устанавливаем скрипт инициализации (для автозапуска):
Устанавливаем скрипты для отсекания логов:
Создаем конфигурационный файл для указания дополнительного пути с библиотеками:
Добавляем в него одну строчку:
* это путь до каталога с библиотеками, с которым мы собирали asterisk (опция —libdir).
Установка Asterisk
Установка астериска выполняется путем сборки исходников. Сама процедура проходит в 3 этапа:
- Установка DAHDI (драйверов плат интерфейсов);
- Установка LibPRI (библиотека для работы с потоковыми TDM-интерфейсами);
- Собственно, сборка и установка Asterisk.
1. Сборка DAHDI
Загружаем исходник, распаковываем его и переходим в распакованный каталог:
tar -xvf dahdi-linux-complete-current.tar.gz
Выполняем сборку и установку:
Выходим из каталога с исходником:
2. Сборка LibPRI
Процедура, во многом, похожа на сборку DAHDI. Загружаем исходник, распаковываем его и переходим в распакованный каталог:
tar -xvf libpri-current.tar.gz
Выполняем сборку и установку:
Выходим из каталога с исходником:
3. Установка самого астериска
Для начала, загружаем исходник на сервер. Так как мы планируем установить LTS версию, заходим на страницу https://www.asterisk.org/downloads/asterisk/all-asterisk-versions, раздел «Long Term Support (LTS) Releases» и копируем ссылку на загрузку пакета:
* Certified Asterisk — бизнес версия с поддержкой для коммерческих клиентов.
Используя ссылку, скачиваем на сервер программу:
Распаковываем архив и переходим в него:
Используем встроенный скрипт, чтобы установить зависимости для астериска:
Чистим образовавшиеся временные файлы:
Добавляем библиотеку для работы с mp3:
./configure —prefix=/usr —sysconfdir=/etc —localstatedir=/var —libdir=/usr/lib64 —with-dahdi —with-pri —with-iconv —with-libcurl —with-speex —with-mysqlclient
* полный перечень опция и что они означают можно посмотреть командой ./configure -h.
Выбираем необходимые компоненты (в данном примере res_config_mysql, app_mysql, cdr_mysql):
Запускаем сборку и установку:
Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:
Missing Dependencies
At the time of writing the following packages were not included with CentOS 8, EPEL 8, or some other popular 3rd party repositories. The names in brackets ( ) are the asterisk modules or features that will not compile or be available if the package is missing.
* iksemel-devel (app_xmpp, res_xmpp, chan_motif)* corosynclib-devel (res_corosync)* radiusclient-ng-devel (cdr_radius)* gmime-devel (res_http_post)* gstreamer (music on hold streaming)* mongodb-server (required for Freepbx XMPP chat)
If you want to use the features that depend on these packages you will need to find them from alternate repositories or compile them yourself from source.
CDR и подключение к базе данных
В моем случае, не работало ведение CDR, а при вводе в консоли asterisk команды:
> odbc show
… я увидел:
ODBC DSN Settings
——————
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Last fail connection attempt: 2021-05-08 10:25:52
Number of active connections: 0 (out of 5)
Logging: Disabled
То есть, нет подключения к базе данных asteriskcdrdb. А при попытке подключиться к нужному DSN из командной строки:
isql -v MySQL-asteriskcdrdb
… я получил ошибку:
Can’t open lib ‘/usr/lib64/libmyodbc5.so’ : file not found
То есть, проблема в отсутствии необходимой бибилиотеки при подключении к базе данных.
Нам необходимо выполнить 2 действия:
- Установить коннектор ODBC.
- Изменить драйвер для подключения к СУБД в odbc.ini.
Так как в данной инструкции мы используем в качестве севера баз данных MariaDB, нам необходим соответствующий коннектор. Для его установки воспользуемся инструкцией .
После открываем файл:
vi /etc/odbc.ini
Задаем новое значение для параметра driver:
driver=MariaDB
* список доступных драйвером можно посмотреть в файле /etc/odbcinst.ini.
Перезапускаем asterisk:
systemctl restart asterisk
После можно проверить, что Asterisk подключился к базе:
> odbc show
Мы должны увидеть:
ODBC DSN Settings
——————
Name: asteriskcdrdb
DSN: MySQL-asteriskcdrdb
Number of active connections: 1 (out of 5)
Logging: Disabled
FreePBX12
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-12.0-latest.tgz tar zxvf freepbx-*.tgz
cd /usr/src/freepbx /etc/init.d/mysqld start mysqladmin create asterisk mysqladmin create asteriskcdrdb mysql asterisk < SQL/newinstall.sql mysql asteriskcdrdb < SQL/cdr_mysql_table.sql mysql GRANT ALL PRIVILEGES ON asteriskcdrdb.* TO asteriskuser@localhost IDENTIFIED BY 'SOMEPASSWORD'; GRANT ALL PRIVILEGES ON asterisk.* TO asteriskuser@localhost IDENTIFIED BY 'SOMEPASSWORD'; flush privileges; \q mysqladmin -u root password 'SOMEPASSWORD'
cd /usr/src/freepbx ./start_asterisk start #php53 nano +946 /etc/php.ini date.timezone = "Europe/Moscow"
pear uninstall db pear install db-1.7.14 yum install php-posix
./install_amp --username=asteriskuser --password=SOMEPASSWORD
PHP warning
PHP warning
PHP Warning: mkdir(): File exists in /usr/src/freepbx/libfreepbx.install.php on line 199
Запустите установку ещё раз
amportal a ma refreshsignatures amportal a ma upgradeall amportal reload amportal chown
или
/usr/local/sbin/amportal ...
echo "/usr/local/sbin/amportal start" >> /etc/rc.local
Настройка Asterisk
В нашей тестовой конфигурации мы создадим 5 внутренних номеров от 101 до 105. И настроим внутренние звонки между ними.
Для этого в файле /etc/asterisk/sip.conf добавляем наши внутренние номера в раздел :
В поле secret устанавливаем пароль для каждого внутреннего номера соответственно. Обязательно, в продакшн серверах используйте надежные пароли! Даже если сервер разворачивается как тестовый, через время вы можете решить использовать его для работы, а пароли поменять забудете.
В файле /etc/asterisk/extensions.conf определяем контекст «internal-calls». Полное содержание файла: