В контейнеры, в наше время, можно установить множество интересных систем
но под катом вы сможете найти лишь относительно стандартную инструкцию по установке 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)


  1. agic
    26.01.2018 15:48

    вы всегда идете таким сложным путем?


    1. Louie Автор
      26.01.2018 18:11

      Конечно нет. Просто, у меня лет 5 как работает простой в установке официальный FreePBX distro в KVM-машине, и к нему есть ряд вопросов и пожеланий. Учитывая этот опыт, хотелось отсечь все лишнее, и сделать, при сохранении удобства настроек, что-то максимально компактное, быстрое, гибкое, современное и надежное.


  1. greynix
    26.01.2018 16:23

    чем обусловлена необходимость ручной сборки? почему не стали подключать репозитории где имеется ПО необходимой версии?


    1. Louie Автор
      26.01.2018 18:27

      Вы про srtp? Насторожило, что требуется пакет из старой замороженной ветки, после переезда проекта, и что пакет в epel 7-ки совсем старый, хотя у 6-ки кто-то бился, часто фиксил 1.5.4.
      Я в шифровании трафика новичок, поэтому забоялся дальнейшего оверхеда из-за какой-то маленькой библиотеки. Кроме того, хотел собрать с поддержкой ssl.


  1. semenenko88
    26.01.2018 18:01

    Спасибо, нужно будет попробовать. Как то раз пытался, но так и не смог заставить работать это в lxc на ProxMox.


  1. alexey_vv
    26.01.2018 18:01

    кто бы рассказал еще про какого-нибудь JavaScript-SIP-WebRTC-клиента…


    1. Louie Автор
      26.01.2018 23:19

      Применительно к данной статье, могу рассказать, что такой во freepbx имеется и работает из UCP при установке соответствующего модуля. Полезность его для меня сомнительна.