В контейнеры, в наше время, можно установить множество интересных систем
но под катом вы сможете найти лишь относительно стандартную инструкцию по установке asterisk+freepbx. Скуку слегка развеет то, что версии всего ПО «последние стабильные», есть шифрование, вместо apache — nginx, а вся установка под недавно «повзрослевший» lxc. На выходе получится достаточно мобильная, компактная и современная IP-АТС, потребляющая в покое 200-300 Мб ОЗУ
0. Перед установкой
Прежде, чем начать, примите во внимание, что инструкция не предполагает установку DAHDI и работу с аналоговыми линиями. Кроме того, поскольку система не является официально распространяемым дистрибутивом FreePBX, вы не сможете в дальнейшем подключить коммерческие модули FreePBX.
1. LXC.Proxmox
Для начала нужно создать контейнер с Centos. Если у вас, как и у меня, proxmox ve — удобнее всего это будет сделать через web-интерфейс. Настройки «оборудования» возьмем минимальные. Потом их можно будет увеличить под нужды: cores: 1 memory: 1024 rootfs: 8G swap: 256, а в качестве шаблона ОС используем centos-7-default_20171212_amd64.tar.xz.
Если у вас такой шаблон недоступен для загрузки — выполните на хосте pveam update. После установки и запуска контейнера, я обычно сразу ставлю ssh, т.к. работать со встроенной web-консолью proxmox не очень удобно.
2. LEMP
Репозитории и базовые утилиты
Выбор webtatic обоснован дальнейшей установкой php56w, с которым гарантированно хорошо работает freepbx. Но можно попробовать и Remi.
Ставим mariadb, nginx и полезности. Пакет net-tools тоже пригодится, т.к. в centos7 по умолчанию нет ifconfig, с которым работает freepbx.
Freepbx пока не поддерживает php7, поэтому ставим рекомендованный 5.6.
Запускаем mariadb и nginx, отключаем apache, правим php.ini. Иначе вы не сможете обновлять модули freepbx через web-интерфейс.
После можно запустить mysql_secure_installation но без установки пароля root – этого требует установщик freepbx.
Теперь, когда у нас есть рабочая «заготовка» LEMP-сервера, можно сделать бэкап системы, чтобы потом можно было откатиться назад или использовать бэкап для приготовления другого сервера. Это займет меньше минуты, а полный архив получится около 350МБ.
3. Asterisk.SRTP
В принципе, у нас все готово к установке asterisk. SIP и PJSIP мы поставим при сборке через опцию --with-pjproject-bundled. Не хватает лишь srtp для включения поддержки шифрования медиа. Тут небольшой затык, т.к. в документации к asterisk 14 сказано, что для работы srtp нужна libsrtp не ниже 1.5.4, теоретически поддерживается libsrtp 2.х, но практически нужно использовать именно 1.5.4 для достижения стабильного результата. То есть, версия 1.4.4 из репозиториев не пойдет, и нам нужно ее собрать самим.
На всякий случай, можно проверить наличие библиотеки в точке назначения
и через ldconfig
Хинт! Если не указывать make shared_library, то по умолчанию make собирает архивную библиотеку libsrtp.a, и требует промежуточного теста make runtest. Если вам нужна именно libsrtp.a, то заранее скачайте словарь для этого теста.
Скачиваем и разворачиваем Asterisk:
На этом этапе можно, с помощью любезно предоставленного разработчиками, скрипта проверить наличие необходимых пакетов и установить их. Так как мы уже установили часть пакетов, рекомендую выполнять такую проверку в режиме
Из вывода скрипта уберем mysql-devel, srtp-devel, а gmime22-devel заменим на gmime-devel. На данный момент пакеты lame и jansson в репозиториях свежие, поэтому мы их тоже поставим из репозиториев:
Далее, загружаем источники звуковых файлов и запускаем конфигурацию asterisk
Если все прошло без ошибок, то запускаем меню конфигурации
Включаем поддержку mp3, выбираем нужные пакеты звуковых файлов в Core Sound Packages, Music On Hold File Packages и Extras Sound Packages. Так же, на всякий случай, проверяем наличие пункта res_srtp в Resource Modules. Готово. Далее:
Теперь можно попробовать запустить asterisk и проверить — подхватил ли он модуль srtp:
Asterisk работает, теперь смотрим загружен ли модуль srtp. В консоли asterisk выполняем:
Если модуль не загружен — пробуем его загрузить:
Если все прошло нормально — останавливаем службу и отключаем автозагрузку asterisk. В дальнейшем его будет запускать служба freepbx.
4. Freepbx.Nginx
Заводим пользователя asterisk и выдаем ему права на каталоги
Устанавливаем nodeJS:
Настраиваем nginx и php-fpm. Для этого удаляем все файлы в /etc/nginx/conf.d/ и /etc/php-fpm.d/, а вместо них создаем свои. В примере указан доступ по IP машины:
Запуск nginx тоже ставим от пользователя asterisk. Иначе не будет работать module admin во freepbx:
вместо
Разрешаем автозагрузку php-fpm и перезапускаем nginx:
Update (18.03.2019): Так как свежий астериск работает с mysql через adaptive_odbc — для работы CDR-reports необходимо поставить odbc-коннектор. Можно поставить mysql connector
Однако, хоть CDR и CEL будут работать, вся кириллица будет кракозябрами UTF8.
Чтобы все было корректно — лучше поставить mariadb connector. На данный момент, стабильная версия 3.0.8. Скачиваем, распаковываем и регистрируем библиотеку libmaodbc.so
Теперь нужно в /etc/odbcinst.ini прописать драйвер, добавив секцию:
А, в /etc/odbc.ini изменить драйвер на MariaDB:
Скачиваем и устанавливем FreePBX:
Проверяем. Если все прошло нормально, то мы должны попасть в админку FreePBX по IP-адресу, который указывали в /etc/nginx/conf.d/freepbx.conf Можно задать админский пароль/email и посмотреть ошибки, если таковые имеются.
Далее создаем юнит systemd для автозагрузки freepbx:
Останавливаем freepbx, запускаем службу, проверяем:
Если все хорошо, поздравляю! Ваша АТС готова!
Возможные ошибки, с которыми я столкнулся при написании инструкции:
При подготовке инструкции использовались материалы:
Installing FreePBX 14 on CentOS 7
Установка Asterisk 14 на Centos 7
Asterisk настройка TLS SRTP для PJSIP.
Всем спасибо за внимание! Буду рад комментариям и поправкам
Отдельное спасибо Generick, otkachov и chents за найденные неточности!

