— 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ТС , 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 , 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 () 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.

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

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.

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.

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).

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 ,
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 — 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 (, ) 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 () 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,ReturnHlavnou č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,originateOba 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> exitTeraz 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á
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ť.
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.

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.targetInicializácia a spustenie skriptu sa deje prostredníctvom systemctl alebo služby.
# systemctl enable callme
# systemctl start callmeSluž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.

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 (, , ). Ak ešte nemáte doménu, môžete vyskúšať FreeDomain ( ), 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
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
Samotný kód na GitHube —
Pôvodný článok ako úvod
Disklejmer: akékoľvek zhody s realitou sú fiktívne a nebol to ja,
Zdroj: habr.com
