Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Bitrix24 është një kombinim i madh që kombinon CRM, rrjedhën e punës, kontabilitetin dhe shumë gjëra të tjera që menaxherët i pëlqejnë vërtet dhe stafi i IT nuk i pëlqejnë vërtet. Portali përdoret nga shumë kompani të vogla dhe të mesme, duke përfshirë klinika të vogla, prodhues dhe madje edhe sallone bukurie. Funksioni kryesor që menaxherët "dashurojnë" është integrimi i telefonisë dhe CRM, kur çdo telefonatë regjistrohet menjëherë në CRM, krijohen kartat e klientit, kur hyjnë, shfaqen informacione për klientin dhe menjëherë mund të shihni se kush është ai, çfarë ai mund të shesë dhe sa i ka borxh. Por telefonia nga Bitrix24 dhe integrimi i saj me CRM kushton para, ndonjëherë shumë. Në artikull do t'ju tregoj përvojën e integrimit me mjete të hapura dhe PBX të njohur IP freepbx, dhe gjithashtu merrni parasysh logjikën e punës së pjesëve të ndryshme

Unë punoj si outsource në një kompani që shet dhe konfiguron, integron telefoninë IP. Kur më pyetën nëse mund t'i ofrojmë diçka kësaj dhe kësaj kompanie për të integruar Bitrix24 me PBX-të që kanë klientët, si dhe me PBX virtuale në kompani të ndryshme VDS, shkova në Google. Dhe sigurisht ai më dha një lidhje me artikull në habr, ku ka një përshkrim, dhe github, dhe gjithçka duket se funksionon. Por kur u përpoqët të përdorni këtë zgjidhje, doli që Bitrix24 nuk është më i njëjti si më parë, dhe shumë duhet të ribëhen. Për më tepër, FreePBX nuk është një yll i zhveshur për ju, këtu duhet të mendoni se si të kombinoni lehtësinë e përdorimit dhe një plan telefonik të fortë në skedarët e konfigurimit.

Ne studiojmë logjikën e punës

Pra, për fillestarët, si duhet të funksionojë e gjitha. Kur një telefonatë merret nga jashtë në PBX (ngjarja SIP INVITE nga ofruesi), fillon përpunimi i planit të telefonimit (plani i telefonimit, plani i telefonimit) - rregullat se çfarë dhe në çfarë rendi duhet bërë me thirrjen. Nga paketa e parë, mund të merrni shumë informacione, të cilat më pas mund të përdoren në rregulla. Një mjet i shkëlqyer për të studiuar të brendshmet e SIP është analizuesi sngrep (lidhje) i cili thjesht instalohet në shpërndarjet e njohura nëpërmjet apt install/yum install dhe të ngjashme, por mund të ndërtohet edhe nga burimi. Le të shohim regjistrimin e thirrjeve në sngrep

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Në një formë të thjeshtuar, dialplan merret vetëm me paketën e parë, ndonjëherë edhe gjatë bisedës, transferohen thirrjet, shtypja e butonave (DTMF), gjëra të ndryshme interesante si FollowMe, RingGroup, IVR dhe të tjera.

Çfarë ka brenda paketës së ftesës

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Në fakt, shumica e planeve të thjeshta dial punojnë me dy fushat e para dhe e gjithë logjika rrotullohet rreth DID dhe CallerID. DID - ku po thërrasim, ID e thirrësit - kush po thërret.

