Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Bitrix24 është një platformë e madhe që kombinon CRM, menaxhimin e dokumenteve, dhe bookkeeping dhe shumë gjëra të tjera që i pëlqejnë menaxherëve dhe nuk janë shumë të preferuara nga IT. Portalin e përdorin shumë kompani të vogla dhe të mesme, përfshirë klinika të vogla, prodhues dhe madje edhe sallone bukurie. Funksioni kryesor që menaxherët 'e duan' është integrimi i telefonisë dhe CRM-së, ku çdo telefonatë regjistrohet menjëherë në CRM, krijohen karta klienti, dhe për ardhjet shfaqet informacioni për klientin, duke treguar kush është ai, çfarë mund t'i shitet dhe sa duhet. Por telefonia nga Bitrix24 dhe integrimi i saj me CRM ka një kosto, ndonjëherë mjaft të lartë. Në këtë artikull do të flas për përvojën e integrimit me mjete të hapura dhe një IP PBX të njohur FreePBX, po ashtu do të shqyrtoj logjikën e funksionimit të pjesëve të ndryshme

Unë punoj në outsourcing në një kompani që merret me shpërndarjen dhe konfigikimin, integrimin e telefonisë IP. Kur më pyetën, a mund të ofrojmë diçka për integrimin e Bitrix24 me PBX që janë tek klientët, si dhe me PBX virtuale në VDS të ndryshme të kompanisë, shkova në Google. Dhe ai natyrisht më dha një lidhje në një artikull në Habr, ku ka përshkrime, dhe github, duket se gjithçka funksionon. Por kur u përpoqa të përdorja këtë zgjidhje, u shfaq që Bitrix24 nuk është çfarë ishte më parë, dhe duhet bërë shumë rregullime. Për më tepër, FreePBX nuk është thjesht një Asterisk i papërpunuar, këtu duhet të mendosh se si të përqendrohesh në lehtësinë e përdorimit dhe planin e dialogut në skedarët e konfigurimit.

Studimi i logjikës së funksionimit

Pra, për të filluar, si duhet të funksionojë. Kur një telefonatë arrin nga jashtë në PBX (ngjarja SIP INVITE nga ofruesi) fillon përpunimi i planit të thirrjes (planit të numërimit, dialplan) - rregullat se çfarë dhe në cilin renditje do të bëjmë me telefonatën. Nga paketa e parë mund të merret shumë informacion, i cili mund të përdoret më pas në rregulla. Një mjet i shkëlqyer për të studiojë thellësitë e SIP është analizatori sngrep (link) i cili vendoset lehtësisht në shpërndarjet e njohura përmes apt install/yum install dhe të ngjashme, por gjithashtu mund të ndërtohet nga burimi. Le të shikojmë logun e telefonatës në sngrep

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Në një formë të thjeshtuar, plani i thirrjes merret vetëm me paketën e parë, ndonjëherë gjatë bisedës bëhen transferime telefonatash, shtypje butonash (DTMF), gjëra të ndryshme interesante si FollowMe, RingGroup, IVR dhe të tjera.

Çfarë ka brenda paketës Invite

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Në thelb, shumica e planeve të thirrjes së thjeshta punojnë me dy fushat e para dhe e gjithë logjika rrotullohet rreth DID dhe CallerID. DID - ku po telefonojmë, CallerID - kush po telefonon.

