Виртуальная атс. часть 3: переводим asterisk на pjsip без лишних телодвижений

Установка и настройка FreePBX

Осуществим некоторые модификации в Apache

sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini &&
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf &&
sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf &&
systemctl restart httpd.service

Скачивание и установка FreePBX

cd /usr/src &&
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-14.0-latest.tgz &&
tar xfz freepbx-14.0-latest.tgz &&
rm -f freepbx-14.0-latest.tgz &&
cd freepbx &&
./start_asterisk start
  • Запустим установочный скрипт

    если пропустить ключ «-n» установка пройдет в интерактивном режиме, это может пригодиться, например, если задан пароль mysql.

./install -n

Если после выполнения последней команды консоль выдаст ошибку типа:

Reading /etc/asterisk/asterisk.conf...Error!
Unable to read /etc/asterisk/asterisk.conf or it was missing a directories section

Добавить в конец конфига /etc/asterisk/asterisk.conf строки:

astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk
astsbindir => /usr/sbin

Выключение фаервола и запуск и автозагрузка http сервера

Выключаем фаервол и убираем из автозагрузки:

systemctl stop firewalld &&
systemctl disable firewalld

Запускаем сервер http и ставим в автозагрузку:

systemctl start httpd &&
systemctl enable httpd

Готово!

Проблемы с отображением кириллицы в CDR

сносим старый коннектор:

 rpm -e mysql-connector-odbc --nodeps

Установим CMAKE

wget https://cmake.org/files/v3.12/cmake-3.12.3.tar.gz
tar zxvf cmake-3.*
cd cmake-3.*
./bootstrap && make && make install

Компилируем новый коннектор:

cd /usr/src
git clone https://github.com/MariaDB/mariadb-connector-odbc.git
cd mariadb-connector-odbc
git checkout 3.0.7
git submodule init
git submodule update
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCONC_WITH_UNIT_TESTS=Off  -DWITH_OPENSSL=true -DCMAKE_INSTALL_PREFIX=/usr/local
make
make install

Правим /etc/odbcinst.ini , добавляем новый драйвер:

Description=ODBC for MariaDB
Driver=/usr/local/lib64/libmaodbc.so
Setup=/usr/lib64/libodbcmyS.so
UsageCount=1

Убедитесь что libmaodbc там где указано:

# find / -name "libmaodbc.so"

/usr/local/lib64/libmaodbc.so
/usr/src/mariadb-connector-odbc/libmaodbc.so

И измените имя драйвера в odbc.ini на , ну или на то что вы укажете в odbcinst.ini

Description=MySQL connection to 'asteriskcdrdb' database
driver=MariaDB
server=localhost
database=asteriskcdrdb
Port=3306
Socket=/var/lib/mysql/mysql.sock
option=3
Charset=utf-8

Такие дела…

Подготовка системы

Я рекомендую ознакомиться с моим материалом на тему первоначальной настройки centos 7. Многие вопросы там рассмотрены подробнее, здесь же я не буду на них задерживаться, просто выполню необходимые команды.

Прежде чем мы начнем устанавливать asterisk, нам надо выполнить целый ряд подготовительных действий. Первым делом отключаем selinux. Для этого открываем файл:

# mcedit /etc/sysconfig/selinux

и устанавливаем значение SELINUX=disabled. После этого применяем настройку без перезагрузки сервера:

# setenforce 0

Рекомендация по отключению selinux дается в официальной инструкции по установке freepbx, так как это может привести к нарушению процесса инсталляции.

Дальше обновляем систему:

# yum update
# yum groupinstall core base "Development Tools"

Устанавливаем необходимые пакеты для работы сервера voip:

# yum install lynx mariadb-server mariadb php php-mysql php-mbstring tftp-server httpd ncurses-devel sendmail sendmail-cf sox newt-devel libxml2-devel libtiff-devel audiofile-devel gtk2-devel subversion kernel-devel git php-process crontabs cronie cronie-anacron wget vim php-xml uuid-devel sqlite-devel net-tools gnutls-devel php-pear

Устанавливаем компонент pear:

# pear install Console_Getopt

Теперь надо настроить iptabes. Подробно вопрос настройки firewall я рассмотрел отдельно. Там можно узнать все нюансы. Здесь же я прото скажу, что для начала нам нужно открыть 80-й порт, чтобы мы смогли работать с веб интерфейсом:

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Для полноценной работы астериск, нужно открыть следующие порты:

iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 5061 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5060 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5061 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4569 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 5038 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 5038 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT

Для работы freepbx необходима mariadb. Это популярный форк mysql, который по-умолчанию предлагается в качестве mysql сервера в CentOS 7. Оба эти сервера имеют полную совместимость и могут в любой момент заменять друг друга. Запустим базу и добавим в автозагрузку:

# systemctl enable mariadb.service
# systemctl start mariadb

При первоначальной конфигурации mariadb рекомендуется запустить скрипт mysql_secure_installation. Сделаем это:

# /usr/bin/mysql_secure_installation

Подробнее о работе этого скрипта и вообще настройке mariadb можно прочитать в материале на тему web-сервера на centos 7.

Важное замечание. На этапе настройки mariadb не указывайте пароль root

Он должен быть пустым. Если его задать, то стандартная установка freepbx закончится ошибкой и сообщением: Error! Invalid Database Permissions. The error was: SQLSTATE Access denied for user ‘root’@’localhost’ (using password: NO)

Мы же двигаемся дальше. Для работы freepbx необходим веб сервер. В этом качестве у нас будет выступать httpd. Запускаем его:

# systemctl start httpd

И добавляем в автозагрузку:

# systemctl enable httpd

Теперь добавим пользователя, под которым будет работать астериск:

# adduser asterisk -M -c "User for voip"

Подготовка

Обновите систему:

sudo dnf -y update

Установите зависимости:

sudo dnf -y groupinstall  "Development Tools"

sudo dnf install -y @php tftp-server ncurses-devel sendmail sendmail-cf newt-devel libxml2-devel libtiff-devel gtk2-devel subversion kernel-devel git crontabs cronie cronie-anacron wget vim php-xml sqlite-devel net-tools gnutls-devel unixODBC

Установка и настройка сервера базы данных MariaDB

Установите MariaDB:

sudo dnf module install mariadb

Проверьте версию MariaDB:

rpm -qi mariadb-server
sudo systemctl enable --now mariadb

Настройте параметры безопасности командой:

mysql_secure_installation

Убедитесь, что вы:

  • Установили пароль пользователя базы данных root
  • Удалили анонимных пользователей
  • Запретили удаленный доступ пользователю root
  • Удалили тестовую базу данных и доступ к ней

Затем проверьте доступ для пользователя root:

mysql -u root -p

Установка Node.js 10 LTS

Проверьте доступные версии Node.js:

sudo dnf module list | grep nodejs

Установите версию по умолчанию (если необходимо можно вручную указать другую версию):

sudo dnf module install nodejs:10

Проверьте установленную версию:

node --version

Установка и настройка Apache Web Server

Установите httpd:

sudo dnf -y install @httpd

Удалите страницу по умолчанию index.html:

sudo rm -f /var/www/html/index.html
sudo systemctl enable --now httpd

Если у вас есть активная служба межсетевого экрана firewalld, откройте порты http и https:

sudo firewall-cmd --add-service={http,https} --permanent
sudo firewall-cmd --reload

Установка и настройка PHP

Установите PHP и необходимые расширения:

sudo dnf -y install wget @php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysqlnd php-gettext php-bcmath php-zip php-xml  php-json php-process php-snmp

Скорректируйте настройки httpd

 sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/httpd/conf/httpd.conf
 sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf
 sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php.ini

В /etc/php-fpm.d/www.conf пропишите:

listen.acl_users = asterisk

Запустите php-fpm и httpd:

sudo systemctl enable --now php-fpm httpd
sudo systemctl restart php-fpm httpd

Проверьте статус обоих служб:

sudo systemctl status php-fpm httpd

Устанавливаем Jansson и pjsip

YAML

# cd ~
# git clone https://github.com/akheron/jansson.git
# cd jansson
# autoreconf -i
# ./configure —prefix=/usr/
# make && make install

1
2
3
4
5
6

# cd ~
# git clone https://github.com/akheron/jansson.git
# cd jansson
# autoreconf -i
# ./configure —prefix=/usr/
# make && make install

YAML

# cd ~
# git clone https://github.com/pjsip/pjproject.git
# cd pjproject
# ./configure CFLAGS=»-DNDEBUG -DPJ_HAS_IPV6=1″ —prefix=/usr —libdir=/usr/lib64 —enable-shared —disable-video —disable-sound —disable-opencore-amr
# make dep && make && make install
# ldconfig

1
2
3
4
5
6

# cd ~
# git clone https://github.com/pjsip/pjproject.git
# cd pjproject
# ./configure CFLAGS=»-DNDEBUG -DPJ_HAS_IPV6=1″ —prefix=/usr —libdir=/usr/lib64 —enable-shared —disable-video —disable-sound —disable-opencore-amr
# make dep && make && make install
# ldconfig

