Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Bitrix24 je ogromna kombinacija koja kombinira CRM, tijek rada, računovodstvo i mnoge druge stvari koje menadžeri jako vole, a IT osoblje baš i ne voli. Portal koriste mnoge male i srednje tvrtke, uključujući male klinike, proizvođače, pa čak i kozmetičke salone. Glavna funkcija koju menadžeri “vole” je integracija telefonije i CRM-a, kada se svaki poziv odmah bilježi u CRM-u, kreiraju se kartice klijenata, prikazuju se podaci o klijentu pri dolasku i odmah se vidi tko je, što može prodati i koliko je dužan. Ali telefonija iz Bitrix24 i njegova integracija s CRM-om koštaju, ponekad i puno. U članku ću vam ispričati iskustvo integracije s otvorenim alatima i popularnim IP PBX-om freepbx, a također razmotrite logiku rada različitih dijelova

Radim kao outsourcer u tvrtki koja prodaje i konfigurira, integrira IP telefoniju. Kad su me pitali možemo li ponuditi nešto toj i toj firmi za integraciju Bitrix24 s PBX-ovima koje korisnici imaju, kao i s virtualnim PBX-ovima na raznim VDS tvrtkama, otišao sam do Googlea. I naravno dao mi je link na članak u habru, gdje postoji opis, i github, i čini se da sve radi. Ali kada smo pokušali koristiti ovo rješenje, pokazalo se da Bitrix24 više nije isti kao prije i mnogo toga treba preurediti. Osim toga, FreePBX nije puka zvjezdica za vas, ovdje morate razmisliti o tome kako kombinirati jednostavnost korištenja i hardcore dialplan u konfiguracijskim datotekama.

Proučavamo logiku rada

Dakle, za početak, kako bi sve to trebalo funkcionirati. Kada se poziv primi izvana na PBX (SIP INVITE događaj od provajdera), počinje obrada dialplana (dialplan, dialplan) - pravila što i kojim redoslijedom raditi s pozivom. Iz prvog paketa možete dobiti puno informacija koje se zatim mogu koristiti u pravilima. Izvrstan alat za proučavanje unutrašnjosti SIP-a je analizator sngrep (link) koji se jednostavno instalira u popularne distribucije putem apt install/yum install i slično, ali se također može izgraditi iz izvora. Pogledajmo zapisnik poziva u sngrepu

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

U pojednostavljenom obliku, dialplan se bavi samo prvim paketom, ponekad i tijekom razgovora, prijenosa poziva, pritiskanja tipki (DTMF), raznih zanimljivosti poput FollowMe, RingGroup, IVR i dr.

Što se nalazi unutar Invite Packa

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Zapravo, većina jednostavnih dialplanova radi s prva dva polja, a cijela se logika vrti oko DID-a i CallerID-a. DID - gdje zovemo, CallerID - tko zove.

Ali ipak imamo tvrtku a ne jedan telefon - što znači da PBX najvjerojatnije ima grupe poziva (istodobno/uzastopno zvonjenje više uređaja) na gradskim brojevima (Ring Group), IVR (Halo, zvali ste ... Pritisnite jedan za ...), Telefonske sekretarice (Fraze), Vremenski uvjeti, Prosljeđivanje na druge brojeve ili u ćeliju (FollowMe, Proslijedi). To znači da je vrlo teško jednoznačno odrediti tko će zapravo primiti poziv, a s kim će razgovarati kada poziv stigne. Evo primjera početka tipičnog poziva u PBX-u naših klijenata

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Nakon što poziv uspješno uđe u PBX, putuje kroz dialplan u različitim "kontekstima". Kontekst sa stajališta Asterisk-a je numerirani skup naredbi, od kojih svaka sadrži filter prema biranom broju (naziva se exten, za vanjski poziv u početnoj fazi exten=DID). Naredbe u retku plana biranja mogu biti bilo što - interne funkcije (na primjer, poziv internom pretplatniku - Dial(), spusti slušalicu - Hangup()), uvjetni operatori (IF, ELSE, ExecIF i slično), prelazi na druga pravila ovog konteksta (Goto, GotoIF), prijelaz u druge kontekste u obliku poziva funkcije (Gosub, Macro). Posebna direktiva include имя_контекста, koji dodaje naredbe iz drugog konteksta na kraj trenutnog konteksta. Naredbe uključene putem uključivanja uvijek se izvršavaju nakon naredbe trenutnog konteksta.

