„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Bitrix24 yra didžiulis kombinatas, apjungiantis CRM, darbo eigą, apskaitą ir daug kitų dalykų, kurie vadovams labai patinka, o IT darbuotojams nelabai. Portalu naudojasi daug mažų ir vidutinių įmonių, įskaitant mažas klinikas, gamintojus ir net grožio salonus. Pagrindinė vadovų „mėgstama“ funkcija – telefonijos ir CRM integravimas, kai bet koks skambutis iš karto įrašomas į CRM, sukuriamos kliento kortelės, įėjus rodoma informacija apie klientą ir iškart matosi, kas jis toks, koks jis. gali parduoti ir kiek skolingas. Tačiau telefonija iš Bitrix24 ir jos integravimas su CRM kainuoja, kartais daug. Straipsnyje papasakosiu apie integravimo su atviraisiais įrankiais ir populiariojo IP PBX patirtį „FreePBX“, taip pat apsvarstykite įvairių dalių darbo logiką

Dirbu užsakovu įmonėje, kuri parduoda ir konfigūruoja, integruoja IP telefoniją. Kai manęs paklausė, ar galėtume pasiūlyti ką nors šiai ir šiai įmonei integruoti Bitrix24 su klientų turimais PBX, taip pat su virtualiais PBX įvairiose VDS įmonėse, nuėjau į Google. Ir, žinoma, jis man davė nuorodą straipsnis habr, kur yra aprašymas, ir github, ir atrodo, kad viskas veikia. Tačiau bandant pasinaudoti šiuo sprendimu paaiškėjo, kad Bitrix24 nebėra toks, koks buvo anksčiau, ir daug ką reikia perdaryti. Be to, „FreePBX“ jums nėra plika žvaigždutė, čia reikia pagalvoti, kaip konfigūracijos failuose suderinti naudojimo paprastumą ir sudėtingą skambinimo planą.

Studijuojame darbo logiką

Taigi, pradedantiesiems, kaip visa tai turėtų veikti. Gavus skambutį iš išorės PBX (SIP INVITE įvykis iš teikėjo), pradedamas rinkimo plano (rinkimo plano, rinkimo plano) apdorojimas - taisyklės, ką ir kokia tvarka daryti su skambučiu. Iš pirmo paketo galite gauti daug informacijos, kurią vėliau galėsite panaudoti taisyklėse. Puikus įrankis tiriant SIP vidines dalis yra analizatorius sngrep (nuoroda), kuris yra tiesiog įdiegtas populiariuose platinimuose naudojant apt install/yum install ir panašiai, tačiau jis taip pat gali būti sukurtas iš šaltinio. Pažiūrėkime į skambučių žurnalą sngrep

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Supaprastinta forma skambinimo planas susijęs tik su pirmuoju paketu, kartais ir pokalbio metu, persiunčiami skambučiai, mygtukų paspaudimai (DTMF), įvairūs įdomūs dalykai kaip FollowMe, RingGroup, IVR ir kt.

Kas yra kvietimų pakete

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Tiesą sakant, dauguma paprastų skambinimo planų veikia su pirmaisiais dviem laukais, o visa logika sukasi apie DID ir CallerID. DID – kur mes skambiname, CallerID – kas skambina.

Bet juk mes turime įmonę, o ne vieną telefoną – vadinasi, PBX greičiausiai turi skambučių grupes (vienu metu / nuosekliai skamba keli įrenginiai) miestų numeriais (Ring Group), IVR (Sveiki, skambinote... Spauskite vienas skirtas ...), Autoatsakikliai (Frazės), Laiko sąlygos, Persiuntimas į kitus numerius arba į langelį (FollowMe, Persiųsti). Tai reiškia, kad labai sunku vienareikšmiškai nustatyti, kas iš tikrųjų gaus skambutį ir su kuo kalbėsis, kai skambutis. Čia yra tipinio skambučio mūsų klientų PBX pradžios pavyzdys

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Po to, kai skambutis sėkmingai patenka į PBX, jis keliauja per rinkimo planą skirtingais „kontekstais“. Kontekstas Žvaigždutės požiūriu yra sunumeruotas komandų rinkinys, kiekvienoje iš jų yra filtras pagal rinktą numerį (jis vadinamas exten, išoriniam skambučiui pradiniame etape exten=DID). Komandos rinkimo plano eilutėje gali būti bet kokios - vidinės funkcijos (pavyzdžiui, skambinti vidiniam abonentui - Dial(), padėjau telefoną - Hangup()), sąlyginiai operatoriai (IF, ELSE, ExecIF ir panašiai), pereina prie kitų šio konteksto taisyklių (Goto, GotoIF), perėjimas į kitus kontekstus funkcijos iškvietimo forma (Gosub, Macro). Atskira direktyva include имя_контекста, kuri prideda komandas iš kito konteksto prie dabartinio konteksto pabaigos. Komandos, įtrauktos per include, visada vykdomos po esamo konteksto komandas.

