on suur tööriist, mis ühendab CRM-i, dokumentide halduse, raamatupidamise ja veel palju erinevaid asju, mis meeldivad juhtidele, kuid mitte IT-personalile. Portaalit kasutavad väga palju väikesed ja keskmised ettevõtted, sealhulgas väikesed kliinikud, tootjad ja isegi ilusalongid. Peamine funktsioon, mida juhid "armastavad", on telefonihalduse ja CRM-i integratsioon, kus iga kõne registreeritakse kohe CRM-i, luuakse kliendi kaardid, siseneval kõnel kuvatakse teave kliendi kohta ja kohe on näha, kes ta on, mida talle müüa võiks ja kui palju ta võlgneb. Kuid telefonihaldus Bitrix24 eest maksab raha, vahel isegi palju. Käesolevas artiklis räägin avatud tööriistade ja populaarse IP-ATS-i integreerimise kogemusest. , samuti vaatan erinevate osade töölogikat.
Töötan väljaannete teenustes ettevõttes, kus müüakse ja seadistatakse, integreeritakse IP-telefonia. Kui mind küsiti, kas me saame näiteks pakkuda ühele ja teisele ettevõttele midagi Bitrix24 integreerimiseks nende klientide ATS-idega, samuti virtuaalsete ATS-idega erinevates VDS-ides, läksin Googlesse. Ja seal see muidugi andis mulle lingi , kus on nii kirjeldus kui ka GitHub, ja tundub, et kõik töötab. Kuid proovides selle lahenduse kasutamist selgus, et Bitrix24 ei ole enam see, mis oli varem, ja palju tuleb ümber teha. Lisaks, FreePBX ei ole lihtsalt tühi Asteriski rakendus, siin tuleb mõelda, kuidas mugavust ja keerulist kõneplaani konfiguratsioonifailides ühendada.
Uurime töölogikat
Nii et alustuseks, kuidas see kõik peaks töötama. Kui ATS-ile saabumine toimub väliskõne korral (SIP INVITE sündmus teenusepakkujalt), algab kõneplaani töötlemine — reegleid, mida ja mis järjekorras kõnega teha. Esimesest paketist saab palju teavet, mida hiljem reeglites kasutada. Suurepärane tööriist SIPi sisemiste sügavale uurimiseks on analüsaator sngrep (), mis installitakse lihtsalt populaarsetes distributsioonides apt install/yum install kaudu, kuid seda saab ka allikatest ehitada. Vaatame sngrepis kõnekäiku.

Lihtsustatult tegeleb dialplaan ainult esimese paketiga, mõnikord toimub kõne jooksul ka kõnede ülekandmine, nuppude (DTMF) vajutamine, erinevad huvitavad funktsioonid nagu FollowMe, RingGroup, IVR ja muud.
Mis on Invite paketis

Enamik lihtsaid dialplaane töötab kahel esimesel väljal ja kogu loogika keerleb ümber DID'i ja CallerID'i. DID - kuhu helistame, CallerID - kes helistab.
Aga meil on firma, mitte üks telefon - ja seega on tõenäoliselt PBX'is helistamisrühmad (mitme seadme samal ajal/järjekorras helistamine) linnanumbrite jaoks (Ring Group), IVR (Tere, te helistate... Vajutage ühte, et...), Häälvastajad (Phrases), Aja tingimused (Time Conditions), Edasi suunamine muudele numbritele või mobiiltelefonile (FollowMe, Forward). See tähendab, et on väga keeruline kindlaks teha, kellele kõne tegelikult tuleb ja kellega räägitakse kõne saabumisel. Siin on näide tüüpilise kõne algusest meie klientide PBX'is.

Pärast kõne sisenemist PBX-i hakkab see liikuma dialplaanis erinevates "kontekstides". Asterisk'i vaatenurgast on kontekst numbrite kogum, millest igaühel on filtrid valitud numbri jaoks (see nimetatakse exten, välist kõnet algfaasis exten=DID). Dialplaani rida võib sisaldada kõike - sisefunktsioone (näiteks helistada sisesele abonendile - Dial(), kõne lõpetamine - Hangup()), tingimuslikke operaattoreid (IF, ELSE, ExecIF ja sarnased), üleminekud teistele selle konteksti reeglitele (Goto, GotoIF), üleminekud teistele kontekstidele funktsioonikutsena (Gosub, Macro). Eraldi väärib tähelepanu direktiiv include konteksti_nimi, mis lisab teise konteksti käsud praeguse konteksti lõppu. Include kaudu lisatud käsud täidetakse alati. pärast praeguse konteksti käsud.
Kogu FreePBX'i tööloogika põhineb erinevate kontekstide üksteise sisse- ja välja lülitamisel, kasutades include ja kutseid läbi Gosub, Macro ja töötlejad. Vaatleme FreePBX'i sissetulevate kõnede konteksti.

Kõne kulgeb kõikides kontekstides ülevalt alla järjestikku, igas kontekstis võivad olla teiste kontekstide kutsed nagu makrod (Macro), funktsioonid (Gosub) või lihtsalt üleminekud (Goto), seega saab tegelikku puu olemasolevast kutse jälgida ainult logides.
Tüüpiline büroo PBX-i seadistamise skeem on näidatud allpool. Saatelefonikõnede marsruutides otsitakse DID-d, kontrollitakse ajatingimusi ja kui kõik on korras, käivitub häälmenüü. Sealt saab vajutada nö. 1 või oodata ära ajapiirang, et minna operaatorite dosaari rühma. Kõne lõppedes kutsutakse esile makro hangupcall, pärast mida dialplaanis ei suudeta enam midagi teha, välja arvatud spetsiaalsed töötlejad (hangup handler).

Kuidas peaksime selle kõne algoritmi kaudu andma teavet kõne algusest CRM-ile, kus alustada salvestamist, kus lõpetada salvestamine ja saata see koos kõne teabega CRM-ile?
Integreerimine väliste süsteemidega
Mis on PBX ja CRM integreerimine? Need on seadistused ja programmid, mis konverteerivad andmeid ja sündmusi nende kahe platvormi vahel ja edastavad need omavahel. Kõige levinum viis sõltumatute süsteemide koostöös on API, ja kõige populaarsem viis keegi API-le ligi pääsemiseks on HTTP REST. Kuid mitte asteriskile.
Asteriskis on:
AGI – sünkroonne väliste programmide/komponentide kutsumine, mida kasutatakse peamiselt dialplaanis, olemas on sellised teegid nagu ,
AMI – tekstiline TCP soket, mis töötab sündmuste tellimise ja tekstikäsu sisestamise põhimõttel, meenutab seestpoolt SMTP-d, suudab jälgida sündmusi ja hallata kõnesid, olemas on teek – kõige populaarsem Asteriski ühendamiseks
AMI väljundi näidis
Event: Newchannel
Privilege: call,all
Channel: PJSIP/VMS_pjsip-0000078b
ChannelState: 4
ChannelStateDesc: Ringi
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
Language: en
AccountCode:
Context: from-pstn
Exten: s
Priority: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244
ARI – segu sellest ja too, kõik läbi REST, WebSocket, JSON formaadis – aga värskete teekide ja mähiste osas pole asjad nii head, lintile leidub (, ) mis arendasid end kolmandat aastat tagasi.
ARI väljundi näidis kõne algatamisel
{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id":"1599644315.5334", "name":"PJSIP/VMSpjsip-000007b6", "state":"Ringi", "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":"ru" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }
Mugavus või ebamugavus, võimalus või võimatus töötada mingi API-ga sõltub ülesannetest, mida lahendada tuleb. CRM-iga integreerimise ülesanded on järgmised:
Jälgida kõne algust, kuhu see edastati, välja võtta CallerID, DID, algus- ja lõpuajad, võib-olla ka andmed kataloogist (telefoninumbri ja CRM kasutaja seose leidmiseks)
Alustada ja lõpetada kõne salvestamine, salvestada sobivas formaadis, teavitada salvestamise lõppedes, kus fail asub
Initsieerida kõne välise sündmuse kaudu (programmist), helistada sise- või välisnumbrile ja ühendada neid
Valikuline: integreerida CRM-iga, kõnegruppidega ja FollowME-ga, et automaatselt suunata kõnesid, kui kohapeal ei viibi (CRM-i teabe põhjal)
Kõiki neid ülesandeid saab lahendada AMI või ARI kaudu, kuid ARI pakub palju vähem teavet, paljusid sündmusi ei jälgita, samuti mitmeid muutujaid, mida AMI siiski sisaldab (näiteks makrode kutsumine, muutuja määramine makrode sees, sealhulgas kõnede salvestamine). Seetõttu valime õige ja täpse jälgimise jaoks praegu AMI (aga mitte lõpuks). Lisaks sellele (noh, kuhu me ilma selleta, oleme inimesed, laisad) - algses töös () kasutavad PAMI-d. *Hiljem tuleb proovida ümber kirjutada ARI-le, kuid pole kindel, et see õnnestub.
Kavandame integratsiooni uuesti
Selleks, et meie FreePBX saaks AMI-sse lihtsate viisidega edastada kõne alguse, lõpuaja, numbrid, salvestatud failide nimed, on kõige lihtsam kasutada sama trikki, mis algsetel autoritel - sisse viia oma muutujad ja analüüsida väljundit nende olemasolu osas. PAMI pakub selleks lihtsalt funktsiooni-filtrit.
Siin on näide oma muutuja seadistamisest kõne alguse jaoks (s - see on eriline number dialplaanis, mis täidetakse ENNE DID järgi otsimise algust)
[ext-did-custom]
exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})Näide AMI sündmusest selle rea järgi
Event: Newchannel
Privilege: call,all
Channel: PJSIP/VMS_pjsip-0000078b
ChannelState: 4
ChannelStateDesc: Ringi
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
Language: en
AccountCode:
Context: from-pstn
Exten: s
Priority: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244
Rakendus: Seata AppData:
CallStart=1599571046
Kuna FreePBX salvestab failid extention.conf ja extention_additional.conf, kasutame faili extention_custom.conf
Täielik kood extention_custom.conf
[globals]
;; Kontrollige kaustade teid ja õigusi - kasutajal asterisk peab olema kirjutamisõigus
;; Siia akan salvestama kõnesid
WAV=\/var\/www\/html\/callme\/records\/wav
MP3=\/var\/www\/html\/callme\/records\/mp3
;; Nendel teedel esitatakse ja laaditakse alla salvestus
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3
;; Callback aadress väljuval kõnel
URLPHP=https:\/\/www.host.ru\/callmeplus
;; Jah, salvestame kõnesid
RECORDING=1
;; See on makro, mis salvestab kõnesid meie kausta.
;; Võib kasutada ka süsteemset salvestust, kuid las see olla, -
;; 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 peamine kontekst kõne algamiseks
[ext-did-custom]
;; See on veidi ohtlik kui seda siiani rakendame, aga see töötab - lisame numbrile '8'
exten => s,1,Set(CALLERID(num)=8${CALLERID(num)})
;; Siin on igasugused muutujad 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õpetamise töötleja.
;; Tavalised lõppemise töötlemise teed (exten=>h,1,midi siin) FreePBX-is ei tööta - Macro(hangupcall,) rikub kõik ära.
;; Seega paneme Hangup_Handler kõne lõpetamise peale
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]
;; Teavitame lõpus kõne lõpetamise väärtustest
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äljakutse töötlejad - 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 lõpetamise töötleja peale
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)})
;; Kutsub skripti, mis teavitab CRM-i kõnest - see on väljuv,
;; nii et tõeliselt lõppemise hetkel
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,ReturnOma ja erinevus originaalsest dialplanist lähtuvate autorite artiklis on
Dialplan .conf formaadis, nagu soovib FreePBX (jah, ta oskab .ael, aga mitte kõik versioonid ja mitte alati on see mugav)
Lõpu töötlemise asemel exten=>h kaudu on sisse viidud hangup_handler, kuna FreePBX dialplan hakkas tööle ainult sellega
Kutsumise scripti rida on parandatud, lisatud on jutumärgid ja väline kutsenumber ExtNum
Töötlemine on viidud _custom kontekstid, võimaldades mitte puudutada ja mitte muuta FreePBX konfiguratsioone—saabumine läbi [ext-did-custom], väljamineked läbi [outbound-allroutes-custom]
Numbritega ei ole sidet—fail on universaalne ja vajab seadistamiseks ainult teed ja lingi serverisse
Töö alustamiseks tuleb veel lubada skriptide kasutamine AMIs kasutajanime ja parooli järgi—selleks on FreePBX-is ka _custom fail
Fail manager_custom.conf
;; see on kasutajanimi
[callmeplus]
;; see on parool
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0
;; ma töötan kohaliku masinaga - aga kui on vaja, võib ka teisi määrata
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 konfiguratsioonid 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> exitNüüd liigutame PHP juurde
Skriptide algatamine ja teenuse loomine
Kuna töö skeem Bitrix 24-ga, AMI teenusega, ei ole just lihtne ja läbipaistev, tuleks sellele eraldi peatuda. Asterisk avab AMI aktiveerimisel lihtsalt pordi ja kõik. Klientide liitumisel küsib see autentimist, seejärel allkirjastab klient vajalikud sündmused. Sündmused saadetakse lihtsa tekstina, mille PAMI muundab struktureeritud objektideks ja pakub võimalust määrata filtreerimisfunktsiooni ainult huvitatud sündmuste, väljade, numbrite jne järgi.
Kui kõne saabub, tekib sündmus NewExten, alustades vanemast kontekstist [from-pstn], seejärel järgneb kõik sündmused järjestuses, nagu need on kontekstides. Kui saadakse teavet dialpanis määratud _custom muutujatest CallMeCallerIDName ja CallStart, kutsutakse välja
Kasutaja ID päringu funktsioon, mis vastab sisemisele numbrile, kuhu kõne tuli. Ent mis juhtub, kui see on kõnede rühm? See on poliitiline küsimus — kas luua kohe kõne kõigile (kui helistatakse kõik korraga) või luua see järk-järgult, kui tehakse järjestikused kõned? Enamiku klientide jaoks on strateegia First Available, seega ei ole sellega probleeme, helistab ainult üks. Aga küsimus tuleb lahendada.
Kõne registreerimise funktsioon Bitrix24-s, mis tagastab CallID, vajalik seejärel kõne parameetrite ja salvestuslingi edastamiseks. Nõuab kas sisemist numbrit või kasutaja ID-d.

Pärast kõne lõppu kutsutakse üles laadimise funktsioon, mis samal ajal edastab kõne lõpetamise staatuse (Hõivatud, Pole vastust, Edu) ning laadib üles mp3-faili lingi salvestusele (kui see on olemas).
Kuna CallMeIn.php moodul peab tööle pidevalt, loodi selleks SystemD käivitamisfail. callme.service, mille tuleb paigutada /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
#Siin tuleb jälgida, millised õigused kaustadel on
#User=www-data #Ubuntu - debian
#User=nginx #Centos
[Install]
WantedBy=multi-user.targetskripti initsialiseerimine ja käivitamine toimub läbi systemctl või teenuse.
# systemctl enable callme
# systemctl start callmeTeenuse ennast taaskäivitamine toimub vajadusel (kõne katkemisel). Sisse tulevate kõnede jälgimise teenus ei nõua veebiserveri paigaldamist, vajalik on ainult php (mille tõenäoliselt serveris FeePBX on). Kuid kui puudub juurdepääs kõnede salvestustele läbi veebiserveri (isegi HTTPS-iga), ei ole võimalik kuulata kõnede salvestusi.
Nüüd räägime väljaminevatest kõnedest. Skriptil CallMeOut.php on kaks funktsiooni:
Kõne initsialiseerimine php skripti nõudmisel (sealhulgas Bitrixi enda ‘Helista’ nupu kaudu). Ilma veebiserverita ei toimi, päring tuleb läbi HTTP POST-i, päringus on token.
Teade kõne kohta, selle parameetrite ja salvestuste kohta Bitrixis. Juhtumine Asteriskilt dialpiani [sub-call-internal-ended] lõpus.

Veebiserverit on vaja ainult kahe asja jaoks — Bitrixi salvestusfailide üleslaadimine (HTTPS-i kaudu) ja CallMeOut.php skripti käivitamine. Võib kasutada FreePBX-i sisseehitatud serverit, mille failid asuvad /var/www/html, või paigaldada muu serveri või määrata teine rada.
Veebiserver
Jätame veebiserveri seadistamise iseseisvaks õppimiseks (, , ). Kui teil pole domeeni, võite proovida FreeDomain( ), mis annab teile tasuta nime teie valge IP jaoks (ärge unustage suunata pordid 80, 443 läbi ruuteri, kui väline aadress on ainult seal). Kui olete just loonud DNS domeeni, peate ootama (15 minutist kuni 48 tunnini), kuni kõik serverid laadivad. Oma kohalikest pakkujatest saadud kogemuse põhjal - 1 tunnist kuni 24 tunnini.
Installeerimise automatiseerimine
GitHubis on alanud installeri arendamine, et saaks veelgi lihtsamalt installida. Kuid sujuv oli vaid paberil - praegu installime kõik käsitsi, aga pärast nende kõigi läbi kaevamist on täiesti selge, kellega millal sõbrustatakse ning kuidas seda deba...de....
Docker
Kui soovite kiiresti lahendust katsetada - on võimalus Dockeriga - kiiresti luua konteiner, avada sellele pordid, lisada seadistusfailid ja proovida (see on variant LetsEncrypt konteineriga, kui sertifikaat juba olemas, lihtsalt tuleb suunata pöördproks veebiserverile FreePBX (millele andsime teise pordi - 88), LetsEncrypt Dockeris inspireeritud
Faili tuleb käivitada allalaaditud projekti kaustas (pärast git clone), aga eelnevalt tuleb minna Asterisk'i konfigureerimisfailidesse (kaust asterisk) ja seal määrata rekordite ja teie saidi URL teed
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 # seadistuseks
- 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äivitatakse läbi
Vaatame lihtsat näidet.
Kui nginx ei käivitunud, siis on midagi valesti konfiguratsioonis kaustas nginx\/ssl_docker.conf
Teised integratsioonid
Aga miks mitte käia mõne CRM-i scriptidesse, mõtlesime. Uurisime mitmete teiste CRM-ide API-sid, eriti tasuta, mis on integreeritud mõnedesse PBX-idesse - ShugarCRM ja Vtiger, ja jah! see on võimalik, põhimõte on sama. Kuid see on juba teine lugu, mille hiljem GitHubi eraldi paneme.
Viidatud lingid
Kood GitHubis -
Algne artikkel inspiratsiooniks
Käesolev teade: kõik kokkulangevused reaalsusega on juhuslikud ja see polnud mina,
Allikas: habr.com