Por në fund të fundit, ne kemi një kompani dhe jo një telefon - që do të thotë se PBX ka shumë të ngjarë të ketë grupe thirrjesh (zile të njëkohshme / të njëpasnjëshme të disa pajisjeve) në numrat e qytetit (Ring Group), IVR (Përshëndetje, ju thirrët ... Shtypni një për ...), Makina telefonike ( Fraza), Kushtet e kohës, Përcjellja në numra të tjerë ose në një qelizë (FollowMe, Forward). Kjo do të thotë se është shumë e vështirë të përcaktohet pa mëdyshje se kush do të marrë në të vërtetë një telefonatë dhe me kë do të bisedojë kur të arrijë një telefonatë. Këtu është një shembull i fillimit të një telefonate tipike në PBX të klientëve tanë

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Pasi thirrja hyn me sukses në PBX, ajo udhëton përmes planit të telefonimit në "kontekste" të ndryshme. Konteksti nga pikëpamja e Asterisk është një grup komandash të numëruara, secila prej të cilave përmban një filtër sipas numrit të thirrur (quhet exten, për një thirrje të jashtme në fazën fillestare exten=DID). Komandat në linjën dialplan mund të jenë çdo gjë - funksione të brendshme (për shembull, telefononi një pajtimtar të brendshëm - Dial(), ul telefonin - Hangup()), operatorët e kushtëzuar (IF, ELSE, ExecIF dhe të ngjashme), kalimet në rregulla të tjera të këtij konteksti (Goto, GotoIF), kalimi në kontekste të tjera në formën e një thirrjeje funksioni (Gosub, Macro). Një direktivë e veçantë include имя_контекста, i cili shton komanda nga një kontekst tjetër në fund të kontekstit aktual. Komandat e përfshira përmes përfshirjes ekzekutohen gjithmonë pas komandat e kontekstit aktual.

E gjithë logjika e FreePBX është e ndërtuar mbi përfshirjen e konteksteve të ndryshme në njëri-tjetrin përmes përfshirjes dhe thirrjes përmes mbajtësve Gosub, Macro dhe Handler. Merrni parasysh kontekstin e thirrjeve hyrëse FreePBX

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Thirrja kalon nëpër të gjitha kontekstet nga lart poshtë me radhë, në secilin kontekst mund të ketë thirrje në kontekste të tjera si makro (Macro), funksione (Gosub) ose thjesht tranzicione (Goto), kështu që pema e vërtetë e asaj që quhet mundet vetëm të gjurmohen në regjistra.

Një diagram tipik konfigurimi për një PBX tipik është paraqitur më poshtë. Kur telefononi, DID kërkohet në rrugët hyrëse, kontrollohen kushtet e përkohshme për të, nëse gjithçka është në rregull, hapet menyja e zërit. Prej tij, duke shtypur butonin 1 ose me skadimin e kohës, dilni në grupin e operatorëve të telefonimit. Pas përfundimit të telefonatës, thirret makroja e thirrjes hangup, pas së cilës nuk mund të bëhet asgjë në planin e telefonimit, përveç mbajtësve specialë (hangup handler).

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Ku në këtë algoritëm të thirrjes duhet të japim informacion për fillimin e thirrjes në CRM, ku të fillojë regjistrimi, ku të përfundojë regjistrimi dhe ta dërgojmë atë së bashku me informacionin për thirrjen në CRM?

Integrimi me sistemet e jashtme

Çfarë është integrimi PBX dhe CRM? Këto janë cilësime dhe programe që konvertojnë të dhënat dhe ngjarjet midis këtyre dy platformave dhe i dërgojnë ato njëra-tjetrës. Mënyra më e zakonshme për të komunikuar sistemet e pavarura është përmes API-ve, dhe mënyra më e njohur për të hyrë në API është HTTP REST. Por jo për yll.

Brenda Asterisk është:

  • AGI - thirrje sinkrone për programet / komponentët e jashtëm, të përdorura kryesisht në planin e telefonimit, ka biblioteka si phpagi, PAGI

  • AMI - një prizë TCP teksti që funksionon në parimin e abonimit në ngjarje dhe futjes së komandave të tekstit, i ngjan SMTP nga brenda, mund të gjurmojë ngjarjet dhe të menaxhojë thirrjet, ka një bibliotekë PAMI - më i popullarizuari për krijimin e një lidhjeje me Asterisk

Shembull i daljes AMI

