Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Bitrix24 — je to obrovský nástroj, ktorý kombinuje CRM, dokumentový obeh, účtovníctvo a ešte mnoho ďalších funkcií, ktoré sa veľmi páčia manažérom a nie tak veľmi IT osobám. Portál využíva množstvo malých a stredných podnikov, vrátane malých kliník, výrobcov a dokonca aj salónov krásy. Hlavnou funkciou, ktorú manažéri "milujú", je integrácia telefónie a CRM, kde sa každý hovor okamžite zaznamenáva do CRM, vytvárajú sa karty zákazníkov, pri prichádzajúcom hovore sa zobrazujú informácie o zákazníkovi a okamžite je vidno, kto to je, čo mu môžeme predávať a koľko dlhujeme. Ale telefónia od Bitrix24 a jej integrácia s CRM niečo stojí, niekedy aj nemalé peniaze. V článku sa podelím o skúsenosti s integráciou pomocou otvorených nástrojov a populárnej IP AТС FreePBX, a tiež sa pozrieme na logiku fungovania rôznych častí.

Pracujem na outsourcingu v spoločnosti, ktorá sa zaoberá predajom a nastavením, integráciou IP telefónie. Keď sa ma spýtali, či môžeme tej a tej spoločnosti ponúknuť niečo na integráciu Bitrix24 s AТС, ktoré má klient, ako aj s virtuálnymi AТС na rôznych VDS spoločnosti, šiel som do Googlu. A samozrejme, našiel mi odkaz na článok na Habri, kde je aj popis, aj github, a zdá sa, že všetko funguje. Ale pri pokuse o použitie tohto riešenia sa ukázalo, že Bitrix24 už nie je to, čo býval, a treba veľa vecí prerobiť. Okrem toho, FreePBX nie je len čistý Asterisk, tu je potrebné premýšľať, ako skombinovať pohodlie používania s hardcore dial plánom v konfiguračných súboroch.

Študujeme logiku práce

Takže na začiatok, ako to všetko má fungovať. Pri príchode hovoru zvonka na AТС (udalosť SIP INVITE od poskytovateľa) začína spracovanie dial plánu (plánu výberu, dialplan) — pravidiel, čo a v akom poradí robiť s hovorom. Z prvého paketu je možné získať množstvo informácií, ktoré potom môžeme použiť v pravidlách. Skvelým nástrojom na skúmanie vnútorností SIP je analyzátor sngrep (odkaz) ktorý sa jednoducho nainštaluje v populárnych distribúciách cez apt install/yum install a podobne, ale je možné ho aj zostaviť z zdrojového kódu. Pozrime sa na log hovoru v sngrep.

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Zjednodušene povedané, dial plán sa zaoberá iba prvým balíkom, niekedy sa tiež počas rozhovoru uskutočňuje preklad hovorov, stlačenia tlačidiel (DTMF), rôzne zaujímavosti ako FollowMe, RingGroup, IVR a podobne.

Čo je zahrnuté v balíku Invite

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Väčšina jednoduchých dial plánov pracuje s prvými dvoma poľami a celá logika sa točí okolo DID a CallerID. DID je číslo, na ktoré voláme, CallerID je číslo volajúceho.

