FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Bitrix24 бұл CRM, жұмыс үрдісі, бухгалтерлік есеп және менеджерлерге шынымен ұнайтын және АТ қызметкерлеріне ұнамайтын көптеген басқа нәрселерді біріктіретін үлкен комбинация. Порталды көптеген шағын және орта компаниялар, соның ішінде шағын клиникалар, өндірушілер және тіпті сұлулық салондары пайдаланады. Менеджерлер «жақсы көретін» негізгі функция телефония мен CRM интеграциясы болып табылады, кез келген қоңырау бірден CRM-ге жазылғанда, клиент карталары жасалады, кіріс келгенде, клиент туралы ақпарат көрсетіледі және сіз оның кім екенін, оның не екенін бірден көре аласыз. сата алады және оның қанша қарызы бар. Бірақ Bitrix24 телефониясы және оның CRM-мен интеграциясы ақшаны, кейде көп нәрсені талап етеді. Мақалада мен сізге ашық құралдармен және танымал IP ATS-пен біріктіру тәжірибесін айтып беремін freepbx, сонымен қатар әртүрлі бөліктердің жұмысының логикасын қарастырыңыз

Мен IP телефонияны сататын және конфигурациялайтын, біріктіретін компанияда аутсорсер болып жұмыс істеймін. Мен осы және осы компанияға Bitrix24-ті тұтынушыларда бар АТС-термен, сондай-ақ әртүрлі VDS компанияларындағы виртуалды АТС-термен біріктіру үшін бірдеңе ұсына аламыз ба деп сұрағанда, мен Google-ға бардым. Және, әрине, ол маған сілтеме берді хабрдағы мақала, мұнда сипаттама және github бар және бәрі жұмыс істейтін сияқты. Бірақ бұл шешімді қолдануға тырысқанда, Bitrix24 бұрынғыдай емес және көп нәрсені өзгерту керек екені белгілі болды. Сонымен қатар, FreePBX сіз үшін жалаң жұлдызша емес, мұнда сіз конфигурация файлдарында пайдаланудың қарапайымдылығы мен қатты теру жоспарын біріктіру туралы ойлануыңыз керек.

Жұмыстың логикасын зерттейміз

Сонымен, жаңадан бастаушылар үшін бәрі қалай жұмыс істеуі керек. АТС-ке сырттан қоңырау түскен кезде (провайдерден SIP INVITE оқиғасы) теру жоспарын өңдеу басталады (теру жоспары, теру жоспары) - қоңыраумен не және қандай тәртіппен істеу ережелері. Бірінші пакеттен сіз көптеген ақпаратты ала аласыз, содан кейін оны ережелерде қолдануға болады. SIP ішкі бөліктерін зерттеудің тамаша құралы - анализатор sngrep (байланыс) ол қарапайым дистрибутивтерде apt install/yum install және т.б. арқылы орнатылады, бірақ оны көзден де жасауға болады. sngrep жүйесіндегі қоңыраулар журналын қарастырайық

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Жеңілдетілген түрде теру жоспары тек бірінші пакетпен жұмыс істейді, кейде сөйлесу кезінде де, қоңыраулар тасымалданады, түймелерді басады (DTMF), FollowMe, RingGroup, IVR және т.б.

Шақыру бумасының ішінде не бар

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Іс жүзінде қарапайым теру жоспарларының көпшілігі алғашқы екі өріспен жұмыс істейді және бүкіл логика DID және CalllerID айналасында айналады. DID - біз қайда қоңырау шалып жатырмыз, CalllerID - кім қоңырау шалып жатыр.