Por ne jemi një kompani dhe jo një telefon - dhe do të thotë se në PBX ka mundësi për grupe thirrjes (thirrje të menjëhershme/së bashku nga disa aparate) në numra të qytetit (Ring Group), IVR (Përshëndetje, ju keni telefonuar... Shtypni një për...), Mesazhe automatikë (Phrases), Kushte të përkohshme (Time Conditions), Rinisje në numra të tjerë ose në celular (FollowMe, Forward). Kjo do të thotë se është shumë e vështirë të përcaktosh saktësisht kujt do t'i vijë thirrja dhe me kë do të bisedohet kur telefonata të arrijë. Këtu është një shembull i fillimit të kalimit të një thirrjeje tipike në PBX-në e klientëve tanë

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Pas një hyrjeje të suksesshme të telefonatës në PBX, ajo kalon përmes planit të thirrjes në kontekste të ndryshme. Kontakti në këndvështrimin e Asterisk është një grup komandash të numëruara, secila prej të cilave përmban një filtrin për numrin e thirrjes (ai quhet exten, për thirrjet jashtë në fazën fillestare exten=DID). Komandat në rreshtin e planit të thirrjes mund të jenë gjithçka - funksione të brendshme (për shembull të thërrasësh një abonent të brendshëm - Dial(), të hedhësh telefonin - Hangup()), operatorë të kushteve (IF, ELSE, ExecIF e të ngjashme), kalime në rregullat e tjera të këtij konteksti (Goto, GotoIF), kalime në kontekste të tjera në formën e thirrjeve të funksioneve (Gosub, Macro). Veçmas, direktivi include emri_kontekstit, i cili 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 funksionimit të FreePBX është ndërtuar mbi përfshirjen e njëri-tjetrit të konteksteve të ndryshme përmes include dhe thirrjes përmes Gosub, Macro dhe trajtuesve Handler. Le të shqyrtojmë kontekstin e thirrjeve të ardhshme të FreePBX

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Thirrja kalon përmes të gjithë konteksteve nga lart poshtë sipas radhës, në secilin kontekst mund të ketë thirrje të konteksteve të tjera si makro (Macro), funksione (Gosub) ose thjesht kalime (Goto), kështu që struktura reale e asaj që thirret mund të gjurmohen vetëm në log.

Shema tipike për konfigurimin e një PBX tipik zyrar tregohet më poshtë. Kur bëhet një thirrje, në rrugët hyrëse kërkohet DID, kontrollohen kushtet kohore, dhe nëse gjithçka është në rregull — aktivizohet menuja gjatë bisedës. Në të, me butonin 1 ose me një kohëzgjatje, kalon në grupin e operatorëve të disponueshëm. Pas përfundimit të thirrjes, thirret makroja hangupcall, pas së cilës nuk mund të kryhen më veprime në planin e thirrjeve, përveç se për trajtuesit specialë (hangup handler).

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Ku në këtë algoritëm thirrjeje duhet të dërgojmë informacionin për fillimin e thirrjes në CRM, ku të fillojmë regjistrimin, ku të përfundojmë regjistrimin dhe ta dërgojmë atë së bashku me informacionin për thirrjen në CRM?

Integrimi me sisteme të jashtme

Çfare është integrimi i PBX me CRM? Këto janë konfigurime dhe programe që konvertojnë të dhëna dhe ngjarje mes këtyre dy platformave dhe shkëmbejnë informacione me njëra-tjetrën. Mënyra më e zakonshme e bashkëveprimit të sistemeve të pavarura është API, dhe mënyra më e njohur për qasje në API është HTTP REST. Por jo për asterisk.

Brenda Asterisk ka:

  • AGI — thirrje sinkrone të programeve/komponentëve të jashtëm, përdoret kryesisht në planin e thirrjeve, ka biblioteka si phpagi, PAGI

  • AMI — soketi TCP tekstor, që funksionon sipas parimit të abonimit në ngjarje dhe futjes së komandave tekstore, ngjan me SMTP nga brenda, di të ndjekë ngjarje dhe të menaxhojë thirrje, ka një bibliotekë PAMI — më e njohur për krijimin e lidhjes me Asterisk

Shembuj i daljes së AMI

Ngjarja: Newchannel
Privilegji: call,all
Channel: PJSIP/VMS_pjsip-0000078b
ChannelState: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
Language: en
AccountCode:
Context: from-pstn
Exten: s
Priority: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI — një miks i të dyja, të gjitha përmes REST, WebSocket, në formatin JSON — por me bibliotekat dhe mbulimet më të reja nuk është shumë, në shikim të parë janë gjetur (phparia, phpari) që kanë ndalur zhvillimin e tyre rreth tre vjet më parë.

Shembuj i daljes së ARI gjatë iniciativës së thirrjes

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{"id":"1599644315.5334", "name":"PJSIP/VMS pjsip-000007b6", "state":"Ring", "caller":{"name":"111222", "number":"111222"}, "connected":{"name":"", "number":""}, "accountcode":"", "dialplan":{"context":"from-pstn", "exten":"s", "priority":2, "app name":"Stasis", "app data":"hello-world"}, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"ru"}, "asterisk id":"48:5b:aa:aa:aa:aa", "application":"hello-world" }Komoditeti ose pamundësia e punës me një API të caktuar përcaktohen nga detyrat që duhet të zgjidhen. Detyrat për integrimin me CRM janë si më poshtë:Të ndjekë fillimin e thirrjes, ku është transferuar, të nxjerrë CallerID, DID, kohët e fillimit dhe përfundimit, ndoshta të dhëna nga katalogu (për të gjetur lidhjen e telefonit me përdoruesin e CRM)Të fillojë dhe përfundojë regjistrimin e thirrjes, ta ruajë në formatin e nevojshëm, t'i informojë pas përfundimit të regjistrimit se ku ndodhet skedaTë inicojë një thirrje përmes një ngjarjeje të jashtme (nga programi), të thërrasë një numër të brendshëm, të jashtëm dhe t'i bashkojë ato

: të integrohet me CRM, grupet e thirrjeve dhe FollowME për transferimin automatik të thirrjeve në raste mungese (sipas informacionit nga CRM)

  • Të gjitha këto detyra mund të zgjidhen përmes AMI ose ARI, por ARI siguron shumë më pak informacion, nuk ka shumë ngjarje, shumë variabla që janë në AMI ndonjëherë mungojnë (për shembull thirrjet e makrove, caktimi i variablave brenda makrove, duke përfshirë regjistrimin e thirrjeve). Pra, për ndjekje të saktë dhe të saktë — do të zgjedhim për tani AMI (por jo përfundimisht). Për më tepër (sigurisht, nuk ka si të mos ndodhë, ne jemi njerëz të lenë) — në punën e mëparshme (

  • artikulli në habr

  • përdorin PAMI. *

  • OpsionaleMë pas duhet të provojmë ta rishkruajmë për ARI, por nuk është e sigurt se do të funksionojë.

Po krijojmë një integrim nga e paraQë FreePBX ynë të mund të njoftojë në AMI në mënyra të thjeshta për fillimin e thirrjes, kohën e përfundimit, numrat, emrat e skedave të regjistruar, më e lehtë është të përdorim të njëjtin trillim, si autorët origjinalë — të futim variablat tanë dhe të analizojmë daljen për praninë e tyre. PAMI e ofron këtë përmes funksionit filtrues.) Ja një shembull i caktimit të një variabli tonin për kohën e fillimit të thirrjes (s — ky është një numër special në planin e thirrjeve, i cili ekzekutohet PARA fillimit të kërkimit sipas DID)[ext-did-custom]exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})

Shembuj i ngjarjes AMI për këtë linjë

Aplikacioni: Set AppData:

CallStart=1599571046

Pasiqë FreePBX riprogramon skedat extention.conf dhe extention_

additional.conf, ne do të përdorim skedën

Ngjarja: Newchannel

Privilegji: call,all

Channel: PJSIP/VMS_pjsip-0000078b

ChannelState: 4

ChannelStateDesc: Ring

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

ConnectedLineName:

Language: en

AccountCode:

Context: from-pstn

Exten: s

Priority: 1

Uniqueid: 1599589046.5244

Linkedid: 1599589046.5244

extention_

custom

Kodi i plotë i extention_custom.confadditional.conf, ne do të përdorim skedarin extention_personalizuar.conf

Kodi i plotë i extention_custom.conf

[globals]	
;; Kontrolloni rrugët dhe të drejtat për dosjet - 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 kalbek në thirrjet që dalin
URLPHP=https://www.host.ru/callmeplus

;; Po, regjistrojmë bisedat
RECORDING=1

;; Ky është makrosi për regjistrimin e bisedave në dosjen tonë. 
;; Mund të përdoret edhe regjistrimi sistemik, por për momentin le të mbetet 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ë provokim, ta bësh këtë dhe këtu, por funksionon - shtojmë numrit '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Këtu janë variablat 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)})

;; E rëndësishme! Menaxheri i përfundimit të bisedës. 
;; Rrugët normale të përpunimit të përfundimit përmes (exten=>h,1,çthtothitu) në FreePBX nuk funksionojnë - Macro(hangupcall,) gjithçka prish. 
;; Prandaj vendosim 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}))