Veď máme firmu, nie len jeden telefón — a to znamená, že v PBX (privátnej ústredni) pravdepodobne existujú skupiny hovorov (súčasné/sledované volanie niekoľkých prístrojov) na mestských číslach (Ring Group), IVR (Dobrý deň, voláte na… Stlačte jedno pre…), automatické záznamníky (Phrases), časové podmienky (Time Conditions), presmerovanie na iné čísla alebo na mobilné (FollowMe, Forward). To znamená, že jednoznačne určiť, komu naozaj príde hovor a s kým bude rozhovor, pri príchode hovoru je veľmi zložité. Tu je príklad začiatku prenosu typového hovoru v PBX našich klientov.

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Po úspešnom prijatí hovoru do PBX nastáva jeho cesta cez dial plán v rôznych „kontextoch“. Kontext z pohľadu Asterisk je číselne označená súprava príkazov, z ktorých každý obsahuje filtráciu podľa vytáčaného čísla (nazýva sa exten, pre vonkajší hovor na počiatočnej úrovni exten=DID). Príkazy v riadku dial plánu môžu byť čokoľvek — interné funkcie (napríklad zavolať internému účastníkovi — Dial(), zložiť sluchátko — Hangup()), podmienečné operátory (IF, ELSE, ExecIF a podobné), prechody k iným pravidlám tohto kontextu (Goto, GotoIF), prechod do iných kontextov vo forme volania funkcií (Gosub, Macro). Osobitne stojí za zmienku direktíva include meno_kontextu, , ktorá pridáva príkazy iného kontextu na koniec aktuálneho kontextu. Príkazy zahrnuté cez include sa vždy vykonávajú po príkazmi aktuálneho kontextu.

Celá logika fungovania FreePBX je postavená na zahrnutí medzi sebou rôznych kontextov cez include a volanie cez Gosub, Macro a Handler. Pozrime sa na kontext prichádzajúcich hovorov FreePBX.

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Hovor prechádza všetkými kontextami zhora nadol po poriadku, v každom kontexte môžu byť volania iných kontextov ako makrá (Macro), funkcie (Gosub) alebo len prechody (Goto), preto reálny strom toho, čo je vyžadované, možno sledovať iba v logoch.

Typická schéma nastavenia bežnej kancelárskej PBX je uvedená nižšie. Pri prichádzajúcich volaniach sa vyhľadáva DID, kontrolujú sa časové podmienky, ak je všetko v poriadku — spustí sa hlasové menu. Z neho sa po stlačení tlačidla 1 alebo timeoutu prechádza na skupinu operátorov. Po skončení hovoru sa vyvolá makro hangupcall, po ktorom už nie je možné vykonať nič v dialpláne, s výnimkou špeciálnych spracovateľov (hangup handler).

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Kde v tomto algoritme volania by sme mali poskytnúť informácie o začiatku hovoru v CRM, kde začať nahrávanie, kde ukončiť nahrávanie a odosielať ju spolu s informáciami 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 posielajú si navzájom. Najrozšírenejším spôsobom interakcie nezávislých systémov je API, a najpopulárnejším spôsobom prístupu k API je HTTP REST. Ale nie pre Asterisk.

Vnútri Asterisku sú:

  • AGI — synchronné volanie externých programov/componentov, používa sa hlavne v dialpláne, existujú knižnice ako phpagi, PAGI

  • AMI — textový TCP socket, ktorý pracuje na princípe prihlásenia sa na udalosti a zadávania textových príkazov, pripomína SMTP zvnútra, vie sledovať udalosti a spravovať hovory, je tu knižnica PAMI — najpopulárnejšia na vytváranie spojenia s Asteriskom

Príklad výstupu AMI

Event: Newchannel
Privilege: call,all
Channel: PJSIP/VMS_pjsip-0000078b
ChannelState: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
Language: en
AccountCode:
Context: from-pstn
Exten: s
Priority: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI — zmes toho a druhého, všetko cez REST, WebSocket, vo formáte JSON — ale s novými knižnicami a wrappermi to nie je veľmi dobré, našli sa (phparia, phpari) ktoré sa vo svojom vývoji zastavili pred 3 rokmi.

Príklad výstupu ARI pri iniciovaní hovoru

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id":"1599644315.5334", "name":"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":"ru" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

Pohodlie alebo nepohodlie, možnosť alebo nemožnosť pracovať s určitým API závisí od úloh, ktoré je potrebné vyriešiť. Úlohy pre integráciu s CRM sú nasledujúce:

  • Sledovať začiatok volania, kam ho preposlali, získať CallerID, DID, časy začiatku a konca, možno údaje z adresára (na nájdenie prepojenia telefónu a používateľa CRM)

  • Začať a ukončiť nahrávanie hovoru, uložiť v požadovanom formáte, oznámiť po ukončení nahrávania, kde sa nachádza súbor

  • Iniciovať hovor na základe vonkajšej udalosti (z programu), zavolať vnútorné číslo, externé a spojiť ich

  • Voliteľne: integrovať s CRM, skupinami volaní a FollowME na automatický prenos hovorov v prípade neprítomnosti (podľa informácií CRM)

Všetky tieto úlohy je možné vyriešiť prostredníctvom AMI alebo ARI, ale ARI poskytuje oveľa menej informácií, chýbajú mnohé udalosti, nesledujú sa mnohé premenné, ktoré sú v AMI predsa len dostupné (napríklad vyvolávanie makier, nastavovanie premenných v rámci makier, vrátane nahrávania hovorov). Preto na správne a presné sledovanie vyberieme zatiaľ AMI (ale nie definitívne). Okrem toho (nuž a kam by sme bez toho, sme len leniví ľudia) — v pôvodnej práci (článok na habri) používajú PAMI. *Potom treba skúsiť prepísať na ARI, ale nie je isté, že to pôjde.

Vymýšľame integráciu odznova

Aby náš FreePBX mohol jednoducho oznámiť v AMI o začiatku hovoru, čase ukončenia, číslach, názvoch nahratých súborov, je najjednoduchšie využiť rovnaký trik ako pôvodní autori — zaviesť svoje premenné a analyzovať výstup na ich prítomnosť. PAMI to ponúka robiť jednoducho prostredníctvom filtračnej funkcie.

Tu je príklad nastavenia svojej premennej pre čas začiatku hovoru (s — to je osobitné číslo v dialpláne, ktoré sa vykonáva PRED začiatkom vyhľadávania po DID)

[ext-did-custom]

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

Príklad AMI udalosti na tento riadok

Event: Newchannel

Privilege: call,all

Channel: PJSIP/VMS_pjsip-0000078b

ChannelState: 4

ChannelStateDesc: Ring

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

ConnectedLineName:

Language: en

AccountCode:

Context: from-pstn

Exten: s

Priority: 1

Uniqueid: 1599589046.5244

Linkedid: 1599589046.5244

Aplikácia: Nastaviť AppData:

CallStart=1599571046

Keďže FreePBX prepisuje súbory extention.conf a extention_additional.conf, budeme používať súbor extention_custom.conf

Celý kód extention_custom.conf

[globals]	
;; Skontrolujte cesty a práva na priečinky - používateľ asterisk musí mať práva na zápis
;; Sem sa budú zapisovať hovory
WAV=\/var\/www\/html\/callme\/records\/wav 
MP3=\/var\/www\/html\/callme\/records\/mp3

;; Na týchto cestách sa budú prehrávať a sťahovať nahrávky
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3

;; Adresa pre callback pri odchádzajúcom hovore
URLPHP=https:\/\/www.host.ru\/callmeplus

;; Áno, zapisujeme hovory
RECORDING=1

;; Toto je makro pre nahrávanie hovorov do nášho priečinka. 
;; Môžete použiť aj systémovú nahrávku, ale zatiaľ to zatiaľ nechajme - 
;; funguje to
[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()


;; Toto je hlavný kontext pre začiatok hovoru
[ext-did-custom]

;; Toto je trochu nekalé, robiť to takto a tu, ale funguje - pridávame k číslu '8'
exten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Tu sú rôzne premenné pre skript
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)})

;; Najdôležitejšie! Správca skončenia hovoru. 
;; Obvyklé cesty spracovania konca cez (exten=>h,1,čtototut) v FreePBX nefungujú - Macro(hangupcall,) všetko kazí. 
;; Preto nasadzujeme Hangup_Handler na koniec hovoru
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Správca konca prichádzajúceho hovoru
[sub-call-from-cid-ended]

;; Oznamujeme hodnoty pri konci hovoru
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)})

;; Stav hovoru - Odpoveď, nech už...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Správca odchádzajúcich hovorov - všetko analogické
[outbound-allroutes-custom]

;; Nahrávanie
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Premenné
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Nasadzujeme Hangup_Handler na koniec hovoru
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Správca konca odchádzajúceho hovoru
[sub-call-internal-ended]

;; premenné
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)})

;; Zavolanie skriptu, ktorý informuje o hovore v CRM - to je odchádzajúci, 
;; takže pri skončení
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

Hlavnou črtou a rozdielom oproti originálnemu dialplánu autorov pôvodného článku je

  • Dialplán vo formáte .conf, pretože to požaduje FreePBX (áno, podporuje .ael, ale nie všetky verzie a nie vždy je to pohodlné)

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

  • Upravený riadok pre volanie skriptu, pridané úvodzovky a externé číslo volania ExtNum

  • Spracovania sú umiestnené do _custom kontextov a umožňujú nedotýkať sa a nemeniť konfigurácie FreePBX — prichádzajúce cez [ext-did-custom], odchádzajúce cez [outbound-allroutes-custom]

  • Nie je viazanie na čísla — súbor je univerzálny a vyžaduje nastavenie iba cesty a odkazu na server

Na začiatok je potrebné ešte pustiť skripty v AMI podľa prihlasovania a hesla — na to v FreePBX je tiež _custom súbor

Súbor manager_custom.conf

;;  toto je prihlasovacie meno
[callmeplus]
;; toto je heslo
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; pracujem s lokálnym strojom - ale ak je potrebné, môžem pridať aj iné
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 je potrebné umiestniť do /etc/asterisk, potom prečítať konfigurácie (alebo reštartovať Asteriska)

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

Teraz prejdeme 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á, mali by sme sa na ňu zamerať osobitne. Asterisk pri aktivácii AMI jednoducho otvorí port a to je všetko. Pri pripojení klienta si vyžaduje autorizáciu, potom sa klient prihlási na požadované udalosti. Udalosti prichádzajú ako jednoduchý text, ktorý PAMI prevádza na štruktúrované objekty a poskytuje možnosť nastaviť funkciu filtrovania iba podľa zaujímavých udalostí, polí, čísiel atď.

Akonáhle hovor prijde, vzniká udalosť NewExten začínajúca s rodičovským kontextom [from-pstn], potom nasledujú všetky udalosti v poradí podľa riadkov v kontextoch. Pri získavaní informácií zo zadaných v dialpláne _custom premenných CallMeCallerIDName a CallStart sa volá

  1. Funkcia požiadavky na UserID, ktorý zodpovedá internému číslu, na ktoré prišla výzva. A čo ak je to skupina volaní? Politická otázka, treba vytvoriť hovor pre všetkých naraz (keď volajú všetci naraz) alebo vytvárať po jednotlivých volaniach pri postupnom volaní? Väčšina klientov má nastavenú stratégiu First Available, takže s tým nie sú problémy, volá iba jeden. Ale otázku je potrebné vyriešiť.

  2. Funkcia registrácie hovoru v Bitrix24, ktorá vracia CallID, potrebný neskôr na reportovanie parametrov hovoru a odkazu na záznam. Vyžaduje buď interné číslo, alebo UserID.

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Po skončení hovoru sa zavolá funkcia na načítanie záznamu, ktorá zároveň oznamuje stav ukončenia hovoru (Zaneprázdnený, Nezodpovedané, Úspech) a tiež načítava odkaz na mp3 súbor so záznamom (ak existuje).

Keďže modul CallMeIn.php musí pracovať nepretržite, pre neho bol vytvorený štartovací súbor SystemD. callme.service, ktorý treba umiestniť 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

#tu je potrebné skontrolovať práva na priečinky
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

Inicializácia a spustenie skriptu sa deje prostredníctvom systemctl alebo služby.

# systemctl enable callme
# systemctl start callme

Služba sa sama reštartuje podľa potreby (pri pádoch). Služba dohľadu nad prichádzajúcimi nevyžaduje inštaláciu webového servera, potrebný je len php (ktorý na serveri FeePBX určite existuje). Ale pri nedostatku prístupu k záznamom hovorov cez webový server (ešte aj s https) nebude možné počúvať záznamy hovorov.

Teraz sa poďme rozprávať o odchádzajúcich hovoroch. Skript CallMeOut.php má dve funkcie:

  • Iniciácia hovoru pri prijatí požiadavky na php skript (vrátane tlačidla „Zavolať“ priamo v Bitrixe). Bez webového servera nefunguje, požiadavka prichádza prostredníctvom HTTP POST, v požiadavke je zahrnutý token.

  • Oznámenie o hovore, jeho parametroch a záznamoch v Bitrixe. Nastáva na podnet Asterisku v dialpláne [sub-call-internal-ended] po skončení hovoru.

Zabávame sa s FreePBX a integrujeme ho s Bitrix24 a nie len s ním.

Webový server je potrebný len na dve veci — nahrávanie súborov so záznamami Bitrixom (cez HTTPS) a vyvolávanie skriptu CallMeOut.php. Môžete použiť vstavaný server FreePBX, súbory pre ktorý sú uložené v /var/www/html, alebo nainštalovať iný server alebo zadať inú cestu.

Webový server

Nastavenie webového servera necháme na samostatné štúdium (kliknite tu, kliknite tu, kliknite tu). Ak ešte nemáte doménu, môžete vyskúšať FreeDomain ( https://www.freenom.com/ru/index.html), ktorá vám zadarmo poskytne názov pre vašu bielu IP (nezabudnite preposlať porty 80, 443 cez router, ak je externá adresa iba na ňom). Ak ste práve vytvorili DNS doménu, bude potrebné počkať (od 15 minút do 48 hodín), kým sa všetky servery načítajú. Z našich skúseností s domácimi poskytovateľmi — od 1 hodiny do 24 hodín.

Automatizácia inštalácie

Na GitHube sa začala vývoj inštalátora, aby sa dalo inštalovať ešte jednoduchšie. Ale hladko to bolo na papieri — zatiaľ všetko inštalujeme ručne, našťastie po hrabaní sa v tom všetkom je jasné, kto sa s kým kam dostáva a ako to odlaďovať. Zatiaľ inštalátor neexistuje (

Docker

Ak chcete rýchlo vyskúšať riešenie — existuje možnosť s Dockerom — rýchlo vytvoriť kontajner, otvoriť mu porty, zadať mu konfiguračné súbory a vyskúšať (to je varianta s kontajnerom LetsEncrypt, ak už certifikát máte, stačí presmerovať reverz Proxy na webový server FreePBX (tomu sme dali iný port — 88), LetsEncrypt v Dockeri na základe tohto článku

Súbor je potrebné spustiť v stiahnutej zložke projektu (po git clone), ale predtým treba upraviť konfigurácie Asteriska (zložka asterisk) a zadať 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 # pre nastavenie
      - 5060:5060\/udp
      - 5160:5160\/udp
      - 127.0.0.1:5038:5038 # pre 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 nespustil, znamená to, že niečo nie je v poriadku s konfiguráciou v zložke nginx\/ssl_docker.conf.

Iné integrácie

A prečo si nezakúpiť niekoľko CRM do skriptov, pomysleli sme si. Preskúmali sme niekoľko API iných CRM, najmä bezplatnej, ktorá je zabudovaná v niektorých Asterisk — ShugarCRM a Vtiger, a áno! dá sa to, princíp je ten istý. Ale to je už iný príbeh, ktorý nahráme na GitHub samostatne.

Odkazy

Disklejmer: akékoľvek zhody s realitou sú fiktívne a nebol to ja,

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster