Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
configure_freepbx_for_cloud_version [2017/09/06 14:40] Евгений Романенко |
configure_freepbx_for_cloud_version [2023/02/16 13:44] Евгений Романенко |
||
---|---|---|---|
Строка 2: | Строка 2: | ||
==== Вводная ==== | ==== Вводная ==== | ||
- | * Данная инструкция написана используя FreePBX версии 13.0.191.11 с Asterisk 13.14.0 на борту. \\ При возникновении каких-либо сложностей/вопросов с более ранними/поздними версиями системы, просьба написать нам на <support@vistep.ru>. | + | * Данная инструкция написана, используя FreePBX версии 13.0.191.11 с Asterisk 13.14.0 на борту. \\ При возникновении каких-либо сложностей/вопросов с более ранними/поздними версиями системы, просьба написать нам на <support@vistep.ru>. |
* Для выполнения описанных ниже действий понадобится: \\ - умение подключиться к серверу по ssh \\ - умение редактировать файлы в текстовом редакторе (nano/vim/emacs/etc) \\ - ясная голова и хорошее настроение ;-) | * Для выполнения описанных ниже действий понадобится: \\ - умение подключиться к серверу по ssh \\ - умение редактировать файлы в текстовом редакторе (nano/vim/emacs/etc) \\ - ясная голова и хорошее настроение ;-) | ||
==== Настройка ==== | ==== Настройка ==== | ||
- | В поставке по умолчанию (что называется "из коробки") FreePBX ведет БД asteriskcdrdb, а точнее табличку cdr, не совсем так, как это нужно для правильной работы системы статистики ViStep.RU. Также, она совсем не ведет записи в таблицу queue_log, что является необходимым. \\ Поэтому нам потребуется выполнить несколько шагов настройки, для достижения нужного поведения FreePBX. | + | В поставке по умолчанию (что называется "из коробки") FreePBX ведет БД asteriskcdrdb, а точнее табличку cdr, не совсем так, как это нужно для правильной работы системы статистики ViStep.RU. Также она совсем не пишет в таблицу queue_log, что является необходимым. \\ Поэтому нам потребуется выполнить несколько шагов настройки, для достижения нужного поведения FreePBX. |
- Начнем с таблицы cdr. \\ Подключимся к серверу по ssh, а затем к консоли MySQL-сервера <code bash>[root@localhost ~]# mysql asteriskcdrdb | - Начнем с таблицы cdr. \\ Подключимся к серверу по ssh, а затем к консоли MySQL-сервера <code bash>[root@localhost ~]# mysql asteriskcdrdb | ||
Welcome to the MySQL monitor. Commands end with ; or \g. | Welcome to the MySQL monitor. Commands end with ; or \g. | ||
Строка 28: | Строка 28: | ||
END $$ | END $$ | ||
DELIMITER ; | DELIMITER ; | ||
- | </code> При успешном выполнении запросов все должно выглядеть примерно вот так: {{https://i.your-admin.pro/i/db8d2543734bb135bdf8c97348a6.png}} {{https://i.your-admin.pro/i/3e7f9092a8223081d718eeff6453.png}} | + | </code> При успешном выполнении запросов все должно выглядеть примерно вот так: {{https://img.vistep.ru/i/db8d2543734bb135bdf8c97348a6.png}} {{https://img.vistep.ru/i/3e7f9092a8223081d718eeff6453.png}} |
- | - Совершим вызов и проверим, что поле filename заполняется {{https://i.your-admin.pro/i/e2659473414c0af4ae19163751fd.png}} | + | - Совершим вызов и проверим, что поле filename заполняется {{https://img.vistep.ru/i/e2659473414c0af4ae19163751fd.png}} |
- | - Теперь нам необходимо изменить логику заполнения полей dst и src в таблице cdr так, чтобы в них всегда попадали те номера, на которые/с которых поступил вызов (например, не номер оператора очереди, а наш городской номер, на который пришел вызов извне для dst или не номер транка, а номер внутреннего абонента для src). \\ Для этого отредактируем файл cdr_adaptive_odbc.conf (FreePBX не перетрет его после рестарта, поэтому можно смело его редактировать), добавив в самом низу строку <code bash>alias realdst => dst | + | - Теперь нам необходимо добавить два новых поля в таблицу cdr - realdst и realsrc, в которые будут записываться номера звонящего и назначения (например, не номер оператора очереди, а наш городской номер, на который пришел вызов извне для realdst или не номер транка, а номер внутреннего абонента для realsrc). \\ Для этого выполним sql-запросы <code sql>ALTER TABLE `cdr` ADD `realsrc` VARCHAR(80) NOT NULL DEFAULT ''; |
- | alias realsrc => src</code> В итоге он примет вид: {{https://i.your-admin.pro/i/23eeef966abc49cb214bd5795912.png}} | + | ALTER TABLE `cdr` ADD `realdst` VARCHAR(80) NOT NULL DEFAULT ''; |
- | - Дабы наши действия возымели силу, модулю cdr_adaptive_mysql.so нужно подсказать, что его конфиг изменился. Подключаемся к консоли asterisk и релоадим модуль вот так: <code bash>[root@localhost asterisk]# asterisk -r | + | UPDATE cdr SET realsrc=src; |
- | localhost*CLI> module reload cdr_adaptive_odbc.so | + | UPDATE cdr SET realdst=dst;</code> |
- | Module 'cdr_adaptive_odbc.so' reloaded successfully. | + | - Пришло время последнего, но отнюдь не маловажного шага в разрезе конфигурирования таблицы cdr - научим АТС записывать данные во вновь созданные поля. \\ \\ Отредактируйте /etc/asterisk/extensions_override_freepbx.conf, внеся в него <code>[ext-did-catchall] |
- | localhost*CLI> </code> | + | include => ext-did-catchall-custom |
- | - Пришло время последнего, но отнюдь не маловажного шага в разрезе конфигурирования таблицы cdr. \\ В web-интерфейсе FreePBX отправимся по пути "Admin-> Config Edit", где в extensions_custom.conf внесем: <code bash>[from-pstn-custom] | + | exten => _.,1,Noop(Catch-All DID Match - Found ${EXTEN} - You probably want a DID for this.) |
- | exten => _X.,1,Set(__FROMPSTNCALL=1) | + | exten => _.,n,Set(__FROM_DID=${EXTEN}) |
- | + | exten => _.,n,Set(_VISTEPRUREALDST=${FROM_DID}) | |
- | </code> А вот и скрин, для наглядности {{https://i.your-admin.pro/i/7baa56eca6c9f4b3601419245838.png}} также внесем изменения в файл extensions_override_freepbx.conf <code>[sub-record-check] | + | exten => _.,n,Set(_VISTEPRUREALSRC=${CALLERID(num)}) |
+ | exten => _.,n,Set(CDR(realsrc)=${VISTEPRUREALSRC}) | ||
+ | exten => _.,n,Set(CDR(realdst)=${VISTEPRUREALDST}) | ||
+ | exten => _.,n,Goto(ext-did,s,1) | ||
+ | |||
+ | [sub-record-check] | ||
include => sub-record-check-custom | include => sub-record-check-custom | ||
exten => s,1,GotoIf($[${LEN(${FROMEXTEN})}]?initialized) | exten => s,1,GotoIf($[${LEN(${FROMEXTEN})}]?initialized) | ||
Строка 79: | Строка 84: | ||
exten => recordcheck,n(startrec),Noop(Starting recording: ${ARG2}, ${ARG3}) | exten => recordcheck,n(startrec),Noop(Starting recording: ${ARG2}, ${ARG3}) | ||
exten => recordcheck,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) | exten => recordcheck,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes) | ||
+ | exten => recordcheck,n,ExecIF($[${LEN(${VISTEPRUREALDST})}]?NoOP():Set(CDR(realdst)=${ARG3})) | ||
+ | exten => recordcheck,n,ExecIF($[${LEN(${VISTEPRUREALSRC})}]?NoOP():Set(CDR(realsrc)=${FROMEXTEN})) | ||
exten => recordcheck,n,Set(__CALLFILENAME=${ARG2}-${ARG3}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID}) | exten => recordcheck,n,Set(__CALLFILENAME=${ARG2}-${ARG3}-${FROMEXTEN}-${TIMESTR}-${UNIQUEID}) | ||
exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},abi(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST}) | exten => recordcheck,n,MixMonitor(${MIXMON_DIR}${YEAR}/${MONTH}/${DAY}/${CALLFILENAME}.${MON_FMT},abi(LOCAL_MIXMON_ID)${MIXMON_BEEP},${MIXMON_POST}) | ||
Строка 92: | Строка 99: | ||
exten => out,1,Noop(Outbound Recording Check from ${FROMEXTEN} to ${ARG2}) | exten => out,1,Noop(Outbound Recording Check from ${FROMEXTEN} to ${ARG2}) | ||
- | exten => out,n,Set(CDR(realdst)=${ARG2}) | ||
exten => out,n,Set(CDR(realsrc)=${FROMEXTEN}) | exten => out,n,Set(CDR(realsrc)=${FROMEXTEN}) | ||
+ | exten => out,n,Set(CDR(realdst)=${ARG2}) | ||
+ | exten => out,n,Set(CUTTEDCHANNEL=${CUT(CHANNEL,,1)}) | ||
+ | exten => out,n,Set(CUTTEDCHANNEL=${CUT(CUTTEDCHANNEL,/,2)}) | ||
+ | exten => out,n,ExecIf($["${FROMEXTEN}" = "${ARG2}"]?Set(CDR(realsrc)=${CUTTEDCHANNEL})) | ||
exten => out,n,Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)}) | exten => out,n,Set(RECMODE=${DB(AMPUSER/${FROMEXTEN}/recording/out/external)}) | ||
exten => out,n,ExecIf($[!${LEN(${RECMODE})} | "${RECMODE}" = "dontcare"]?Goto(routewins)) | exten => out,n,ExecIf($[!${LEN(${RECMODE})} | "${RECMODE}" = "dontcare"]?Goto(routewins)) | ||
Строка 103: | Строка 113: | ||
exten => in,1,Noop(Inbound Recording Check to ${ARG2}) | exten => in,1,Noop(Inbound Recording Check to ${ARG2}) | ||
- | exten => in,n,Set(CDR(realdst)=${ARG2}) | ||
- | exten => in,n,Set(CDR(realsrc)=${CALLERID(number)}) | ||
exten => in,n,Set(FROMEXTEN=unknown) | exten => in,n,Set(FROMEXTEN=unknown) | ||
+ | exten => in,n,ExecIf($[${LEN(${FROM_DID})}]?Set(_VISTEPRUREALDST=${FROM_DID})) | ||
exten => in,n,ExecIf($[${LEN(${CALLERID(num)})}]?Set(FROMEXTEN=${CALLERID(num)})) | exten => in,n,ExecIf($[${LEN(${CALLERID(num)})}]?Set(FROMEXTEN=${CALLERID(num)})) | ||
+ | exten => in,n,ExecIf($[${LEN(${VISTEPRUREALDST})}]?NoOp("=== VISTEPRUREALDST has already been set ==="):Set(_VISTEPRUREALDST=${ARG2})) | ||
+ | exten => in,n,ExecIf($[${LEN(${VISTEPRUREALSRC})}]?NoOp("=== VISTEPRUREALSRC has already been set ==="):Set(_VISTEPRUREALSRC=${FROMEXTEN})) | ||
+ | exten => in,n,Set(CDR(realsrc)=${VISTEPRUREALSRC}) | ||
+ | exten => in,n,Set(CDR(realdst)=${VISTEPRUREALDST}) | ||
exten => in,n,Gosub(recordcheck,1(${ARG3},in,${ARG2})) | exten => in,n,Gosub(recordcheck,1(${ARG3},in,${ARG2})) | ||
exten => in,n,Return() | exten => in,n,Return() | ||
exten => exten,1,Noop(Exten Recording Check between ${FROMEXTEN} and ${ARG2}) | exten => exten,1,Noop(Exten Recording Check between ${FROMEXTEN} and ${ARG2}) | ||
- | exten => exten,n,Set(CDR(realdst)=${ARG2}) | + | exten => exten,n,ExecIF($[${LEN(${VISTEPRUREALDST})}]?NoOP():Set(CDR(realdst)=${ARG2})) |
- | exten => exten,n,Set(CDR(realsrc)=${FROMEXTEN}) | + | exten => exten,n,ExecIF($[${LEN(${VISTEPRUREALSRC})}]?NoOP():Set(CDR(realsrc)=${FROMEXTEN})) |
+ | exten => exten,n,Set(CDR(cnum)=${FROMEXTEN}) | ||
exten => exten,n,Set(CALLTYPE=${IF($[${LEN(${FROM_DID})}]?external:internal)}) | exten => exten,n,Set(CALLTYPE=${IF($[${LEN(${FROM_DID})}]?external:internal)}) | ||
exten => exten,n,ExecIf(${LEN(${CALLTYPE_OVERRIDE})}?Set(CALLTYPE=${CALLTYPE_OVERRIDE})) | exten => exten,n,ExecIf(${LEN(${CALLTYPE_OVERRIDE})}?Set(CALLTYPE=${CALLTYPE_OVERRIDE})) | ||
Строка 166: | Строка 180: | ||
exten => parking,n,Return() | exten => parking,n,Return() | ||
- | ;--== end of [sub-record-check] ==--; | + | ;--== end of [sub-record-check] ==--;</code> \\ после чего выполните команду <code>dialplan reload</code> в консоли Asterisk \\ **Код проверен на FreePBX 13.0.191.11 и 14.0.2.10** \\ Если мажорная (13 в данном примере) версия FreePBX у вас отличается, то контекст [sub-record-check] может быть немного другим. Напишите нам на <support@vistep.ru> и мы поможем с написанием диалплана данного контекста. |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | [macro-exten-vm] | + | |
- | include => macro-exten-vm-custom | + | |
- | exten => s,1,Macro(user-callerid,) | + | |
- | exten => s,n,ExecIF(${FROMPSTNCALL}?Set(CDR_PROP(disable)=true):Set(CDR(realdst)=${EXTEN})) | + | |
- | exten => s,n,Set(RingGroupMethod=none) | + | |
- | exten => s,n,Set(__EXTTOCALL=${ARG2}) | + | |
- | exten => s,n,Set(__PICKUPMARK=${ARG2}) | + | |
- | exten => s,n,Set(RT=${IF($["${ARG1}"!="novm" | "${DB(CFU/${EXTTOCALL})}"!="" | "${DB(CFB/${EXTTOCALL})}"!="" | "${ARG3}"="1" | "${ARG4}"="1" | "${ARG5}"="1"]?${RINGTIMER}:)}) | + | |
- | exten => s,n,ExecIf($[$["${REDIRECTING(reason)}" = "send_to_vm" | "${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_send_to_vm"] & "${ARG1}" != "novm"]?Macro(vm,${ARG1},DIRECTDIAL,${IVR_RETVM})) | + | |
- | exten => s,n,ExecIf($[$["${REDIRECTING(reason)}" = "send_to_vm" | "${SIP_HEADER(X-Digium-Call-Feature)}" = "feature_send_to_vm"] & "${ARG1}" != "novm"]?MacroExit()) | + | |
- | exten => s,n(checkrecord),Gosub(sub-record-check,s,1(exten,${EXTTOCALL},dontcare)) | + | |
- | exten => s,n,GotoIf($["${CUT(CHANNEL,@,2):5:5}"="queue"|"${AMPUSER}"=""|${LEN(${FROM_DID})}|"${DB(AMPUSER/${EXTTOCALL}/answermode)}"!="intercom"|${LEN(${BLINDTRANSFER})}|"${EXTENSION_STATE(${EXTTOCALL})}"!="NOT_INUSE"|"${CC_RECALL}"!=""]?macrodial) | + | |
- | exten => s,n,Set(INTERCOM_EXT_DOPTIONS=${DIAL_OPTIONS}) | + | |
- | exten => s,n,Set(INTERCOM_RETURN=TRUE) | + | |
- | exten => s,n,Gosub(ext-intercom,*80${EXTTOCALL},1()) | + | |
- | exten => s,n,Set(INTERCOM_RETURN=) | + | |
- | exten => s,n,Set(INTERCOM_EXT_DOPTIONS=) | + | |
- | exten => s,n(macrodial),GosubIf($["${INTERCOM_CALL}"="TRUE" & ${LEN(${BLINDTRANSFER})}]?clrheader,1()) | + | |
- | exten => s,n,Macro(dial-one,${RT},${DIAL_OPTIONS},${EXTTOCALL}) | + | |
- | exten => s,n,Set(SV_DIALSTATUS=${DIALSTATUS}) | + | |
- | exten => s,n(calldocfu),GosubIf($[("${SV_DIALSTATUS}"="NOANSWER"|"${SV_DIALSTATUS}"="CHANUNAVAIL") & "${DB(CFU/${EXTTOCALL})}"!="" & "${SCREEN}"=""]?docfu,1()) | + | |
- | exten => s,n(calldocfb),GosubIf($["${SV_DIALSTATUS}"="BUSY" & "${DB(CFB/${EXTTOCALL})}"!="" & "${SCREEN}"=""]?docfb,1()) | + | |
- | exten => s,n,Set(DIALSTATUS=${SV_DIALSTATUS}) | + | |
- | exten => s,n,ExecIf($[("${DIALSTATUS}"="NOANSWER"&"${ARG3}"="1")|("${DIALSTATUS}"="BUSY"&"${ARG4}"="1")|("${DIALSTATUS}"="CHANUNAVAIL"&"${ARG5}"="1")]?MacroExit()) | + | |
- | exten => s,n,GotoIf($["${ARG1}"="novm"]?s-${DIALSTATUS},1) | + | |
- | exten => s,n,Macro(vm,${ARG1},${DIALSTATUS},${IVR_RETVM}) | + | |
- | + | ||
- | exten => docfu,1(docfu),ExecIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG3}"="1")]?StackPop()) | + | |
- | exten => docfu,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG3}"="1")]?from-internal,${DB(CFU/${EXTTOCALL})},1) | + | |
- | exten => docfu,n,Set(RTCF=${IF($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="0"]?${RT}:${DB(AMPUSER/${EXTTOCALL}/cfringtimer)})}) | + | |
- | exten => docfu,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I)) | + | |
- | exten => docfu,n,Dial(Local/${DB(CFU/${EXTTOCALL})}@from-internal/n,${RTCF},${DIAL_OPTIONS}) | + | |
- | exten => docfu,n,Return() | + | |
- | + | ||
- | exten => docfb,1(docfu),ExecIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG4}"="1")]?StackPop()) | + | |
- | exten => docfb,n,GotoIf($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="-1"|("${ARG1}"="novm"&"${ARG4}"="1")]?from-internal,${DB(CFB/${EXTTOCALL})},1) | + | |
- | exten => docfb,n,Set(RTCF=${IF($["${DB(AMPUSER/${EXTTOCALL}/cfringtimer)}"="0"]?${RT}:${DB(AMPUSER/${EXTTOCALL}/cfringtimer)})}) | + | |
- | exten => docfb,n,ExecIf($["${DIRECTION}" = "INBOUND"]?Set(DIAL_OPTIONS=${STRREPLACE(DIAL_OPTIONS,T)}I)) | + | |
- | exten => docfb,n,Dial(Local/${DB(CFB/${EXTTOCALL})}@from-internal/n,${RTCF},${DIAL_OPTIONS}) | + | |
- | exten => docfb,n,Return() | + | |
- | + | ||
- | exten => clrheader,1,ExecIf($[${LEN(${SIPURI})}&"${SIPURI}"="${SIP_URI_OPTIONS}"]?Set(SIP_URI_OPTIONS=)) | + | |
- | exten => clrheader,n,ExecIf($[${LEN(${ALERTINFO})}]?SIPRemoveHeader(${ALERTINFO})) | + | |
- | exten => clrheader,n,ExecIf($[${LEN(${CALLINFO})}]?SIPRemoveHeader(${CALLINFO})) | + | |
- | exten => clrheader,n,Return() | + | |
- | + | ||
- | exten => s-BUSY,1,GotoIf($["${IVR_RETVM}"="RETURN" & "${IVR_CONTEXT}"!=""]?exit,1) | + | |
- | exten => s-BUSY,n,Playtones(busy) | + | |
- | exten => s-BUSY,n,Busy(20) | + | |
- | + | ||
- | exten => _s-!,1,GotoIf($["${IVR_RETVM}"="RETURN" & "${IVR_CONTEXT}"!=""]?exit,1) | + | |
- | exten => _s-!,n,Playtones(congestion) | + | |
- | exten => _s-!,n,Congestion(10) | + | |
- | + | ||
- | exten => exit,1,Playback(beep&line-busy-transfer-menu&silence/1) | + | |
- | exten => exit,n,MacroExit() | + | |
- | + | ||
- | ;--== end of [macro-exten-vm] ==--;</code> В завершении кликнем Save, затем Apply Config, позвоним на АТС, с АТС вовне и проверим корректность заполнения поля dst. | + | |
- С cdr разобрались, дело за queue_log. Эта таблица нужна нам для того, чтобы понимать какие события происходили в очередях Asterisk. Перво-наперво создадим ее <code sql>CREATE TABLE `queue_log` ( | - С cdr разобрались, дело за queue_log. Эта таблица нужна нам для того, чтобы понимать какие события происходили в очередях Asterisk. Перво-наперво создадим ее <code sql>CREATE TABLE `queue_log` ( | ||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, | `id` int(10) unsigned NOT NULL AUTO_INCREMENT, | ||
Строка 244: | Строка 196: | ||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;</code> | ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;</code> | ||
- Научим FreePBX(читай Asterisk) писать туда все то, что нам нужно. \\ Отправляемся в web-интерфейс по знакомой дорожке и создаем новый файл под именем **extconfig.conf**, кликнув Add New File. \\ Внести в него нужно лишь одну строчку <code bash>[settings] | - Научим FreePBX(читай Asterisk) писать туда все то, что нам нужно. \\ Отправляемся в web-интерфейс по знакомой дорожке и создаем новый файл под именем **extconfig.conf**, кликнув Add New File. \\ Внести в него нужно лишь одну строчку <code bash>[settings] | ||
- | queue_log => odbc,asteriskcdrdb</code> Скрин: {{https://i.your-admin.pro/i/5347bc8b8a5a1f66dd9c87a7c980.png}} *не забываем про Save и Apply Configs \\ После выполнения данных действий и совершения звонков в очереди, запрос из консоли mysql <code sql>select * from queue_log;</code> должен вернуть вам нечто подобное {{https://i.your-admin.pro/i/7d2a89142a30ddd7ea0c36e2443b.png}} *на запрос в скрине не ориентируйтесь, там я специально добавил условие, чтобы сократить выхлоп | + | queue_log => odbc,asteriskcdrdb</code> Скрин: {{https://img.vistep.ru/i/5347bc8b8a5a1f66dd9c87a7c980.png}} *не забываем про Save и Apply Configs \\ После выполнения данных действий и совершения звонков в очереди, запрос из консоли mysql <code sql>select * from queue_log;</code> должен вернуть вам нечто подобное {{https://img.vistep.ru/i/7d2a89142a30ddd7ea0c36e2443b.png}} *на запрос в скрине не ориентируйтесь, там я специально добавил условие, чтобы сократить выхлоп |
- | - С препарированием нашей АТС по части БД закончили! \\ Переходим к настройке синхронизации БД и файлов записей разговоров в облако ViStep.RU. \\ После того, как вы получите ссылку для входа в систему, логин и пароль, вам необходимо авторизироваться и кликнуть меню "Настройки->Основные" \\ В скринах это будет выглядеть так: {{https://i.your-admin.pro/i/37d973a33476853c1ec5572739b8.png}} {{https://i.your-admin.pro/i/df31b32f5c79d79b3d5e754a9e7d.png}} | + | - С препарированием нашей АТС по части БД закончили! \\ Переходим к настройке синхронизации БД и файлов записей разговоров в облако ViStep.RU. Для этого воспользуйтесь инструкцией - https://wiki.vistep.ru/doku.php?id=cloud_daemon_sync |
- | - Укажите путь к файлам записей разговоров (в FreePBX это обычно /var/spool/asterisk/monitor/) и нажмите кнопку "Сохранить", после чего появится возможность скачать архив со скриптом синхронизации {{https://i.your-admin.pro/i/d50e6f2d0cc49e4928408647a656.png}} | + | - Для входа в систему статистики используйте данные авторизации (Email-адрес/Пароль) из регистрационного письма. |
- | - Заугрузите на сервер скачанный архив в папку /opt (например, используя scp или FileZilla) | + | |
- | - Далее просто листинг команд, дабы не перегружать текст <code bash>[root@localhost ~]# cd /opt/ | + | |
- | [root@localhost opt]# mkdir -p stat.vistep.ru | + | |
- | [root@localhost opt]# mv Fb38f1218c6.zip stat.vistep.ru/ | + | |
- | [root@localhost opt]# cd stat.vistep.ru/ | + | |
- | [root@localhost stat.vistep.ru]# unzip Fb38f1218c6.zip | + | |
- | [root@localhost stat.vistep.ru]# rm -f Fb38f1218c6.zip | + | |
- | </code> по окончании у нас должно получиться так {{https://i.your-admin.pro/i/b400005bee1f1c47b2fe04634b4e.png}} | + | |
- | - В скрипте **stat.vistep.ru.js** уже практически все учтено, нам остается только вбить данные доступа к БД. Откроем файл **stat.vistep.ru.js** в любимом текстовом редакторе и внесем нужные изменения в строках 393-397 <code javascript>// Исправляем все что ниже под себя | + | |
- | "dbhost":"localhost", | + | |
- | "dbuser":"freepbxuser", | + | |
- | "dbpassword":"1230239dkl8c5ef2rf497aeb523f1d117cdb", | + | |
- | "db":"asteriskcdrdb", // <--- имя БД | + | |
- | "timezone":"Europe/Moscow", // <--- часовой пояс | + | |
- | "fileMask": /\.*/ // <--- регулярка, если нужно синкать все файлы | + | |
- | + | ||
- | // далее ничего не трогаем</code> *Логин и пароль для доступа к БД вы найдете в файле **/etc/asterisk/res_odbc_additional.conf** | + | |
- | - Мы почти у цели, остался последний штрих. \\ Скрипт нужно запустить, но не только запустить, а еще и форкнуть его (говоря по-русски нужно чтобы скрипт остался в работе после того, как мы отключимся от сервера, т.е. работал бы как любой другой демон в ОС). \\ Такой функционал обеспечит замечательный [[http://pm2.keymetrics.io|proccess meneger pm2]]. \\ Установим pm2 и отдадим в его руки управление скриптом <code bash>npm install pm2 -g | + | |
- | pm2 start /opt/stat.vistep.ru/stat.vistep.ru.js --name "ViStep.RU stat" | + | |
- | pm2 startup centos6 | + | |
- | pm2 save</code> | + | |
- | На этом все настройки завершены. \\ Если вы все сделали правильно, то через какое-то время (зависит от размера БД) сможете воспользоваться всеми отчетами системы статистики ViStep.RU в своем личном кабинете. \\ Повторюсь, если у вас остались вопросы и/или есть предложения/замечания, пишите нам на <support@vistep.ru>. | + | На этом все настройки завершены. \\ Если вы все сделали правильно, то через какое-то время (зависит от размера БД) сможете воспользоваться всеми отчетами системы статистики ViStep.RU в своем личном кабинете. \\ Повторюсь, если у вас остались вопросы и/или есть предложения/замечания, пишите нам на <support@vistep.ru>. |
- | + |