Инструменты пользователя

Инструменты сайта


configure_freepbx_for_cloud_version

Различия

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

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
configure_freepbx_for_cloud_version [2017/09/06 14:40]
Евгений Романенко
configure_freepbx_for_cloud_version [2023/02/16 13:47]
Евгений Романенко
Строка 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.1114.0.2.10 и 15.0.23.25.** \\ Если мажорная ​(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>​. ​
- +
configure_freepbx_for_cloud_version.txt · Последние изменения: 2023/02/16 13:47 — Евгений Романенко