Ақыр соңында, бізде бір телефон емес, компания бар - бұл АТС-те қала нөмірлері (Ring Group), IVR (Сәлеметсіз бе, сіз қоңырау шалдыңыз) бойынша қоңырау топтары (бірнеше құрылғылардың бір мезгілде / дәйекті қоңырауы) болуы мүмкін дегенді білдіреді ... біреуі ... үшін), Жауап беру машиналары ( Сөз тіркестері), Уақыт шарттары, Басқа сандарға немесе ұяшыққа бағыттау (FollowMe, Forward). Бұл дегеніміз, нақты қоңырауды кім қабылдайтынын және қоңырау келгенде кіммен сөйлесетінін біржақты анықтау өте қиын. Міне, біздің клиенттеріміздің АТС-тегі әдеттегі қоңыраудың басталуының мысалы

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Қоңырау АТС-ке сәтті енгеннен кейін ол әртүрлі «контексттерде» теру жоспары арқылы өтеді. Жұлдызша тұрғысынан контекст пәрмендердің нөмірленген жиынтығы болып табылады, олардың әрқайсысында терілген нөмір бойынша сүзгі бар (ол экстен деп аталады, бастапқы кезеңде сыртқы қоңырау үшін exten=DID). Теру жоспарындағы командалар кез келген нәрсе болуы мүмкін - ішкі функциялар (мысалы, ішкі абонентке қоңырау шалу - Dial(), тұтқаны қою - Hangup()), шартты операторлар (IF, ELSE, ExecIF және сол сияқтылар), осы контексттің басқа ережелеріне көшу (Goto, GotoIF), функционалдық шақыру түріндегі басқа контексттерге көшу (Gosub, Macro). Жеке директива include имя_контекста, ол ағымдағы контексттің соңына басқа контекстен пәрмендерді қосады. Include арқылы енгізілген пәрмендер әрқашан орындалады после ағымдағы контексттің пәрмендері.

FreePBX логикасы Gosub, Macro және Handler өңдегіштері арқылы қосу және шақыру арқылы бір-біріне әртүрлі контексттерді қосуға негізделген. Кіріс FreePBX қоңырауларының контекстін қарастырыңыз

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Қоңырау кезегімен жоғарыдан төменге қарай барлық контексттер арқылы өтеді, әрбір контекстте макростар (Макро), функциялар (Gosub) немесе жай ғана ауысулар (Goto) сияқты басқа контексттерге шақырулар болуы мүмкін, сондықтан аталғанның нақты ағашы тек журналдарда бақыланады.

Әдеттегі АТС үшін әдеттегі орнату диаграммасы төменде көрсетілген. Қоңырау шалған кезде кіріс маршруттарда DID ізделеді, ол үшін уақытша шарттар тексеріледі, егер бәрі тәртіпте болса, дауыстық мәзір іске қосылады. Одан 1 немесе күту уақытын басу арқылы теру операторлары тобына шығыңыз. Қоңырау аяқталғаннан кейін hangupcall макросы шақырылады, одан кейін теру жоспарында арнайы өңдеушілерден (қосу өңдеушісінен) басқа ештеңе істеу мүмкін емес.

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Бұл қоңырау алгоритмінде CRM қызметіне қоңырау шалудың басталуы туралы ақпаратты қай жерде жазуды бастау керек, жазуды қай жерде аяқтау керек және оны CRM-ге қоңырау туралы ақпаратпен бірге жіберу керек пе?

Сыртқы жүйелермен интеграция

PBX және CRM интеграциясы дегеніміз не? Бұл осы екі платформа арасындағы деректер мен оқиғаларды түрлендіретін және оларды бір-біріне жіберетін параметрлер мен бағдарламалар. Тәуелсіз жүйелердің байланысуының ең көп тараған жолы API арқылы, ал API интерфейстеріне қол жеткізудің ең танымал жолы HTTP REST болып табылады. Бірақ жұлдызша үшін емес.

Жұлдызшаның ішінде:

  • AGI - сыртқы бағдарламалардың/компоненттердің синхронды шақыруы, негізінен теру жоспарында пайдаланылады, сияқты кітапханалар бар. phpagi, PAGI

  • AMI - оқиғаларға жазылу және мәтіндік командаларды енгізу принципі бойынша жұмыс істейтін мәтіндік TCP ұясы, ішінен SMTP-ге ұқсайды, оқиғаларды бақылай алады және қоңырауларды басқара алады, кітапханасы бар ПАМИ - жұлдызшамен байланыс жасау үшін ең танымал

AMI шығысының мысалы

Оқиға: Жаңа арна
Артықшылық: қоңырау шалу, барлығы
Арна: PJSIP/VMS_pjsip-0000078b
Арна күйі: 4
ChannelStateDesc: қоңырау
Қоңырау шалушының идентификаторы: 111222
Қоңырау шалушының идентификаторы: 111222
ConnectedLineNum:
қосылған желі атауы:
Тіл: en
шот коды:
Мәтінмән: from-pstn
Ұзарту: с
Басымдық: 1
Бірегей: 1599589046.5244
Сілтеме: 1599589046.5244

  • ARI бұл екеуінің қоспасы, барлығы REST, WebSocket арқылы, JSON пішімінде - бірақ жаңа кітапханалар мен қаптамалармен, өте жақсы емес, кездейсоқ табылған (phparia, phpari) бұл олардың дамуында шамамен 3 жыл бұрын болды.