Ngjarja: Kanal i ri
Privilegji: telefononi, të gjithë
Kanali: PJSIP/VMS_pjsip-0000078b
Gjendja e kanalit: 4
ChannelStateDesc: Zile
Numri ID i thirrësit: 111222
Emri i telefonuesit: 111222
Connected LineNum:
emri i linjës së lidhur:
Gjuha: en
kodi i llogarisë:
Konteksti: nga-pstn
Zgjat: s
Prioriteti: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI është një përzierje e të dyjave, të gjitha nëpërmjet REST, WebSocket, në format JSON - por me biblioteka dhe mbështjellës të freskët, jo shumë të mirë, të gjetur në mënyrë të padobishme (phparia, phpari) të cilat u bënë në zhvillimin e tyre rreth 3 vjet më parë.

Shembull i daljes ARI kur fillon një telefonatë

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «emri»:»PJSIP/VMSpjsip-000007b6″, "state":"Zilja", "thirruesi":{ "emri":"111222″, "numri":"111222″ }, "i lidhur":{ "emri":"", "numri" :"" }, "code account":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appemri":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "yllid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Komoditeti ose shqetësimi, mundësia ose pamundësia për të punuar me një API të veçantë përcaktohen nga detyrat që duhet të zgjidhen. Detyrat për integrimin me CRM janë si më poshtë:

  • Gjurmo fillimin e telefonatës, ku është transferuar, tërhiq ID-në e telefonuesit, DID, fillimin dhe mbarimin, ndoshta të dhënat nga drejtoria (për të kërkuar një lidhje midis telefonit dhe përdoruesit CRM)

  • Filloni dhe përfundoni regjistrimin e thirrjes, ruani atë në formatin e dëshiruar, informoni në fund të regjistrimit se ku ndodhet skedari

  • Filloni një telefonatë në një ngjarje të jashtme (nga programi), telefononi një numër të brendshëm, një numër të jashtëm dhe lidhini ato

  • Opsionale: integrohu me CRM, grupet e numrave dhe FollowME për transferimin automatik të thirrjeve në mungesë të një vendi (sipas CRM)

Të gjitha këto detyra mund të zgjidhen përmes AMI ose ARI, por ARI ofron shumë më pak informacion, nuk ka shumë ngjarje, shumë variabla që AMI i ka ende (për shembull, thirrjet makro, vendosja e variablave brenda makrove, përfshirë regjistrimin e thirrjeve) nuk gjurmohen. Prandaj, për gjurmim të saktë dhe të saktë, le të zgjedhim AMI për momentin (por jo plotësisht). Për më tepër (epo, ku do të ishte pa këtë, ne jemi dembelë) - në veprën origjinale (artikull në habr) përdorni PAMI. *Atëherë duhet të përpiqeni të rishkruani në ARI, por jo faktin që do të funksionojë.

Rishpikja e integrimit

Në mënyrë që FreePBX-ja jonë të jetë në gjendje t'i raportojë AMI-së në mënyra të thjeshta për fillimin e telefonatës, kohën e përfundimit, numrat, emrat e skedarëve të regjistruar, është më e lehtë të llogarisni kohëzgjatjen e thirrjes duke përdorur të njëjtin mashtrim si autorët origjinal. - futni variablat tuaja dhe analizoni daljen për praninë e tyre. PAMI sugjeron ta bëni këtë thjesht përmes një funksioni filtri.

Këtu është një shembull i vendosjes së ndryshores tuaj për kohën e fillimit të telefonatës (s është një numër i veçantë në planin e telefonimit që kryhet PARA fillimit të kërkimit DID)

[ext-did-custom]

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

Një shembull i ngjarjes AMI për këtë linjë

Ngjarja: Kanal i ri

Privilegji: telefononi, të gjithë

Kanali: PJSIP/VMS_pjsip-0000078b

Gjendja e kanalit: 4

ChannelStateDesc: Zile

Numri ID i thirrësit: 111222

Emri i telefonuesit: 111222

Connected LineNum:

emri i linjës së lidhur:

Gjuha: en

kodi i llogarisë:

Konteksti: nga-pstn

Zgjat: s

Prioriteti: 1

Uniqueid: 1599589046.5244

Linkedid: 1599589046.5244

Aplikimi: Vendosni të dhënat e aplikacionit:

CallStart=1599571046

Sepse FreePBX mbishkruan skedarët extension.conf dhe extension_Additional.conf, ne do të përdorim skedarin shtrirje_me porosi.konf

