Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Bitrix24 on suur tööriist, mis ühendab CRM-i, dokumendihaldust, raamatupidamise ja veel palju erinevaid funktsioone, mis meeldivad juhtidele, kuid mitte IT-personalile. Portaalist kasutavad väga paljud väikesed ja keskmise suurusega ettevõtted, sealhulgas väikesed kliinikud, tootjad ja isegi ilusalongid. Peamine funktsioon, mida juhid „armastavad“, on telefoni ja CRM-i integreerimine: iga väljakutse salvestatakse CRM-i, luuakse kliendikaardid, ning sissetuleva kõne korral kuvatakse kliendi teave ja on kohe näha, kes ta on, mida talle müüa ja kui palju ta võlgneb. Kuid Bitrix24 telefoni teenused ja nende integreerimine CRM-iga on tasulised, mõnikord üsna kallid. Artiklis jagan kogemusi avatud tööriistade ja populaarse IP PBX-i integreerimise osas. FreePBX, samuti vaatleme erinevate osade tööloogikat.

Töötan välislepingulises ettevõttes, mis tegeleb IP telefonide müügi, seadistamise ja integreerimisega. Kui mind küsiti, kas suudame pakkuda midagi integratsiooni jaoks Bitrix24 ja klientide juures olevate telefonivahetuste ning erinevate ettevõtte VDS-ide virtuaalsete telefonivahetuste jaoks, otsisin Google'ist. Ja seal tuli mulle loomulikult link Habr'i artiklile, kus on nii kirjeldus, GitHub ja tundub, et kõik töötab. Kuid katsetades seda lahendust selgus, et Bitrix24 ei ole enam endine ja palju tuleb ümber teha. Lisaks, FreePBX ei ole lihtsalt paljas Asterisk, siin tuleb mõelda, kuidas ühendada kasutusmugavus ja hardcore dialplani konfigureerimine.

Uurime tööloogikat

Nii et kõigepealt, kuidas kõik see peaks töötama. Kui väline kõne jõuab telefonivahetusse (SIP INVITE sündmus teenusepakkujalt), algab dialplani (numbri plaan, dialplan) töötlus - reeglid, mida ja millises järjekorras kõnega teha. Esimesest paketist saab palju teavet, mida hiljem reeglites kasutada. Suurepärane tööriist SIP sisemuse uurimiseks on analyzator sngrep (link) mis toimub populaarsetes distributsioonides apt install/yum install ja sarnaste kaudu, kuid on võimalik koguda ka allikast. Vaatame kõnetu logi sngrepis.

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Lihtsustatud vormis tegeleb dialplan ainult esimese paketiga, mõnikord toimub kõne ajal ka kõnede suunamine, nuppude vajutamine (DTMF), erinevad huvitavad asjad nagu FollowMe, RingGroup, IVR jne.

Mis on Invite paketi sees

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Tegelikult töötavad enamik lihtsaid dialplane peamiselt kahe esimese väljanäitajaga ja kogu loogika keerleb ümber DID-i ja CallerID-i. DID – kuhu helistame, CallerID – kes helistab.

Aga meil on firma, mitte üks telephone – see tähendab, et PSTN-is on tõenäoliselt helistamiskohad (mitme seadme samaaegne/järgnev helistamine) linnanumbritele (Ring Group), IVR (Tere, olete helistanud... Vajutage ühte...), Vastuvõtjad (Phrases), Aja tingimused (Time Conditions), Ümber suunamine teistesse numbritesse või mobiilile (FollowMe, Forward). See tähendab, et on väga keeruline täpselt määrata, kellele kõne tegelikult tuleb ja kellega räägitakse kõne saabudes. Siin on näide tüüpilise kõne läbimisest meie klientide PBXs.

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Pärast edukat sissejuhatust läbib kõne oma teekonna dialplaadis erinevates „kontekstides“. Kontekst Asteriski vaatenurgast on nummerdatud käsukogum, millest igaühel on filtrid valitud numbri järgi (seda nimetatakse exten, välise kõne alguses exten=DID). Dialplaadi ridades võivad olla kõikvõimalikud käsud — sisefunktsioonid (näiteks helistada sisesele abonendile — Dial(), lõpetada kõne — Hangup()), tingimuslikud operaatorid (IF, ELSE, ExecIF ja sarnased), üleminekud teistele selle konteksti reeglile (Goto, GotoIF), üleminekud teistele kontekstidele funktsioonide kutsumise kaudu (Gosub, Macro). Eraldi seisab käsk include nimi_konteksti, , mis lisab teiste konteksti käsud praeguse konteksti lõppu. Käsud, mis on lisatud läbi include, täidetakse alati pärast praeguse konteksti käsude järjekorras.

