Ubuntu 14.04 + Asterisk 11 + CDR-Stats

Предлагаю пошаговое руководство по установке и настройке сервера Ubuntu, телефонной станции Asterisk и системы обработки и аналитики звонков CDR-STATS.

Установка Ubuntu


Ставим Ubuntu server 14.04 (LTS), скачав дистрибутив с официального сайта. Во время установки я указал SSH + LAMP + SAMBA во избежание потом долгого процесса установки нужных компонентов.

Логинимся на сервер. Первым делом я поставил midnight commander (люблю DOS-интерфейс, да и удобно):

sudo apt-get install mc -y

Следующий шаг вы можете пропустить, если вам не нужен GUI для сервера.

Для большего удобства и ввиду некоторых особенностей будущего сервера я накатил GUI:

sudo apt-get install --no-install-recommends lubuntu-desktop

После установки:

sudo reboot 

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

Настраиваем все необходимые сетевые интерфейсы, имена сервера и его Alias. (Примеры настроек не буду приводить, дабы не вводить людей в заблуждение).

Следующим шагом будет установка webmin на сервер. Я воспользовался официальной документацией с сайта webmin.com:
Using the Webmin APT repository
If you like to install and update Webmin via APT, edit the /etc/apt/sources.list file on your system and add the lines:

deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

You should also fetch and install my GPG key with which the repository is signed, with the commands:

cd /root
wget http://www.webmin.com/jcameron-key.asc
apt-key add jcameron-key.asc

Возможно, потребуется запустить данную команду от root

sudo apt-key add jcameron-key.asc

You will now be able to install with the commands:

sudo apt-get update
sudo apt-get install webmin

All dependencies should be resolved automatically.

После выполнения всех шагов webmin будет доступен по адресу: your-server-ip-or-name:10000

Настало время настроить правила для iptables. На просторах сети я нашел очень хорошую статью по защите сервера Asterisk с помощью iptables. Источник: blog.ls20.com/securing-your-asterisk-voip-server-with-iptables. Статья на английском, но все достаточно просто для понимания.

Теперь очень важный момент! Не импортируйте правила в iptables стандартным способом! Это не сработает:

iptables-restore < filename

Не сработает.

Необходимо выполнить следующие действия:

Найти файл /etc/iptables.up.rules и скопировать его куда-либо (так сказать, сделайте бэкап), а файл etc/iptables.up.rules заменить полученным вами в результате предыдущих действий.
Если вы все сделали правильно, то в webmin Networking/Linux Firewall вы увидите все необходимые правила. Ставлю доступные обновления для установленных компонентов:

sudo apt-get update && sudo apt-get upgrade –y && sudo reboot

Итак, сервер установлен, настроен и обновлен

Установка Asterisk

Настало время для установки asterisk. В текущей конфигурации я буду использовать Asterisk 11:

cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-11-current.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-1.4-current.tar.gz

Распакуем все это:

tar -zxvf asterisk-11-current.tar.gz
tar -zxvf dahdi-linux-complete-current.tar.gz
tar -zxvf libpri-1.4-current.tar.gz

Поставим некоторые пакеты, буде таковые не были установлены ранее:

sudo apt-get install build-essential libncurses5-dev openssl libxml2-dev

Дальше есть два пути:

1-й путь:

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

sudo /usr/src/asterisk-11.12.0/contrib/scripts/install_prereq install

Скрипт ставит все необходимые зависимости и пакеты, но очень много ненужного.

2-й путь:

Установка из исходников
Перед этим действием я сделал checkpoint на моем hyper-v сервере, во избежание так сказать:

sudo apt-get install libncurses5-dev openssl libssl-dev zlib1g zlib1g-dev mpg123 linux-headers-`uname -r` build-essential mysql-server libmysqlclient15-dev php5 php5-cli php5-mysql php5-gd php-pear apache2 curl sox bison flex cpp g++ gcc make libauthen-pam-perl libio-pty-perl libnet-ssleay-perl libxml2 libxml2-dev libaudiofile-dev subversion libsqlite3-dev

Ок. пакеты установили. Теперь самое время разобраться с установкой самого Asterisk.

Ставим DAHDI:

cd /usr/src/dahdi-linux-complete-2.10.0+2.10.0
sudo make all
sudo make install
sudo make config

Ставим LibPRI:

cd /usr/src/libpri-1.4.15
sudo make
sudo make install

Ну и сам Asterisk:

cd /usr/src/asterisk-11.12.0
./configure
sudo make menuselect

Выбираем нужные компоненты. Поскольку я собираюсь хранить CDR в базе MySQL и прикрутить web-интерфейс CDR-STATS, отмечаю, что включил модули format_mp3, app_mysql, cdr_mysql и res_config_mysql.

В остальном, за исключением звуков (а мне нужны en, en-gb и ru) все остается стандартным:

sudo make install

В процессе установки при выборе format_mp3 нужно выполнить:

contrib/scripts/get_mp3_source.sh

Продолжаем установку:

sudo make install

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

Следующий шаг samples и config. Тестовые конфиги:

sudo make samples

Для несочинения скрипта автозапуска:

sudo make config

Ффуухх! Поставили. Стартуем:

sudo asterisk start

Подключаемся:

sudo rasterisk

Проверяем версию DAHDI:

*CLI>dahdi show version

Проверяем версию LibPRI:

*CLI>pri show version
*CLI>exit

Так, поставили, посмотрели. На текущий момент asterisk запускается от пользователя root, что, как бы, не комильфо. Поэтому делаем следующее:

sudo service asterisk stop

Создаем пользователя asterisk и добавляем его в группу asterisk:

sudo adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk PBX" asterisk

Создали, меняем права на нужные каталоги:

sudo chown -R asterisk:asterisk /var/lib/asterisk
sudo chown -R asterisk:asterisk /var/log/asterisk
sudo chown -R asterisk:asterisk /var/run/asterisk
sudo chown -R asterisk:asterisk /var/spool/asterisk
sudo chown -R asterisk:asterisk /usr/lib/asterisk
sudo chown -R asterisk:asterisk /dev/dahdi
sudo chmod -R u=rwX,g=rX,o= /var/lib/asterisk
sudo chmod -R u=rwX,g=rX,o= /var/log/asterisk
sudo chmod -R u=rwX,g=rX,o= /var/run/asterisk
sudo chmod -R u=rwX,g=rX,o= /var/spool/asterisk
sudo chmod -R u=rwX,g=rX,o= /usr/lib/asterisk
sudo chmod -R u=rwX,g=rX,o= /dev/dahdi
sudo chown -R root:asterisk /etc/asterisk
sudo chmod -R u=rwX,g=rX,o= /etc/asterisk

В файле /etc/default/asterisk раскомментируем две строчки:

AST_USER=«asterisk»
AST_GROUP=«asterisk»

Запускаем asterisk:

sudo service asterisk start

Смотрим, от какого пользователя запустился Asterisk:

ps aux|grep aster

И должны увидеть подобное:
asterisk 2793 3.0 0.8 2539536 26540? Ssl 20:21 0:00 /usr/sbin/asterisk -U asterisk -G asterisk

Увидели? Значит все ок. Теперь научим asterisk писать CDR в MySQL.

Ставим для начала:

sudo apt-get install mysql-client

Логинимся в mysql:

sudo mysql -p

Enter password:
Welcome to the MySQL monitor. Commands end with; or \g.
mysql>

Создаем базу:

mysql> create database asteriskcdrdb;

Создаем в базе “asteriskcdrdb” таблицу “cdr”, вот с такой структурой:

mysql> use asteriskcdrdb;
mysql>CREATE TABLE `cdr` (
`acctid` int(11) NOT NULL AUTO_INCREMENT, 
`src` varchar(80) DEFAULT NULL, 
`dst` varchar(80) DEFAULT NULL,  
`calldate` datetime NOT NULL, 
`clid` varchar(80) DEFAULT NULL, 
`dcontext` varchar(80) DEFAULT NULL, 
`channel` varchar(80) DEFAULT NULL, 
`dstchannel` varchar(80) DEFAULT NULL, 
`lastapp` varchar(80) DEFAULT NULL, 
`lastdata` varchar(80) DEFAULT NULL, 
`duration` int(10) unsigned DEFAULT NULL, 
`billsec` int(10) unsigned DEFAULT NULL, 
`disposition` varchar(80) NOT NULL DEFAULT '', 
`amaflags` varchar(80) DEFAULT NULL, 
`accountcode` int(10) unsigned DEFAULT NULL, 
`uniqueid` varchar(32) DEFAULT NULL, 
`userfield` varchar(80) DEFAULT NULL, 
`import_cdr` tinyint(4) NOT NULL DEFAULT '0', 
PRIMARY KEY (`acctid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Создаем пользователя asterisk с паролем 'asterisk':

mysql> CREATE USER asterisk_user IDENTIFIED BY 'asterisk_password';

Теперь даем доступ для пользователя “asterisk” с паролем “asterisk″ к базе “asteriskcdrdb” только с localhost:

mysql> grant all on asteriskcdrdb.* to 'asterisk'@'localhost' identified by 'asterisk';
mysql> flush privileges;

Теперь укажем нашему Астериску писать CDR в базу. Для этого в файле “/etc/asterisk/cdr_mysql.conf” раскомментируем и меняем строчки:

[global]
hostname=localhost
dbname=asteriskcdrdb
table=cdr
password=asterisk
user=asterisk
sock=/var/lib/mysqld/mysqld.sock

Для применения изменений перезагружаем модуль cdr_mysql.so:

sudo rasterisk
*CLI>module unload cdr_mysql.so

Unloaded cdr_mysql.so
  == Unregistered 'mysql' CDR backend

*CLI> module load cdr_mysql.so

Loaded cdr_mysql.so
  == Parsing '/etc/asterisk/cdr_mysql.conf': Found
    -- Found alias start for column calldate
 Loaded cdr_mysql.so => (MySQL CDR Backend)

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

*CLI> cdr mysql status

Connected to asterisk on socket file /var/lib/mysql/mysql.sock using table cdr for 0 hours, 2 minutes, 7 seconds.
Wrote 0 records since last restart.

Если у вас такое же сообщение, то все настроено верно.

Установка CDR-STATS

Воспользуемся инструкцией. Все казалось бы просто:

wget –no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/master/install/install-cdr-stats-asterisk.sh -O install-cdr-stats-asterisk.sh
bash ./install-cdr-stats-asterisk.sh

Но, дьявол, как обычно, кроется в деталях. У вас не получится установить CDR-stats подобным образом, потому что скрипт вывалится со следующей ошибкой:

bash ./install-cdr-stats-asterisk.sh
./install-cdr-stats-asterisk.sh: line 1: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 2: !DOCTYPE: No such file or directory
./install-cdr-stats-asterisk.sh: line 3: html: No such file or directory
./install-cdr-stats-asterisk.sh: line 4: head: No such file or directory
./install-cdr-stats-asterisk.sh: line 5: title: No such file or directory
./install-cdr-stats-asterisk.sh: line 6: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 7: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 8: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 9: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 10: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 11: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 12: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 13: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 14: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 15: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 16: $'\r': command not found
./install-cdr-stats-asterisk.sh: line 17: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 18: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 19: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 20: base: No such file or directory
./install-cdr-stats-asterisk.sh: line 21: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 22: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 23: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 24: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 25: meta: No such file or directory
./install-cdr-stats-asterisk.sh: line 26: link: No such file or directory
./install-cdr-stats-asterisk.sh: line 27: syntax error near unexpected token `<'
./install-cdr-stats-asterisk.sh: line 27: `

Как мы можем увидеть, приведенный текст содержит в себе глупости вроде !DOCTYPE. Я открыл сей скрипт и увидел разное непонятное. Зато в конце сам скрипт целехонький. Выпиливаем все ненужное, оставляя только тело скрипта. Вот его текст:

Не изменяйте нижеследующий текст во избежание проблем!

#!/bin/bash
#
# CDR-Stats License
# http://www.cdr-stats.org
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Copyright (C) 2011-2012 Star2Billing S.L.
#
# The Initial Developer of the Original Code is
# Arezqui Belaid <info@star2billing.com>
#
# To download and run the script on your server :
# cd /usr/src/ ; rm install-cdr-stats-asterisk.sh ; wget --no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/master/install/install-cdr-stats-asterisk.sh -O install-cdr-stats-asterisk.sh; bash install-cdr-stats-asterisk.sh
#
BRANCH='master'
INSTALL_DIR='/usr/share/cdr_stats'
#INSTALL TYPE (ASTERISK or FREESWITCH)
INSTALL_TYPE='ASTERISK'
INSTALLMODE='GENTLE' # Set to FULL to update Selinux, Firewall, etc if not Set to GENTLE
echo ""
echo ""
echo "> > > This is only to be installed on a fresh new installation of CentOS 6.2 or Ubuntu LTS 10.04 / 12.04! < < <"
echo ""
echo "It will install CDR-Stats on your server"
echo "Press Enter to continue or CTRL-C to exit"
echo ""
read TEMP
#Get Scripts dependencies
cd /usr/src/
wget --no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/$BRANCH/install/bash-common-functions.sh -O bash-common-functions.sh
wget --no-check-certificate https://raw.github.com/Star2Billing/cdr-stats/$BRANCH/install/cdr-stats-functions.sh -O cdr-stats-functions.sh
#Include general functions
source bash-common-functions.sh
source cdr-stats-functions.sh
#Identify the OS
func_identify_os
#Request the user to accept the license
func_accept_license_mplv2
#run install menu
run_menu_cdr_stats_install

Запускаем:

bash install-cdr-stats-asterisk.sh

Cкрипт опять валится с ошибкой:
This script is only intended to run on Ubuntu LTS 10.04 / 12.04 or CentOS 6.X

Ковыряние интернета ни на секунду не приблизило меня к решению этого вопроса, поэтому я пошел другим путем. Вдумчивое курение скрипта и веществ (кофе и сигареты) навели меня на следующее решение:

cd /etc/

Открываем файл lsb-release и видим:
DISTRIB_CODENAME=trusty

Запомнили. Теперь:

cd /usr/src/

Открываем файл bash-common-functions.sh. И в нем смотрим на функцию:

func_identify_os() {

    if [ -f /etc/debian_version ] ; then
        DIST='DEBIAN'
        if [ "$(lsb_release -cs)" != "lucid" ] && [ "$(lsb_release -cs)" != "precise" ]; then
            echo "This script is only intended to run on Ubuntu LTS 10.04 / 12.04 or CentOS 6.X"
            exit 255

Видим два варианта: lucid и precise. Я выбрал precise (Ubuntu 12.04 LTS). И делаем следующее:

В файле:
/etc/lsb-release меняем trusty на precise

Далее:

cd /usr/src
bash install-cdr-stats.sh

It will install CDR-Stats on your server
Press Enter to continue or CTRL-C to exit

Жмем Enter
На вопрос:
I agree to be bound by the terms of the license — [YES/NO]

Говорим:

YES

Запускается установщик.
> CDR-Stats Installation Menu
=====================================
1) Install All
2) Install CDR-Stats Web Frontend
3) Install CDR-Stats Backend / CDR-Stats-Celery
4) Install MongoDB
0) Quit
(0-4): 1

Выбираем пункт меню номер 1. И ждем пока установится. В процессе установки будет установлена mongodb и postgresql. Далее нам будет предложено сконфигурировать подключение к MySQL:

Enter database settings for Asterisk…
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Configure Mysql Settings to connect to the Asterisk CDR database…
Enter Mysql hostname (default:localhost)
localhost
Enter Mysql port (default:3306)
3306
Enter Mysql Username (default:root)
asterisk
Enter Mysql Password (default:password)
asterisk
Enter Database name (default:asteriskcdrdb)
asteriskcdrdb
We will now add a Primary Key to your CDR database
We advice you to first backup your database prior continuing

Далее будет предложено создать супер админа для cdr-stats:
Create a super admin user…
Username (leave blank to use 'root'):
E-mail address: your-email@server.com
Password:
Password (again):
Superuser created successfully.

Завершаем установку кнопкой 0. И ура!
your-server-ip-or-name:8008
Доступен. Заходим и любуемся.

Возможно появление следующей ошибки:
No data can be found in your collections, please make sure the import of data is working correctly.

Что делаем? Останавливаем CDR-stats:

sudo service cdr-stats-celeryd stop

Заходим в mongo:

mongo

Выполняем следующие действия:

use cdr-stats;
db.monthly_analytic.remove({});
db.daily_analytic.remove({});
db.aggregate_world_report.remove({});
db.aggregate_result_cdr_view.remove({});
db.aggregate_hourly_country_report.remove({});
db.cdr_common.remove({});

Выходим: Ctrl+D
Заходим в mysql:

sudo mysql -p 

mysql> use asteriskcdrdb;
mysql> update cdr SET import_cdr = 0;

Query OK, 0 rows affected (0.24 sec)
Rows matched: 3 Changed: 0 Warnings: 0

У меня на текущий момент было 3 записи в CDR. Выходим из mysql: Ctrl+C

cd /usr/share/cdr-stats

Открываем файл settings_local.py и ищем строку:

LOCAL_SWITCH_IP = "некое значение"

Меняем его на 'localhost':

LOCAL_SWITCH_IP = 'localhost'

Сохраняем изменения и запускаем cdr-stats:

sudo service cdr-stats-celeryd start

your-server-ip-or-name:8008

И все начинает работать.

Еще один важный момент! Если у вас несколько провайдеров телефонии или вы используете нестандартные префиксы выхода на городскую или международную линию, то необходимо в cdr-stats указать их. Делается это вот тут:

/usr/share/cdr-stats/setting_local.py

Строка:
PREFIX_TO_IGNORE = "+,00,000,0000,00000,011,55555,99999"

Не изменяйте текущие значения, оставьте как есть, и добавьте ваши в конец строки
Например, вот так:

PREFIX_TO_IGNORE = "+,00,000,0000,00000,011,55555,99999,8,810,9,910" 

Сохраните изменения в файле и перезапустите cdr-stats:

sudo service cdr-stats-celeryd restart

Теперь CDR-STATS будет корректно обрабатывать все звонки, в чем вы сможете убедиться, посетив соответствующий пункт меню.
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 16
  • 0
    sudo apt-get install --no-install-recommends lubuntu-desktop

    можно ещё сборник рецептов поставить, в нём наверняка будет «рецепт» «Asterisk on Ubuntu»
    • 0
      Это да, можно еще научить варить кофе.
      На деле, позднее оказалось, что десктоп на серверной убунте не нужен.
      Издержки производства.
    • +3
      Привет вам из 2017 года!
      У нас LTS для убунты уже «Ubuntu 16.04.2 LTS» и Asterisk версии 14.4 вышел!
      • 0
        Ту да, ман полуторалетней давности, но полезен по-прежнему.
        • 0
          Привет из середины 2016 года.
          В данном случае речь идет не в точности о последней версии продукта, а о подводных камнях, коих остается достаточно много при попытках подружить тот или иной сервис с телефонией.
          К счастью, asterisk 14 не является LTS-release.
          Ubuntu апгрейдится двумя командами.

        • +1

          Зачем вам DAHDI и LibPRI, если нет карты для которой они нужны?
          Или hyper-v уже научили пробрасывать pci устройства в виртуалку?

          • 0
            DAHDI и LibPRI были и остаются нужны исключительно для конференций.
            • 0
              Насколько помню с 10-той версии Asterisk данные модули не нужны для конференций, это в старых версиях через них шла синхронизация.
              • 0
                ConfBridge не хочет ни DAHDI ни LibPRI.
            • +3
              Трогательная история о том, как кто-то поставил с ошибками устаревший софт и прикрутил на него какой-то костыль, подперев десятком других костылей.
              Причем невозможно выяснить, что это за костыль и для чего вообще он, потому что сайт cdr-stats.org лежит.
              Божественно.
              • 0
                Некромантия во всей свой красе.
                Сайт не лежит :)
                • 0
                  Ну если пустая страница и крутящийся занчок загрузки это не лежит, то да. Формально, конечно, я 404 не получил :)
              • +1
                DAHDI и LibPRI не нужны ни для чего вообще, конференции работают без них и в 11 и во всех последующих
                • 0
                  почему бы вам не оформить ваши изыскания в виде скриптов и докерфайла, где будут описаны все выполняемые команды и скрипты?
                  плюс положить в репо на гитхаб. тогда можно будет скачать и быстро запустить.
                  а так «делать по мануалу»? ну нет, спасибо. ошибки не минуемы ))
                  • 0
                    Не понимаю, зачем ставить на Ubuntu Asterisk? Это как в ногу себе выстрелить.
                    • 0
                      Вообще нет. Это так не работает. Если не делать ненужных вещей, кои в статье присутствуют, то в целом получается вполне сносно работающая система, не требующая вмешательства от слова совсем.

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