[Из песочницы] Сервер VoIP для небольшой компании (FreePBX 14, Asterisk 15, Ubuntu 16.04)

habr.png

Добрый день, вечер или ночь, все зависит от времени суток в который вам довелось прочитать мою статью. Начнем с начала. В нашей компании задумались о переходе на SIP и встал вопрос? как это реализовать. Были рассмотрены несколько вариантов:

  • Оставить всё как есть (сотовые телефоны);
  • Облачная АТС;
  • «Железное» решение;
  • Свой сервер VoIP.


В итоге приняли решение реализовать свой сервер VoIP.

Что мы имеем:

  • Ubuntu Server 16.04 (минимальная конфигурация), установлен на ESXi 6.5;
  • SIP от zadarma и Мегафон;
  • Сотовые телефоны с SIP клиентами.


Небольшое отступление, по пунктам:

Ubuntu 16.04 у нас являться корпоративным стандартом, сервера Ubuntu Server 16.04, как рабочая OS Ubuntu Desktop 16.04. Основной же сервер построен на базе Zentyal 5.0. Сервера и рабочие ПК устанавливаются по сети по TFTP. Если будет интересно опишу все нюансы установки Zentyal (а их приличное количество).

Аппараты решили не покупать, у каждого сотрудника есть сотовый либо на Android, либо на iOS, так, что проблем с клиентами нет, сотрудники имеют доступ к рабочему Wi-FI. Так же клиенты SIP стоят на рабочих ПК. Так же есть доступ к SIP через Интернет, безопасность тоже учтена, порты подключения изменены, пароли для SIP достаточно сложны.

Переходим к самой сути. В сети полно документации по установке FreePBX 13 на Ubuntu 16.04, А вот каr установить FreePBX 14 нету, даже официальном wiki FreePBX есть только для CentOS 7 и Debian 8.8, но было большое желание и стремление сделать задуманное.

1. Установку Ubuntu Server 16.04 описывать не буду, это просто даже для новичка.

1.1. Все манипуляции я проводил по root sudo su

2. Обновим систему: apt update && apt upgrade -y , если требуется перезагрузка, перегружаемся.

3. Займемся PHP, для FreePBX 14 необходим PHP 5.6, по умолчанию в Ubunty 16.04 идет PHP 7.0

Удаляем весь PHP, если он есть в системе:

sudo apt-get purge `dpkg -l | grep php| awk '{print $2}' |tr "\n" " "`

Устанавливаем репозиторий PHP 5.6:

sudo add-apt-repository ppa:ondrej/php

Обновляемся и устанавливаем PHP:

sudo apt-get update
sudo apt-get install php5.6

4. Mysql который идет в репозитории не совместим с FreePBX 14, нам нужна MariaDB, добавим её в репозиторий:

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://mirror.mephi.ru/mariadb/repo/10.2/ubuntu xenial main'

5. Нам так же необходим nodejs:

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

6. Установим теперь всё необходимое:

sudo apt install -y build-essential linux-headers-`uname -r` openssh-server apache2 mariadb-server mysql-client bison flex sox libncurses5-dev libssl-dev libmysqlclient-dev mpg123 libxml2-dev libnewt-dev sqlite3 libsqlite3-dev pkg-config automake libtool autoconf git subversion unixodbc-dev uuid uuid-dev libasound2-dev libogg-dev libvorbis-dev libcurl4-openssl-dev libical-dev libneon27-dev libsrtp0-dev libspandsp-dev libopus-dev opus-tools libiksemel-dev libiksemel-utils libiksemel3 xmlstarlet

sudo apt install -y php5.6 php5.6-curl php5.6-cli php5.6-mysql php5.6-odbc php5.6-db php5.6-gd php5.6-xml curl libapache2-mod-php5.6

apt install -y php-pear

6.1. Пакета libmyodbc больше нет в репозиториях Ubuntu начиная с версии Xenial.

Скачиваем нужный коннектор:

wget https://dev.mysql.com/get/Downloads/Connector-ODBC/5.3/mysql-connector-odbc-5.3.9-linux-ubuntu16.04-x86-64bit.tar.gz

Распакуем:
tar -zxvf mysql-connector-odbc-5.3.9-linux-ubuntu16.04-x86-64bit.tar.gz

И скопируем в директорию /usr/lib/x86_64-linux-gnu/odbc/:

cd mysql-connector-odbc-5.3.9-linux-ubuntu16.04-x86-64bit/lib
cp libmyodbc5* /usr/lib/x86_64-linux-gnu/odbc/

7. Теперь по рекомендациям FreePBX необходимо перезагрузиться, я этого не делал.

8. Убедимся, что mod_rewrite включен, чтобы избежать возможных атак.

a2enmod rewrite
service apache2 restart

9. Включим поддержку Console_Getopt

pear install Console_Getopt

10. Переходим к установке Asterisk 15 (фактически это часть wiki с FreePBX для Debina 8.8):

Скачиваем исходники:

cd /usr/src
wget http://sourceforge.net/projects/lame/files/lame/3.98.4/lame-3.98.4.tar.gz &&
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz &&
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz &&
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15-current.tar.gz &&
git clone https://github.com/akheron/jansson.git &&
wget http://www.pjsip.org/release/2.5.5/pjproject-2.5.5.tar.bz2

Скомпилируем и установим Lame (mp3):

cd /usr/src &&
tar zxvf lame-3.98.4.tar.gz &&
cd lame-3.98.4 &&
./configure &&
make &&
make install

Скомпилируем и установим DAHDI и LibPRI (Мы платы не используем, но кто знает, что захочется потом):

cd /usr/src &&
tar xvfz dahdi-linux-complete-current.tar.gz &&
tar xvfz libpri-current.tar.gz &&
rm -f dahdi-linux-complete-current.tar.gz libpri-current.tar.gz &&
cd dahdi-linux-complete-* &&
make all &&
make install &&
make config &&
cd /usr/src/libpri-* &&
make &&
make install

Скомпилируем и установим pjproject:

cd /usr/src &&
tar -xjvf pjproject-2.*.*.tar.bz2 &&
cd pjproject-* &&
CFLAGS='-DPJ_HAS_IPV6=1' ./configure --prefix=/usr --enable-shared --disable-sound\
--disable-resample --disable-video --disable-opencore-amr &&
make dep &&
make &&
make install

Скомпилируем и установим jansson:

cd /usr/src/jansson &&
autoreconf -i &&
./configure &&
make &&
make install

Если вы хотите использовать кодек Opus, перед началом компиляции Asterisk необходимо установить xmlstarlet:

sudo apt install xmlstarlet

Скомпилируем и установим Asterisk:

cd /usr/src &&
tar xvfz asterisk-15-current.tar.gz &&
rm -f asterisk-15-current.tar.gz &&
cd asterisk-* &&
./contrib/scripts/install_prereq install &&
./configure --with-pjproject-bundled --with-crypto --with-ssl=ssl --with-srtp &&
contrib/scripts/get_mp3_source.sh &&
make menuselect

Для себя я выбрал 'format_mp3' и 'res_config_mysql', а так же включил 'codec_opus'

Сохраняем изменения и продолжаем установку:

make &&
make install &&
make config &&
ldconfig
update-rc.d -f asterisk remove

Пока все собиралось я успел налить себе кофе и продолжил.

Настроим запуск от имени пользователя 'Asterisk'

Расcкомментируйте в /etc/default/asterisk:

AST_USER="asterisk"
AST_GROUP="asterisk"

Создаём пользователя Asterisk и задаём права пользователя:

useradd -m asterisk &&
chown asterisk. /var/run/asterisk &&
chown -R asterisk. /etc/asterisk &&
chown -R asterisk. /var/{lib,log,spool}/asterisk &&
chown -R asterisk. /usr/lib/asterisk

11. Переходим к FreePBX 14

Настроим Apache:

sed -i 's/\(^upload_max_filesize = \).*/\256M/' /etc/php/5.6/apache2/php.ini &&
sed -ie 's/\;date\.timezone\ \=/date\.timezone\ \=\ "Asia\/Yekaterinburg"/g' /etc/php/5.6/apache2/php.ini &&
cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf_orig &&
sed -i 's/^\(User\|Group\).*/\1 asterisk/' /etc/apache2/apache2.conf &&
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf &&
systemctl restart apache2

Настроим ODBC:

cat >> /etc/odbcinst.ini << EOF
[MySQL]
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmyodbc5w.so
UsageCount=2

EOF

cat >> /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:

cd /usr/src
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-14.0-latest.tgz
tar vxfz freepbx-14.0-latest.tgz
rm -f freepbx-14.0-latest.tgz
cd freepbx
touch /etc/asterisk/ari.conf
./start_asterisk start
./install -n

11.1. Для русификации FreePBX необходима локаль ru_RU.UTF-8:

echo "russian ru_RU.UTF-8" >> /etc/locale.alias
locale-gen ru_RU
systemctl restart apache2

12. Создадим скрипт запуска для systemd:

В файл /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

Активируем сервис:

systemctl enable freepbx.service

Эпилог.

На этом установка и первоначальная настройка закончена. Будут вопросы, всегда готов ответить.

© Habrahabr.ru