Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Bitrix24 je ogromen kombinat, ki združuje CRM, potek dela, računovodstvo in številne druge stvari, ki so zelo všeč menedžerjem, IT osebju pa ne. Portal uporablja veliko malih in srednje velikih podjetij, vključno z majhnimi klinikami, proizvajalci in celo kozmetičnimi saloni. Glavna funkcija, ki jo menedžerji »obožujejo«, je integracija telefonije in CRM, ko se vsak klic takoj zabeleži v CRM, ustvarijo se kartice strank, ob dohodu se prikažejo informacije o stranki in takoj vidite, kdo je, kaj lahko proda in koliko je dolžan. Toda telefonija iz Bitrix24 in njena integracija s CRM stane denar, včasih veliko. V članku vam bom povedal izkušnjo integracije z odprtimi orodji in priljubljeno IP PBX freepbx, in upoštevajte tudi logiko dela različnih delov

Delam kot zunanji izvajalec v podjetju, ki se ukvarja s prodajo in konfiguracijo, integracijo IP telefonije. Ko so me vprašali, ali lahko temu in temu podjetju kaj ponudimo za integracijo Bitrix24 s PBX-i, ki jih imajo stranke, pa tudi z virtualnimi PBX-i na raznih VDS podjetjih, sem se obrnil na Google. In seveda mi je dal povezavo do članek v habr, kjer je opis in github, in zdi se, da vse deluje. Toda pri poskusu uporabe te rešitve se je izkazalo, da Bitrix24 ni več enak kot prej in je treba marsikaj spremeniti. Poleg tega FreePBX za vas ni gola zvezdica, tukaj morate razmisliti o tem, kako v konfiguracijskih datotekah združiti enostavnost uporabe in hardcore dialplan.

Preučujemo logiko dela

Torej, za začetek, kako bi moralo vse skupaj delovati. Ob prejemu klica izven PBX (dogodek SIP INVITE s strani ponudnika) se začne obdelava načrta klicanja (dial plan, dialplan) - pravila, kaj in v kakšnem vrstnem redu narediti s klicem. Iz prvega paketa lahko dobite veliko informacij, ki jih lahko nato uporabite v pravilih. Odlično orodje za preučevanje notranjosti SIP je analizator sngrep (povezava), ki se preprosto namesti v priljubljene distribucije prek apt install/yum install in podobno, lahko pa se ga zgradi tudi iz izvorne kode. Poglejmo dnevnik klicev v sngrep

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Poenostavljeno se dialplan ukvarja samo s prvim paketom, včasih tudi med pogovorom, preusmeritvijo klicev, pritiski na tipke (DTMF), raznimi zanimivostmi, kot so FollowMe, RingGroup, IVR in drugo.

Kaj je v paketu Invite Pack

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Pravzaprav večina preprostih načrtov klicanja deluje s prvima dvema poljema, celotna logika pa se vrti okoli DID in CallerID. DID - kam kličemo, CallerID - kdo kliče.

Ampak konec koncev imamo podjetje in ne en telefon - kar pomeni, da ima telefonska centrala najverjetneje klicne skupine (hkratno / zaporedno zvonjenje več naprav) na mestnih številkah (Ring Group), IVR (Halo, poklicali ste ... Pritisnite ena za ...), telefonski odzivniki ( fraze), časovni pogoji, posredovanje na druge številke ali v celico (FollowMe, Posreduj). To pomeni, da je zelo težko nedvoumno določiti, kdo bo dejansko prejel klic in s kom se bo pogovarjal ob dohodnem klicu. Tukaj je primer začetka tipičnega klica v PBX naših strank

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Ko klic uspešno vstopi v PBX, potuje skozi dialplan v različnih "kontekstih". Kontekst z vidika Asterisk je oštevilčen niz ukazov, od katerih vsak vsebuje filter po klicani številki (imenuje se exten, za zunanji klic na začetni stopnji exten=DID). Ukazi v vrstici klicnega načrta so lahko karkoli - interne funkcije (na primer klic internega naročnika - Dial(), odloži slušalko - Hangup()), pogojni operatorji (IF, ELSE, ExecIF in podobno), prehodi na druga pravila tega konteksta (Goto, GotoIF), prehod v druge kontekste v obliki klica funkcije (Gosub, Macro). Posebna direktiva include имя_контекста, ki doda ukaze iz drugega konteksta na konec trenutnega konteksta. Ukazi, vključeni prek include, se vedno izvedejo po ukazi trenutnega konteksta.