Қоңырау басталған кезде ARI шығысының мысалы

{ "айнымалы":"CallMeCallerIDName", "мән":"111222", "түрі":"ChannelVarset", "уақыт белгісі":"2020-09-09T09:38:36.269+0000", "арна":{ "id »:»1599644315.5334″, «аты»:»PJSIP/VMSpjsip-000007b6″, "күй":"Қоңырау", "қоңырау шалушы":{ "аты":"111222″, "нөмір":"111222" }, "қосылған":{ "аты":"", "нөмір" :"" }, "шот коды":"", "dialplan":{ "контекст":"from-pstn", "exten":"s", "priority":2, "appname":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"kz" }, "жұлдызша"id":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Қолайлылық немесе ыңғайсыздық, белгілі бір API-мен жұмыс істеу мүмкіндігі немесе мүмкін еместігі шешуді қажет ететін міндеттермен анықталады. CRM-мен интеграцияға арналған міндеттер келесідей:

  • Қоңыраудың басын, қай жерде жіберілгенін қадағалаңыз, Қоңырау шалушы идентификаторын, DID нөмірін, басталу және аяқталу уақытын, мүмкін каталогтан деректерді шығарыңыз (телефон мен CRM пайдаланушысы арасындағы байланысты іздеу үшін)

  • Қоңырауды жазуды бастау және аяқтау, оны қажетті форматта сақтау, жазбаның соңында файлдың қайда орналасқанын хабарлау

  • Сыртқы оқиғаға (бағдарламадан) қоңырау шалыңыз, ішкі нөмірге, сыртқы нөмірге қоңырау шалыңыз және оларды қосыңыз

  • Қосымша: орын болмаған кезде қоңырауларды автоматты түрде жіберу үшін CRM, теру топтары және FollowME біріктіру (CRM сәйкес)

Барлық осы тапсырмаларды AMI немесе ARI арқылы шешуге болады, бірақ ARI әлдеқайда аз ақпарат береді, оқиғалар көп емес, AMI әлі бар көптеген айнымалылар (мысалы, макрос қоңыраулар, макростар ішіндегі айнымалыларды орнату, соның ішінде қоңырауды жазу) бақыланбайды. Сондықтан, дұрыс және дәл қадағалау үшін қазір AMI таңдайық (бірақ толық емес). Оған қоса (жақсы, онсыз қайдан болар едік, біз жалқау халықпыз) – түпнұсқа шығармада (хабрдағы мақала) PAMI пайдаланыңыз. *Содан кейін сіз ARI-ге қайта жазуға тырысуыңыз керек, бірақ ол жұмыс істейтінін емес.

Интеграцияны қайта ойлап табу

Біздің FreePBX AMI-ге қоңыраудың басталуы, аяқталу уақыты, сандар, жазылған файлдардың атаулары туралы қарапайым тәсілдермен есеп бере алуы үшін, бастапқы авторлар сияқты трюк арқылы қоңырау ұзақтығын есептеу оңай. - айнымалы мәндерді енгізіңіз және олардың болуы үшін нәтижені талдаңыз. PAMI мұны жай сүзгі функциясы арқылы жасауды ұсынады.

Қоңыраудың басталу уақыты үшін өзіңіздің айнымалы мәніңізді орнатудың мысалы келтірілген (s — теру жоспарындағы арнайы нөмір, ол DID іздеуді бастағанға дейін орындалады)

[ext-did-custom]

exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})

Осы жолға арналған мысал AMI оқиғасы

Оқиға: Жаңа арна

Артықшылық: қоңырау шалу, барлығы

Арна: PJSIP/VMS_pjsip-0000078b

Арна күйі: 4

ChannelStateDesc: қоңырау

Қоңырау шалушының идентификаторы: 111222

Қоңырау шалушының идентификаторы: 111222

ConnectedLineNum:

қосылған желі атауы:

Тіл: en

шот коды:

Мәтінмән: from-pstn

Ұзарту: с

Басымдық: 1

Бірегей: 1599589046.5244

Сілтеме: 1599589046.5244

Қолданба: AppData орнату:

CallStart=1599571046

Өйткені FreePBX extention.conf және extension_ файлдарын қайта жазадыextra.conf файлын қолданамыз кеңейтім_таңдамалы.conf

