SSH
yum install openssh-server -y
systemctl enable sshd --now


LEMP

Добавляем репозиторий
yum -y install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum –y update

Ставим mariadb, nginx и полезности
yum -y install wget tar nano bzip2 unzip curl net-tools make gcc gcc-c++ openssl openssl-devel mariadb-server mariadb-devel nginx tftp-server crontabs cronie cronie-anacron sendmail sendmail-cf

Freepbx пока не поддерживает php7, поэтому ставим рекомендованный 5.6.
yum install php56w php56w-pdo php56w-mysql php56w-mbstring php56w-pear php56w-process php56w-xml php56w-opcache php56w-ldap php56w-intl php56w-soap php56w-fpm php56w-gd -y

Запускаем mariadb и nginx, отключаем apache, правим php.ini. Иначе вы не сможете обновлять модули freepbx через web-интерфейс.
systemctl enable mariadb.service
systemctl start mariadb
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini
systemctl enable nginx --now
systemctl disable httpd

После можно запустить mysql_secure_installation но без установки пароля root – этого требует установщик freepbx.


Asterisk.SRTP

т.к. в документации к asterisk 14 сказано, что для работы srtp нужна libsrtp не ниже 1.5.4, теоретически поддерживается libsrtp 2.х, но практически нужно использовать именно 1.5.4 для достижения стабильного результата. То есть, версия 1.4.4 из репозиториев не пойдет, и нам нужно ее собрать самим.

cd /usr/src/
wget https://github.com/cisco/libsrtp/archive/v1.5.4.tar.gz
tar xvzf v1.5.4.tar.gz
cd libsrtp-1.5.4
./configure --libdir=/usr/lib64 --enable-openssl
make shared_library
make install

На всякий случай, можно проверить наличие библиотеки в точке назначения
ls /usr/lib64 | grep srtp

и через ldconfig
ldconfig -p | grep srtp


Хинт! Если не указывать make shared_library, то по умолчанию make собирает архивную библиотеку libsrtp.a, и требует промежуточного теста make runtest. Если вам нужна именно libsrtp.a, то заранее скачайте словарь для этого теста.
wget -O /usr/share/dict/words https://github.com/cisco/libsrtp/blob/master/test/words.txt

Скачиваем и разворачиваем Asterisk:
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-14-current.tar.gz
tar xvfz asterisk-14-current.tar.gz
cd asterisk-14*/

рекомендую выполнять такую проверку в режиме test.
./contrib/scripts/install_prereq test

Из вывода скрипта уберем mysql-devel, srtp-devel, а gmime22-devel заменим на gmime-devel. На данный момент пакеты lame и jansson в репозиториях свежие, поэтому мы их тоже поставим из репозиториев:
yum –y install patch ncurses-devel uuid-devel libuuid-devel jansson-devel lame lame-libs libxml2-devel sqlite-devel automake unixODBC-devel libcurl-devel libogg-devel libvorbis-devel speex-devel spandsp-devel freetds-devel net-snmp-devel iksemel-devel corosynclib-devel newt-devel popt-devel libtool-ltdl-devel lua-devel libsqlite3x-devel radiusclient-ng-devel portaudio-devel neon-devel libical-devel openldap-devel sqlite2-devel bluez-libs-devel jack-audio-connection-kit-devel gsm-devel libedit-devel pjproject-devel gmime-devel subversion git libxslt-devel python-devel

Далее, загружаем источники звуковых файлов и запускаем конфигурацию asterisk
./contrib/scripts/get_mp3_source.sh
./configure --libdir=/usr/lib64 --with-pjproject-bundled --with-crypto --with-ssl=ssl --with-srtp

Если все прошло без ошибок, то запускаем меню конфигурации
make menuselect

Включаем поддержку mp3, выбираем нужные пакеты звуковых файлов в Core Sound Packages, Music On Hold File Packages и Extras Sound Packages. Так же, на всякий случай, проверяем наличие пункта res_srtp в Resource Modules. Готово. Далее:
make && make install && make config && ldconfig