Kogu FreePBX töölogika on üles ehitatud erinevate kontekstide omavahelisele tõmbamisele läbi include'i ja kutsumise kaudu Gosub, Macro ja Handleri töötlejate kaudu. Vaatleme FreePBX-i sissetulevate kõnede konteksti.

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Kutsed käivad kontekstidest üles ja alla järjestikku, igas kontekstis võivad olla teiste kontekstide kutsed, näiteks makrod (Macro), funktsioonid (Gosub) või lihtsalt üleminekud (Goto), seega on tegelikku puu struktuuri, mida kutsutakse, võimalik jälgida ainult logides.

Tüüpiline kontoritelefonijaama seadistamise skeem on toodud allpool. Sissetulevates marsruutides otsitakse DID-d, mille alusel kontrollitakse ajatingimusi; kui kõik on korras, käivitatakse hääls menu. Sealt on võimalik vajutada nuppu 1 või oodata ajakuupäeva, et suunata kõnede rühma operaatoreid. Kõne lõppedes kutsutakse üles makro hangupcall, pärast mida ei saa dialplaanis enam midagi teha, välja arvatud spetsiaalsed käitlejad (hangup handler).

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Kus selles kõne algoritmis peame me edastama teavet kõne alguse kohta CRM-ile, kus alustada salvestamist, kus lõpetada salvestamine ja saata see koos kõneandmetega CRM-ile?

Integreerimine välistesse süsteemidesse

Mis on PBX ja CRM integreerimine? Need on seadistused ja programmid, mis konverteerivad andmeid ja sündmusi kahe platvormi vahel ning edastavad neid üksteisele. Kõige levinum viis sõltumatute süsteemide vaheliseks suhtlemiseks on API, kõige populaarsem juurdepääs API-le on HTTP REST. Aga mitte asterisk'i jaoks.

Asteriskis on:

  • AGI - sünkroonne väliste programmide/komponentide kutsumine, mida kasutatakse peamiselt kõneskeemis, on olemas sellised raamatukogud nagu phpagi, PAGI

  • AMI - tekstiline TCP soket, töötab sündmuste tellimise ja tekstikomandite sissetoomise põhimõttel, sarnaneb SMTP-ga seest poolt, oskab jälgida sündmusi ja hallata kõnesid, on olemas raamatukogu PAMI — kõige populaarsem Asteriskiga ühenduse loomiseks.

AMI väljundi näide

Sündmus: Uus kanal
Privileeg: call, all
Kanal: PJSIP/VMS_pjsip-0000078b
KanalState: 4
KanalStateDesc: Helistamine
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
Keel: en
AccountCode:
Kontekst: from-pstn
Exten: s
Prioriteet: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI - segu ühest ja teisest, kõik RESTi, WebSocketi kaudu, JSON formaadis — kuid uute raamatukogude ja kattesüsteemidega on kehvasti, esialgu leidsime (phparia, phpari) mis arenesid umbes 3 aastat tagasi.

ARI väljundi näide kõne alustamisel.

{ «variable»:»CallMeCallerIDName», «value»:»111222″, «type»:»ChannelVarset», «timestamp»:»2020-09-09T09:38:36.269+0000″, «channel»:{ «id»:»1599644315.5334″, «name»:»PJSIP/VMSpjsip-000007b6″, «state»:»Ring», «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»:»et» }, «asteriskid»:»48:5b:aa:aa:aa:aa», «application»:»hello-world» }

Mugavus või ebamugavus, võimalus või võimaluse puudumine töötada teatud API-dega määratakse ülesannete järgi, mida on vaja lahendada. CRM-iga integreerimise ülesanded on järgmised:

  • Kutsuda välja kõne algus, kuhu see suunati, toota CallerID, DID, algus- ja lõpuajad, võib-olla ka andmed kataloogist (telefoninumbri ja CRM-i kasutaja seose leidmiseks)

  • Alustada ja lõpetada kõne salvestamine, salvestada sobivas formaadis, teavitada salvestamise lõpuni, kus fail asub

  • Käivitada kõne välise sündmuse tõttu (programmist), helistada sise- või välisnumbrile ja ühendada need

  • Valikuline: integreerida CRM-iga, helistamisrühmade ja FollowME-ga, et automaatselt suunata kõnesid kohtades puudumise korral (CRM-i teabe alusel)

Kõik need ülesanded on lahendatavad AMI või ARI kaudu, kuid ARI pakub märgatavalt vähem teavet, paljusid sündmusi ei registreerita, samuti ei jälgita paljusid muutujaid, mida AMIs siiski leidub (näiteks makrode kutsungid, muutujate määramine makrodesees, sealhulgas kõnede salvestamine). Seetõttu, et tagada õige ja täpne jälgimine — valime esialgu AMI (kuid mitte lõplikult). Lisaks (no kuidas me ilma selleta, me oleme ju laisad inimesed) — algses töös (artikkel Habr) kasutavad PAMI. *Siis tuleb proovida ümber kirjutada ARI peale, kuid ei ole kindel, kas see õnnestub.

Kujundame integratsiooni uuesti

Selleks, et meie FreePBX saaks AMI-le lihtsalt teada anda kõne algusest, lõpuajast, numbritest, salvestatud failide nimedest, on kõige lihtsam arvutada kõne kestust sama triki abil, mida kasutasid algsed autorid — määrata oma muutujad ja analüüsida väljundit nende olemasolu osas. PAMI pakub seda võimalust lihtsalt filtreerimisfunktsiooni kaudu.

Siin on näide oma muutuja määramisest kõne algusaega (s — see on spetsiaalne number dialplanis, mis täidetakse ENNE otsingut DIDi järgi)

[ext-did-custom]

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

AMI sündmuse näidis selle rea jaoks

Sündmus: Uus kanal

Privileeg: call, all

Kanal: PJSIP/VMS_pjsip-0000078b

KanalState: 4

KanalStateDesc: Helistamine

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

ConnectedLineName:

Keel: en

AccountCode:

Kontekst: from-pstn

Exten: s

Prioriteet: 1

Uniqueid: 1599589046.5244

Linkedid: 1599589046.5244

Rakendus: Määra AppData:

CallStart=1599571046

Kuna FreePBX kirjutab ümber failid extention.conf ja extention_additional.conf, kasutame faili extention_custom.conf

Täpne kood extention_custom.conf

[globals]	
;; Kontrollige kaustade teid ja õigusi - kasutajal asterisk peavad olema kirjutamise õigused
;; Siia kirjutatakse kõned
WAV=/var/www/html/callme/records/wav 
MP3=/var/www/html/callme/records/mp3

;; Nende teede kaudu mängitakse ja allalaaditakse salvestus
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Tagasihelistamise aadress väljuva kõne puhul
URLPHP=https://www.host.ru/callmeplus

;; Jah, salvestame kõnesid
RECORDING=1

;; See on makro kõnede salvestamiseks meie kausta.
;; Võib kasutada ka süsteemi salvestust, aga hetkel olgu see - 
;; see töötab
[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()


;; See on põhikontekst kõne alustamiseks
[ext-did-custom]

;; See on veidi hullumeelne, teha seda nii ja siin, aga töötab - lisame numbrile '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Siin on igasuguseid muutujaid skripti jaoks
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)})

;; Kõige olulisem! Kõne lõpu töötleja.
;; Tavalised teed kõne lõpu töötlemiseks (exten=>h,1,...) FreePBX-is ei tööta - Macro(hangupcall,) rikub kõike.
;; Seetõttu seame Hangup_Handler'i kõne lõpetamisele
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Sissetuleva kõne lõpetamise töötleja
[sub-call-from-cid-ended]

