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