Установка DAHDI, libPRI и Asterisk

  1. # cd dahdi-linux-complete-2.11.1+2.11.1
    # make all
    # make install
    # make config
    # cp tools/dahdi.init /etc/init.d/dahdi 
    
    
  2. # cd ../libpri-1.6.0
    # make
    # make install
    
  3. # cd ../asterisk-16.5.1
    # ./configure --prefix=/usr --exec-prefix=/usr --with-crypto --with-dahdi --with-iconv -with-libcurl --with-gmime --with-iksemel --with-mysqlclient --disable-xmldoc --with-pri --with-spandsp --with-ldap --with-libcurl --with-popt --with-resample --with-speex --with-unixodbc --with-jansson-bundled
    # make menuselect # ./contrib/scripts/get_mp3_source.sh # make # make install # make samples
  4. # ln -s /usr/lib/libpri.so.1.4 /usr/lib64/libpri.so.1.4
    # cat contrib/init.d/rc.redhat.asterisk | sed 's/__ASTERISK_SBIN_DIR__/\/usr\/sbin/' > /etc/init.d/asterisk
    # chmod 755 /etc/rc.d/init.d/asterisk
    # systemctl enable asterisk.service
    
  5. # groupadd asterisk 
    # useradd -c "asterisk PBX" -d /var/lib/asterisk -s /sbin/nologin -g asterisk asterisk
  6. # systemctl enable dahdi
    # cat /etc/dahdi/system.conf.sample > /etc/dahdi/system.conf
    # systemctl start dahdi
    # chown -R asterisk:asterisk /var/{lib,log,spool,run}/asterisk /etc/asterisk
    # systemctl start asterisk
    
  7. Включаем fail2ban:
    # vi /etc/fail2ban/jail.local
    # cat /etc/fail2ban/jail.local
    
    enabled = true
    
     
    enabled = true
    filter = asterisk
    logpath  = /var/log/asterisk/messages tail
    bantime = 86400
    
    # cd /etc/fail2ban/filter.d/
    # mv asterisk.conf asterisk.conf.orig
    # wget http://www.adminhelp.pro/wp-content/uploads/fail2ban/asterisk.conf
    # systemctl enable fail2ban.service
    # systemctl restart fail2ban.service
    

Установка Asterisk

Загрузите Asterisk:

cd /usr/src/
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz
tar xvfz asterisk-16-current.tar.gz
rm -f asterisk-16-current.tar.gz
cd asterisk-16*/

Конфигурация:

./configure --libdir=/usr/lib64

При успешной конфигурации Вы должны получить следующий вывод:

При успешной конфигурации Вы должны получить следующий вывод:

configure: Menuselect build configuration successfully completed

               .$$$$$$$$$$$$$$$=..
            .$7$7..          .7$$7:.
          .$$:.                 ,$7.7
        .$7.     7$$$$           .$$77
     ..$$.       $$$$$            .$$$7
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7
$$$       .7$$$$$$$$$$$$$$$$      :$$$.
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.
$$$        $$$   7$$$7  .$$$    .$$$.
$$$$             $$$$7         .$$$.
7$$$7            7$$$$        7$$$
 $$$$$                        $$$
  $$$$7.                       $$  (TM)
   $$$$$$$.           .7$$$$$$  $$
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$
       $$$$$$$$$$$$$$$$.

configure: Package configured for:
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : pc : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu :

Если каких-то зависимостей нехватает то можно запустить скрипт install_prereq для их установки:

contrib/scripts/install_prereq

Запустите меню настройки:

make menuselect

В разделе «Add-ons» выберите «chan_ooh323» и «format_mp3»

В разделе «Core Sound Packages» выберите необходимые аудиопакеты (опционально)

В разделе «Music On Hold» выберите нужные форматы музыки на удержании (опционально)

В разделе «Extra Sound Packages» выберите дополнительные аудиопакеты (опционально)

В разделе «Applications» выберите «app_macro» (в — Deprecated —)

Затем нажмите save and exit

Сборка и установка:

Загрузите библиотеку mp3-декодера:

sudo contrib/scripts/get_mp3_source.sh

Соберите и установите Asterisk:

make
make install
make samples
make config
make install-logrotate ;Если требуется установка logrotate для ротации лог-файлов
ldconfig

Настройка и запуск

Создайте отдельного пользователя и группу для запуска asterisk, а так же настройке права:

sudo groupadd asterisk
sudo useradd -r -d /var/lib/asterisk -g asterisk asterisk
sudo usermod -aG audio,dialout asterisk
sudo chown -R asterisk.asterisk /etc/asterisk /var/{lib,log,spool}/asterisk /usr/lib64/asterisk

Настройте запуск asterisk из под соответствующего пользователя:

Откройте файл /etc/sysconfig/asterisk и раскоментируйте следующие строки:

AST_USER="asterisk"
AST_GROUP="asterisk"

Откройте файл /etc/asterisk/asterisk.conf и раскоментируйте следующие строки:

runuser = asterisk ; The user to run as.
rungroup = asterisk ; The group to run as.

Перезапустите службу asterisk:

sudo systemctl restart asterisk
sudo systemctl enable asterisk

Проверьте статус asterisk:

systemctl status asterisk

Проверьте соединение с astierisk:

asterisk -vvvr

На этом установка asterisk закончена.

Настройка папки со звонками

Записи разговоров будут складываться в папку из примера выше.

Есть два варианта хранения файлов записей:

  1. Все записи разговоров хранятся в одной папке.
  2. Записи разговоров должны распределяться по папкам в соответствии с датой.

Также есть возможность настройки «отложенной конвертации записей разговоров».

Когда днем выполняется запись в формат WAV, а ночью необходимо по CRON запустить скрипт для преобразования файлов из WAV в MP3.
«Отложенную конвертацию записей разговоров» и распределение по папкам в соответствии с датой можно использовать вместе, а можно что-то одно.

За распределение файлов записей по папкам, преобразование файлов из WAV в MP3 отвечает скрипт из папки docs.

Для 2 варианта

Каждый день в 00.01 часов записи из папки по CRON должны распределяться по дате в соответствующие папки.

Для распределения файлов по папкам в соответствии с датой нужно использовать скрипт из папки docs.

Формат хранения записей (пример):

  1. /home/calls/2014/2014-09/2014-09-29
  2. /home/calls/2014/09/29

Настройки скрипта для соответствующего формата:

Настройки скрипта для преобразования файлов из WAV в MP3:

За включение преобразования файлов из WAV в MP3 в скрипте отвечает переменная . Необходимо установить ее значение в true или false.

Можно настроить МИНИМАЛЬНЫЙ РАЗМЕР ФАЙЛА для преобразования файлов из WAV в MP3, задается в переменной , размер указывается в КилоБайтах.
Если размер файла меньше , то этот файл будет удален, и не будет преобразован из WAV в MP3.

Также можно настроить уровень вложенности поиска WAV файлов для их преобразования в переменной «DEPTH».

Примеры значений для переменной

Для вариантов, когда Asterisk сам распределяет записи по папкам в соответствии с датой.

Если у вас Asterisk сам распределяет записи звонков по папкам в соответствии с датой, тогда необходимости запуска скрипта по CRON нет.
Если только у вас не настроена «отложенная конвертация записей разговоров»

Возможные форматы хранения записей:

  1. /home/calls/2014/2014-09/2014-09-29
  2. /home/calls/2014/09/29

Полный/Частичный путь к файлам звонков хранится в базе данных

Если у вас полный или частичный путь к файлам звонков хранится в базе данных, допустим в столбце «column_name».
Например: , , .

В этом случае можно использовать как полный путь к файлу, так и относительный. Также в пути можно использовать имя файла как с расширением, так и без расширения файла.

Если у вас используется полный путь к файлу (от корня диска), то в конфиг-файле необходимо задать: .

Если у вас используется частичный путь к файлу, допустим , то в конфиг-файле необходимо задать первую часть пути, например: .
БЕЗ слеша на конце. Таким образом получим полный путь: .

Если у вас используется относительный путь к файлу, допустим , то в конфиг-файле необходимо задать первую часть пути, например: .
БЕЗ слеша на конце. Таким образом получим полный путь: .

Аналогично для файлов без расширения.

Примеры путей к файлам при их хранении в базе данных (содержимое колонки «filename»):

  1. /home/calls/2015/2015-01/2015-01-01/in/filename.mp3
  2. ./calls/2015/2015-01/2015-01-01/in/filename.mp3
  3. 2015/2015-01/2015-01-01/in/filename.mp3
  4. /home/calls/2015/2015-01/2015-01-01/in/filename
  5. ./calls/2015/2015-01/2015-01-01/in/filename
  6. 2015/2015-01/2015-01-01/in/filename

Настройка Web сервера

Для рабо­ты пане­ли FreePBX нужен web сер­вер с php. Я буду исполь­зо­вать вер­сию php 7.2 из базо­во­го рпозитория.

Уста­нав­ли­ва­ем веб сер­вер apache:

YAML

# dnf install @httpd

1 # dnf install @httpd

Уда­ля­ем стар­то­вую страницу.

YAML

# rm -f /var/www/html/index.html

1 # rm -f /var/www/html/index.html

Запус­ка­ем httpd и добав­ля­ем в автозагрузку.

YAML

# systemctl enable —now httpd

1 # systemctl enable —now httpd

Откры­ва­ем пор­ты на firewalld, если вы ранее не настра­и­ва­ли iptables.

YAML

# firewall-cmd —add-service={http,https} —permanent
# firewall-cmd —reload

1
2

# firewall-cmd —add-service={http,https} —permanent
# firewall-cmd —reload

Если вы хоти­те исполь­зо­вать php 5.6, то сра­зу пере­хо­ди­те в самый конец ста­тьи, в соот­вет­ству­ю­щий раз­дел. Ниже будем ста­вить дефолт­ную вер­сию php 7.2 из базо­во­го репо­зи­то­рия Centos 8. Уста­нав­ли­ва­ем необ­хо­ди­мые php расширения.

YAML

# dnf install wget @php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysqlnd php-gettext php-bcmath php-zip php-xml php-json php-process php-snmp

1 # dnf install wget @php php-pear php-cgi php-common php-curl php-mbstring php-gd php-mysqlnd php-gettext php-bcmath php-zip php-xml php-json php-process php-snmp

Изме­ня­ем мак­си­маль­но допу­сти­мый раз­мер фай­ла для загруз­ки и лимит по памя­ти для скриптов.

YAML

# sed -i ‘s/\(^upload_max_filesize = \).*/\100M/’ /etc/php.ini
# sed -i ‘s/\(^memory_limit = \).*/\512M/’ /etc/php.ini

1
2

# sed -i ‘s/\(^upload_max_filesize = \).*/\100M/’ /etc/php.ini
# sed -i ‘s/\(^memory_limit = \).*/\512M/’ /etc/php.ini

Теперь нам нуж­но изме­нить неко­то­рые пара­мет­ры httpd — запу­стить его от поль­зо­ва­те­ля asterisk и вклю­чить опцию AllowOverride. Это мож­но сде­лать рука­ми в фай­ле /etc/httpd/conf/httpd.conf, либо авто­ма­ти­че­ски с помо­щью sed.

YAML

# sed -i ‘s/^\(User\|Group\).*/\1 asterisk/’ /etc/httpd/conf/httpd.conf
# sed -i ‘s/AllowOverride None/AllowOverride All/’ /etc/httpd/conf/httpd.conf

1
2

# sed -i ‘s/^\(User\|Group\).*/\1 asterisk/’ /etc/httpd/conf/httpd.conf
# sed -i ‘s/AllowOverride None/AllowOverride All/’ /etc/httpd/conf/httpd.conf

Мы про­сто выста­ви­ли сле­ду­ю­щие параметры:

  • User asterisk
  • Group asterisk
  • AllowOverride All

И так же в php-fpm меня­ем поль­зо­ва­те­ля на asterisk в кон­фи­гу­ра­ции пула /etc/php-fpm.d/www.conf

YAML

# sed -i ‘s/^\(user\|group\).*/\1 = asterisk/’ /etc/php-fpm.d/www.conf
# sed -i ‘s/^\(listen.acl_users\).*/\1 = asterisk/’ /etc/php-fpm.d/www.conf

1
2

# sed -i ‘s/^\(user\|group\).*/\1 = asterisk/’ /etc/php-fpm.d/www.conf
# sed -i ‘s/^\(listen.acl_users\).*/\1 = asterisk/’ /etc/php-fpm.d/www.conf

Запус­ка­ем httpd и php-fpm.

YAML

# systemctl enable —now php-fpm httpd
# systemctl restart php-fpm httpd

1
2

# systemctl enable —now php-fpm httpd
# systemctl restart php-fpm httpd

Пове­ря­ем ста­тус запу­щен­ных служб.

YAML

# systemctl status php-fpm httpd

1 # systemctl status php-fpm httpd

Все в поряд­ке, дви­жем­ся дальше.

Установка Asterisk

Мы будем устанавливать 16-ю версию Asterisk. На странице загрузки мы можем посмотреть все версии АТС и ссылки на них.

Сначала установим пакеты, необходимые для сборки:

dnf —enablerepo=powertools install libedit-devel

После скачиваем Asterisk:

wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz

Распаковываем архив и переходим в него:

tar -xvf asterisk-*.tar.gz

cd asterisk-*/

Устанавливаем зависимости для астериска:

./contrib/scripts/install_prereq install

Мы должны увидеть:

Complete!
#############################################
## install completed successfully
#############################################

Чистим временные файлы, которые появились после установки зависимостей:

make distclean

Добавляем библиотеку для работы с mp3:

./contrib/scripts/get_mp3_source.sh

Конфигурируем исходник:

./configure

* в данном примере мы конфигурируем исходник без дополнительных опций. Полный перечень опций и что они означают можно посмотреть командой ./configure -h.

Мы должны увидеть:


configure: Menuselect build configuration successfully completed

               .$$$$$$$$$$$$$$$=..      
            .$7$7..          .7$$7:.    
          .$$:.                 ,$7.7   
        .$7.     7$$$$           .$$77  
     ..$$.       $$$$$            .$$$7 
    ..7$   .?.   $$$$$   .?.       7$$$.
   $.$.   .$$$7. $$$$7 .7$$$.      .$$$.
 .777.   .$$$$$$77$$$77$$$$$7.      $$$,
 $$$~      .7$$$$$$$$$$$$$7.       .$$$.
.$$7          .7$$$$$$$7:          ?$$$.
$$$          ?7$$$$$$$$$$I        .$$$7 
$$$       .7$$$$$$$$$$$$$$$$      :$$$. 
$$$       $$$$$$7$$$$$$$$$$$$    .$$$.  
$$$        $$$   7$$$7  .$$$    .$$$.   
$$$$             $$$$7         .$$$.    
7$$$7            7$$$$        7$$$      
 $$$$$                        $$$       
  $$$$7.                       $$  (TM)     
   $$$$$$$.           .7$$$$$$  $$      
     $$$$$$$$$$$$7$$$$$$$$$.$$$$$$      
       $$$$$$$$$$$$$$$$.                

configure: Package configured for: 
configure: OS type  : linux-gnu
configure: Host CPU : x86_64
configure: build-cpu:vendor:os: x86_64 : pc : linux-gnu :
configure: host-cpu:vendor:os: x86_64 : pc : linux-gnu :

Продолжаем настройку — запускаем меню для выбора параметров:

make menuselect

Можно оставить значения по умолчанию и сохранить настройки.

Теперь можно запустить сборку астериска:

make

Мы должны увидеть сообщение об успешной сборке:

 +——— Asterisk Build Complete ———+
 + Asterisk has successfully been built, and +
 + can be installed by running:              +
 +                                           +
 +                make install               +
 +——————————————-+

После выполняем установку:

make install

Мы увидим:

 +—- Asterisk Installation Complete ——-+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 …

Устанавливаем скрипты для автозапуска АТС и готовые конфигурационные файлы:

make config

make samples

Ранее мы создали пользователя asterisk, от которого должен запуститься наш сервер телефонии. Для этого откроем файл:

vi /etc/asterisk/asterisk.conf

Снимаем комментарий с опций:

runuser = asterisk
rungroup = asterisk

… и снимем комментарий с последующим редактированием:

defaultlanguage = ru
documentation_language = ru_RU

Задаем владельца для следующих каталогов:

chown -R asterisk:asterisk /var/run/asterisk

chown -R asterisk:asterisk /etc/asterisk

chown -R asterisk:asterisk /var/{lib,log,spool}/asterisk

chown -R asterisk:asterisk /var/log/asterisk

и проверяем настройки:

asterisk -c

Мы должны увидеть Asterisk Ready:

… значит наш сервер готов к запуску. Все ошибки и предупреждения нам не помешают, однако их можно устранить разными способами, как правило, отключив неиспользуемые модули.

После успешной проверки, можно запустить Asterisk в качестве демона:

systemctl enable asterisk

systemctl start asterisk

Платформа IT инфраструктуры

Обстановка в подавляющем большинстве компаний нашей с вами родины сложилась следующим образом: Везде Windows. На компьютерах Windows. На серверах Windows. Ноутбуки продаются с предустановленной Windows. Современные недорогие планшеты и те — на Windows. Все полезные и необходимые программы для бизнеса написаны для работы в Windows.

Хорошо это или плохо? Речь сейчас не об этом.

Нужно работать. Выполнять поставленные задачи. Бизнес должен развиваться и зарабатывать деньги. А в крестовый поход против Microsoft мы сегодня не пойдем.

Сегодня я расскажу Вам что нужно сделать чтобы развернуть телефонию в компании без погружения в мир Linux и черных экранов с множеством непонятных команд.

Настройка Asterisk

Для того, чтобы Asterisk смог взаимодействовать с новыми столбцами в таблице, необходимо в файле создать их алиасы.

Добавим в конец этого файла ( секция ) строчки:

Вместо «название_столбца» вставьте название столбца, в котором хранится название записи звонка, например «filename».
Алиас «remoteip» нужен для записи IP адреса клиента Asterisk. Это НЕОБЯЗАТЕЛЬНО.

Создание алиаса и наличие в базе колонки «calldate» обязательно для правильной работы CDR Viewer.

Все изменения производим в , либо в . В зависимости от того, в какой файле у нас написан диалплан.

Если название столбца, в котором хранится название записи звонка у вас отличается от «filename», то необходимо внести соответствующие изменения в диалплан.
Необходимо изменить строку на

В «globals» добавим пару переменных:

Добавим макрос.

Сразу уточним, что в этом макросе, если RECORDING=1 запись прямо во время разговора конвертируется в MP3. т.е. существует некоторая нагрузка на сервер.

Если же RECORDING=2, то нагрузка на сервер минимальная, т.к. запись выполняется в родной формат Asterisk — WAV. Конвертирование в MP3 должно быть выполнено
с помощью скрипта , который можно найти в папке docs. В скрипте написаны подробные комментарии по его настройке

Пример вызова макроса:

Пример вызова макроса:

Дополнительно (необязательно). Если НЕ использовали файл импорта в базу «cdr_mysql.sql»

В Asterisk если используется макрос, то звонок совершается с экстеншеном s.

Чтобы Номер назначения был действительным, а не s или s, то сделаем следующее:

  • Теперь нужно добавить триггер на таблицу.

Для этого зайдем в Триггеры — Добавить триггер. Назначаем имя триггеру, остальное оставляем без изменений. В поле «Определение» вставляем текст ниже:

Для того, чтобы в поле записывался правильный Номер назначения, нужно отредактировать диалплан. Макрос выше в редактировании не нуждается.
В используемом у вас макросе необходимо добавить строчку, это только пример. Задайте правильные имена параметров (${number}, ${ARG1}).

Настройка CDR Viewer

Пример конфиг файла находится в .

Перед началом использования этот файл нужно переименовать в .

Все настройки находятся в файле с подробными комментариями, тут не должно возникнуть сложностей.

Можно использовать «пользовательский» конфиг. Это значит, что будет использоваться альтернативный конфиг файл с настройками.
Для этого нужно создать еще один файл с конфигом, например: .

Формат имени файла конфига:

Для имени можно использовать латинские буквы, цифры, тире и нижнее подчеркивание.

Кратко:

  1. Скачать ZIP архив с GitHub или выполнить
  2. Распаковать или Перенести файлы в нужную папку на сервере
  3. Переименовать файл в . Т.е. будет файл
  4. Настроить параметры в
  5. Почти готово. Если необходим доступ только для определенных пользователей, то необходимо создать файл .

Установка Asterisk

Когда подготовка сервера завершена, начнем установку самого Asterisk. Скачайте самый свежий пакет с сайта разработчика в разделе Download, или воспользуйтесь командой wget.

root@centos-7 ~# wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13.5.0.tar.gz

Распакуйте архив, перейдите в созданную папку и сконфигурируйте пакет перед сборкой:

root@centos-7 ~# tar -zxvf asterisk-13.5.0.tar.gz
root@centos-7 ~# cd asterisk-13.5.0
root@centos-7 asterisk-13.5.0# ./configure --libdir=/usr/lib64

Если все прошло успешно, вы увидите такой логотип в стиле ASCII Art:

Sox — микширование аудиофайлов

Для записи по отдельности звонящего и отвечающего абонентов в правый и левый канал стереофайла можно записать два отдельных файла
и смикшировать их командой sox.

Для микширования файлов сначала надо установить sox:

Параметры для команды MixMonitor для дополнительной записи файлов с каналами только звонящего и только отвечающего абонентов:

r(имя_файла_с записью_звонящего)
t(имя_файла_с записью_отвечающего)

Чтобы не записывать файл с обоими каналами, в команде MixMonitor нужно не указывать filename, т.е. сразу после скобки ставить запятую.

Чтобы после записи файлов смиксовать их в один файл, после второй запятой в параметрах команды MixMonitor указать команду,
которую нужно выполнить после завершения работы команды MixMonitor:

Пример:

MixMonitor(,r(${fname}_r.wav)t(${fname}_t.wav),sox -M ${fname}_r.wav ${fname}_t.wav ${fname}.wav)

Пример фрагмента диалплана, выполняющий запись файла mp3 с разнесением звонящего и отвечающего в разные каналы,
файлы раскладываются по папкам год-месяц-день:

same =>      n,Set(__RecDir=/var/spool/asterisk/monitor)
same =>      n,Set(fname=${RecDir}/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}/${STRFTIME(${EPOCH},,%d)}/${STRFTIME(${EPOCH},,%Y%m%d_%H%M%S)}_${CALLERID(num)})
same =>      n,MixMonitor(,bW(2)r(${fname}_r.wav)t(${fname}_t.wav),sox -M ${fname}_r.wav ${fname}_t.wav ${fname}.wav && lame -b 32 -m d ${fname}.wav ${fname}.mp3 && rm ${fname}*.wav)

