Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Bitrix24 — është një platformë e madhe që kombinon CRM, menaxhimin e dokumenteve, kontabilitetin dhe shumë funksione të tjera që janë shumë të pëlqyer nga menaxherët dhe jo shumë nga stafi IT. Portali përdoret nga shumë kompani të vogla dhe të mesme, përfshirë klinikat e vogla, prodhuesit dhe madje edhe sallonet e bukurisë. Funksioni kryesor që menaxherët e pëlqejnë është integrimi i telefonisë dhe CRM, ku çdo telefonatë regjistrohet menjëherë në CRM, krijohen kartela të klientëve, dhe gjatë thirrjeve hyrëse shfaqet informacioni rreth klientit, duke treguar se kush është, çfarë mund t'i shitet dhe sa i duhet. FreePBX, dhe do të shqyrtoj logjikën e funksionimit të pjesëve të ndryshme

Unë punoj në outsourcing për një kompani që merret me shitjen, konfigurimin dhe integrimin e telefonisë IP. Kur më pyetën nëse mund të ofronim diçka për integrimin e Bitrix24 me telefonatat që ka klientëve, si dhe me telefonatat virtuale në VDS të ndryshme të kompanisë, shkova në Google. Dhe ai, natyrisht, më dha një link në një artikull në Habr, ku ka përshkrim, si dhe github dhe duket që gjithçka funksionon. Por, kur përpiqesha të përdorja këtë zgjidhje, doli se Bitrix24 nuk është çfarë ishte më parë, dhe duhej të rregullohej shumë. Për më tepër, FreePBX nuk është thjesht një Asterisk i pastër, këtu duhet të mendoni se si të bashkoni lehtësinë e përdorimit me planin e thirrjeve të avancuar në skedarët e konfigurimit.

Të mësojmë logjikën e punës

Pra, për fillim, si duhet të funksionojë gjithçka. Kur merr një thirrje nga jashtë në telefonatën (ngjarja SIP INVITE nga ofruesi), fillon përpunimi i planit të thirrjes (plani i thirrjeve, dialplan) — rregullat se çfarë dhe në cilën rend do të bëhet me thirrjen. Nga paketa e parë mund të merrni shumë informacion, të cilin më pas mund ta përdorni në rregulla. Një mjet i shkëlqyer për të studiuar brendësitë e SIP është analizuesi sngrep (link) që thjesht instalohet në shpërndarjet popullore përmes apt install/yum install dhe të ngjashme, por gjithashtu mund të ndërtohet nga burimi. Le të shikojmë logun e thirrjes në sngrep

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Në një formë të thjeshtuar, plani i thirrjes merret vetëm me paketën e parë, ndonjëherë gjatë bisedës ndodhin gjithashtu përkthime thirrjesh, shtypja e butonave (DTMF), gjëra interesante si FollowMe, RingGroup, IVR dhe të tjera.

Çfarë ka brenda paketës Invite

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Saktësisht shumica e planeve të thirrjes funksionojnë me dy fushat e para dhe të gjithë logjika rrotullohet rreth DID dhe CallerID. DID — ku telefonojmë, CallerID — kush po telefonon.