Visa „FreePBX“ logika pagrįsta skirtingų kontekstų įtraukimu vienas į kitą per įtraukimo ir skambučio programas per „Gosub“, „Macro“ ir „Handler“ tvarkykles. Apsvarstykite gaunamų „FreePBX“ skambučių kontekstą

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Skambutis eina per visus kontekstus iš viršaus į apačią, kiekviename kontekste gali būti iškvietimų į kitus kontekstus, pvz., makrokomandas (Macro), funkcijas (Gosub) arba tiesiog perėjimus (Goto), todėl tikrasis vadinamasis medis gali būti tik būti sekamas žurnaluose.

Žemiau parodyta tipinio PBX nustatymo schema. Skambinus DID ieškoma įeinančiuose maršrutuose, jam tikrinamos laikinos sąlygos, jei viskas tvarkoje, paleidžiamas balso meniu. Iš jo, paspausdami mygtuką 1 arba skirtąjį laiką, išeikite į rinkimo operatorių grupę. Skambučiui pasibaigus, iškviečiama „hangupcall“ makrokomanda, po kurios nieko negalima daryti rinkimo plane, išskyrus specialias tvarkykles (hangup handler).

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Kur šiame skambučio algoritme turėtume pateikti informaciją apie skambučio CRM pradžią, kur pradėti įrašymą, kur baigti įrašymą ir išsiųsti ją kartu su informacija apie skambutį CRM?

Integracija su išorinėmis sistemomis

Kas yra PBX ir CRM integracija? Tai nustatymai ir programos, kurios konvertuoja duomenis ir įvykius tarp šių dviejų platformų ir siunčia juos viena kitai. Dažniausias nepriklausomų sistemų ryšio būdas yra API, o populiariausias būdas pasiekti API yra HTTP REST. Bet ne dėl žvaigždutės.

Inside Asterisk yra:

  • AGI - sinchroninis skambutis į išorines programas / komponentus, daugiausia naudojamas rinkimo plane, yra bibliotekų, tokių kaip phpagi, PAGI

  • AMI - tekstinis TCP lizdas, veikiantis įvykių prenumeratos ir tekstinių komandų įvedimo principu, iš vidaus panašus į SMTP, gali sekti įvykius ir valdyti skambučius, yra biblioteka PAMI - populiariausias kuriant ryšį su Asterisk

AMI išvesties pavyzdys

Renginys: naujas kanalas
Privilegija: skambinkite, visi
Kanalas: PJSIP/VMS_pjsip-0000078b
Kanalo būsena: 4
ChannelStateDesc: skambutis
Skambintojo IDNum: 111222
Skambintojo IDName: 111222
ConnectedLineNum:
prijungtas linijos pavadinimas:
Kalba: en
sąskaitos kodas:
Kontekstas: iš-pstn
Išplėtimas: s
Prioritetas: 1
Unikalus: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI yra abiejų mišinys, visi per REST, WebSocket, JSON formatu, bet su naujomis bibliotekomis ir įvyniokliais, ne itin geri, rasta iš karto (phparia, phpari), kuri tapo jų raida maždaug prieš 3 metus.

ARI išvesties pavyzdys, kai inicijuojamas skambutis