;; Menaxheri i përfundimit të thirrjes hyrëse
[sub-call-from-cid-ended]

;; Njoftojmë për vlerat në përfundimin e thirrjes
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, nuk përgjigjet...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Menaxheri i thirrjeve që dalin - të gjitha analoge
[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})

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

;; Menaxheri i përfundimit të thirrjes që del
[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, i cili do të njoftojë për thirrjen në CRM - është dalëse, 
;; pra në fakt në përfundim
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

Karakteristika dhe dallimi nga plani origjinal i bisedës i autorëve të artikullit burimor —

  • Plani i bisedës në format .conf, siç e do FreePBX (po, ai di .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 bisedës së FreePBX funksionoi vetëm me të

  • Është korrigjuar rreshti i thirrjes së skriptit, janë shtuar citate dhe numri i jashtëm i thirrjes ExtNum

  • Përpunimet janë nxjerrë në kontekste _custom dhe lejojnë të mos preken dhe të mos rregullohen konfigurimet e FreePBX — hyrëse përmes [ext-did-custom], dalëse përmes [outbound-allroutes-custom]

  • Nuk ka lidhje me numrat - skedari është universale dhe ka nevojë për konfigurim vetëm të rrugës dhe lidhjes me serverin

Për të filluar punën, duhet gjithashtu të hapni skriptet në AMI me emrin e përdoruesit dhe fjalëkalimin - për këtë FreePBX gjithashtu ka skedarin _custom

Skedari manager_custom.conf

;;  ky është emri i përdoruesit
[callmeplus]
;; ky është fjalëkalimi
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; unë punoj me makinën lokale - por nëse duhen, mund të shkruhen edhe 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 skeda duhet vendosur në /etc/asterisk, pastaj duhet të lexohen konfigurimet (ose duhet të ribashkohen asterisku)

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

Tani të kalojmë në PHP

Inizializimi i skriptit dhe krijimi i shërbimit

Duke pasi skema e punës me Bitrix 24, shërbimi për AMI nuk është shumë e thjeshtë dhe e qartë, duhet të ndalesh ndaras. Asterisk, kur aktivizohet AMI, thjesht hap portin dhe kaq. Kur klienti bashkohet, kërkon autorizim, pastaj klienti subscribe për ngjarjet e nevojshme. Ngjarjet vijnë si tekst i thjeshtë, që PAMI e transformon në objekte të strukturuara dhe ofron mundësinë për të vendosur funksionin e filtrimit vetëm për ngjarjet, fushat, numrat etj. që të interesojnë.

Sapo që thirrja arrin, ndodh ngjarja NewExten duke filluar nga konteksti prind [from-pstn], pastaj ndodhin të gjitha ngjarjet sipas renditjes së rreshtave në kontekste. Kur merrni informacionin nga variablat e caktuar në planin e thirrjes _custom CallMeCallerIDName dhe CallStart, thirret

  1. Funksioni i kërkesës UserID, i cili korrespondon me numrin e brendshëm, ku ka ardhur thirrja. Por nëse është grup thirrjeje? Kjo është një çështje politike, duhet të krijoni thirrje për të gjithë njëherazi (kur thirren të gjithë menjëherë) apo të krijoni ndërlidhje ndërsa thirren një pas një? Te shumica e klientëve, strategjia është First Available, kështu që nuk ka probleme, thirret vetëm një. Por çështja duhet të zgjidhet

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

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Pas përfundimit të thirrjes thirret funksioni i ngarkimit të regjistrimit, i cili njëkohësisht raporton statusin e përfundimit të thirrjes (e Zënë, Nuk ka përgjigje, Succes), si dhe ngarkon lidhjen me skedarin mp3 me regjistrimin (nëse ekziston).

Duke qenë se moduli CallMeIn.php duhet të funksionojë pa ndërprerje, një skedë fillimi SystemD është krijuar për të callme.service, e cila 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ëtë duhet të shikoni, çfarë të drejtash kanë dosjet
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

në inicializimin dhe fillimin e skriptit ndodh përmes systemctl ose service

# systemctl enable callme
# systemctl start callme

Shërbimi do të rindezë vetë sipas nevojës (në raste dështimesh). Shërbimi për mbikëqyrjen e thirrjeve të hyrëse nuk kërkon instalimin e një serveri web, vetë php është e nevojshme (e cila sigurisht është në serverin FeePBX). Por pa qasje në regjistrimet e thirrjeve përmes serverit web (edhe me https) nuk do të ketë mundësi për të dëgjuar regjistrimet e bisedave.

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

  • Inicimi i thirrjes kur bëhet kërkesa për skriptin php (përfshirë me butonin 'Thirr') brenda Bitrix. Pa server web nuk funksionon, kërkesa bëhet përmes HTTP POST, në kërkesë përmban tokenin

  • Raporti mbi thirrjen, parametrat e saj dhe regjistrimet në Bitrix. Kjo ndodh nga iniciativa Asterisk në planin e thirrjes [sub-call-internal-ended] kur thirrja përfundon

Kemi diskutuar mbi FreePBX dhe e integrojmë atë me Bitrix24 e jo vetëm

Serveri web është i nevojshëm vetëm për dy gjëra - ngarkimin e skedarëve të regjistrimeve nga Bitrix (për HTTPS) dhe thirrjen e skriptit CallMeOut.php. Mund të përdorni serverin e ndërtuar brenda FreePBX, skedarët për të cilin ndodhen në /var/www/html, ose mund të instaloni një server tjetër ose të skiconi një rrugë tjetër.

Server web

Do ta lëmë konfigurimin e serverit web për studim të vetë, (klikoni këtu, klikoni këtu, klikoni këtu). Nëse nuk keni një domain, mund të provoni FreeDomain, ( https://www.freenom.com/ru/index.html), të cilët falas do t'ju jepnin një emër për IP tuaj të bardhë (mos harroni të kaloni portet 80, 443 përmes routerit, nëse adresa e jashtme ndodhet vetëm aty). Nëse sapo krijuat një domain DNS, duhet të prisni (nga 15 minuta deri në 48 orë) derisa të gjitha serverët të ngarkohen. Sipas përvojës me ofruesit vendas - nga 1 orë deri në një ditë.

Automatizimi i instalimit

Në github është filluar zhvillimi i një instaluesi, për ta bërë instalimin edhe më të lehtë. Por gjithçka dukej mirë në letër - për tani po e instalojmë gjithë këtë manualisht, e cila është e qartë pas një hulumtimi të thellë se me kënd lidhesh, ku shkon dhe si ta debagojë. Instaluesi ende nuk është në dispozicion (

Docker

Nëse dëshironi të provoni shpejt zgjidhjen - ka një opsion me Docker - të krijoni shpejt një konteiner, ti jepni portet jashtë, t'i jepni skedarët e konfigurimit dhe të provoni (ky është opsioni me konteinerin LetsEncrypt, nëse certifikata tashmë ekziston, vetëm duhet të drejtoni një proxy të kundërt në serverin web FreePBX (ti kemi dhënë një port tjetër - 88), LetsEncrypt në docker është bazuar në këtë artikull

Duhet të ekzekutoni skedarin në dosjen e projektit të shkarkuar (pas git clone), por fillimisht të hyni në konfigurimet e Asterisk (dosja asterisk) dhe të shkruani aty rrugët për regjistrimet dhe URL-në e faqes tuaj

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 konfigurimin
      - 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, ekzekutohet përmes

docker-compose up -d

Nëse nginx nuk u nis, do të thotë se diçka nuk është në rregull me konfigurimin në dosjen nginx/ssl_docker.conf.

Integrime të tjera

Pse të mos shtojmë disa CRM në skriptet tona, menduam ne. Studiuam disa API të CRM-ve të tjera, veçanërisht atë të integruar falas në disa ATS — ShugarCRM dhe Vtiger, dhe po! është e mundur, principi është i njëjtë. Por kjo është një histori tjetër, të cilën do ta ngarkojmë më vonë në GitHub veçmas.

Linke

Diskleimer: çdo ngjashmëri me realitetin është rastësore dhe nuk ishte unë,

Burimi: habr.com

Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS 🔥 Bleni hostim të besueshëm për faqe me mbrojtje nga DDoS, serverë VPS VDS | ProHoster