но под катом вы сможете найти лишь относительно стандартную инструкцию по установке asterisk+freepbx. Скуку слегка развеет то, что версии всего ПО «последние стабильные», есть шифрование, вместо apache — nginx, а вся установка под недавно «повзрослевший» lxc. На выходе получится достаточно мобильная, компактная и современная IP-АТС, потребляющая в покое 200-300 Мб ОЗУ
0. Перед установкой
Прежде, чем начать, примите во внимание, что инструкция не предполагает установку DAHDI и работу с аналоговыми линиями. Кроме того, поскольку система не является официально распространяемым дистрибутивом FreePBX, вы не сможете в дальнейшем подключить коммерческие модули FreePBX.
At this time we only support commercial modules in the distro. Yoy can not take a non distro system and turn it into the distro (Andrew Nagy. Director of Software Engineering)
1. LXC.Proxmox
Для начала нужно создать контейнер с Centos. Если у вас, как и у меня, proxmox ve — удобнее всего это будет сделать через web-интерфейс. Настройки «оборудования» возьмем минимальные. Потом их можно будет увеличить под нужды: cores: 1 memory: 1024 rootfs: 8G swap: 256, а в качестве шаблона ОС используем centos-7-default_20171212_amd64.tar.xz.
Если у вас такой шаблон недоступен для загрузки — выполните на хосте pveam update. После установки и запуска контейнера, я обычно сразу ставлю ssh, т.к. работать со встроенной web-консолью proxmox не очень удобно.
yum -y install openssh-server
systemctl enable sshd --now
2. LEMP
Репозитории и базовые утилиты
yum -y install epel-release
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum -y update
Выбор webtatic обоснован дальнейшей установкой php56w, с которым гарантированно хорошо работает freepbx. Но можно попробовать и Remi.
Ставим mariadb, nginx и полезности. Пакет net-tools тоже пригодится, т.к. в centos7 по умолчанию нет ifconfig, с которым работает freepbx.
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 -y 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
Запускаем 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.
Теперь, когда у нас есть рабочая «заготовка» LEMP-сервера, можно сделать бэкап системы, чтобы потом можно было откатиться назад или использовать бэкап для приготовления другого сервера. Это займет меньше минуты, а полный архив получится около 350МБ.
3. Asterisk.SRTP
В принципе, у нас все готово к установке asterisk. SIP и PJSIP мы поставим при сборке через опцию --with-pjproject-bundled. Не хватает лишь 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 <markster@digium.com>
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
4. 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
Запуск nginx тоже ставим от пользователя asterisk. Иначе не будет работать module admin во freepbx:
nano /etc/nginx/nginx.conf
вместо
user nginx;
ставим user asterisk;
Разрешаем автозагрузку php-fpm и перезапускаем nginx:
systemctl enable php-fpm --now
systemctl restart nginx
Update (18.03.2019): Так как свежий астериск работает с mysql через adaptive_odbc — для работы CDR-reports необходимо поставить odbc-коннектор. Можно поставить mysql connector
yum -y install mysql-connector-odbc
Однако, хоть CDR и CEL будут работать, вся кириллица будет кракозябрами UTF8.
Чтобы все было корректно — лучше поставить mariadb connector. На данный момент, стабильная версия 3.0.8. Скачиваем, распаковываем и регистрируем библиотеку libmaodbc.so
wget -qO- https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.0.8/mariadb-connector-odbc-3.0.8-ga-rhel7-x86_64.tar.gz | tar xvz -C / && ldconfig
Теперь нужно в /etc/odbcinst.ini прописать драйвер, добавив секцию:
[MariaDB]
Description=ODBC for MariaDB
Driver=/usr/lib64/libmaodbc.so
Setup=/usr/lib64/libodbcmyS.so
UsageCount=1
А, в /etc/odbc.ini изменить драйвер на MariaDB:
[MySQL-asteriskcdrdb]
Description=MySQL connection to 'asteriskcdrdb' database
driver=MariaDB
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/lib/mysql/mysql.sock
option=3
Charset=utf8
Скачиваем и устанавливем 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 и попробуйте обновить модуль онлайн
При подготовке инструкции использовались материалы:
Installing FreePBX 14 on CentOS 7
Установка Asterisk 14 на Centos 7
Asterisk настройка TLS SRTP для PJSIP.
Всем спасибо за внимание! Буду рад комментариям и поправкам
Отдельное спасибо Generick, otkachov и chents за найденные неточности!