Теперь можно попробовать запустить asterisk и проверить — подхватил ли он модуль srtp:

systemctl start asterisk
systemctl status asterisk
rasterisk

Asterisk 14.7.5, Copyright (C) 1999 - 2016, Digium, Inc. and others.
Created by Mark Spencer <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
===============================================================
Connected to Asterisk 14.7.5 currently running on pbx4 (pid = 28020)
pbx4*CLI>


Asterisk работает, теперь смотрим загружен ли модуль srtp. В консоли asterisk выполняем:

pbx4*CLI> module show like srtp
Module Description Use Count Status Support Level
res_srtp.so Secure RTP (SRTP) 0 Running core
1 modules loaded

Если модуль не загружен — пробуем его загрузить:

pbx4*CLI> module load res_srtp.so
Loaded res_srtp.so

Если все прошло нормально — останавливаем службу и отключаем автозагрузку asterisk. В дальнейшем его будет запускать служба freepbx.
systemctl stop asterisk
systemctl disable asterisk



Freepbx.Nginx

Заводим пользователя asterisk и выдаем ему права на каталоги

adduser asterisk -m -c "Asterisk User"
chown asterisk. /var/run/asterisk
chown asterisk. /var/spool/mqueue/
chown -R asterisk. /etc/asterisk
chown -R asterisk. /var/{lib,log,spool}/asterisk
chown -R asterisk. /usr/lib64/asterisk
chown -R asterisk. /var/www/
chown -R asterisk. /var/lib/nginx

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

curl -sL https://rpm.nodesource.com/setup_8.x | bash -
yum install -y nodejs

Настраиваем nginx и php-fpm. Для этого удаляем все файлы в /etc/nginx/conf.d/ и /etc/php-fpm.d/, а вместо них создаем свои. В примере указан доступ по IP машины:

nano /etc/nginx/conf.d/freepbx.conf

server {
server_name 10.10.0.126;
listen 80;
index index.php;
client_max_body_size 120m;
root /var/www/html/;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;

include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SERVER_NAME $host;
}
}


nano /etc/php-fpm.d/freepbx.conf

[freepbx]
listen = /var/run/php-fpm.sock
listen.owner = asterisk
listen.group = asterisk
listen.mode = 0666
user = asterisk
group = asterisk
pm = dynamic
pm.max_children = 30
pm.start_servers = 3
pm.min_spare_servers = 3
pm.max_spare_servers = 21
pm.max_requests = 1000
php_admin_value[memory_limit] = 512M


Разрешаем автозагрузку php-fpm и перезапускаем nginx:

systemctl enable php-fpm
systemctl restart nginx


Скачиваем и устанавливем FreePBX:

cd /usr/src
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-14.0-latest.tgz
tar xvfz freepbx-14.0-latest.tgz
cd freepbx
./start_asterisk start
./install -n

Проверяем. Если все прошло нормально, то мы должны попасть в админку FreePBX по IP-адресу, который указывали в /etc/nginx/conf.d/freepbx.conf Можно задать админский пароль/email и посмотреть ошибки, если таковые имеются.

Далее создаем юнит systemd для автозагрузки freepbx:

nano /etc/systemd/system/freepbx.service

[Unit]
Description=FreePBX VoIP Server
After=mariadb.service
.
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/fwconsole start -q
ExecStop=/usr/sbin/fwconsole stop -q
.
[Install]
WantedBy=multi-user.target

Останавливаем freepbx, запускаем службу, проверяем:

fwconsole stop
systemctl enable freepbx --now


Если все хорошо, поздравляю! Ваша АТС готова!






|Возможные ошибки, с которыми я столкнулся при написании инструкции:

— Если на веб-gui висит ошибка cannot communicate with Asterisk: Проверьте пароли. /etc/asterisk/manager.conf и /etc/amportal.conf пароль из manager.conf секция [admin] должен совпадать с паролем из amportal.conf

— Если какой-то из модулей помечен, как tampered: Выполните в консоли fwconsole ma refreshsignatures, перезапустите службу freepbx и попробуйте обновить модуль онлайн