**Системные требования.** * На сервере (здесь и далее примем, что “сервером” может быть как отдельный компьютер, \\ так и виртуальная машина, 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-адреса сервера.