среда, 5 апреля 2017 г.

Установка Asterisk с FreePBX


Все команды выполнялись от прав пользователя root.



1. Устанавливаю необходимые пакеты:
apt-get install -y build-essential linux-headers-`uname -r` openssh-server apache2 mysql-server mysql-client bison flex php5 php5-curl php5-cli php5-mysql php-pear php-db php5-gd curl 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 libiksemel-dev libiksemel-utils libiksemel3 libmyodbc sudo

2. Скачиваю необходимые сырцы для установки Asterisk:
cd /usr/src
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-14-current.tar.gz

3. Распаковываю скачанное:
tar -zxvf libpri-current.tar.gz
tar -zxvf dahdi-linux-complete-current.tar.gz
tar -zxvf asterisk-14-current.tar.gz

4. Начинаю сборку и установку сырцов (собственно все как в инструкции самого Asteriska):
cd dahdi-linux-complete-2.11.1+2.11.1
make
make install
make config

cd ..
cd libpri-1.6.0
make
make install

5. До устанавливаю более новый протокол (по инструкции), наверно его можно не устанавливать, но вдруг захочется каких нибудь дополнительных настроек:
 cd ..
wget http://www.pjsip.org/release/2.4.5/pjproject-2.4.5.tar.bz2
tar -xjvf pjproject-2.4.5.tar.bz2
cd pjproject-2.4.5

5.1. Правлю готовый конфиг для его сборки:
nano pjlib/include/pj/config_site.h

Вставляю "простыню"
/*
 * Asterisk config_site.h
 */
#include


/*
 * Defining PJMEDIA_HAS_SRTP to 0 does NOT disable Asterisk's ability to use srtp.
 * It only disables the pjmedia srtp transport which Asterisk doesn't use.
 * The reason for the disable is that while Asterisk works fine with older libsrtp
 * versions, newer versions of pjproject won't compile with them.
 */
#define PJMEDIA_HAS_SRTP 0
#define PJ_HAS_IPV6 1
#define NDEBUG 1
#define PJ_MAX_HOSTNAME (256)
#define PJSIP_MAX_URL_SIZE (512)
#ifdef PJ_HAS_LINUX_EPOLL
#define PJ_IOQUEUE_MAX_HANDLES  (5000)
#else
#define PJ_IOQUEUE_MAX_HANDLES  (FD_SETSIZE)
#endif
#define PJ_IOQUEUE_HAS_SAFE_UNREG 1
#define PJ_IOQUEUE_MAX_EVENTS_IN_SINGLE_POLL (16)
#define PJ_SCANNER_USE_BITWISE  0
#define PJ_OS_HAS_CHECK_STACK   0
#define PJ_LOG_MAX_LEVEL        6
#define PJ_ENABLE_EXTRA_CHECK   1
#define PJSIP_MAX_TSX_COUNT     ((64*1024)-1)
#define PJSIP_MAX_DIALOG_COUNT  ((64*1024)-1)
#define PJSIP_UDP_SO_SNDBUF_SIZE    (512*1024)
#define PJSIP_UDP_SO_RCVBUF_SIZE    (512*1024)
#define PJ_DEBUG            0
#define PJSIP_SAFE_MODULE       0
#define PJ_HAS_STRICMP_ALNUM        0

/*
 * Do not ever enable PJ_HASH_USE_OWN_TOLOWER because the algorithm is
 * inconsistently used when calculating the hash value and doesn't
 * convert the same characters as pj_tolower()/tolower().  Thus you
 * can get different hash values if the string hashed has certain
 * characters in it.  (ASCII '@', '[', '\\', ']', '^', and '_')
 */
#undef PJ_HASH_USE_OWN_TOLOWER

/*
  It is imperative that PJSIP_UNESCAPE_IN_PLACE remain 0 or undefined.
  Enabling it will result in SEGFAULTS when URIs containing escape sequences are encountered.
*/
#undef PJSIP_UNESCAPE_IN_PLACE
#define PJSIP_MAX_PKT_LEN           6000
#undef PJ_TODO
#define PJ_TODO(x)
/* Defaults too low for WebRTC */
#define PJ_ICE_MAX_CAND 32
#define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * PJ_ICE_MAX_CAND)
/* Increase limits to allow more formats */
#define PJMEDIA_MAX_SDP_FMT   64
#define PJMEDIA_MAX_SDP_BANDW   4
#define PJMEDIA_MAX_SDP_ATTR   (PJMEDIA_MAX_SDP_FMT*2 + 4)
#define PJMEDIA_MAX_SDP_MEDIA   16


5.2. Начинаю сборку:
./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr CFLAGS='-O2 -DNDEBUG'
make dep
make
make install
ldconfig

5.3. Проверяю:
ldconfig -p | grep pj

Должно получиться что-то типа:
        libpjsua2.so.2 (libc6,x86-64) => /usr/lib/libpjsua2.so.2
        libpjsua2.so (libc6,x86-64) => /usr/lib/libpjsua2.so
        libpjsua.so.2 (libc6,x86-64) => /usr/lib/libpjsua.so.2
        libpjsua.so (libc6,x86-64) => /usr/lib/libpjsua.so
        libpjsip.so.2 (libc6,x86-64) => /usr/lib/libpjsip.so.2
        libpjsip.so (libc6,x86-64) => /usr/lib/libpjsip.so
        libpjsip-ua.so.2 (libc6,x86-64) => /usr/lib/libpjsip-ua.so.2
        libpjsip-ua.so (libc6,x86-64) => /usr/lib/libpjsip-ua.so
        libpjsip-simple.so.2 (libc6,x86-64) => /usr/lib/libpjsip-simple.so.2
        libpjsip-simple.so (libc6,x86-64) => /usr/lib/libpjsip-simple.so

6. Устанавливаю:
cd ..
git clone https://github.com/akheron/jansson.git
cd /usr/src/jansson
autoreconf -i
./configure
make
make install

cd ..
cd asterisk-14.3.0
./configure
contrib/scripts/get_mp3_source.sh

6.1. Вызываю конфигуратор:
make menuselect

И выбираю следующее:
    Add-ons: format_mp3, res_config_mysql, app_mysql и cdr_mysql.
    Core Sound Packages: русские звуки RU-WAV.
    Music On Hold File Packages: звук WAV.
    Extras Sound Packages:  английский EN-WAV, русского нет.

6.2. Собираю с учетом выбранного:
make
make install
make config

7. Скачиваю и распаковываю FreePBX:
cd..
wget http://mirror.freepbx.org/modules/packages/freepbx/freepbx-13.0-latest.tgz
tar xvfz freepbx-13.0-latest.tgz
cd freepbx

pear install Console_Getopt

7.1. Создаю управляющего пользователя и задаю права:
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

7.2. Убираю лишнее и немного конфигурирую Apache:
rm -rf /var/www/html
sed -i 's/\(^upload_max_filesize = \).*/\120M/' /etc/php5/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
service apache2 restart

7.3. Настраиваю ODBC:
cat >> /etc/odbcinst.ini << EOF
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1

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

7.4. Устанавливаю FreePBX (остановив предварительно Asterisk):
cd freepbx
/etc/init.d/asterisk stop

./start_asterisk start
   STARTING ASTERISK
   Asterisk Started

./install -n --dbpass passMySQL




7.5. Толком не разобрался, но какой-то косяк по-умолчанию, пришлось пожертвовать безопасностью, иначе попасть в веб-интерфейс не получалось:
rm -rf /var/www/html/.htaccessy
/etc/init.d/apache2 restart

8. Вводим в браузере IP сервера Asterisk и попадаем на FreePBX.