Kodi i plotë i 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

Tipari dhe ndryshimi nga plani origjinal i numrit të autorëve të artikullit origjinal -

  • Dialplan në formatin .conf, siç dëshiron FreePBX (po, mund të .ael, por jo të gjitha versionet dhe nuk është gjithmonë i përshtatshëm)

  • Në vend që të përpunohej fundi përmes exten=>h, përpunimi u prezantua përmes hangup_handler, sepse plani i telefonimit FreePBX funksiononte vetëm me të.

  • Vargu i fiksuar i thirrjeve të skriptit, kuotat e shtuara dhe numri i thirrjes së jashtme ExtNum

  • Përpunimi zhvendoset në kontekstet _custom dhe ju lejon të mos prekni ose modifikoni konfigurimet e FreePBX - të ardhura nëpërmjet [ext-bëri-zakon], duke dalë përmes [outbound-allroutes-custom]

  • Nuk ka lidhje me numrat - skedari është universal dhe duhet të konfigurohet vetëm për shtegun dhe lidhjen me serverin

Për të filluar, ju gjithashtu duhet të ekzekutoni skriptet në AMI me hyrje dhe fjalëkalim - për këtë, FreePBX ka gjithashtu një skedar _custom

skedar 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

Të dy këta skedarë duhet të vendosen në /etc/asterisk, pastaj rilexoni konfigurimet (ose rinisni yllin)

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

Tani le të kalojmë te PHP

Inicializimi i skripteve dhe krijimi i një shërbimi

Meqenëse skema e punës me Bitrix 24, një shërbim për AMI, nuk është plotësisht e thjeshtë dhe transparente, ajo duhet të diskutohet veçmas. Asterisk, kur aktivizohet AMI, thjesht hap portin dhe kaq. Kur një klient bashkohet, ai kërkon autorizim, pastaj klienti abonohet në ngjarjet e nevojshme. Ngjarjet vijnë në tekst të thjeshtë, të cilin PAMI e konverton në objekte të strukturuara dhe ofron mundësinë për të vendosur funksionin e filtrimit vetëm për ngjarjet me interes, fushat, numrat, etj.

Sapo vjen thirrja, ngjarja NewExten aktivizohet duke filluar nga konteksti prind [nga-pstn], më pas të gjitha ngjarjet shkojnë sipas renditjes së rreshtave në kontekste. Kur informacioni merret nga variablat CallMeCallerIDName dhe CallStart të specifikuara në planin e telefonimit _custom,

  1. Funksioni i kërkimit të ID-së së përdoruesit që korrespondon me numrin shtesë ku erdhi thirrja. Po sikur të jetë një grup dial-up? Pyetja është politike, a duhet të krijoni një thirrje për të gjithë menjëherë (kur të gjithë thërrasin menjëherë) apo të krijoni siç thërrasin kur telefonojnë me radhë? Shumica e klientëve kanë strategjinë Fisrt Available, kështu që nuk ka asnjë problem me këtë, vetëm një telefonon. Por çështja duhet të zgjidhet.

  2. Funksioni i regjistrimit të thirrjeve në Bitrix24, i cili kthen ID-në e thirrjes, e cila më pas kërkohet të raportojë parametrat e thirrjes dhe një lidhje me regjistrimin. Kërkon numrin shtesë ose ID-në e përdoruesit

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Pas përfundimit të telefonatës, thirret funksioni i shkarkimit të regjistrimit, i cili njëkohësisht raporton statusin e përfundimit të telefonatës (I zënë, Pa përgjigje, Sukses), dhe gjithashtu shkarkon një lidhje me skedarin mp3 me regjistrimin (nëse ka).

Për shkak se moduli CallMeIn.php duhet të funksionojë vazhdimisht, një skedar fillestar SystemD është krijuar për të telefononi.shërbim, i cili duhet të vendoset në /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

inicializimi dhe nisja e skriptit ndodh përmes systemctl ose shërbimit

# systemctl enable callme
# systemctl start callme

