Asterisk 18 + FreePBX 16

Debian 11 & 12

Asterisk 18
sudo apt -y install git vim curl wget libnewt-dev libssl-dev libncurses5-dev subversion software-properties-common libsqlite3-dev build-essential libjansson-dev libxml2-dev uuid-dev sox mpg123 lame ffmpeg
cd /usr/src/ && sudo wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-18-current.tar.gz && sudo tar xvf asterisk-18-current.tar.gz && cd asterisk-18*/ && sudo contrib/scripts/get_mp3_source.sh
sudo contrib/scripts/install_prereq install

вводим код страны 7

sudo ./configure
sudo make menuselect

В меню выбираем следующие параметры

Add-ons (See README-addons.txt)
	[*] chan_ooh323 
	[*] format_mp3
Core Sound Packages
	[*] CORE-SOUNDS-RU-WAV      
	[*] CORE-SOUNDS-RU-ULAW     
	[*] CORE-SOUNDS-RU-ALAW     
	[*] CORE-SOUNDS-RU-GSM      
	[*] CORE-SOUNDS-RU-G729     
	[*] CORE-SOUNDS-RU-G722     
	[*] CORE-SOUNDS-RU-SLN16    
	[*] CORE-SOUNDS-RU-SIREN7   
	[*] CORE-SOUNDS-RU-SIREN14
Music On Hold File Packages
	[*] MOH-OPSOUND-WAV  
	[*] MOH-OPSOUND-ULAW 
	[*] MOH-OPSOUND-ALAW 
	[*] MOH-OPSOUND-GSM
Extras Sound Packages
	[*] EXTRA-SOUNDS-EN-WAV
	[*] EXTRA-SOUNDS-EN-ULAW
	[*] EXTRA-SOUNDS-EN-ALAW
	[*] EXTRA-SOUNDS-EN-GSM
Applications - добавить
	[*] app_macro

Save & Exit
sudo make

По завершении должны получить:

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

По завершении должны получить:

 +---- Asterisk Installation Complete -------+
 +                                           +
 +    YOU MUST READ THE SECURITY DOCUMENT    +
 +                                           +
 + Asterisk has successfully been installed. +
 + If you would like to install the sample   +
 + configuration files (overwriting any      +
 + existing config files), run:              +
 +                                           +
 + For generic reference documentation:      +
 +    make samples                           +
 +                                           +
 + For a sample basic PBX:                   +
 +    make basic-pbx                         +
 +                                           +
 +                                           +
 +-----------------  or ---------------------+
 +                                           +
 + You can go ahead and install the asterisk +
 + program documentation now or later run:   +
 +                                           +
 +               make progdocs               +
 +                                           +
 + **Note** This requires that you have      +
 + doxygen installed on your local system    +
 +-------------------------------------------+
sudo make samples && \
sudo make config && \
sudo 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 && sudo chown -R asterisk.asterisk /var/{lib,log,spool}/asterisk && sudo chown -R asterisk.asterisk /usr/lib/asterisk
sudo sed -i 's/#AST_USER="asterisk"/AST_USER="asterisk"/' /etc/default/asterisk && sudo sed -i 's/#AST_GROUP="asterisk"/AST_GROUP="asterisk"/' /etc/default/asterisk && sudo sed -i 's/;runuser = asterisk/runuser = asterisk/' /etc/asterisk/asterisk.conf && sudo sed -i 's/;rungroup = asterisk/rungroup = asterisk/' /etc/asterisk/asterisk.conf && \
sed -i 's";\[radius\]"\[radius\]"g' /etc/asterisk/cdr.conf && \
sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cdr.conf && \
sed -i 's";radiuscfg => /usr/local/etc/radiusclient-ng/radiusclient.conf"radiuscfg => /etc/radcli/radiusclient.conf"g' /etc/asterisk/cel.conf
sudo systemctl restart asterisk && sudo systemctl enable asterisk && sudo systemctl status asterisk