;; Teatame väärtustest kõne lõppedes
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)})

;; Kõne staatus - Vastatud, mitte vastatud...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Väljuvate kõnede töötleja - kõik on sarnane
[outbound-allroutes-custom]

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

;; Seame Hangup_Handler'i kõne lõpu töötlejale
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Väljuva kõne lõpetamise töötleja
[sub-call-internal-ended]

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

;; Skripti kutse, mis teatab kõnest CRM-is - see on väljuv,
;; nii et tegelikult selle lõppedes
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

Erinevus ja eripära originaal dialplaniga autorite esitatud artiklis —

  • Dialplan .conf formaadis, nagu soovib FreePBX (jah, ta toetab ka .ael, kuid mitte kõik versioonid ja mitte alati on see mugav)

  • Lõppude töötlemise asemel exten=>h kaudu on sisse viidud töötlemine hangup_handler kaudu, kuna FreePBX dialplan töötas ainult sellega

  • Kohandatud skripti kutset, lisatud jutumärgid ja väline kõne number ExtNum

  • Töötlemine on viidud konteksti _custom ja võimaldab mitte puudutada ja muuta FreePBX konfiguratsioone — sisse tulevad läbi [ext-did-custom], välja minevad läbi [outbound-allroutes-custom]

  • Ei ole nummerdamise seoseid — fail on universaalne ja vajab seadistamist ainult tee ja serveri lingi jaoks

Töö alustamiseks tuleb samuti lasta skriptid AMI-le sisse logida ja parooliga — selle jaoks on FreePBX'is ka _custom fail

Fail manager_custom.conf

;; see on kasutajanimi
[callmeplus]
;; see on salasõna
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; töötan kohaliku masinaga - kuid vajadusel saab kirjeldada ka teisi
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

Need kaks faili tuleb paigutada /etc/asterisk, seejärel lugeda seadistused uuesti (või taaskäivitada asterisk)

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

Liigume edasi PHP juurde

Käivitage skripte ja looge teenus

Kuna tööprotsess Bitrix 24, mis on AMI teenus, ei ole väga lihtne ja selge, tasub sellele eraldi peatuda. Asterisk aktiveerimisel avab AMI lihtsalt pordi ja kõik. Klient liitudes küsib autentimist, seejärel liitub klient vajalike sündmustega. Sündmused saadetakse lihtsa tekstina, mille PAMI muudab struktureeritud objektideks ja võimaldab filterfunktsiooni seadistamist ainult huvitavate sündmuste, väljade, numbrite jms järgi.

Niipea kui kõne saabub, tekib sündmus NewExten, alustades vanemapõhjast [from-pstn], seejärel järgivad kõik sündmused kontekstides ridade järjekorras. Kui vajalik teave saadakse kõneplaanis määratud _custom muutujatest CallMeCallerIDName ja CallStart, kutsutakse välja

  1. UserID päringufunktsioon, mis vastab sise numbrile, kuhu kõne tuli. Aga kui see on kõnede rühma ühendamine? See on poliitiline küsimus, kas luua kõne kõigile korraga (kui nad kõik helistavad korraga) või luua kõne seadistamine järk-järgult, kui helistatakse? Enamikul klientidest on strateegia First Available, seega ei ole probleeme, helistab ainult üks. Aga küsimus tuleb lahendada.

  2. Kõne registreerimise funktsioon Bitrix24-s, mis tagastab CallID, mida on hiljem vaja kõne parameetrite ja salvestuse lingi edastamiseks. Nõuab kas sise numbrit või UserID-d.

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Pärast kõne lõppu kutsutakse esile salvestuse laadimise funktsioon, mis samal ajal teatab kõne lõpetamise staatuse (Hõivatud, Pole vastust, Edu), samuti laadib mp3-faili lingi salvestamiseks (kui on).

Kuna CallMeIn.php moodul peab töötama pidevalt, siis on selle jaoks loodud SystemD käivitamise fail. callme.service, mille tuleb panna /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