Shërbimi do të rifillojë vetë sipas nevojës (në rast përplasjeje). Shërbimi i përcjelljes së inbox-it nuk kërkon të instalohet një server në internet, nevojitet vetëm php (i cili është padyshim në serverin FeePBX). Por në mungesë të aksesit në regjistrimet e thirrjeve përmes serverit në internet (gjithashtu me https), nuk do të jetë e mundur të dëgjohen regjistrimet e thirrjeve.

Tani le të flasim për thirrjet dalëse. Skripti CallMeOut.php ka dy funksione:

  • Fillimi i një thirrjeje kur merret një kërkesë për një skript php (përfshirë përdorimin e butonit "Thirrje" në vetë Bitrix). Nuk funksionon pa një server në internet, kërkesa merret përmes HTTP POST, kërkesa përmban një shenjë

  • Mesazh për thirrjen, parametrat dhe regjistrimet e saj në Bitrix. Futet nga Asterisk në planin e numrit [nën-telefonatë-fundim i brendshëm] kur përfundon një telefonatë

Kuptimi i FreePBX dhe integrimi i tij me Bitrix24 dhe më shumë

Serveri i uebit nevojitet vetëm për dy gjëra - shkarkimin e skedarëve të regjistrimit Bitrix (përmes HTTPS) dhe thirrjen e skriptit CallMeOut.php. Ju mund të përdorni serverin e integruar FreePBX, skedarët për të cilët janë /var/www/html, mund të instaloni një server tjetër ose të specifikoni një rrugë tjetër.

Web server

Le ta lëmë konfigurimin e serverit në internet për studim të pavarur (tyts, tyts, tyts). Nëse nuk keni një domen, mund të provoni FreeDomain( https://www.freenom.com/ru/index.html), i cili do t'ju japë një emër falas për IP-në tuaj të bardhë (mos harroni të përcjellni portet 80, 443 përmes ruterit nëse adresa e jashtme është vetëm në të). Nëse sapo keni krijuar një domen DNS, atëherë duhet të prisni (nga 15 minuta në 48 orë) derisa të ngarkohen të gjithë serverët. Sipas përvojës së punës me ofruesit vendas - nga 1 orë në një ditë.

Automatizimi i instalimit

Një instalues ​​është zhvilluar në github për ta bërë instalimin edhe më të lehtë. Por ishte e qetë në letër - ndërkohë që ne po i instalojmë të gjitha me dorë, pasi pasi u ndryshuam me të gjitha këto u bë e qartë se çfarë është miq me kë, kush shkon ku dhe si ta korrigjojë atë. Nuk ka ende instalues

prerës

Nëse dëshironi të provoni shpejt zgjidhjen - ekziston një opsion me Docker - krijoni shpejt një kontejner, jepini portet jashtë, rrëshqisni skedarët e cilësimeve dhe provoni (ky është opsioni me kontejnerin LetsEncrypt, nëse tashmë keni një certifikatë , ju vetëm duhet të ridrejtoni përfaqësuesin e kundërt në serverin e internetit FreePBX (ne i dhamë një port tjetër është 88), LetsEncrypt në docker bazuar në Ky artikull

Ju duhet të ekzekutoni skedarin në dosjen e shkarkuar të projektit (pas klonimit të git), por së pari futeni në konfigurimet e yjeve (dosja yll) dhe shkruani shtigjet për të dhënat dhe URL-në e faqes tuaj atje

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:

Ky skedar docker-compose.yaml ekzekutohet nëpërmjet

docker-compose up -d

Nëse nginx nuk fillon, atëherë diçka nuk është në rregull me konfigurimin në dosjen nginx/ssl_docker.conf

Integrime të tjera

Dhe pse të mos vendosni disa CRM në skriptet në të njëjtën kohë, menduam. Ne studiuam disa API të tjera CRM, veçanërisht PBX të integruar falas - ShugarCRM dhe Vtiger, dhe po! po, parimi është i njëjtë. Por kjo është një histori tjetër, të cilën më vonë do ta ngarkojmë veçmas në github.

Referencat

Mohim përgjegjësie: Çdo ngjashmëri me realitetin është fiktive dhe nuk isha unë.

Burimi: www.habr.com

Shto një koment