Проверяем доступность

sudo asterisk -rv

Открываем необходимые порты tcp 5060,5061.

MariaDB
sudo apt -y install mariadb-server mariadb-client && \
sudo systemctl start mariadb && \
sudo systemctl enable mariadb && \
sudo mysql_secure_installation

root SQL password - СЛОЖНЫЙ ПАРОЛЬ_РУТА - генерируем и записываем.

Node.JS Debian 11
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg && sudo mkdir -p /etc/apt/keyrings && \
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && NODE_MAJOR=20 && \
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && \
sudo apt-get update && sudo apt-get install nodejs -y
Node.JS Debian 12
sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg && \
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
NODE_MAJOR=20 && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo \
tee /etc/apt/sources.list.d/nodesource.list && sudo apt-get update && sudo apt-get install nodejs -y
Apache2
sudo apt -y install apache2 && \
sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig && \
sudo sed -i 's/export APACHE_RUN_USER=www-data/export APACHE_RUN_USER=asterisk/' /etc/apache2/envvars && \
sudo sed -i 's/export APACHE_RUN_GROUP=www-data/export APACHE_RUN_GROUP=asterisk/' /etc/apache2/envvars && \
sudo sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf && \
sudo rm -f /var/www/html/index.html && \
sudo unlink  /etc/apache2/sites-enabled/000-default.conf
PHP 7.4 Debian 11
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2 && \
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list && \
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add - && \
sudo apt remove php* && sudo apt install -y php7.4-{mysql,cli,common,imap,ldap,xml,fpm,curl,mbstring,zip,gd,gettext,xml,json} libapache2-mod-php7.4 && \
sudo sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php/7.4/apache2/php.ini && \
sudo sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php/7.4/cli/php.ini && \
sudo sed -i 's/\(^memory_limit = \).*/\1256M/' /etc/php/7.4/apache2/php.ini && \
sudo apt install -y sox mpg123 lame ffmpeg sqlite3 git unixodbc dirmngr postfix  odbc-mariadb pkg-config libicu-dev
PHP 7.4 Debian 12
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2 wget curl && \
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg && \
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list && \
sudo apt update && sudo apt install -y php7.4 libapache2-mod-php7.4 && sudo apt install -y php7.4-{mysql,cli,common,imap,\
ldap,xml,fpm,curl,mbstring,zip,gd,gettext,xml,json} && \
sudo sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php/7.4/apache2/php.ini && \
sudo sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php/7.4/cli/php.ini && \
sudo sed -i 's/\(^memory_limit = \).*/\1256M/' /etc/php/7.4/apache2/php.ini && \
sudo apt install -y sox mpg123 lame ffmpeg sqlite3 git unixodbc dirmngr postfix  odbc-mariadb pkg-config libicu-dev
Настраиваем ODBC
sudo tee /etc/odbcinst.ini<<EOF
[MySQL]
Description = ODBC for MySQL (MariaDB)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so
FileUsage = 1
EOF
sudo tee /etc/odbc.ini<<EOF
[MySQL-asteriskcdrdb]
Description = MySQL connection to 'asteriskcdrdb' database
Driver = MySQL
Server = localhost
Database = asteriskcdrdb
Port = 3306
Socket = /var/run/mysqld/mysqld.sock
Option = 3
EOF
FreePBX 16
cd /usr/src && sudo wget http://mirror.freepbx.org/modules/packages/freepbx/7.4/freepbx-16.0-latest.tgz && \
sudo tar xfz freepbx-16.0-latest.tgz && sudo rm -f freepbx-16.0-latest.tgz && \
cd freepbx && sudo systemctl stop asterisk && sudo ./start_asterisk start

Подключаемся к БД и настраиваем (вставляем записанный ранее пароль)

sudo ./install -n --dbuser root --dbpass "СЛОЖНЫЙ ПАРОЛЬ_РУТА"
sudo tee /etc/systemd/system/freepbx.service<<EOF
[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
EOF
sudo systemctl daemon-reload && sudo systemctl enable freepbx
sudo fwconsole ma disablerepo commercial && \
sudo fwconsole ma installall && \
sudo fwconsole ma delete firewall && \
sudo fwconsole reload && \
sudo fwconsole restart && \
sudo a2enmod rewrite && \
sudo systemctl restart apache2

Если нет записей в CDR-reports, то выполняем следующие команды:

cd /tmp && wget https://wiki.freepbx.org/download/attachments/202375584/libssl1.0.2_1.0.2u-1_deb9u4_amd64.deb && \
wget https://wiki.freepbx.org/download/attachments/122487323/mariadb-connector-odbc_3.0.7-1_amd64.deb && \
sudo dpkg -i libssl1.0.2_1.0.2u-1_deb9u4_amd64.deb mariadb-connector-odbc_3.0.7-1_amd64.deb && \
sudo apt install -f && ln -s /usr/local/lib/libmaodbc.so /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so
Установка дополнительного модуля FreePBX

Как пример устанавливаю модуль asterisk-cli

sudo fwconsole ma download asterisk-cli && sudo fwconsole ma install asterisk-cli
Кастомизация меню

Внимание: после переноса пункта меню во вновь созданное он перестанет отображаться в старом месте.

Для кастомизации создаем/редактируем следующий файл:

nano /etc/asterisk/freepbx_menu.conf

Содержимое как пример: создал дополнительное меню "Главное".

cat freepbx_menu.conf  
[extensions]
category=Главное
name=Внутренние номера

[trunks]
category=Главное
name=Линии к провайдеру

[did]
category=Главное
name=Входящие маршруты

[routing]
category=Главное
name=Исходящие маршруты

[asteriskinfo]
category=Главное
name=Статус Asterisk

[cli]
category=Главное
name=Cli

[logfiles]
category=Главное
name=Логи

Убеждаемся, что в разделе Settings → Advanced Settings:

  • параметр Use freepbx_menu.conf Configuration выставлен в Yes;
  • Display Readonly Settings и Override Readonly Settings тоже выставлены в Yes.

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

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

Поддержка русского языка
sudo locale-gen ru_RU && sudo locale-gen ru_RU.UTF8 && sudo dpkg-reconfigure locales

Добавляю строку в файл:

sudo nano /etc/profile
export LC_ALL="en_US.UTF-8"
source /etc/profile

вместо: russian ru_RU.ISO-8859-5
изменяю на: russian ru_RU.UTF-8

sudo nano /etc/locale.alias

После выбора Russian в меню Language я получаем русификацированный интерфейс.

Видеосвязь

Переходим Settings - Asterisk SIP settings. В самом последнем разделе "Video codecs" переключаем на Enabled и активируем кодеки h264 и vp8.
Можем откорректировать необходимый битрейт в строке ниже.

На экстеншене (pjsip) на вкладке "Advanced" значения "Max audio streams" и "Max video streams" ставлю равные 10.

Logrotate
nano /etc/logrotate.d/freepbx
/var/log/asterisk/queue_log {
        daily
        missingok
        rotate 30
        notifempty
        sharedscripts
        create 0640 asterisk asterisk
        su asterisk asterisk
}

/var/spool/mail/asterisk {
        daily
        missingok
        rotate 7
        notifempty
        sharedscripts
        create 0660 asterisk mail
        su asterisk mail
}

/var/log/asterisk/messages
/var/log/asterisk/event_log
/var/log/asterisk/full
/var/log/asterisk/dtmf
/var/log/asterisk/fail2ban {
        daily
        missingok
        rotate 7
        notifempty
        sharedscripts
        create 0640 asterisk asterisk
        su asterisk asterisk
        postrotate
                /usr/sbin/asterisk -rx 'logger reload' > /dev/null 2> /dev/null
        endscript
}
systemctl restart logrotate
Удаление старых записей

Создаем юзера в SQL и даём права на БД:

mysql
CREATE USER 'deletecdr'@'localhost' IDENTIFIED BY 'a5QW3m#ND9w#9';
GRANT DELETE, SELECT, INSERT ON asteriskcdrdb.cdr TO 'deletecdr'@'localhost';
GRANT DELETE, SELECT, INSERT ON asteriskcdrdb.cel TO 'deletecdr'@'localhost';
quit

Создаем файл скрипта

nano /etc/asterisk/delete_cdr.sh
#!/bin/bash
# Задаём переменные (Specify variables)
MYSQL_USER="deletecdr"                            # Имя пользователя MySQL (MySQL username)
MYSQL_PASSWORD="a5QW3m#ND9w#9"             # Пароль пользователя MySQL (MySQL password)
MYSQL="/usr/bin/mysql"                            # Расположение MySQL (whereis mysql)
MYSQLCHECK="/usr/bin/mysqlcheck"                  # Расположение MySQLcheck (whereis mysqlcheck)
EMAIL="admins@your.mail"                          # Почтовый адрес для уведомлений (Email address for notification)
TYPE="month"                                      # Интервал времени (SECOND,MINUTE,HOUR,DAY,MONTH,YEAR)
NUMBER="6"                                        # Количество (5 месяца) (the number 5 months)
LOG="/var/log/cdr-temp.log"                       # Лог файл перезаписываемый и отсылаемый на почту(A temporary log file is sent on email as a report)
LOG1="/var/log/cdr-clean.log"                     # Лог файл постоянный (The log file permanent)
data="`date`"

# Чистим лог от старых записей (Clean old log records from)
echo > $LOG

# Делаем запись даты в лог (The date recorded in the log)
echo >> $LOG1
echo "---------=$data=---------" >> $LOG1
echo >> $LOG1

# Чистим asteriskcdrdb.cdr (clean asterisksdrdb.cdr)
if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "delete from asteriskcdrdb.cdr where calldate < DATE_SUB(NOW(), interval $NUMBER $TYPE);"; then
echo >> $LOG1
echo Старые записи из asteriskcdrdb.cdr успешно удалены >> $LOG1
echo >> $LOG1
else
echo Не удалось удалить старые записи из asteriskcdrdb.cdr >> $LOG1
echo >> $LOG1
exit 0
fi

# Чистим asteriskcdrdb.cel (clean asteriskcdrdb.cel)
if $MYSQL -u$MYSQL_USER -p$MYSQL_PASSWORD -e "delete from asteriskcdrdb.cel where eventtime < DATE_SUB(NOW(), interval $NUMBER $TYPE);"; then
echo Старые записи из asteriskcdrdb.cel успешно удалены >> $LOG1
echo >> $LOG1
else
echo Не удалось удалить старые записи из asteriskcdrdb.cel >> $LOG1
echo >> $LOG1
exit 0
fi

# Оптимизируем asteriskcdrdb (optimize asteriskcdrdb table)
if $MYSQLCHECK -u$MYSQL_USER -p$MYSQL_PASSWORD --optimize asteriskcdrdb; then
echo База asteriskcdrdb успешно оптимизирована >> $LOG1
echo >> $LOG1
else
echo Не удалось оптимизировать базу asteriskcdrdb >> $LOG1
echo >> $LOG1
exit 0
fi

# Чистим папки от файлов записи (Records you want to delete, and empty folders)

find /recordings/ -name "*.wav*" -type f -mtime +180 -print -delete
find /recordings/ -type d -empty -print -delete

Права на выполнение:

chmod +x /etc/asterisk/delete_cdr.sh

Добавляем в крон:

nano /etc/crontab

Последней строкой добавляем:

*  *    1 * *   root    /etc/asterisk/delete_cdr.sh

Fuse

Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.