Cijela logika FreePBX-a izgrađena je na uključivanju različitih konteksta jednog u drugi kroz uključivanje i pozivanje kroz rukovatelje Gosub, Macro i Handler. Razmotrite kontekst dolaznih FreePBX poziva

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Poziv prolazi redom kroz sve kontekste od vrha do dna, u svakom kontekstu mogu biti pozivi drugim kontekstima poput makronaredbi (Macro), funkcija (Gosub) ili samo prijelaza (Goto), tako da pravo stablo onoga što se poziva može samo pratiti u zapisima.

Dolje je prikazan tipični dijagram postavljanja tipičnog PBX-a. Prilikom poziva, DID se traži u dolaznim rutama, provjeravaju se privremeni uvjeti za to, ako je sve u redu, pokreće se glasovni izbornik. Iz nje pritiskom na tipku 1 ili timeoutom izađite u grupu operatera biranja. Nakon završetka poziva poziva se makro hangupcall, nakon čega se u dialplanu ne može raditi ništa, osim posebnih rukovatelja (hangup handler).

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Gdje u ovom algoritmu poziva trebamo unijeti informacije o početku poziva u CRM, gdje započeti snimanje, gdje završiti snimanje i poslati zajedno s informacijama o pozivu u CRM?

Integracija s vanjskim sustavima

Što je PBX i CRM integracija? To su postavke i programi koji pretvaraju podatke i događaje između ove dvije platforme i šalju ih jedna drugoj. Najčešći način za komunikaciju neovisnih sustava je putem API-ja, a najpopularniji način pristupa API-jima je HTTP REST. Ali ne za zvjezdicu.

Unutar Zvjezdice je:

  • AGI - sinkroni poziv vanjskim programima/komponentama, koristi se uglavnom u dialplanu, postoje biblioteke poput phpagi, PAGI

  • AMI - tekstualni TCP socket koji radi na principu pretplate na događaje i unos tekstualnih naredbi, iznutra podsjeća na SMTP, može pratiti događaje i upravljati pozivima, postoji biblioteka PAMI - najpopularniji za stvaranje veze sa zvjezdicom

Primjer AMI izlaza

Događaj: Novi kanal
Privilegija: poziv, svi
Kanal: PJSIP/VMS_pjsip-0000078b
Stanje kanala: 4
ChannelStateDesc: zvoni
ID pozivatelja: 111222
ID ime pozivatelja: 111222
ConnectedLineNum:
naziv povezane linije:
Jezik: en
šifra računa:
Kontekst: from-pstn
Proširenje: s
Prioritet: 1
Uniqued: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI je mješavina oba, sve putem REST-a, WebSocket-a, u JSON formatu - ali sa svježim bibliotekama i omotima, ne baš dobrim, nađeno na brzinu (phparija, phpari) koji je nastao u njihovom razvoju prije otprilike 3 godine.

Primjer ARI izlaza kada je poziv pokrenut

{ "varijabla":"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, "appime":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "asteriskid":"48:5b:aa:aa:aa:aa", "aplikacija":"zdravo-svijete"}

Pogodnost ili neugodnost, mogućnost ili nemogućnost rada s određenim API-jem određuju se zadacima koje je potrebno riješiti. Zadaci za integraciju sa CRM-om su sljedeći:

  • Pratite početak poziva, gdje je prebačen, izvucite CallerID, DID, vrijeme početka i završetka, možda podatke iz imenika (za traženje veze između telefona i CRM korisnika)

  • Započnite i završite snimanje poziva, spremite ga u željenom formatu, obavijestite na kraju snimanja gdje se datoteka nalazi

  • Inicirati poziv na eksterni događaj (iz programa), nazvati interni broj, eksterni broj i spojiti ih

  • Neobvezno: integrirajte s CRM-om, grupama za biranje i FollowME za automatski prijenos poziva u nedostatku mjesta (prema CRM-u)

Svi ovi zadaci mogu se riješiti kroz AMI ili ARI, ali ARI pruža puno manje informacija, nema puno događaja, mnoge varijable koje AMI još ima (na primjer, makro pozivi, postavljanje varijabli unutar makronaredbi, uključujući snimanje poziva) se ne prate. Stoga, za ispravno i točno praćenje, izaberimo AMI za sada (ali ne u potpunosti). Osim toga (pa gdje bi bez ovoga, mi smo lijeni ljudi) - u originalnom djelu (članak u habru) koristiti PAMI. *Zatim morate pokušati prepisati na ARI, ali ne i činjenicu da će to raditi.

Ponovno osmišljavanje integracije

Kako bi naš FreePBX mogao na jednostavne načine izvijestiti AMI o početku poziva, vremenu završetka, brojevima, nazivima snimljenih datoteka, najlakše je izračunati trajanje poziva koristeći isti trik kao i originalni autori - unesite svoje varijable i raščlanite izlaz na njihovu prisutnost. PAMI predlaže da to učinite jednostavno pomoću funkcije filtra.

Ovdje je primjer postavljanja vlastite varijable za vrijeme početka poziva (s je poseban broj u planu biranja koji se izvodi PRIJE pokretanja DID pretrage)

[ext-did-custom]

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

Primjer AMI događaja za ovu liniju

Događaj: Novi kanal

Privilegija: poziv, svi

Kanal: PJSIP/VMS_pjsip-0000078b

Stanje kanala: 4

ChannelStateDesc: zvoni

ID pozivatelja: 111222

ID ime pozivatelja: 111222

ConnectedLineNum:

naziv povezane linije:

Jezik: en

šifra računa:

Kontekst: from-pstn

Proširenje: s

Prioritet: 1

Uniqued: 1599589046.5244

Linkedid: 1599589046.5244

Aplikacija: Postavi AppData:

CallStart=1599571046

Budući da FreePBX prepisuje datoteke extention.conf i extention_Additional.conf, koristit ćemo datoteku nastavak_običaj.konf

Puni kod 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čajka i razlika u odnosu na izvorni dijaplan autora izvornog članka -

  • Dialplan u .conf formatu, kako FreePBX želi (da, može .ael, ali ne sve verzije i nije uvijek prikladno)

  • Umjesto obrade kraja kroz exten=>h, obrada je uvedena kroz hangup_handler, jer je FreePBX dialplan radio samo s njim

  • Ispravljen niz poziva skripte, dodani navodnici i vanjski broj poziva ExtNum

  • Obrada je premještena u _prilagođene kontekste i omogućuje vam da ne dodirujete ili uređujete FreePBX konfiguracije - dolazne putem [ext-did-custom], odlazni kroz [outbound-allroutes-custom]

  • Nema vezanja na brojeve - datoteka je univerzalna i potrebno ju je samo konfigurirati za put i vezu do poslužitelja

Da biste započeli, također morate pokrenuti skripte u AMI-ju putem prijave i lozinke - za to FreePBX također ima _custom datoteku

manager_custom.conf datoteka

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

Obje ove datoteke moraju biti smještene u /etc/asterisk, zatim ponovno pročitajte konfiguracije (ili ponovno pokrenite zvjezdicu)

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

Sada prijeđimo na PHP

Inicijalizacija skripti i kreiranje usluge

Budući da shema za rad s Bitrix 24, uslugom za AMI, nije sasvim jednostavna i transparentna, o njoj se mora raspravljati zasebno. Asterisk kad se aktivira AMI jednostavno otvori port i to je to. Kada se klijent pridruži, traži autorizaciju, zatim se pretplaćuje na potrebne događaje. Događaji dolaze u običnom tekstu koji PAMI pretvara u strukturirane objekte i pruža mogućnost postavljanja funkcije filtriranja samo za događaje od interesa, polja, brojeve itd.

Čim stigne poziv, NewExten događaj se pokreće počevši od nadređenog [from-pstn] konteksta, a zatim svi događaji idu redoslijedom redova u kontekstima. Kada se primi informacija od varijabli CallMeCallerIDName i CallStart navedenih u _custom dialplan,

  1. Funkcija traženja UserID-a koji odgovara broju lokala na koji je stigao poziv. Što ako je to dial-up grupa? Pitanje je političko, trebate li kreirati poziv svima odjednom (kada svi zovu odjednom) ili kreirati kako oni zovu kada zovu redom? Većina klijenata ima strategiju Fisrt Available, tako da s tim nema problema, samo jedan zove. Ali problem treba riješiti.

  2. Funkcija registracije poziva u Bitrix24, koja vraća CallID, koji je zatim potreban za prijavu parametara poziva i link na snimku. Zahtijeva dodatni broj ili korisnički ID

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Nakon završetka poziva poziva se funkcija preuzimanja zapisa koja istovremeno javlja status završetka poziva (Zauzeto, Nema odgovora, Uspješno), te preuzima poveznicu na mp3 datoteku sa zapisom (ako postoji).

Budući da modul CallMeIn.php treba kontinuirano raditi, za njega je stvorena datoteka za pokretanje SystemD nazovi me.usluga, koji se mora staviti u /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

inicijalizacija i pokretanje skripte odvija se kroz systemctl ili uslugu

# systemctl enable callme
# systemctl start callme

Usluga će se sama ponovno pokrenuti po potrebi (u slučaju rušenja). Usluga praćenja inboxa ne zahtijeva instaliranje web servera, potreban je samo php (koji se svakako nalazi na FeePBX serveru). Ali u nedostatku pristupa evidenciji poziva putem web poslužitelja (također s https), neće biti moguće slušati evidenciju poziva.

Razgovarajmo sada o odlaznim pozivima. Skripta CallMeOut.php ima dvije funkcije:

  • Pokretanje poziva kada se primi zahtjev za php skriptu (uključujući korištenje gumba "Poziv" u samom Bitrixu). Ne radi bez web poslužitelja, zahtjev se prima putem HTTP POST-a, zahtjev sadrži token

  • Poruka o pozivu, njegovim parametrima i zapisima u Bitrixu. Aktivirao Asterisk u planu biranja [sub-call-internal-ended] kada poziv završi

Razumijevanje FreePBX-a i njegova integracija s Bitrix24 i više

Web poslužitelj je potreban samo za dvije stvari - preuzimanje Bitrix zapisa (preko HTTPS-a) i pozivanje CallMeOut.php skripte. Možete koristiti ugrađeni FreePBX poslužitelj, čije su datoteke /var/www/html, možete instalirati drugi poslužitelj ili odrediti drugu putanju.

Web poslužitelj

Ostavimo postavljanje web poslužitelja za samostalno proučavanje (tits, tits, tits). Ako nemate domenu, možete isprobati FreeDomain( https://www.freenom.com/ru/index.html), koji će vam dati besplatno ime za vaš bijeli IP (ne zaboravite proslijediti portove 80, 443 kroz usmjerivač ako je vanjska adresa samo na njemu). Ako ste upravo kreirali DNS domenu, tada morate pričekati (od 15 minuta do 48 sati) dok se svi poslužitelji ne učitaju. Prema iskustvu rada s domaćim ponuđačima - od 1 sata do jednog dana.

Automatizacija instalacije

Na githubu je razvijen program za instalaciju kako bi instalacija bila još lakša. Ali na papiru je išlo glatko - dok mi to sve ručno instaliramo, pošto je nakon petljanja sa svim ovim postalo kristalno jasno što je s kim prijatelj, tko kamo ide i kako debugirati. Još nema programa za instalaciju

Lučki radnik

Ako želite brzo isprobati rješenje - postoji opcija s Dockerom - brzo izradite spremnik, dajte mu portove prema van, ubacite datoteke postavki i pokušajte (ovo je opcija s LetsEncrypt spremnikom, ako već imate certifikat , trebate samo preusmjeriti obrnuti proxy na FreePBX web poslužitelj (dali smo mu još jedan port 88), LetsEncrypt u dockeru na temelju ovaj članak

Morate pokrenuti datoteku u preuzetoj mapi projekta (nakon git klona), ali prvo uđite u konfiguracije zvjezdice (mapa sa zvjezdicom) i tamo napišite staze do zapisa i URL svoje stranice

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:

Ova datoteka docker-compose.yaml pokreće se putem

docker-compose up -d

Ako se nginx ne pokrene, onda nešto nije u redu s konfiguracijom u mapi nginx/ssl_docker.conf

Ostale integracije

A zašto ne staviti malo CRM-a u skripte u isto vrijeme, pomislili smo. Proučili smo nekoliko drugih CRM API-ja, posebno besplatni ugrađeni PBX - ShugarCRM i Vtiger, i da! da, princip je isti. Ali ovo je već druga priča, koju ćemo kasnije zasebno prenijeti na github.

reference

Odricanje od odgovornosti: svaka sličnost sa stvarnošću je fiktivna i to nisam bio ja.

Izvor: www.habr.com

Dodajte komentar