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. , 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 , 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 () mis toimub populaarsetes distributsioonides apt install/yum install ja sarnaste kaudu, kuid on võimalik koguda ka allikast. Vaatame kõnetu logi sngrepis.

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

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.

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.

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).

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 ,
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 — 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 (, ) 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 () 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,ReturnErinevus 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,originateNeed 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> exitLiigume 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
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.
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.

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.targetSkripti initsialiseerimine ja käivitamine toimub läbi systemctl või service
# systemctl enable callme
# systemctl start callmeTeenust 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

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 (, , ). Kui teil pole domeeni, võite proovida FreeDomaini ( ), 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)
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
Kood ise GitHubis —
Algne artikkel ideeks
Kohustuslik teavitus: kõik kokkulangevused reaalsusega on juhuslikud ja see ei olnud mina.
Allikas: habr.com