{ "kintamasis":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «vardas»:»PJSIP/VMSpjsip-000007b6″, "state":"Skambutis", "skambinotojas":{ "vardas":"111222", "numeris":"111222″ }, "prisijungta":{ "vardas":", "numeris" :"" }, "sąskaitos kodas":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "apppavadinimas":"Stasis", "programėlėdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"lt" }, "žvaigždutė"id":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Patogumą ar nepatogumą, galimybę ar negalėjimą dirbti su tam tikra API lemia užduotys, kurias reikia išspręsti. Integravimo su CRM užduotys yra šios:

  • Stebėkite skambučio pradžią, kur jis buvo perkeltas, ištraukite CallerID, DID, pradžios ir pabaigos laikus, galbūt duomenis iš katalogo (norėdami ieškoti ryšio tarp telefono ir CRM vartotojo)

  • Pradėkite ir baigkite skambučio įrašymą, išsaugokite jį norimu formatu, įrašo pabaigoje informuokite, kur yra failas

  • Inicijuokite skambutį dėl išorinio įvykio (iš programos), paskambinkite vidiniu numeriu, išoriniu numeriu ir sujunkite juos

  • Neprivaloma: integruokite su CRM, rinkimo grupėmis ir FollowME, kad būtų galima automatiškai perduoti skambučius, kai nėra vietos (pagal CRM)

Visas šias užduotis galima išspręsti per AMI arba ARI, tačiau ARI suteikia daug mažiau informacijos, nėra daug įvykių, daug kintamųjų, kurių AMI vis dar turi (pavyzdžiui, makrokomandų iškvietimai, makrokomandų viduje esančių kintamųjų nustatymas, įskaitant skambučių įrašymą) nėra sekami. Todėl teisingam ir tiksliam sekimui kol kas rinkimės AMI (bet ne iki galo). Be to (na, kur būtų be šito, mes esame tinginiai) - originaliame darbe (straipsnis habr) naudoti PAMI. *Tada reikia bandyti perrašyti į ARI, bet ne tai, kad veiks.

Integracijos išradimas iš naujo

Kad mūsų nemokamas PBX galėtų paprastais būdais pranešti AMI apie skambučio pradžią, pabaigos laiką, numerius, įrašytų failų pavadinimus, pokalbio trukmę lengviausia apskaičiuoti naudojant tą patį triuką kaip ir pirminiai autoriai. - įveskite savo kintamuosius ir analizuokite išvestį, kad nustatytų jų buvimą. PAMI siūlo tai padaryti tiesiog naudojant filtro funkciją.

Štai pavyzdys, kaip nustatyti savo kintamąjį skambučio pradžios laikui (s yra specialus numeris rinkimo plane, kuris atliekamas PRIEŠ pradedant DID paiešką)

[ext-did-custom]

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

Šios eilutės AMI įvykio pavyzdys

Renginys: naujas kanalas

Privilegija: skambinkite, visi

Kanalas: PJSIP/VMS_pjsip-0000078b

Kanalo būsena: 4

ChannelStateDesc: skambutis

Skambintojo IDNum: 111222

Skambintojo IDName: 111222

ConnectedLineNum:

prijungtas linijos pavadinimas:

Kalba: en

sąskaitos kodas:

Kontekstas: iš-pstn

Išplėtimas: s

Prioritetas: 1

Unikalus: 1599589046.5244

Linkedid: 1599589046.5244

Taikymas: nustatykite „AppData“:

CallStart=1599571046

Kadangi „FreePBX“ perrašo failus extendion.conf ir extendion_extra.conf, mes naudosime failą pratęsimas_paprotys.conf

Visas extension_custom.conf kodas

[globals]	
;; Проверьте пути и права на папки - юзер asterisk должен иметь права на запись
;; Сюда будет писаться разговоры
WAV=/var/www/html/callme/records/wav 
MP3=/var/www/html/callme/records/mp3

;; По этим путям будет воспроизводится и скачиваться запись
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Адрес для калбека при исходящем вызове
URLPHP=https://www.host.ru/callmeplus

;; Да пишем разговоры
RECORDING=1

;; Это макрос для записи разговоров в нашу папку. 
;; Можно использовать и системную запись, но пока пусть будет эта - 
;; она работает
[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()


;; Это основной контекст для начала разговора
[ext-did-custom]

;; Это хулиганство, делать это так и здесь, но работает - добавляем к номеру '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Тут всякие переменные для скрипта
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)})

;; Самое главное! Обработчик окончания разговора. 
;; Обычные пути обработки конца через (exten=>h,1,чтототут) в FreePBX не работают - Macro(hangupcall,) все портит. 
;; Поэтому вешаем Hangup_Handler на окончание звонка
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания входящего вызова
[sub-call-from-cid-ended]

;; Сообщаем о значениях при конце звонка
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)})
exten => s,n,Return


;; Обработчик исходящих вызовов - все аналогичено
[outbound-allroutes-custom]

;; Запись
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Переменные
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Вешаем Hangup_Handler на окончание звонка
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Обработчик окончания исходящего вызова
[sub-call-internal-ended]

;; переменные
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)})

;; Вызов скрипта, который сообщит о звонке в CRM - это исходящий, 
;; так что по факту окончания
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

Ypatybė ir skirtumas nuo pirminio originalaus straipsnio autorių telefono plano -

  • Dialplan .conf formatu, kaip to nori FreePBX (taip, gali .ael, bet ne visos versijos ir ne visada patogu)

  • Užuot apdorojus pabaigą per exten=>h, apdorojimas buvo įvestas per hangup_handler, nes FreePBX skambinimo planas veikė tik su juo

  • Ištaisyta scenarijaus iškvietimo eilutė, pridėtos kabutės ir išorinio skambučio numeris ExtNum

  • Apdorojimas perkeliamas į _priskirtus kontekstus ir leidžia neliesti ir neredaguoti FreePBX konfigūracijų – gaunama per [ext-padary-custom], išeinantis per [outbound-allroutes-custom]

  • Jokio susiejimo su skaičiais – failas yra universalus ir tereikia sukonfigūruoti kelią ir nuorodą į serverį

Norėdami pradėti, taip pat turite paleisti scenarijus AMI naudodami prisijungimo vardą ir slaptažodį - tam FreePBX taip pat turi _custom failą

manager_custom.conf failą

;;  это логин
[callmeplus]
;; это пароль
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; я работаю с локальной машиной - но если надо, можно и другие прописать
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

Abu šiuos failus reikia įdėti į /etc/asterisk, tada iš naujo perskaityti konfigūracijas (arba iš naujo paleisti žvaigždutę)

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

Dabar pereikime prie PHP

Scenarijų inicijavimas ir paslaugos kūrimas

Kadangi darbo su Bitrix 24, AMI paslauga, schema nėra visiškai paprasta ir skaidri, ją reikia aptarti atskirai. Žvaigždutė, kai AMI aktyvuota, tiesiog atidaro prievadą ir viskas. Kai klientas prisijungia, jis prašo leidimo, tada klientas užsiprenumeruoja reikiamus įvykius. Įvykiai pateikiami paprastu tekstu, kurį PAMI konvertuoja į struktūrinius objektus ir suteikia galimybę nustatyti filtravimo funkciją tik dominantiems įvykiams, laukams, skaičiams ir pan.

Kai tik gaunamas iškvietimas, NewExten įvykis suaktyvinamas pradedant nuo pirminio [from-pstn] konteksto, tada visi įvykiai vyksta kontekstų eilučių tvarka. Kai gaunama informacija iš CallMeCallerIDName ir CallStart kintamųjų, nurodytų _custom dialplan,

  1. Vartotojo ID, atitinkančio plėtinio numerį, į kurį buvo skambinta, užklausos funkcija. Ką daryti, jei tai yra telefono ryšio grupė? Klausimas politinis, ar reikia sukurti skambutį visiems iš karto (kai visi skambina iš karto) ar kurti taip, kaip skambina iš eilės? Dauguma klientų turi „Fisrt Available“ strategiją, todėl čia nėra jokių problemų, tik vienas skambutis. Tačiau problemą reikia išspręsti.

  2. Skambučių registravimo funkcija Bitrix24, kuri grąžina skambučio ID, kuris vėliau reikalingas skambučio parametrams ir įrašo nuorodai pranešti. Reikalingas plėtinio numeris arba vartotojo ID

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Pasibaigus pokalbiui iškviečiama įrašų atsisiuntimo funkcija, kuri vienu metu praneša apie skambučio baigimo būseną (Užimtas, Neatsakytas, Sėkmingas), taip pat atsisiunčia nuorodą į mp3 failą su įrašu (jei yra).

Kadangi CallMeIn.php modulis turi veikti nuolat, jam buvo sukurtas SystemD paleisties failas callme.service, kuris turi būti įtrauktas į /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

#тут надо смотреть,какие права на папки
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

scenarijaus inicijavimas ir paleidimas vyksta per systemctl arba paslaugą

# systemctl enable callme
# systemctl start callme

Prireikus paslauga bus paleista iš naujo (esant gedimams). Gautųjų sekimo paslaugai nereikia įdiegti žiniatinklio serverio, reikia tik php (kuris tikrai yra FeePBX serveryje). Tačiau nesant prieigos prie skambučių įrašų per žiniatinklio serverį (taip pat naudojant https), skambučių įrašų nebus galima klausytis.

Dabar pakalbėkime apie išeinančius skambučius. CallMeOut.php scenarijus turi dvi funkcijas:

  • Skambučio inicijavimas, kai gaunama užklausa dėl php scenarijaus (įskaitant „Bitrix“ mygtuko „Skambinti“ naudojimą). Neveikia be žiniatinklio serverio, užklausa gaunama per HTTP POST, užklausoje yra prieigos raktas

  • Pranešimas apie skambutį, jo parametrus ir įrašus Bitrix. Suaktyvinama žvaigždute [sub-call-internal-ended] rinkimo plane, kai skambutis baigiasi

„FreePBX“ supratimas ir integravimas su „Bitrix24“ ir kt

Žiniatinklio serveris reikalingas tik dviem dalykams – Bitrix įrašų failų atsisiuntimui (per HTTPS) ir CallMeOut.php scenarijaus iškvietimui. Galite naudoti integruotą FreePBX serverį, kurio failai yra /var/www/html, galite įdiegti kitą serverį arba nurodyti kitą kelią.

Tinklapio serveris

Palikime žiniatinklio serverio sąranką savarankiškam tyrimui (tipai, tipai, tipai). Jei neturite domeno, galite pabandyti FreeDomain ( https://www.freenom.com/ru/index.html), kuris suteiks jums nemokamą baltojo IP pavadinimą (nepamirškite per maršrutizatorių persiųsti prievadų 80, 443, jei išorinis adresas yra tik jame). Jei ką tik sukūrėte DNS domeną, turite palaukti (nuo 15 minučių iki 48 valandų), kol bus įkelti visi serveriai. Pagal darbo su vietiniais tiekėjais patirtį - nuo 1 valandos iki dienos.

Montavimo automatika

Github buvo sukurta diegimo programa, kad diegimas būtų dar lengvesnis. Bet popieriuje viskas klostėsi sklandžiai – kol visa tai diegiame rankiniu būdu, nes po viso šito padirbėjus tapo visiškai aišku, kas su kuo draugauja, kas kur eina ir kaip derinti. Dar nėra montuotojo

dokininkas

Jei norite greitai išbandyti sprendimą - yra galimybė su Docker - greitai sukurkite konteinerį, suteikite jam prievadus išorėje, įmeskite nustatymų failus ir pabandykite (tai yra parinktis su LetsEncrypt konteineriu, jei jau turite sertifikatą, tiesiog reikia nukreipti atvirkštinį tarpinį serverį į „FreePBX“ žiniatinklio serverį (davėme jam kitą prievadą 88), „LetsEncrypt“ dokeryje, remiantis šis straipsnis

Turite paleisti failą atsisiųstame projekto aplanke (po git clone), bet pirmiausia įeikite į žvaigždutės konfigūracijas (aplanką žvaigždute) ir ten parašykite kelius į įrašus bei savo svetainės URL.

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 # для настройки
      - 5060:5060/udp
      - 5160:5160/udp
      - 127.0.0.1:5038:5038 # для 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:

Šis docker-compose.yaml failas paleistas per

docker-compose up -d

Jei nginx nepaleidžiamas, kažkas negerai su konfigūracija aplanke nginx/ssl_docker.conf

Kitos integracijos

Ir kodėl tuo pačiu metu neįdėjus CRM į scenarijus, pagalvojome. Mes ištyrėme keletą kitų CRM API, ypač nemokamą įmontuotą PBX - ShugarCRM ir Vtiger, ir taip! taip, principas tas pats. Bet tai jau kita istorija, kurią vėliau įkelsime į github atskirai.

Nuorodos

Atsakomybės apribojimas: bet koks panašumas į tikrovę yra fiktyvus ir tai buvau ne aš.

Šaltinis: www.habr.com

Добавить комментарий