Extension_custom.conf толық коды

[globals]	
;; Проверьте пути и права на папки - юзер asterisk должен иметь права на запись
;; Сюда будет писаться разговоры
WAV=/var/www/html/callme/records/wav 
MP3=/var/www/html/callme/records/mp3

;; По этим путям будет воспроизводится и скачиваться запись
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Адрес для калбека при исходящем вызове
URLPHP=https://www.host.ru/callmeplus

;; Да пишем разговоры
RECORDING=1

;; Это макрос для записи разговоров в нашу папку. 
;; Можно использовать и системную запись, но пока пусть будет эта - 
;; она работает
[recording]
exten => ~~s~~,1,Set(LOCAL(calling)=${ARG1})
exten => ~~s~~,2,Set(LOCAL(called)=${ARG2})
exten => ~~s~~,3,GotoIf($["${RECORDING}" = "1"]?4:14)
exten => ~~s~~,4,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => ~~s~~,5,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)})
exten => ~~s~~,6,System(mkdir -p ${MP3}/${datedir})
exten => ~~s~~,7,System(mkdir -p ${WAV}/${datedir})
exten => ~~s~~,8,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")
exten => ~~s~~,9,Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3)
exten => ~~s~~,10,Set(CDR(filename)=${fname}.mp3)
exten => ~~s~~,11,Set(CDR(recordingfile)=${fname}.wav)
exten => ~~s~~,12,Set(CDR(realdst)=${called})
exten => ~~s~~,13,MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt})
exten => ~~s~~,14,NoOp(Finish if_recording_1)
exten => ~~s~~,15,Return()


;; Это основной контекст для начала разговора
[ext-did-custom]

;; Это хулиганство, делать это так и здесь, но работает - добавляем к номеру '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Тут всякие переменные для скрипта
exten =>  s,n,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
exten =>  s,n,ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp())
exten =>  s,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten =>  s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Самое главное! Обработчик окончания разговора. 
;; Обычные пути обработки конца через (exten=>h,1,чтототут) в FreePBX не работают - Macro(hangupcall,) все портит. 
;; Поэтому вешаем Hangup_Handler на окончание звонка
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания входящего вызова
[sub-call-from-cid-ended]

;; Сообщаем о значениях при конце звонка
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})

;; Статус вызова - Ответ, не ответ...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Обработчик исходящих вызовов - все аналогичено
[outbound-allroutes-custom]

;; Запись
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Переменные
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Вешаем Hangup_Handler на окончание звонка
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания исходящего вызова
[sub-call-internal-ended]

;; переменные
exten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

;; Вызов скрипта, который сообщит о звонке в CRM - это исходящий, 
;; так что по факту окончания
exten => s,n,System(curl -s ${URLPHP}/CallMeOut.php --data action=sendcall2b24 --data ExtNum=${CallExtNum} --data call_id=${SIPCALLID} --data-urlencode FullFname='${FullFname}' --data CallIntNum=${CallIntNum} --data CallDuration=${CallMeDURATION} --data-urlencode CallDisposition='${CallMeDISPOSITION}')
exten => s,n,Return

Түпнұсқа мақала авторларының бастапқы диалпланынан ерекшелігі мен айырмашылығы -

  • FreePBX қалауы бойынша .conf пішімінде теру (иә, ол .ael мүмкін, бірақ барлық нұсқаларда емес және әрқашан ыңғайлы емес)

  • Соңын exten=>h арқылы өңдеудің орнына, өңдеу hangup_handler арқылы енгізілді, себебі FreePBX теру жоспары онымен ғана жұмыс істеді.

  • Бекітілген сценарий шақыру жолы, қосылған тырнақшалар және сыртқы қоңырау нөмірі ExtNum

  • Өңдеу _арнайы мәтінмәндерге жылжытылады және FreePBX конфигурацияларына қол тигізбеуге немесе өңдеуге болмайды - кіріс [ арқылыext-did-customer], шығыс [ арқылыoutbound-allroutes-custom]

  • Сандармен байланыстыру жоқ - файл әмбебап және тек жол мен серверге сілтеме үшін конфигурациялануы керек

Бастау үшін логин мен құпия сөз арқылы AMI-де сценарийлерді іске қосу керек - бұл үшін FreePBX-те _custom файлы бар.

manager_custom.conf файлы

;;  это логин
[callmeplus]
;; это пароль
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; я работаю с локальной машиной - но если надо, можно и другие прописать
permit = 127.0.0.1/255.255.255.255
read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
write = system,call,agent,log,verbose,user,config,command,reporting,originate

Бұл файлдардың екеуі де /etc/asterisk ішіне орналастырылуы керек, содан кейін конфигурацияларды қайта оқыңыз (немесе жұлдызшаны қайта іске қосыңыз)

# astrisk -rv
  Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
     Dialplan reloaded.
#freepbx*CLI> exit

Енді PHP тіліне көшейік

Сценарийлерді инициализациялау және қызметті құру

AMI қызметі Bitrix 24-пен жұмыс істеу схемасы қарапайым және ашық емес болғандықтан, оны бөлек талқылау керек. Жұлдызша, AMI іске қосылғанда, жай ғана портты ашады. Клиент қосылған кезде ол авторизацияны сұрайды, содан кейін клиент қажетті оқиғаларға жазылады. Оқиғалар қарапайым мәтін түрінде келеді, оны PAMI құрылымдық нысандарға түрлендіреді және сүзу функциясын тек қызықты оқиғаларға, өрістерге, сандарға және т.б. орнату мүмкіндігін береді.

Қоңырау түскен бойда, NewExten оқиғасы ата-аналық [from-pstn] мәтінмәнінен бастап іске қосылады, содан кейін барлық оқиғалар мәтінмәндердегі жолдар ретімен өтеді. Ақпарат _арнаулы теру жоспарында көрсетілген CallMeCallerIDName және CallStart айнымалыларынан алынған кезде,

  1. Қоңырау түскен кеңейтім нөміріне сәйкес пайдаланушы идентификаторын сұрау функциясы. Егер бұл диал-ап тобы болса ше? Сұрақ саяси, барлығына бірден қоңырау шалу керек пе (барлығы бірден қоңырау шалған кезде) немесе кезекпен қоңырау шалғанда олар шақырғандай жасау керек пе? Көптеген клиенттерде Fisrt Available стратегиясы бар, сондықтан бұл мәселеде ешқандай проблема жоқ, тек бір ғана қоңырау. Бірақ мәселені шешу керек.

  2. Bitrix24 жүйесіндегі қоңырауды тіркеу функциясы, ол кейін қоңырау параметрлері мен жазбаға сілтеме туралы хабарлау үшін қажет CallID кодын қайтарады. Кеңейтім нөмірі немесе пайдаланушы идентификаторы қажет

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Қоңырау аяқталғаннан кейін жазбаны жүктеу функциясы шақырылады, ол бір уақытта қоңыраудың аяқталу күйін хабарлайды (Бос емес, Жауап жоқ, Сәтті), сонымен қатар жазбасы бар mp3 файлға сілтемені жүктейді (бар болса).

CallMeIn.php модулі үздіксіз жұмыс істеуі қажет болғандықтан, ол үшін SystemD іске қосу файлы жасалған callme.service, ол /etc/systemd/system/callme.service ішіне қойылуы керек

[Unit]
Description=CallMe

[Service]
WorkingDirectory=/var/www/html/callmeplus
ExecStart=/usr/bin/php /var/www/html/callmeplus/CallMeIn.php 2>&1 >>/var/log/callmeplus.log
ExecStop=/bin/kill -WINCH ${MAINPID}
KillSignal=SIGKILL

Restart=on-failure
RestartSec=10s

#тут надо смотреть,какие права на папки
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

сценарийді инициализациялау және іске қосу systemctl немесе қызмет арқылы жүзеге асырылады

# systemctl enable callme
# systemctl start callme

Қажет болған жағдайда қызмет өзін қайта іске қосады (апат болған жағдайда). Кіріс жәшігін бақылау қызметі веб-серверді орнатуды қажет етпейді, тек PHP қажет (ол сөзсіз FeePBX серверінде). Бірақ веб-сервер арқылы (сондай-ақ https арқылы) қоңыраулар жазбаларына қол жеткізу болмаған жағдайда, қоңыраулар жазбаларын тыңдау мүмкін болмайды.

Енді шығыс қоңыраулар туралы сөйлесейік. CallMeOut.php сценарийінде екі функция бар:

  • PHP сценарийіне сұраныс түскен кезде қоңырауды бастау (соның ішінде Bitrix ішіндегі «Қоңырау шалу» түймесін пайдалану). Ол веб-серверсіз жұмыс істемейді, сұрау HTTP POST арқылы қабылданады, сұрауда таңбалауыш бар

  • Қоңырау, оның параметрлері және Bitrix ішіндегі жазбалар туралы хабарлама. Қоңырау аяқталғанда [ішкі қоңыраудың ішкі аяқталатын] теру жоспарында жұлдызша арқылы іске қосылды

FreePBX түсіну және оны Bitrix24 және т.б. біріктіру

Веб-сервер тек екі нәрсе үшін қажет - Bitrix жазба файлдарын жүктеп алу (HTTPS арқылы) және CallMeOut.php сценарийін шақыру. Сіз кірістірілген FreePBX серверін пайдалана аласыз, файлдары /var/www/html, басқа серверді орнатуға немесе басқа жолды көрсетуге болады.

Веб-сервер

Веб-сервердің баптауын тәуелсіз оқуға қалдырайық (tyz, tyz, tyz). Егер сізде домен болмаса, FreeDomain( https://www.freenom.com/ru/index.html), ол сізге ақ IP-ге тегін атау береді (егер сыртқы мекенжай тек онда болса, маршрутизатор арқылы 80, 443 порттарын жіберуді ұмытпаңыз). Егер сіз жаңа ғана DNS доменін жасаған болсаңыз, барлық серверлер жүктелгенше күтуіңіз керек (15 минуттан 48 сағатқа дейін). Отандық провайдерлермен жұмыс тәжірибесі бойынша – 1 сағаттан күніне дейін.

Орнатуды автоматтандыру

Орнатуды жеңілдету үшін github жүйесінде орнатушы әзірленді. Бірақ бұл қағазда тегіс болды - біз оны қолмен орнатып жатқанда, мұның бәрін ойластырғаннан кейін кіммен дос болатыны, кім қайда баратыны және оны қалай түзетуге болатыны анық болды. Әзірге орнатушы жоқ

Докер

Шешімді жылдам қолданып көргіңіз келсе - Docker-те опция бар - тез контейнер жасаңыз, оған порттарды сыртқа беріңіз, параметрлер файлдарын сырғытып, көріңіз (бұл LetsEncrypt контейнеріндегі опция, егер сізде сертификат бар болса). , сізге тек кері проксиді FreePBX веб-серверіне қайта бағыттау қажет (біз оған басқа порт бердік 88), LetsEncrypt докердегі осы баптың

Жүктеп алынған жоба қалтасында файлды іске қосу керек (git clone кейін), бірақ алдымен жұлдызша конфигурацияларына (жұлдызша қалтасына) кіріп, жазбаларға жолдарды және сайттың URL мекенжайын сол жерге жазыңыз.

version: '3.3'
services:
  nginx:
    image: nginx:1.15-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/ssl_docker.conf:/etc/nginx/conf.d/ssl_docker.conf
  certbot:
    image: certbot/certbot
  freepbx:
    image: flaviostutz/freepbx
    ports:
      - 88:80 # для настройки
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # для CallMeOut.php
#      - 3306:3306
      - 18000-18100:18000-18100/udp
    restart: always
    environment:
      - ADMIN_PASSWORD=admin123
    volumes:
      - backup:/backup
      - recordings:/var/spool/asterisk/monitor
      - ./callme:/var/www/html/callme
      - ./systemd/callme.service:/etc/systemd/system/callme.conf
      - ./asterisk/manager_custom.conf:/etc/asterisk/manager_custom.conf
      - ./asterisk/extensions_custom.conf:/etc/asterisk/extensions_custom.conf
#      - ./conf/startup.sh:/startup.sh

volumes:
  backup:
  recordings:

Бұл docker-compose.yaml файлы арқылы іске қосылады

docker-compose up -d

Егер nginx іске қосылмаса, nginx/ssl_docker.conf қалтасындағы конфигурацияда бірдеңе дұрыс емес.

Басқа интеграциялар

Неліктен кейбір CRM-ді сценарийлерге бір уақытта қоймасқа деп ойладық. Біз бірнеше басқа CRM API интерфейстерін зерттедік, әсіресе тегін кіріктірілген АТС – ShugarCRM және Vtiger және иә! иә, принцип бірдей. Бірақ бұл басқа оқиға, біз оны кейінірек github-қа бөлек жүктейміз.

сілтемелер

Жауапкершіліктен бас тарту: Шындыққа кез келген ұқсастық жалған және ол мен емес едім.

Ақпарат көзі: www.habr.com

пікір қалдыру