# Siit tuleb vaadata, millised õigused on kaustadel
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

Skripti initsialiseerimine ja käivitamine toimub läbi systemctl või service

# systemctl enable callme
# systemctl start callme

Teenust käivitatakse vajadusel automaatselt (katkestuste korral). Sissevoolu jälgimise teenus ei vaja veebiserveri seadistamist, vajalik on vaid PHP (mis kindlasti on FeePBX serveris). Kuid kui puudub juurdepääs kõnede salvestustele läbi veebiserveri (veel ka https), ei saa kõnede salvestusi kuulata.

Nüüd räägime väljaminevatest kõnedest. Skriptil CallMeOut.php on kaks funktsiooni:

  • Kõne algatamine, kui saadetakse päring PHP skriptile (sealhulgas nupule 'Helista' Bitrixis). Ilma veebiserverina ei tööta, päring saabub läbi HTTP POST, kus sisaldub token

  • Teade kõne, selle parameetrite ja salvestuste kohta Bitrixis. Toimub Asterisk'i algatusel dialplaanis [sub-call-internal-ended] kõne lõppedes

Käime läbi FreePBX ja integreerime selle Bitrix24-ga ja muu hulgas

Veebiserver on vajalik kaheks asjaks — Bitrixi failiüleslaadimise (HTTPS kaudu) ja skripti CallMeOut.php käivitamiseks. Saate kasutada sisseehitatud FreePBX serverit, mille failid asuvad /var/www/html, installida teise serveri või määrata teise tee.

Veebiserver

Jätame veebiserveri seadistamise iseseisvaks uurimiseks (kliki siia, kliki siia, kliki siia). Kui teil pole domeeni, võite proovida FreeDomaini ( https://www.freenom.com/ru/index.html), mis annavad teile tasuta nime teie avalikule IP-le (ärge unustage suunata porte 80, 443 ruuteri kaudu, kui väline aadress on ainult sellel). Kui olete just DNS domeeni loonud, peate ootama (15 minutist kuni 48 tunnini), kuni kõik serverid uuendatakse. Oma kogemuste põhjal kodumaiste teenusepakkujatega — 1 tunni kuni ööpäeva.

Installeerimise automatiseerimine

GitHubis on alustatud installeerija arendust, et paigaldamine oleks veelgi lihtsam. Kuid sujuv oli ainult paberil — hetkel paigaldame kõik käsitsi, kuid pärast kogu selle kallale minekut on kristallselge, kellega sõbrustatakse, kes kuhu läheb ja kuidas seda siluda. Installeerijat hetkel pole (

Docker

Kui soovite lahendust kiiresti proovida, on olemas Dockeriga variant — kiiresti luua konteiner, avada sellele port väljast, lisada konfiguratsioonifailid ja proovida (see on LetsEncrypt konteineri variant, kui sertifikaat juba olemas, tuleb lihtsalt suunata pöördproksi FreePBX veebiserverile (millele me andsime teise pordi — 88), LetsEncrypt Dockeris töötab põhjal) selle artikli

Faili tuleb käivitada projekti allalaaditud kaustas (pärast git clone), kuid eelnevalt tuleb minna Asterisk'i konfiguratsioonifailidesse (kaust asterisk) ja määrata seal ülesvõtete ja teie saidi URL-ided

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 # seadmise jaoks
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # CallMeOut.php jaoks
#      - 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:

See fail docker-compose.yaml käivitub läbi

docker-compose up -d

Kui nginx ei käivitunud, siis on nginx/ssl_docker.conf kaustas midagi valesti konfigureeritud.

Teised integratsioonid

Aga miks mitte lisada skriptidesse ka mõned CRM-id, mõtlesime me. Uurisime mitmeid teiste CRM-ide API-sid, eriti tasuta, mis on integreeritud mõnede ATSide — ShugarCRM ja Vtiger, ja jah! See on võimalik, põhimõte on sama. Aga see on juba teine lugu, mille laadime hiljem GitHubi eraldi.

Lingid

Kohustuslik teavitus: kõik kokkulangevused reaalsusega on juhuslikud ja see ei olnud mina.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster