Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

Bitrix24 je obrovská kombinácia, ktorá kombinuje CRM, workflow, účtovníctvo a mnoho ďalších vecí, ktoré majú manažéri naozaj radi a IT pracovníci nie. Portál využíva množstvo malých a stredných firiem, vrátane malých kliník, výrobcov a dokonca aj kozmetických salónov. Hlavnou funkciou, ktorú manažéri „milujú“, je integrácia telefonovania a CRM, kedy sa akýkoľvek hovor okamžite zaznamená do CRM, vytvoria sa klientske karty, pri príchode sa zobrazia informácie o klientovi a hneď vidíte, kto je, čo môže predať a koľko dlhuje. Ale telefonovanie od Bitrix24 a jeho integrácia s CRM stojí peniaze, niekedy veľa. V článku vám poviem skúsenosti s integráciou s otvorenými nástrojmi a populárnou IP PBX free pbx, a tiež zvážiť logiku práce rôznych častí

Pracujem ako outsourcer vo firme, ktorá predáva a konfiguruje, integruje IP telefóniu. Keď som dostal otázku, či by sme tejto a tejto spoločnosti mohli ponúknuť niečo na integráciu Bitrix24 s ústredňami, ktoré majú zákazníci, ako aj s virtuálnymi ústredňami na rôznych spoločnostiach VDS, išiel som do Googlu. A samozrejme mi dal odkaz článok v habr, kde je popis a github a zdá sa, že všetko funguje. Ale pri pokuse použiť toto riešenie sa ukázalo, že Bitrix24 už nie je taký istý ako predtým a je potrebné veľa prerobiť. FreePBX pre vás navyše nie je obyčajná hviezdička, tu musíte myslieť na to, ako v konfiguračných súboroch skombinovať jednoduchosť používania a hardcore dialplan.

Študujeme logiku práce

Takže na začiatok, ako by to malo všetko fungovať. Pri príjme hovoru zvonku PBX (udalosť SIP INVITE od poskytovateľa) začína spracovanie dialplanu (dial plan, dialplan) - pravidlá, čo a v akom poradí sa má s hovorom robiť. Z prvého paketu môžete získať množstvo informácií, ktoré potom môžete použiť v pravidlách. Skvelým nástrojom na štúdium vnútorných častí SIP je analyzátor sngrep (odkaz), ktorý sa v populárnych distribúciách jednoducho inštaluje cez apt install/yum install a podobne, ale dá sa zostaviť aj zo zdroja. Pozrime sa na protokol hovorov v sngrep

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

V zjednodušenej forme sa dialplan zaoberá len prvým paketom, niekedy aj počas hovoru, prepájaním hovorov, stláčaním tlačidiel (DTMF), rôznymi zaujímavosťami ako FollowMe, RingGroup, IVR a iné.

Čo je v balíku Invite Pack

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

V skutočnosti väčšina jednoduchých telefónnych plánov pracuje s prvými dvoma poľami a celá logika sa točí okolo DID a CallerID. DID - kam voláme, CallerID - kto volá.

Ale veď máme firmu a nie jeden telefón - čo znamená, že PBX má s najväčšou pravdepodobnosťou skupiny hovorov (súčasné / po sebe idúce zvonenia viacerých zariadení) na mestských číslach (Ring Group), IVR (Dobrý deň, volali ste ... Stlačte jeden pre ...), Záznamníky ( Frázy), Časové podmienky, Preposielanie na iné čísla alebo do bunky (FollowMe, Forward). To znamená, že je veľmi ťažké jednoznačne určiť, kto v skutočnosti prijme hovor a s kým sa bude pri príchode hovoru rozprávať. Tu je príklad začiatku typického hovoru v pobočkovej ústredni našich klientov

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

Po úspešnom vstupe hovoru do pobočkovej ústredne prechádza dialplánom v rôznych „kontextoch“. Kontext z pohľadu Asteriska je očíslovaná množina príkazov, z ktorých každý obsahuje filter podľa volaného čísla (nazýva sa exten, pre externý hovor v počiatočnom štádiu exten=DID). Príkazy v linke dialplan môžu byť čokoľvek - interné funkcie (napríklad zavolať internému účastníkovi - Dial(), polož telefón - Hangup()), podmienené operátory (IF, ELSE, ExecIF a podobne), prechody na iné pravidlá tohto kontextu (Goto, GotoIF), prechod do iných kontextov formou volania funkcie (Gosub, Macro). Samostatná smernica include имя_контекста, ktorý pridáva príkazy z iného kontextu na koniec aktuálneho kontextu. Príkazy zahrnuté cez include sa vždy vykonajú po príkazy aktuálneho kontextu.