Por ne kemi një kompani dhe jo një telefon — dhe kjo do të thotë që në PBX ka të ngjarë grupet e thirrjeve (thirrje të shumëfishta/sipas rendit) në numrat lokalë (Ring Group), IVR (Përshëndetje, ju telefononi… Shtypni një për…), Auto-ndihmës (Phrases), Kushtet e kohës (Time Conditions), Përcjellje në numra të tjerë ose në celular (FollowMe, Forward). Kjo do të thotë se është shumë e vështirë të përcaktohet se kujt do t'i vijë thirrja dhe me kë do të flasë kur të vijë thirrja. Ja një shembull i fillimit të kalimit të një thirrjeje tipike në PBX e klientëve tanë.

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Pas hyrjes së suksesshme të thirrjes në PBX, ajo fillon udhëtimin e saj përmes planit të thirrjes në kontekste të ndryshme. Një kontekst nga pikëpamja Asterisk është një grup i numeruar komandash, secila nga të cilat përmban një filtro për numrin e telefonit të bërë (quhet exten, për thirrje jashtë në fazën fillestare exten=DID). Komandat në linjën e planit të thirrjes mund të jenë gjithçka — funksione të brendshme (për shembull, për të telefonuar një abonent të brendshëm — Dial(), të hedhësh aparatin — Hangup()), operatorë kondicionalë (IF, ELSE, ExecIF dhe të ngjashme), kalime në rregulla të tjera të këtij konteksti (Goto, GotoIF), kalime në kontekste të tjera në formën e thirrjes së funksioneve (Gosub, Macro). Një direktivë e veçantë është include emri_kontekstit, që shton komandat e një konteksti tjetër në fund të kontekstit aktual. Komandat e përfshira përmes include gjithmonë ekzekutohen pas komandave të kontekstit aktual.

E gjithë logjika e punës së FreePBX është e ndërtuar mbi përfshirjen e njëri-tjetrit të konteksteve të ndryshme përmes include dhe thirrjeve përmes Gosub, Macro dhe trajtuesve Handler. Le të shqyrtojmë kontekstin e thirrjeve të ardhshme në FreePBX.

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Thirrja kalon nëpër të gjitha kontekstet nga lart poshtë në radhë, në çdo kontekst mund të ketë thirrje të konteksteve të tjera si makro (Macro), funksione (Gosub) ose thjesht kalime (Goto), prandaj ndarja reale e asaj që thirret mund të ndjeket vetëm në loge.

Diagrami tipik i konfigurimit të një PBX tipik zyrar është e ilustruar më poshtë. Gjatë thirrjeve, në rrugët hyrëse kërkohet DID, që i kontrollon kushtet temporale; nëse gjithçka është në rregull, aktivizohet menuja vokale. Nga aty, me butonin 1 ose pasoutjes, kalon në grupin e operatorëve. Pas përfundimit të thirrjes, thirret makroja hangupcall, pas së cilës nuk mund të kryhen më asgjë në planin dial, përveç trajtuesve të veçantë (hangup handler).

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Në cilën pjesë të këtij algoritmi të thirrjes duhet të ofrojmë informacionin mbi fillimin e thirrjes në CRM, ku të fillojmë regjistrimin, ku ta ndalim regjistrimin dhe ta dërgojmë atë së bashku me informacionin mbi thirrjen në CRM?

Integrimi me sisteme të jashtme

Çfarë është integrimi i PBX me CRM? Ajo përfshin konfigurime dhe programe që konvertojnë të dhëna dhe ngjarje midis këtyre dy platformave dhe i dërgojnë njëra-tjetrës. Mënyra më e zakonshme e bashkëpunimit të sistemeve të pavarura është API, dhe mënyra më e popullarizuar për të aksesuar API është HTTP REST. Por jo për asterisk.

Brenda Asterisk ka:

  • AGI — thirrje sinkronike të programeve / komponenteve të jashtme, përdoret kryesisht në planin dial, ka biblioteka si phpagi, PAGI

  • AMI — një socket tekstual TCP, punon mbi parimin e regjistrimit për ngjarje dhe futjes së komandave tekstuale, ngjason më shumë me SMTP nga brenda, është në gjendje të ndjekë ngjarjet dhe menaxhojë thirrjet, ka bibliotekën PAMI — më e njohura për krijimin e lidhjeve me Asterisk

Shembulli i daljes AMI

Ngjarja: Newchannel
Privilegji: call,all
Kanal: PJSIP/VMS_pjsip-0000078b
GjendjaKanal: 4
PërshkrimiGjendjaKanal: Ring
NumriIDThirrësit: 111222
EmriIDThirrësit: 111222
NumriLinjes së lidhur:
EmriLinjes së lidhur:
Gjuha: en
KodiLlogarisë:
Konteksti: from-pstn
Ekstension: s
Prioriteti: 1
IDUnike: 1599589046.5244
ID i lidhur: 1599589046.5244

  • ARI — një përzierje e dy, gjithçka përmes REST, WebSocket, në formatin JSON — por me bibliotekat dhe mbështjellësit e rinj nuk është shumë, në shikim të parë u gjetën (phparia, phpari) që i thonin zhvillimit të tyre rreth 3 vite më parë.

Shembulli i daljes ARI gjatë iniciimit të thirrjes

{ "variabël":"CallMeCallerIDName", "vlerë":"111222", "tip":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "kanali":{ "id":"1599644315.5334", "emri":"PJSIP/VMS pjsip-000007b6", "shteti":"Ring", "thirrësi":{ "emri":"111222", "numri":"111222" }, "i lidhur":{ "emri":"", "numri":"" }, "kodllogarisë":"", "plani i thirrjeve":{ "konteksti":"from-pstn", "ekstension":"s", "prioritet":2, "aplikacioni":{ "emri":"Stasis", "të dhënat":"hello-world" }, "kohakrijimit":"2020-09-09T09:38:35.926+0000", "gjuha":"ru" }, "asterisk":"id":"48:5b:aa:aa:aa:aa", "aplikacioni":"hello-world" }pjsip-000007b6″, «state»:»Rring», «caller»:{ «name»:»111222″, «number»:»111222″ }, «connected»:{ «name»:»», «number»:»» }, «accountcode»:»», «dialplan»:{ «context»:»from-pstn», «exten»:»s», «priority»:2, «appname»:»Stasis», «appdata»:»hello-world» }, «creationtime»:»2020-09-09T09:38:35.926+0000″, «language»:»sq» }, «asteriskid»:»48:5b:aa:aa:aa:aa», «application»:»hello-world» }

Komoditeti ose papërshtatshmëria, mundësia ose pamundësia për të punuar me një API të caktuar përcaktohen nga detyrat që duhen zgjidhur. Detyrat për integrimin me CRM janë si më poshtë:

  • Të gjurmosh fillimin e thirrjes, ku është transferuar, të nxjerrësh CallerID, DID, kohët e fillimit dhe përfundimit, ndoshta edhe të dhëna nga direktoria (për të gjetur lidhjen midis telefonit dhe përdoruesit të CRM)

  • Të fillosh dhe të përfundosh regjistrimin e thirrjes, ta ruash në formatin e duhur, të njoftosh pas përfundimit të regjistrimit ku ndodhet файли

  • Të iniciasht një thirrje përmes një ngjarjeje të jashtme (nga programi), të telefonosh një numër të brendshëm, një të jashtëm dhe t'i lidhësh ato

  • Opcionale: të integrosh me CRM, grupet e thirrjeve dhe FollowME për të transferuar thirrjet automatikisht kur nuk je në vend (sipas informacionit të CRM)

Të gjitha këto detyra mund të zgjidhen përmes AMI ose ARI, por ARI ofron shumë më pak informacion, nuk gjurmohen shumë ngjarje, nuk ndjekin shumë variabla që AMI e ka (p.sh. thirrjet e makronave, caktimin e variablave brenda makronave, përfshirë regjistrimin e thirrjeve). Prandaj, për gjurmimin e saktë dhe të saktë — do të zgjedhim për momentin AMI (por jo përfundimisht). Për më tepër (si ndodhi?), ne jemi njerëz të dëgjueshëm) — në punën fillestare (artikulli në Habr) përdorin PAMI. *Më pas duhet të provojmë ta shkruajmë përsëri në ARI, por nuk është e sigurt se do të funksionojë.

Po ricaktojmë integrimin.

Për të bërë që FreePBX tonë të mund të raportojë në AMI në mënyrë të thjeshtë përfill ndihmën e fillimit të thirrjes, kohën e përfundimit, numrat, emrat e fileve të regjistruara, llogaritë e kohëzgjatjes së thirrjes, është më e lehtë të përdorësh të njëjtën truk që përdoruesit fillestarë — të vendosësh variablët e tu dhe të analizosh rezultatin për praninë e tyre. PAMI ofron mundësinë e realizimit të kësaj thjesht përmes funksionit filtrim.

Ja një shembull i caktimit të variablës sënde për kohën e fillimit të thirrjes (s është një numër special në planin e thirrjes, i cili ekzekutohet PARA fillimit të kërkimit sipas DID)

[ext-did-custom]

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

Shembulli i ngjarjes AMI sipas këtij rreshti

Ngjarja: Newchannel

Privilegji: call,all

Kanal: PJSIP/VMS_pjsip-0000078b

GjendjaKanal: 4

PërshkrimiGjendjaKanal: Ring

NumriIDThirrësit: 111222

EmriIDThirrësit: 111222

NumriLinjes së lidhur:

EmriLinjes së lidhur:

Gjuha: en

KodiLlogarisë:

Konteksti: from-pstn

Ekstension: s

Prioriteti: 1

IDUnike: 1599589046.5244

ID i lidhur: 1599589046.5244

Aplikimi: Set AppData:

CallStart=1599571046

Pasi FreePBX ri-regjistron skedarin extention.conf dhe extention_additional.conf, do të përdorim skedarin extention_custom.conf

Kodi i plotë i extention_custom.conf

[globals]
;; Kontrolloni rrugët dhe të drejtat në dosje - përdoruesi asterisk duhet të ketë të drejta për të shkruar
;; Këtu do të shkruhen bisedat
WAV=\/var\/www\/html\/callme\/records\/wav 
MP3=\/var\/www\/html\/callme\/records\/mp3

;; Në këto rrugë do të luhet dhe shkarkohet regjistrimi
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3

;; Adresa për callback gjatë një thirrjeje që ka dalë
URLPHP=https:\/\/www.host.ru\/callmeplus

;; Po regjistrojmë bisedat
RECORDING=1

;; Ky është makro për regjistrimin e bisedave në dosjen tonë.
;; Mund të përdorim gjithashtu regjistrimin sistemor, por për momentin le të jetë ky -
;; funksionon
[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()


;; Ky është konteksti kryesor për fillimin e bisedës
[ext-did-custom]

;; Kjo është një shkelje, ta bësh kështu dhe këtu, por funksionon - shtojmë '8' te numri
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Këtu janë disa variabla për skriptin
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)})

;; Më e rëndësishmja! Menaxhuese e përfundimit të bisedës.
;; Rrugët normale të përpunimit të përfundimit përmes (exten=>h,1,çtototut) në FreePBX nuk funksionojnë - Macro(hangupcall,) gjithçka prish.
;; Prandaj e lidhim Hangup_Handler në përfundimin e thirrjes
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Menaxhuese e përfundimit të thirrjeve që kanë ardhur
[sub-call-from-cid-ended]

;; Njoftojmë për vlerat kur përfundon thirrja
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)})

;; Statusi i thirrjes - Përgjigje, pa përgjigje...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Menaxhuese e thirrjeve që kanë dalë - gjithçka është e ngjashme
[outbound-allroutes-custom]

;; Regjistrimi
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Variablat
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; E lidhim Hangup_Handler në përfundimin e thirrjes
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Menaxhuese e përfundimit të thirrjes që kanë dalë
[sub-call-internal-ended]

;; variablat
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)})

;; Thirrja e skriptit që do të njoftojë mbi thirrjen në CRM - kjo është një thirrje që ka dalë,
;; kështu që në fakt gjatë përfundimit
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

Veçoria dhe dallimi nga plani origjinal i dialogut të autorëve të artikullit të origjinës —

  • Plani i dialogut në format .conf, siç dëshiron FreePBX (po, ai mund të përdorë .ael, por jo të gjitha versionet dhe jo gjithmonë është e përshtatshme)

  • Në vend të përpunimit të përfundimit përmes exten=>h, është futur përpunimi përmes hangup_handler, sepse plani i dialogut të FreePBX punoi vetëm me këtë

  • Është rregulluar rreshti i thirrjes së skenarit, janë shtuar thonjëza dhe numri i jashtëm i thirrjes ExtNum

  • Përpunimet janë nxjerrë në kontekstet _custom dhe lejojnë që të mos preken dhe të mos rregullohen konfigurimet e FreePBX — të hyra përmes [ext-did-custom], daljet përmes [outbound-allroutes-custom]

  • Nuk ka lidhje me numrat — skedari është universale dhe kërkon vetëm konfigurim të rrugës dhe lidhjen me serverin

Për të filluar punën, duhet gjithashtu të kaloni skenaret në AMI përmes emrit të përdoruesit dhe fjalëkalimit — për këtë ka gjithashtu një skedar _custom në FreePBX

Skedari manager_custom.conf

;;  kjo është emri
[callmeplus]
;; kjo është fjalëkalimi
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; unë punoj me makinën lokale - por nëse nevojitet, mund të shkruhen dhe të tjera
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

Këto dy skedarë duhet të vendosen në /etc/asterisk, pastaj të rimarrin konfigurimet (ose të rinisnin Asterisk-in)

# 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ë në PHP

Inicializimi i skenarëve dhe krijimi i shërbimit

Për shkak se skema e punës me Bitrix 24, shërbimin për AMI nuk është krejtësisht e thjeshtë dhe e qartë, duhet të ndalemi veçmas mbi të. Asterisk me aktivizimin AMI thjesht hap portin dhe gjithçka. Kur klienti lidhet, ai kërkon autorizimin, pastaj klienti regjistrohet për ngjarjet e nevojshme. Ngjarjet vijnë në tekst të pastër, që PAMI e transformon në objekte të strukturuara dhe ofron mundësinë e caktimit të funksionit të filtrimit vetëm për ngjarjet, fushat, numrat etj.

Sa herë që një thirrje arrin, krijohet ngjarja NewExten e cila fillon nga konteksti prind [from-pstn], pastaj ndodhin të gjitha ngjarjet sipas renditjes së rreshtave në kontekstet. Në marrjen e informacionit nga variablat e caktuara në planin e dialogut _custom CallMeCallerIDName dhe CallStart thirret

  1. Funksioni i kërkesës UserID, që korrespondon me numrin e brendshëm ku ka mbërritur thirrja. Dhe nëse kjo është një grup thirrjesh? Pyetja është politike; duhen krijuar thirrje për të gjithë njëherësh (kur thirrja bëhet për të gjithë) ose të krijohen sipas radhës gjatë thirrjeve? Te shumica e klientëve është strategjia Fisrt Available, kështu që s'ka probleme, thërret vetëm një. Por ky është një çështje që duhet zgjidhur.

  2. Funksioni i regjistrimit të thirrjes në Bitrix24, i cili kthen CallID, e cila është e nevojshme më pas për të raportuar parametrat e thirrjes dhe lidhjen me regjistrimin. Kërkon ose numrin e brendshëm ose UserID.

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Pas përfundimit të thirrjes, thirret funksioni për ngarkimin e regjistrimit, i cili në të njëjtën kohë raporton statusin e përfundimit të thirrjes (E zënë, Nuk ka përgjigje, Sukses), si dhe ngarkon lidhjen me skedarin mp3 me regjistrimin (nëse ka).

Meqenëse moduli CallMeIn.php duhet të punojë vazhdimisht, për të është krijuar një skedar nisje SystemD. callme.service, i cili duhet vendosur 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

#këtu duhet parë, cilat janë të drejtat për dosjet
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

Inicializimi dhe nisja e skriptit ndodhin përmes systemctl ose service.

# systemctl enable callme
# systemctl start callme

Shërbimi do të rindezë vetë sipas nevojës (nëse ka rënie). Shërbimi për monitorimin e thirrjeve të ardhshme nuk kërkon instalim të serverit web, nevojitet vetëm php (i cili patjetër është në serverin FeePBX). Por nëse nuk ka akses në regjistrimet e thirrjeve përmes serverit web (madje me https) nuk do të ketë mundësi të dëgjohen regjistrimet e bisedave.

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

  • Iniciimi i thirrjes kur bëhet një kërkesë për skriptin php (përfshirë përmes butonit “Thirri” në Bitrix vetë). Pa server web nuk funksionon, kërkesa vjen përmes HTTP POST, në kërkesë përmban një token.

  • Raportimi i thirrjes, parametrave të saj dhe regjistrimeve në Bitrix. Kjo ndodh nga iniciativa e Asterisk në diagramin e thirrjes [sub-call-internal-ended] pas përfundimit të thirrjes.

Po shqyrtojmë FreePBX dhe e integrojmë atë me Bitrix24 dhe jo vetëm

Serveri web është i nevojshëm vetëm për dy gjëra - ngarkimi i skedarëve të regjistrimeve në Bitrix (përmes HTTPS) dhe thirrja e skriptit CallMeOut.php. Mund të përdorim serverin e integruar FreePBX, skedarët e të cilit ndodhen në /var/www/html, mund të instalojmë një server tjetër ose të shkruajmë një rrugë tjetër.

Serveri web

Do ta lëmë konfigurimin e serverit web për studim të pavarur (klikoni këtu, klikoni këtu, klikoni këtu). Nëse nuk keni një domen, mund të provoni FreeDomain( https://www.freenom.com/ru/index.html), të cilat do t'ju japin falas një emër për IP-në tuaj të bardhë (mos harroni të kaloni portet 80, 443 përmes rutera, nëse adresën e jashtme e keni vetëm aty). Nëse sapo e keni krijuar domenin DNS, duhet të prisni (nga 15 minuta deri në 48 orë) derisa të gjitha serverat të sinkronizohen. Sipas eksperiencës me ofruesit vendas — nga 1 orë deri në një ditë.

Automatizimi i instalimit

Në GitHub ka filluar zhvillimi i një instaluesi, për ta bërë instalimin edhe më të lehtë. Por gjithçka duket e lehtë në letër — tani e instalojmë të gjithë këtë manualisht, mirë që pasi kemi gërmuar në këtë, është bërë kristalisht e qartë se kush është në miqësi me kë, kush shkon ku dhe si ta debagojmë. Instaluesi akoma nuk është në dispozicion (

Docker

Nëse doni ta provoni shpejt zgjidhjen — ka një mundësi me Docker — krijoni shpejt një kontejner, hapni portet e tij jashtë, fusni skedarët e konfigurimit dhe provoni (kjo është mundësia me kontejnerin LetsEncrypt, nëse certifikata tashmë është në dispozicion, thjesht duhet të redirektoni proxy-in e kthyer në serverin web FreePBX (i kemi dhënë një port tjetër — 88), LetsEncrypt në docker me motivet ky artikull

Duhet të lançoni skedarin në folderin e shkarkuar të projektit (pas git clone), por paraprakisht duhet të hyni në konfigurimet e Asterisk (folderi asterisk) dhe të shkruani atje rrugët për regjistrimet dhe URL-në e faqes tuaj të internetit.

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 # për konfigurim
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # për 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, niset përmes

docker-compose up -d

Nëse nginx nuk nisi, atëherë diçka nuk shkon me konfigurimin në folderin nginx/ssl_docker.conf

Integrime të tjera

Pse të mos e përfshijmë disa CRM në skenat, menduam ne. Ngritëm disa API të CRM-ve të tjera, veçanërisht të atyre falas të integruara në disa PBX — ShugarCRM dhe Vtiger, dhe po! është e mundur, principi është i njëjtë. Por kjo është një tjetër histori, që do ta ngarkohet më vonë në GitHub veçmas.

Linket

Disklemer: çdo bashkësi me realitetin është e rremë dhe nuk isha unë,

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster