В контейнеры, в наше время, можно установить множество интересных систем
но под катом вы сможете найти лишь относительно стандартную инструкцию по установке asterisk+freepbx. Скуку слегка развеет то, что версии всего ПО «последние стабильные», есть шифрование, вместо apache — nginx, а вся установка под недавно «повзрослевший» lxc. На выходе получится достаточно мобильная, компактная и современная IP-АТС, потребляющая в покое 200-300 Мб ОЗУ
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:
Скачиваем и устанавливем FreePBX:
Проверяем. Если все прошло нормально, то мы должны попасть в админку FreePBX по IP-адресу, который указывали в /etc/nginx/conf.d/freepbx.conf Можно задать админский пароль/email и посмотреть ошибки, если таковые имеются.
Далее создаем юнит systemd для автозагрузки freepbx:
Останавливаем freepbx, запускаем службу, проверяем:
Если все хорошо, поздравляю! Ваша АТС готова!
Возможные ошибки, с которыми я столкнулся при написании инструкции:
При подготовке инструкции использовались материалы: раз, два и три.
Всем спасибо за внимание! Буду рад комментариям и поправкам
но под катом вы сможете найти лишь относительно стандартную инструкцию по установке asterisk+freepbx. Скуку слегка развеет то, что версии всего ПО «последние стабильные», есть шифрование, вместо apache — nginx, а вся установка под недавно «повзрослевший» lxc. На выходе получится достаточно мобильная, компактная и современная IP-АТС, потребляющая в покое 200-300 Мб ОЗУ
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
systemctl start sshd
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 php56-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
systemctl start nginx
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_na
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
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:
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
systemctl start freepbx
Если все хорошо, поздравляю! Ваша АТС готова!
Возможные ошибки, с которыми я столкнулся при написании инструкции:
— Если на веб-gui висит ошибка cannot communicate with Asterisk: Проверьте пароли. /etc/asterisk/manager.conf и /etc/amportal.conf пароль из manager.conf секция [admin] должен совпадать с паролем из amportal.conf
— Если какой-то из модулей помечен, как tampered: Выполните в консолиfwconsole ma refreshsignatures
, перезапустите службу freepbx и попробуйте обновить модуль онлайн
При подготовке инструкции использовались материалы: раз, два и три.
Всем спасибо за внимание! Буду рад комментариям и поправкам
Комментарии (7)
greynix
26.01.2018 16:23чем обусловлена необходимость ручной сборки? почему не стали подключать репозитории где имеется ПО необходимой версии?
Louie Автор
26.01.2018 18:27Вы про srtp? Насторожило, что требуется пакет из старой замороженной ветки, после переезда проекта, и что пакет в epel 7-ки совсем старый, хотя у 6-ки кто-то бился, часто фиксил 1.5.4.
Я в шифровании трафика новичок, поэтому забоялся дальнейшего оверхеда из-за какой-то маленькой библиотеки. Кроме того, хотел собрать с поддержкой ssl.
semenenko88
26.01.2018 18:01Спасибо, нужно будет попробовать. Как то раз пытался, но так и не смог заставить работать это в lxc на ProxMox.
agic
вы всегда идете таким сложным путем?
Louie Автор
Конечно нет. Просто, у меня лет 5 как работает простой в установке официальный FreePBX distro в KVM-машине, и к нему есть ряд вопросов и пожеланий. Учитывая этот опыт, хотелось отсечь все лишнее, и сделать, при сохранении удобства настроек, что-то максимально компактное, быстрое, гибкое, современное и надежное.