Celá logika FreePBX je postavená na začlenení rôznych kontextov do seba prostredníctvom include a call cez Gosub, Macro a Handler handler. Zvážte kontext prichádzajúcich hovorov FreePBX

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

Volanie prechádza postupne všetkými kontextami zhora nadol, v každom kontexte môžu byť volania do iných kontextov, ako sú makrá (Macro), funkcie (Gosub) alebo len prechody (Goto), takže skutočný strom toho, čo sa volá, môže sledovať v denníkoch.

Typická schéma nastavenia pre typickú PBX je uvedená nižšie. Pri volaní sa hľadá DID v prichádzajúcich trasách, kontrolujú sa mu dočasné podmienky, ak je všetko v poriadku, spustí sa hlasové menu. Z nej stlačením tlačidla 1 alebo timeoutu opustíte skupinu operátorov voľby. Po ukončení hovoru sa zavolá makro hangupcall, po ktorom sa v dialplane nedá nič robiť, okrem špeciálnych handlerov (handler hangup).

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

Kde v tomto algoritme hovoru máme dodať informáciu o začiatku hovoru do CRM, kde začať nahrávať, kde ukončiť nahrávanie a poslať ho spolu s informáciou o hovore do CRM?

Integrácia s externými systémami

Čo je integrácia PBX a CRM? Ide o nastavenia a programy, ktoré konvertujú dáta a udalosti medzi týmito dvoma platformami a navzájom si ich posielajú. Najbežnejší spôsob komunikácie nezávislých systémov je cez API a najpopulárnejším spôsobom prístupu k API je HTTP REST. Ale nie pre hviezdičku.

Vo vnútri hviezdičky je:

  • AGI - synchrónne volanie externých programov/komponentov, využíva sa hlavne v dialplane, existujú knižnice ako napr. phppagi, PAGI

  • AMI - textový TCP socket, ktorý funguje na princípe odoberania udalostí a zadávania textových príkazov, zvnútra pripomína SMTP, dokáže sledovať udalosti a spravovať hovory, nechýba knižnica PAMI - najobľúbenejší na vytvorenie spojenia s Asteriskom

Príklad výstupu AMI

Udalosť: Nový kanál
Privilégium: hovor, všetko
Kanál: PJSIP/VMS_pjsip-0000078b
Stav kanála: 4
ChannelStateDesc: Prezvoniť
ID volajúceho: 111222
Meno volajúceho: 111222
ConnectedLineNum:
názov pripojeného riadku:
Jazyk: en
kód účtu:
Kontext: od-pstn
Rozšírte: s
Priorita: 1
Jedinečné: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI je zmesou oboch, všetko cez REST, WebSocket, vo formáte JSON - ale s čerstvými knižnicami a obalmi, nie veľmi dobré, nájdené z ruky (phparia, phpari), ktorý sa stal v ich vývoji asi pred 3 rokmi.

Príklad výstupu ARI pri inicializácii hovoru

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «názov»:»PJSIP/VMSpjsip-000007b6″, "state":"Zvonenie", "volajúci":{ "meno":"111222″, "číslo":"111222″ }, "connected":{ "meno":"", "číslo" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appnázov":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"sk" }, "hviezdičkaid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Pohodlie alebo nepohodlie, možnosť alebo nemožnosť práce s konkrétnym API sú určené úlohami, ktoré je potrebné vyriešiť. Úlohy pre integráciu s CRM sú nasledovné:

  • Sledujte začiatok hovoru, kde bol prepojený, vytiahnite CallerID, DID, časy začiatku a konca, prípadne údaje z adresára (na vyhľadanie spojenia medzi telefónom a používateľom CRM)

  • Spustite a ukončite nahrávanie hovoru, uložte ho v požadovanom formáte, na konci nahrávania informujte, kde sa súbor nachádza

  • Iniciujte hovor na externú udalosť (z programu), zavolajte na interné číslo, externé číslo a spojte ich

  • Voliteľné: integrácia s CRM, skupinami dialerov a FollowME pre automatické presmerovanie hovorov v neprítomnosti miesta (podľa CRM)

Všetky tieto úlohy sa dajú riešiť cez AMI alebo ARI, no ARI poskytuje oveľa menej informácií, udalostí nie je veľa, veľa premenných, ktoré AMI ešte má (napríklad volania makier, nastavenie premenných vnútri makier vrátane nahrávania hovorov) nie je sledovaných. Preto pre správne a presné sledovanie zvoľme zatiaľ AMI (nie však úplne). Navyše (no, kde by to bez tohto bolo, veď sme leniví ľudia) - v pôvodnom diele (článok v habr) použite PAMI. *Potom sa musíte pokúsiť prepísať na ARI, ale nie skutočnosť, že to bude fungovať.

Znovuobjavenie integrácie

Aby naša FreePBX mohla jednoduchým spôsobom informovať AMI o začiatku hovoru, čase ukončenia, číslach, názvoch nahratých súborov, je najjednoduchšie vypočítať trvanie hovoru pomocou rovnakého triku ako pôvodní autori - zadajte svoje premenné a analyzujte výstup na ich prítomnosť. PAMI navrhuje urobiť to jednoducho pomocou funkcie filtra.

Tu je príklad nastavenia vlastnej premennej pre čas začiatku hovoru (s je špeciálne číslo v dialplane, ktoré sa vykonáva PRED spustením vyhľadávania DID)

[ext-did-custom]

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

Príklad udalosti AMI pre tento riadok

Udalosť: Nový kanál

Privilégium: hovor, všetko

Kanál: PJSIP/VMS_pjsip-0000078b

Stav kanála: 4

ChannelStateDesc: Prezvoniť

ID volajúceho: 111222

Meno volajúceho: 111222

ConnectedLineNum:

názov pripojeného riadku:

Jazyk: en

kód účtu:

Kontext: od-pstn

Rozšírte: s

Priorita: 1

Jedinečné: 1599589046.5244

Linkedid: 1599589046.5244

Aplikácia: Nastaviť AppData:

Začiatok hovoru=1599571046

Pretože FreePBX prepíše súbory extensionion.conf a extensionion_Additional.conf, použijeme súbor rozšírenie_zvyk.konf

Úplný kód extension_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

Vlastnosť a rozdiel oproti pôvodnému číselníku autorov pôvodného článku -

  • Dialplan vo formáte .conf, ako to chce FreePBX (áno, dokáže .ael, ale nie všetky verzie a nie vždy je to pohodlné)

  • Namiesto spracovania konca cez exten=>h bolo zavedené spracovanie cez hangup_handler, pretože dialplán FreePBX fungoval iba s ním

  • Opravený reťazec volania skriptu, pridané úvodzovky a externé telefónne číslo ExtNum

  • Spracovanie je presunuté do _vlastných kontextov a umožňuje vám nedotýkať sa ani upravovať konfigurácie FreePBX – prichádzajúce cez [ext-did-custom], odchádzajúce cez [outbound-allroutes-custom]

  • Žiadna väzba na čísla - súbor je univerzálny a musí byť nakonfigurovaný iba pre cestu a odkaz na server

Ak chcete začať, musíte tiež spustiť skripty v AMI pomocou prihlasovacieho mena a hesla - na to má FreePBX aj _custom súbor

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

Oba tieto súbory musia byť umiestnené v /etc/asterisk, potom si znova prečítajte konfigurácie (alebo reštartujte hviezdičku)

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

Teraz prejdime k PHP

Inicializácia skriptov a vytvorenie služby

Keďže schéma práce s Bitrix 24, službou pre AMI, nie je úplne jednoduchá a transparentná, treba ju prediskutovať samostatne. Asterisk pri aktivácii AMI jednoducho otvorí port a je to. Keď sa klient pripojí, požiada o autorizáciu a potom sa klient prihlási na odber potrebných udalostí. Udalosti prichádzajú vo forme obyčajného textu, ktorý PAMI prevádza na štruktúrované objekty a poskytuje možnosť nastaviť funkciu filtrovania iba pre zaujímavé udalosti, polia, čísla atď.

Hneď ako príde volanie, spustí sa udalosť NewExten počnúc nadradeným kontextom [from-pstn] a potom všetky udalosti idú v poradí riadkov v kontextoch. Keď sa prijmú informácie z premenných CallMeCallerIDName a CallStart špecifikovaných v _custom dialplan,

  1. Funkcia vyžiadania ID používateľa zodpovedajúceho číslu pobočky, na ktorú prišiel hovor. Čo ak je to skupina telefonického pripojenia? Otázka je politická, či potrebujete vytvoriť hovor pre všetkých naraz (keď všetci volajú naraz) alebo vytvoriť tak, ako volajú, keď volajú postupne? Väčšina klientov má stratégiu Fisrt Available, takže s tým nie je problém, len jeden hovor. Problém je však potrebné vyriešiť.

  2. Funkcia registrácie hovoru v Bitrix24, ktorá vracia CallID, ktorá je potom potrebná na nahlásenie parametrov hovoru a odkaz na nahrávku. Vyžaduje sa číslo klapky alebo ID používateľa

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

Po ukončení hovoru sa vyvolá funkcia sťahovania záznamu, ktorá súčasne hlási stav ukončenia hovoru (Obsadené, Neodpovedá, Úspech) a stiahne aj odkaz na mp3 súbor so záznamom (ak existuje).

Pretože modul CallMeIn.php musí bežať nepretržite, bol preň vytvorený spúšťací súbor SystemD zavolajte mi.servis, ktorý musí byť vložený do /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

inicializácia a spustenie skriptu prebieha prostredníctvom systemctl alebo služby

# systemctl enable callme
# systemctl start callme

Služba sa sama reštartuje podľa potreby (v prípade pádov). Služba sledovania doručenej pošty nevyžaduje inštaláciu webového servera, je potrebný iba php (ktorý je určite na serveri FeePBX). Ale bez prístupu k záznamom hovorov cez webový server (aj s https), nebude možné počúvať záznamy hovorov.

Teraz hovorme o odchádzajúcich hovoroch. Skript CallMeOut.php má dve funkcie:

  • Spustenie hovoru, keď je prijatá požiadavka na php skript (vrátane použitia tlačidla „Zavolať“ v samotnom Bitrixe). Bez webového servera to nefunguje, požiadavka je prijatá cez HTTP POST, požiadavka obsahuje token

  • Správa o hovore, jeho parametroch a záznamoch v Bitrixe. Spúšťa ho Asterisk v dialpláne [sub-call-internal-ended] pri ukončení hovoru

Pochopenie FreePBX a jeho integrácia s Bitrix24 a ďalšími

Webový server je potrebný len na dve veci – sťahovanie súborov záznamov Bitrix (cez HTTPS) a volanie skriptu CallMeOut.php. Môžete použiť vstavaný server FreePBX, ktorého súbory sú /var/www/html, môžete nainštalovať iný server alebo zadať inú cestu.

webový server

Nastavenie webového servera nechajme na samostatné štúdium (tyts, tyts, tyts). Ak nemáte doménu, môžete vyskúšať FreeDomain( https://www.freenom.com/ru/index.html), ktorý vám dá voľný názov pre vašu bielu IP (nezabudnite presmerovať porty 80, 443 cez router, ak je externá adresa iba na ňom). Ak ste práve vytvorili doménu DNS, musíte počkať (15 minút až 48 hodín), kým sa načítajú všetky servery. Podľa skúseností z práce s domácimi poskytovateľmi - od 1 hodiny do dňa.

Automatizácia inštalácie

Na github bol vyvinutý inštalačný program, aby bola inštalácia ešte jednoduchšia. Ale na papieri to bolo hladké - kým to všetko inštalujeme ručne, keďže po pohraní sa s tým všetkým bolo krištáľovo jasné, čo sa s kým kamaráti, kto kam chodí a ako to odladiť. Zatiaľ neexistuje žiadny inštalátor

prístavný robotník

Ak chcete rýchlo vyskúšať riešenie - existuje možnosť s Dockerom - rýchlo vytvorte kontajner, dajte mu porty smerom von, vložte súbory nastavení a vyskúšajte (toto je možnosť s kontajnerom LetsEncrypt, ak už máte certifikát , stačí presmerovať reverzný proxy na webový server FreePBX (dali sme mu iný port je 88), LetsEncrypt v docker na základe tento článok

Musíte spustiť súbor v stiahnutom priečinku projektu (po git clone), ale najprv sa dostať do asterisk configs (hviezdička) a napísať tam cesty k záznamom a URL vašej stránky

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:

Tento súbor docker-compose.yaml sa spúšťa cez

docker-compose up -d

Ak sa nginx nespustí, niečo nie je v poriadku s konfiguráciou v priečinku nginx/ssl_docker.conf

Iné integrácie

A prečo nevložiť do skriptov zároveň nejaké CRM, povedali sme si. Študovali sme niekoľko ďalších CRM API, najmä bezplatné vstavané PBX - ShugarCRM a Vtiger, a áno! ano, princip je rovnaky. Ale toto je iný príbeh, ktorý neskôr nahráme na github samostatne.

referencie

Upozornenie: Akákoľvek podobnosť s realitou je fiktívna a nebol som to ja.

Zdroj: hab.com

Pridať komentár