В примере в параметрах lame указывается:

  — режим кодирования каналов: dual channels. В этом режиме стереоканалы кодируются совершенно независимо,
каждому каналу выделяется ровно половина битрейта. Поэтому:

  — целевой битрейт, указываем в два раза больше чем обычный 16 для телефонии

Следующая команда после lame (после &&) удаляет все больше не нужные wav-файлы.

Исправление ошибок

Рассмотрим процесс устранения предупреждений и ошибок во время запуска Asterisk.

Из-за неиспользуемых модулей

Для устранения данных проблем необходимо просто отключить данные модули.

Открываем файл:

vi /etc/asterisk/modules.conf

И в зависимости от ошибок, добавляем нижеперечисленные исправления…

Отключаем res_phoneprov:

noload => res_phoneprov.so

Отключаем res_config_ldap:

noload => res_config_ldap.so

Отключаем res_config_pgsql:

noload => res_config_pgsql.so

Отключаем cel_pgsql:

noload => cel_pgsql.so

Отключаем cel_tds:

noload => cel_tds.so

Другие ошибки

ari/config … No configured users for ARI

ARI предоставляет API для Asterisk REST Interface. В данном примере, отключаем поддержку:

vi /etc/asterisk/ari.conf

Находим параметр enabled и меняем его значение на no:

enabled = no

CDR и подключение к базе данных

В моем случае, не работало ведение CDR, а при вводе в консоли asterisk команды:

> odbc show

… я увидел:

ODBC DSN Settings
——————
  Name:   asteriskcdrdb
  DSN:    MySQL-asteriskcdrdb
    Last fail connection attempt: 2021-05-08 10:25:52
    Number of active connections: 0 (out of 5)
    Logging: Disabled

То есть, нет подключения к базе данных asteriskcdrdb. А при попытке подключиться к нужному DSN из командной строки:

isql -v MySQL-asteriskcdrdb

… я получил ошибку:

Can’t open lib ‘/usr/lib64/libmyodbc5.so’ : file not found

То есть, проблема в отсутствии необходимой бибилиотеки при подключении к базе данных.

Нам необходимо выполнить 2 действия:

  1. Установить коннектор ODBC.
  2. Изменить драйвер для подключения к СУБД в odbc.ini.

Так как в данной инструкции мы используем в качестве севера баз данных MariaDB, нам необходим соответствующий коннектор. Для его установки воспользуемся инструкцией .

После открываем файл:

vi /etc/odbc.ini

Задаем новое значение для параметра driver:

driver=MariaDB

* список доступных драйвером можно посмотреть в файле /etc/odbcinst.ini.

Перезапускаем asterisk:

systemctl restart asterisk

После можно проверить, что Asterisk подключился к базе:

> odbc show

Мы должны увидеть:

ODBC DSN Settings
——————
  Name:   asteriskcdrdb
  DSN:    MySQL-asteriskcdrdb
    Number of active connections: 1 (out of 5)
    Logging: Disabled

Заключение

Долго я возился с этой статьей. В итоге перепробовал кучу всяких вариантов и настроек, но у меня так и не получилось добиться того, чтобы Freepbx без ошибок работала на Centos 8. Я для себя сделал вывод, что панель просто не готова к работе на этой системе. Статью я решил все же оформить и опубликовать, потому что было жаль потраченного времени, плюс может это будет кому-то полезно, если необходимо настраивать только на Centos 8.

При настройке и отладке различных версий, рекомендую использовать виртуальную машину и снепшоты. Я сначала настроил систему, сделал снепшот, потом собрал астериск, сделал еще снепшот, а потом уже пробовал различные версии панели. Это позволило оперативно проверить много вариантов настроек и версий php. Загружался из снепшотов раз 20.

Все статьи в буржунете, что видел, поверхностны и рассказывают обычную установку на дефолтную систему с php 7.2 из базовых реп. Как это потом работает, никто не проверяет. Реально полезной и законченной информации по Centos 8 b Freepbx я не нашел.

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Онлайн курс Infrastructure as a code

Если у вас есть желание научиться автоматизировать свою работу, избавить себя и команду от рутины, рекомендую пройти онлайн курс Infrastructure as a code. в OTUS. Обучение длится 4 месяца.

Что даст вам этот курс:

  • Познакомитесь с Terraform.
  • Изучите систему управления конфигурацией Ansible.
  • Познакомитесь с другими системами управления конфигурацией — Chef, Puppet, SaltStack.
  • Узнаете, чем отличается изменяемая инфраструктура от неизменяемой, а также научитесь выбирать и управлять ей.
  • В заключительном модуле изучите инструменты CI/CD: это GitLab и Jenkins

Смотрите подробнее программу по .

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: