**Системные требования.**
* На сервере (здесь и далее примем, что “сервером” может быть как отдельный компьютер, \\ так и виртуальная машина, VPS/VDS и т .д. \\ Также отметим: docker-контейнер с локальной версией системы статистики может быть запущен как на том же сервере, что и АТС Asterisk, так и на отдельном сервере) должна быть установлена операционная система Linux семейства Debian не ниже 10.0 (Ubuntu 18.04 и выше), CentOS не ниже 7 или другие дистрибутивы с актуальной базой репозиториев.
* IP АТС Asterisk должна быть версии не ниже 1.8. \\ На Asterisk должна быть настроена запись информации о разговорах в таблицы cel, cdr и queue_log, подробную информацию о необходимых настройках Asterisk вы найдете ниже в разделе "Настройки Asterisk".
* Сервер БД MySQL не ниже версии 5.5.
* Docker версии 1.7.1 и выше (версии ниже нужно проверять дополнительно). \\ Установка docker в различных ОС подробно расписана в официальной документации: \\ [[https://docs.docker.com/engine/install/debian/|Debian]], [[https://docs.docker.com/engine/install/ubuntu/|Ubuntu]], [[https://docs.docker.com/engine/install/centos/|CentOS]]. \\ Для установки в FreePBX 13 можете воспользоваться [[https://wiki.fetg.uz/doku.php?id=установка_docker_на_freepbx_13_centos_6.6|нашей инструкцией]]
==== Настройка ====
Часть шагов по конфигурированию вам поможет сделать установщик, ссылку для скачивания которого пришлют наши инженеры после оплаты\\
Скачайте, запустите и следуйте его инструкциям.\\
В данном [[https://youtu.be/eYNTPAa06U4|видео]] представлен пример работы установщика на АТС FreePBX \\
По завершению его работы вам будет предоставлена ссылка для входа в web-интерфейс, но настройка не завершена - нужно выполнить еще несколько манипуляций:\\
- Инсталлируем необходимые пакеты (для примера в Debian/Ubuntu) aptitude install unixodbc-dev libmyodbc
- Asterisk должен быть собран со следующими опциями {{::9d37fd2a5c08439f8a69fe81a398891c.png?400|}}{{::34d0b50241d3443d827afa222aede0f4.png?400|}}
- Далее редактируем несколько конфиг-файлов:\\ **/etc/asterisk/res_odbc.conf** [asterisk]
enabled => yes
dsn => MySQL-asterisk
username => asterisk_user
password => 232d2edxse3e
**/etc/asterisk/cdr_adaptive_odbc.conf** [cdr_adaptive_connection]
connection=asterisk
table=cdr
alias start => calldate
**/etc/odbc.ini** [MySQL-asterisk]
Description = MySQL Asterisk database
;Trace = Off
;TraceFile = stderr
Driver = MySQL
Server = localhost
User = asterisk_user
Password = 232d2edxse3e
;Port = 3306
Socket = /var/run/mysqld/mysqld.sock
Database = asterisk
Charset = utf8
**/etc/odbcinst.ini** [MySQL]
Description = MySQL driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
CPTimeout =
CPReuse =
в конец **/etc/asterisk/cdr_mysql.conf** добавить alias filename => filename
- Внесем в **/etc/asterisk/extconfig.conf** queue_log => odbc,asterisk
- **cel.conf** выглядит так [general]
enable=yes
apps=all
events=all
dateformat = %F %T
[manager]
[radius]
- **cel_odbc.conf** [asterisk]
connection=asterisk
table=cel
loguniqueid=yes
charset=utf8
- Проверим все ли в порядке с подключением Asterisk к MySQL *CLI> odbc show asterisk
ODBC DSN Settings
-----------------
Name: asterisk
DSN: MySQL-asterisk
Last connection attempt: 1970-01-01 07:00:00
Pooled: No
Connected: Yes
- И последним (далеко не в плане значимости) шагом будет настройка диалплана для записи разговоров. Ниже приведен пример макроса для синтаксиса AEL (**extensions.ael**) globals {
WAV=/var/calls; //Временный каталог с WAV
MP3=/var/calls; //Куда выгружать mp3 файлы
RECORDING=1; // Запись, 1 - включена.
};
macro recording (calling,called) {
if ("${RECORDING}" = "1"){
Set(CUTTEDCHANNEL=${CUT(CHANNEL,,1)});
Set(CUTTEDCHANNEL=${CUT(CUTTEDCHANNEL,/,2)});
Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
System(mkdir -p ${MP3}/${datedir});
System(mkdir -p ${WAV}/${datedir});
Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3");
Set(CDR(filename)=${fname}.mp3);
Set(CDR(recordingfile)=${fname}.wav);
Set(CDR(realdst)=${called});
Set(CDR(realsrc)=${calling});
ExecIf($["${calling:-10:10}" = "${called:-10:10}"]?Set(CDR(realsrc)=${CUTTEDCHANNEL}));
MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});
};
};
_XXXXXX => {
&recording(${CALLERID(number)},${EXTEN});
Dial(SIP/83843${EXTEN}@multifon,180,tT);
HangUP();
} // end of _XXXXXX
\\ В данном примере файлы записей разговоров попадают прямиков в **/var/calls**, где имеют следующую иерархию \\ ls /var/calls/2016/ -l
total 24
drwxr-xr-x 19 asterisk asterisk 4096 May 31 10:10 05
drwxr-xr-x 30 asterisk asterisk 4096 Jun 30 10:02 06
drwxr-xr-x 31 asterisk asterisk 4096 Jul 31 10:18 07
drwxr-xr-x 31 asterisk asterisk 4096 Aug 31 09:00 08
drwxr-xr-x 26 asterisk asterisk 4096 Sep 26 09:51 09
- Если вам ближе стандартный синтаксис, обратите внимание на следующий макрос [globals]
WAV=/records
MP3=/records/mp3
FETGRURECORDING=1
[macro-fetg.uz-record]
exten => s,1,NoOp(== START macro-fetg.uz-record ==)
same => n,Set(CallerID=${ARG1})
same => n,Set(CalleeID=${ARG2})
same => n,Set(CUTTEDCHANNEL=${CUT(CHANNEL,,1)})
same => n,Set(CUTTEDCHANNEL=${CUT(CUTTEDCHANNEL,/,2)})
same => n,NoOp(CalleeID=${CalleeID}, CallerID=${CallerID})
same => n,NoOp(FETGRURECORDING = ${FETGRURECORDING})
same => n,GotoIf($["${FETGRURECORDING}" = "0"]?end)
same => n,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${CallerID}-${CalleeID})
same => n,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)})
same => n,System(mkdir -p ${MP3}/${datedir})
same => n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3")
same => n,Set(CDR(filename)=${fname}.mp3)
same => n,Set(CDR(realdst)=${CalleeID})
same => n,Set(CDR(realsrc)=${CallerID})
same => n,ExecIf($["${CallerID:-10:10}" = "${CalleeID:-10:10}"]?Set(CDR(realsrc)=${CUTTEDCHANNEL}))
same => n,MixMonitor(${WAV}/${fname}.wav,b,${monopt})
same => n(end),MacroExit()
;пример использования
[from-internal-custom]
;include => from-internal
exten => _XX.,1, Macro(fetg.uz-record,${CALLERID(number)},${EXTEN})
[from-pstn-custom]
exten => _XX.,1, Macro(fetg.uz-record,${CALLERID(number)},${EXTEN})
- Или у вас внезапно lua
WAV = "/opt/records/wav" -- Временный каталог с WAV
MP3="/opt/records/mp3" --Куда выгружать mp3 файлы
RECORDING=1 -- 1 - запись включена.
function recording(calling,called)
if RECORDING == 1 then
fname = channel.UNIQUEID:get() .. "-" .. channel.STRFTIME("${EPOCH},,%Y-%m-%d-%H_%M".."-"..calling.."-"..called):get()
datedir = channel.STRFTIME("${EPOCH},,%Y/%m/%d"):get().."/"
os.execute("mkdir -p " .. WAV.."/"..datedir)
os.execute("mkdir -p " .. MP3.."/"..datedir)
WAVfname = WAV..datedir..fname..".wav"
MP3fname = MP3..datedir..fname..".mp3"
channel.CDR("filename"):set(MP3fname)
channel.CDR("realdst"):set(called)
channel.CDR("realsrc"):set(calling)
monopt = string.format("nice -n 19 /usr/bin/lame -b 32 --silent %s %s && rm -f %s && chown o+r %s",WAVfname,MP3fname,WAVfname,MP3fname)
app.mixmonitor(WAVfname,b,monopt)
return
end;
end;
extensions = {
["local"] = {
--локальные вызовы на номера XXX
["_XXX"] = function(context,extension)
app.answer()
recording(channel.CALLERID("num"):get(),extension)
app.dial("SIP/"..extension,300,"t")
app.hangup()
end;
};
}
- Для входа в систему статистики используйте email/пароль, которые сообщат вам инженеры технической поддержки.
\\
На этом настройка завершена, приятного пользования! \\ По любым вопросам/неполадкам/пр. пишите нам на или прямо из интерфейса, в меню Help Desk.
**Некоторые замечания по части MySQL.**
- В ходе своей работы установщик подключается к БД Asterisk, для чего ему необходимы имя пользователя и пароль. Создать их можно, например, вот так:
mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3359
Server version: 5.5.60-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'fetguz'@'%' \
IDENTIFIED BY 'MySuperPassword111' WITH GRANT OPTION;
flush privileges;
quit
\\
- Также проверьте, что MySQL слушает не только 127.0.0.1, но и IP-адрес, по которому к нему будет обращаться система статистики. \\ За это в настройках MySQL отвечает параметр **bind-address**, проще всего закомментировать эту строку в my.cnf и перезагрузить демон MySQL, тогда сервис будет слушать все IP-адреса сервера.