Celotna logika FreePBX je zgrajena na vključevanju različnih kontekstov drug v drugega prek vključitve in klica prek Gosub, Macro in Handler handlerjev. Upoštevajte kontekst dohodnih klicev FreePBX

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Klic poteka po vrsti skozi vse kontekste od vrha do dna, v vsakem kontekstu so lahko klici drugih kontekstov, kot so makri (Macro), funkcije (Gosub) ali samo prehodi (Goto), tako da lahko pravo drevo klicanega samo slediti v dnevnikih.

Spodaj je prikazan tipičen namestitveni diagram za tipično PBX. Pri klicu se DID išče v dohodnih poteh, za to se preverijo začasni pogoji, če je vse v redu, se zažene glasovni meni. Iz njega s pritiskom na gumb 1 ali časovno omejitvijo izstopite v skupino klicnih operaterjev. Po končanem klicu se pokliče makro hangupcall, po katerem ni mogoče storiti ničesar v načrtu klicanja, razen posebnih obdelovalcev (hangup handler).

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Kje v tem klicnem algoritmu naj podamo informacijo o začetku klica v CRM, kje začeti snemanje, kje končati snemanje in ga poslati skupaj s podatki o klicu v CRM?

Integracija z zunanjimi sistemi

Kaj je integracija PBX in CRM? To so nastavitve in programi, ki pretvarjajo podatke in dogodke med tema dvema platformama in jih pošiljajo druga drugi. Najpogostejši način za komunikacijo neodvisnih sistemov je prek API-jev, najbolj priljubljen način za dostop do API-jev pa je HTTP REST. Ampak ne za zvezdico.

Znotraj zvezdice je:

  • AGI - sinhroni klic zunanjih programov/komponent, ki se uporablja predvsem v načrtu klicanja, obstajajo knjižnice, npr. phpagi, PAGI

  • AMI - besedilna TCP vtičnica, ki deluje na principu naročanja na dogodke in vnosa besedilnih ukazov, od znotraj spominja na SMTP, lahko spremlja dogodke in upravlja klice, obstaja knjižnica PAMI - najbolj priljubljen za ustvarjanje povezave z zvezdico

Primer izhoda AMI

Dogodek: Nov kanal
Privilegij: klic, vsi
Kanal: PJSIP/VMS_pjsip-0000078b
Stanje kanala: 4
ChannelStateDesc: zvonjenje
ID klicatelja: 111222
ID klicatelja: 111222
ConnectedLineNum:
ime povezane vrstice:
Jezik: en
šifra računa:
Kontekst: od-pstn
Razširitev: s
Prednost: 1
Edinstveno: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI je mešanica obojega, vse prek REST, WebSocket, v formatu JSON - vendar s svežimi knjižnicami in ovoji, ne zelo dobrimi, najdenimi naključno (phparia, phpari), ki je nastal v svojem razvoju pred približno 3 leti.

Primer izpisa ARI, ko se sproži klic

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «ime»:»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":"en" }, "asteriskid":"48:5b:aa:aa:aa:aa", "aplikacija":"zdravo-svet"}

Priročnost ali neprijetnost, možnost ali nezmožnost dela z določenim API-jem določajo naloge, ki jih je treba rešiti. Naloge za integracijo s CRM so naslednje:

  • Sledite začetku klica, kam je bil preusmerjen, izvlecite CallerID, DID, začetni in končni čas, morda podatke iz imenika (za iskanje povezave med telefonom in CRM uporabnikom)

  • Začnite in končajte snemanje klica, shranite ga v želeni obliki, na koncu snemanja sporočite, kje se datoteka nahaja

  • Iniciirajte klic na zunanji dogodek (iz programa), pokličite interno številko, zunanjo številko in ju povežite

  • Neobvezno: integracija s CRM, skupinami za klicanje in FollowME za samodejno preusmeritev klicev v odsotnosti kraja (glede na CRM)

Vse te naloge je mogoče rešiti prek AMI ali ARI, vendar ARI zagotavlja veliko manj informacij, ni veliko dogodkov, številnim spremenljivkam, ki jih AMI še ima (na primer makro klice, nastavitev spremenljivk znotraj makrov, vključno s snemanjem klica) se ne sledi. Zato za pravilno in natančno sledenje zaenkrat izberimo AMI (vendar ne povsem). Poleg tega (no, kje bi brez tega, leni smo ljudje) - v izvirnem delu (članek v habr) uporabite PAMI. *Potem morate poskusiti prepisati na ARI, vendar ne dejstvo, da bo delovalo.

Ponovno odkrivanje integracije

Da bi naša FreePBX lahko AMI na preprost način poročala o začetku klica, končnem času, številkah, imenih posnetih datotek, je najlažje izračunati trajanje klica z istim trikom kot izvirni avtorji - vnesite svoje spremenljivke in razčlenite izhod za njihovo prisotnost. PAMI predlaga, da to preprosto storite s funkcijo filtra.

Tukaj je primer nastavitve lastne spremenljivke za začetni čas klica (s je posebna številka v načrtu klicanja, ki se izvede PRED začetkom iskanja DID)

[ext-did-custom]

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

Primer dogodka AMI za to vrstico

Dogodek: Nov kanal

Privilegij: klic, vsi

Kanal: PJSIP/VMS_pjsip-0000078b

Stanje kanala: 4

ChannelStateDesc: zvonjenje

ID klicatelja: 111222

ID klicatelja: 111222

ConnectedLineNum:

ime povezane vrstice:

Jezik: en

šifra računa:

Kontekst: od-pstn

Razširitev: s

Prednost: 1

Edinstveno: 1599589046.5244

Linkedid: 1599589046.5244

Aplikacija: Nastavi podatke aplikacije:

CallStart=1599571046

Ker FreePBX prepiše datoteki extention.conf in extention_Additional.conf, bomo uporabili datoteko razširitev_po meri.conf

Celotna koda extention_custom.conf

[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

Značilnost in razlika od prvotnega dialplana avtorjev izvirnega članka -

  • Dialplan v formatu .conf, kot ga želi FreePBX (da, lahko .ael, vendar ne vse različice in ni vedno priročno)

  • Namesto obdelave konca prek exten=>h je bila obdelava uvedena prek hangup_handler, ker je klicni načrt FreePBX deloval samo z njim

  • Popravljen klicni niz skripta, dodani narekovaji in zunanja klicna številka ExtNum

  • Obdelava je premaknjena v kontekste _custom in vam omogoča, da se ne dotikate ali urejate konfiguracij FreePBX - dohodno prek [ext-did-custom], odhaja skozi [outbound-allroutes-custom]

  • Brez vezave na številke - datoteka je univerzalna in jo je treba konfigurirati le za pot in povezavo do strežnika

Za začetek morate zagnati tudi skripte v AMI s prijavo in geslom - za to ima FreePBX tudi datoteko _custom

datoteka manager_custom.conf

;;  это логин
[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

Obe datoteki morate postaviti v /etc/asterisk, nato znova preberite konfiguracije (ali znova zaženite zvezdico)

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

Zdaj pa preidimo na PHP

Inicializacija skriptov in ustvarjanje storitve

Ker shema za delo z Bitrix 24, storitvijo za AMI, ni povsem preprosta in pregledna, je treba o njej razpravljati ločeno. Asterisk, ko je AMI aktiviran, preprosto odpre port in to je to. Ko se stranka pridruži, zahteva avtorizacijo, nato se stranka naroči na potrebne dogodke. Dogodki prihajajo v navadnem besedilu, ki ga PAMI pretvori v strukturirane objekte in omogoča nastavitev funkcije filtriranja samo za zanimive dogodke, polja, številke itd.

Takoj ko pride klic, se sproži dogodek NewExten, ki se začne od nadrejenega konteksta [from-pstn], nato pa gredo vsi dogodki po vrstnem redu vrstic v kontekstih. Ko so informacije prejete iz spremenljivk CallMeCallerIDName in CallStart, podanih v klicnem načrtu _custom,

  1. Funkcija zahtevanja ID-ja uporabnika, ki ustreza interni številki, na katero je prišel klic. Kaj pa, če je to skupina na klic? Vprašanje je politično, ali morate ustvariti klic vsem hkrati (ko vsi kličejo hkrati) ali ustvariti tako, kot kličejo, ko kličejo po vrsti? Večina strank ima strategijo Fisrt Available, tako da s tem ni težav, le eden kliče. Toda vprašanje je treba rešiti.

  2. Funkcija registracije klica v Bitrix24, ki vrne CallID, ki je nato potreben za poročanje parametrov klica in povezavo do posnetka. Zahteva interno številko ali ID uporabnika

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Po končanem klicu se prikliče funkcija prenosa zapisa, ki hkrati sporoči status zaključka klica (Zasedeno, Ni odgovora, Uspešno), prenese pa tudi povezavo do mp3 datoteke z zapisom (če obstaja).

Ker mora modul CallMeIn.php delovati neprekinjeno, je bila zanj ustvarjena zagonska datoteka SystemD pokliči me.storitev, ki ga morate dati v /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

inicializacija in zagon skripta poteka prek systemctl ali storitve

# systemctl enable callme
# systemctl start callme

Storitev se bo po potrebi znova zagnala (v primeru zrušitev). Storitev sledenja prejetih sporočil ne zahteva namestitve spletnega strežnika, potreben je le php (ki je zagotovo na strežniku FeePBX). Če pa ni dostopa do zapisov klicev prek spletnega strežnika (tudi s https), zapisov klicev ne bo mogoče poslušati.

Zdaj pa se pogovorimo o odhodnih klicih. Skript CallMeOut.php ima dve funkciji:

  • Začetek klica, ko je prejeta zahteva za skript php (vključno z uporabo gumba "Pokliči" v samem Bitrixu). Brez spletnega strežnika ne deluje, zahteva se prejme preko HTTP POST, zahteva vsebuje žeton

  • Sporočilo o klicu, njegovih parametrih in zapisih v Bitrixu. Sproži Asterisk v klicnem načrtu [sub-call-internal-ended], ko se klic konča

Razumevanje FreePBX in njegova integracija z Bitrix24 in več

Spletni strežnik je potreben samo za dve stvari - prenos datotek zapisa Bitrix (prek HTTPS) in klic skripte CallMeOut.php. Uporabite lahko vgrajeni strežnik FreePBX, katerega datoteke so /var/www/html, lahko namestite drug strežnik ali določite drugo pot.

spletni strežnik

Pustimo nastavitev spletnega strežnika za samostojno študijo (tipk, tipk, tipk). Če nimate domene, lahko poskusite FreeDomain( https://www.freenom.com/ru/index.html), ki vam bo dal brezplačno ime za vaš beli IP (ne pozabite posredovati vrat 80, 443 prek usmerjevalnika, če je zunanji naslov samo na njem). Če ste pravkar ustvarili domeno DNS, potem morate počakati (od 15 minut do 48 ur), da se vsi strežniki naložijo. Glede na izkušnje dela z domačimi ponudniki - od 1 ure do dneva.

Avtomatizacija namestitve

Na githubu je bil razvit namestitveni program, ki olajša namestitev. A na papirju je šlo gladko - medtem, ko vse nameščamo ročno, saj je po tem, ko smo se poigrali z vsem tem, postalo kristalno jasno, kaj je s kom prijatelj, kdo kam gre in kako to odpraviti. Namestitvenega programa še ni

Lučki delavec

Če želite hitro preizkusiti rešitev - obstaja možnost z Dockerjem - hitro ustvarite vsebnik, mu dajte vrata navzven, potisnite nastavitvene datoteke in poskusite (to je možnost z vsebnikom LetsEncrypt, če že imate potrdilo , povratni proxy morate samo preusmeriti na spletni strežnik FreePBX (dali smo mu druga vrata, 88), LetsEncrypt v dockerju temelji na ta članek

Datoteko morate zagnati v preneseni mapi projekta (po klonu git), vendar najprej pojdite v konfiguracije zvezdice (mapa zvezdice) in tam zapišite poti do zapisov in URL svojega mesta

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:

Ta datoteka docker-compose.yaml se izvaja prek

docker-compose up -d

Če se nginx ne zažene, je nekaj narobe s konfiguracijo v mapi nginx/ssl_docker.conf

Druge integracije

In zakaj ne bi hkrati vključili nekaj CRM v skripte, smo pomislili. Preučili smo več drugih API-jev CRM, zlasti brezplačno vgrajeno PBX - ShugarCRM in Vtiger, in ja! ja, princip je enak. A to je že druga zgodba, ki jo bomo kasneje posebej naložili na github.

reference

Zavrnitev odgovornosti: Vsaka podobnost z resničnostjo je izmišljena in to nisem bil jaz.

Vir: www.habr.com

Dodaj komentar