— ez egy hatalmas platform, amely ötvözi a CRM-et, a dokumentumkezelést, a könyvelést és sok más dolgot, amit a vezetők nagyon kedvelnek, de az IT személyzet nem annyira. A portált sok kis- és középvállalat használja, beleértve a kisebb klinikákat, gyártókat és még szépségszalonokat is. A legfontosabb funkció, amelyet a vezetők 'szeretnek', a telefonintegráció és a CRM, amikor minden hívás azonnal rögzítve lesz a CRM-ben, ügyfélkártyák készülnek, és bejövő híváskor megjelenik az ügyfél információja, és azonnal látható, hogy ki ő, mit lehet neki eladni és mennyivel tartozik. Azonban a Bitrix24 telefonrendszere és annak integrálása a CRM-be költségekkel jár, néha nem is kicsikkel. A cikkben bemutatom az integráció tapasztalataimat nyílt forráskódú eszközökkel és népszerű IP PBX-szel. , és megvizsgálom a különböző részek működési logikáját.
Egy olyan cégnél dolgozom, amely IP telefonálás értékesítésével, beállításával és integrációjával foglalkozik. Amikor megkérdezték tőlem, hogy javasolhatunk-e valamit a Bitrix24 és a kliensek által használt PBX integrálására, valamint a különböző VDS-előfizetők virtuális PBX-eivel, elmentem a Google-hoz. Ő természetesen egy linket adott nekem a , ahol leírás, github és szinte minden működik. De amikor próbáltam használni ezt a megoldást, kiderült, hogy a Bitrix24 már nem az, ami korábban volt, és sok mindent át kell alakítani. Ezen kívül, a FreePBX nem csupán egy egyszerű Asterisk, itt gondolkodni kell arról, hogyan lehet ötvözni a felhasználási kényelmet és a hardcore dialplan-t a konfigurációs fájlokban.
Tanulmányozzuk a működési logikát.
Tehát elöljáróban nézzük meg, hogyan kellene ennek működnie. Amikor a PBX-re bejövő hívás érkezik (SIP INVITE esemény a szolgáltatótól), megkezdődik a dialplan (hívási terv) feldolgozása — annak a szabályai, hogy mit és milyen sorrendben kell tenni a hívással. Az első csomagból sok információ nyerhető, amely később a szabályokban felhasználható. Az SIP belső működésének tanulmányozásához remek eszköz az sngrep () amely egyszerűen telepíthető a népszerű disztribúciókban az apt install/yum install és hasonlók segítségével, de forráskódból is összegyűjthető. Nézzük meg a hívás naplóját az sngrep-ben.

A leegyszerűsített dialplan csak az első csomaggal foglalkozik, néha a beszélgetés alatt hívások átirányítása, gombnyomás (DTMF), különféle érdekességek, mint a FollowMe, RingGroup, IVR és egyéb funkciók is megvalósulnak.
Mi található az Invite csomagban

Valójában a legtöbb egyszerű dialplan az első két mezővel dolgozik, és minden logika a DID és a CallerID körül forog. A DID - hová hívunk, a CallerID - ki hív.
De hiszen nekünk cégünk van, nem egy telefon — tehát valószínű, hogy az IP-telefonközpontban csoportok vannak (egyidejű/sorozatos hívás több eszközhöz) városi számokon (Ring Group), IVR (Helló, ön a ... számot hívta… Nyomjon egyet a ...), automatikus válaszok (Phrases), időszakos feltételek (Time Conditions), átirányítás más számokra vagy mobilra (FollowMe, Forward). Ez azt jelenti, hogy nagyon nehéz egyértelműen meghatározni, hogy a hívás valójában kinek érkezik, és kivel fog beszélni a hívás beérkezésekor. Íme egy példa, hogyan zajlik egy tipikus hívás az ügyfeleinknél az IP-telefonközpontban.

A hívás sikeres belépése után az IP-telefonközpontban a dialplan különböző "környezetekben" utazik. Az Asterisk szempontjából a környezet egy számozott parancskészlet, amely minden egyes parancsra egy szűrőt tartalmaz a hívott számra (ezt exten-nek hívják, a külső hívások kezdetén pedig exten=DID). A dialplan sorában lévő parancsok bármi lehetnek — belső funkciók (például hívás egy belső előfizetőnek — Dial(), a hívás megszakítása — Hangup()), feltételes operátorok (IF, ELSE, ExecIF és hasonlók), áttételek más szabályokhoz ebben a környezetben (Goto, GotoIF), összekapcsolás más környezetekbe funkciók hívásával (Gosub, Macro). Külön érdemes megemlíteni a direktívát include név_környezet, , amely más környezet parancsait adja hozzá a jelenlegi környezet végéhez. Az include paranccsal beillesztett parancsokat mindig a jelenlegi környezet parancsai után végrehajtják.
A FreePBX munkafolyamatának logikája más-más környezetek összekapcsolásán alapul, beleértve az include-ot és a Gosub, Macro, valamint Handler kezelőket. Tekintsük meg a FreePBX bejövő hívásainak környezetét.

A hívás minden környezetet felülről lefelé, sorrendben átjár, minden környezetben más környezetek hívásai lehetnek, mint makrók (Macro), funkciók (Gosub) vagy egyszerű áttételek (Goto), ezért a tényleges fa struktúra azt, hogy mi kerül hívásra, csak a naplókban követhető nyomon.
A tipikus irodai PBX beállításának sémája lent látható. A bejövő hívások során a DID-t keresi a rendszer, ellenőrzi az időbeli feltételeket, és ha minden rendben van, elindítja a hangmenüt. Ebből a 1-es gomb megnyomásával vagy időtúllépéssel a hívási csoporthoz jutunk el. A hívás befejezése után a hangupcall makró hívása következik, amely után semmilyen más művelet nem végezhető el a hívásmenedzsmentben, kivéve a különleges kezelőket (hangup handler).

Hol kell ebben a hívási algoritmusban információt szolgáltatnunk a hívás kezdetéről a CRM-be, hol kell elindítani a felvételt, hol kell befejezni a felvételt és azt a hívás információjával együtt a CRM-be küldeni?
Integráció külső rendszerekkel
Mi az a PBX és CRM integráció? Ezek olyan beállítások és programok, amelyek konvertálják az adatokat és eseményeket e két platform között, és továbbítják azokat egymásnak. A független rendszerek közötti interakció legelterjedtebb módja az API, a legnépszerűbb API-hozzáférési mód pedig a HTTP REST. De ez nem vonatkozik az Asterisk-re.
Az Asterisk rendszerén belül:
AGI — szinkron hívás külső programok/komponensekhez, főként a hívásmenedzsmentben használják, mindkét oldalra léteznek olyan könyvtárak, mint a ,
AMI — egy szöveges TCP socket, amely események előfizetésén és szöveges parancsok beírásán alapul, a belseje hasonlít az SMTP-hez, képes események nyomon követésére és a hívások kezelésére, ehhez van egy könyvtár, — a legnépszerűbb az Asterisk-szel való kapcsolattartáshoz.
AMI kimenetének példája
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 — a kettő keveréke, minden REST-en, WebSocket-en, JSON formátumban — de itt az új könyvtárakkal és burkolatokkal nem túl jó, első pillantásra ezek találhatók:, ) amelyek három évvel ezelőtt fejlődésük során megálltak.
Példa ARI kimenetre hívás kezdeményezésekor
{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id":"1599644315.5334", "name":"PJSIP/VMS_pjsip-000007b6", "state":"Ring", "caller":{ "name":"111222", "number":"111222" }, "connected":{ "name":"", "number":"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "app_name":"Stasis", "app_data":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"ru" }, "asterisk_id":"48:5b:aa:aa:aa:aa", "application":"hello-world" }pjsip-000007b6″, «állapot»:»Csengés», «hívó»:{ «név»:»111222″, «szám»:»111222″ }, «kapcsolódott»:{ «név»:»», «szám»:»» }, «felhasználókód»:»», «hívási terv»:{ «környezet»:»from-pstn», «hossz»:»s», «prioritás»:2, «alkalmazás«név»:»Stasis», «alkalmazásadat»:»hello-world» }, «létrehozási idő»:»2020-09-09T09:38:35.926+0000″, «nyelv»:»hu» }, «asteriskid»:»48:5b:aa:aa:aa:aa», «alkalmazás»:»hello-world» }
A kényelem vagy kényelmetlenség, a különböző API-kal való munka lehetősége vagy lehetetlensége az általunk megoldandó feladatoktól függ. A CRM-integrációhoz tartozó feladatok a következők:
Követni a hívás kezdetét, hogy hová irányították, kinyerni a CallerID-t, a DID-et, a kezdési és befejezési időpontokat, esetleg az adatokat a könyvtárból (a telefon és a CRM felhasználó közötti kapcsolat kereséséhez)
A hívás rögzítésének megkezdése és befejezése, a szükséges formátumban való mentés, a felvétel végén értesítés arról, hogy hol található a fájl
Külső esemény alapján hívás kezdeményezése (programból), belső számra, külső számra hívás, és ezeket összekapcsolni
Opcionális: integrálni a CRM-mel, hívási csoportokkal és FollowME-vel a hívások automatikus átirányításához, ha nem tartózkodunk jelen (a CRM információi alapján)
Mindezek a feladatok megoldhatók az AMI vagy ARI segítségével, de az ARI sokkal kevesebb információt ad, hiányoznak sok esemény, sok változót nem követnek nyomon, amelyek az AMI-ban mégis megtalálhatók (például makrók hívása, változók megadása a makrókban, beleértve a hívások rögzítését). Ezért a pontos nyomon követés érdekében válasszuk egyelőre az AMI-t (de nem véglegesen). Ezen kívül (hát hova máshová meneküljünk, mi lusták vagyunk) — az alapmunkában () a PAMI-t használják. *Aztán meg kell próbálni átírni ARI-ra, de nem biztos, hogy sikerül.
Újra kitaláljuk az integrációt
Ahhoz, hogy a FreePBX egyszerű módon tudjon értesítést küldeni az AMI-nak a hívás kezdetéről, a befejezés idejéről, a számokról, a mentett fájlok neveiről és a hívás időtartamának számításáról, a legjobb egyszerű trükköt alkalmazni, mint az eredeti szerzők — a saját változóinkat kell megadni, és elemezni a kimenetet a jelenlétükre. A PAMI ezt egyszerűen kínálja a szűrőfüggvényen keresztül.
Itt van egy példa, hogyan állítsuk be a saját változónkat a hívás kezdeti idejére (s — ez egy speciális szám a híváskezelőben, amely a DID keresése előtt fut le)
[ext-did-custom]
exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})Példa AMI esemény erre a sorra
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
Application: Set AppData:
CallStart=1599571046
Mivel a FreePBX felülírja az extention.conf és extention_additional.conf fájlokat, a extention_custom.conf fájlt fogjuk használni
Teljes kód extention_custom.conf
[globals]
;; Ellenőrizze az útvonalakat és a mappák jogosultságait - az asterisk felhasználónak írási jogosultsággal kell rendelkeznie
;; Itt fogják rögzíteni a beszélgetéseket
WAV=\/var\/www\/html\/callme\/records\/wav
MP3=\/var\/www\/html\/callme\/records\/mp3
;; Ezeket az útvonalakat fogja a felvétel lejátszásához és letöltéséhez használni
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3
;; Visszahívás címe kimenő hívás esetén
URLPHP=https:\/\/www.host.ru\/callmeplus
;; Igen, rögzítjük a beszélgetéseket
RECORDING=1
;; Ez a makró a beszélgetések rögzítésére a mappánkba.
;; Használhatjuk a rendszeres rögzítést is, de egyelőre maradjunk ennél -
;; ez működik
[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()
;; Ez a fő kontextus a beszélgetés kezdetéhez
[ext-did-custom]
;; Ez nem szokványos, hogy így és itt csináljuk, de működik - '8'-at adunk a számhoz
nexten => s,1,Set(CALLERID(num)=8${CALLERID(num)})
;; Itt van néhány változó a szkripthez
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)})
;; A legfontosabb! A beszélgetés befejezésének kezelője.
;; A FreePBX-hez tartozó hagyományos végeztetési utak (exten=>h,1,...) nem működnek - Macro(hangupcall,) mindent elront.
;; Ezért a hívás végére a Hangup_Handler-t kötjük
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))
;; Bemenő hívás befejezésének kezelője
[sub-call-from-cid-ended]
;; Tájékoztatjuk az értékekről a hívás végén
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)})
;; Hívás állapota - Válaszolt, nem válaszolt...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return
;; Kimenő hívások kezelője - minden analóg
[outbound-allroutes-custom]
;; Felvétel
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Változók
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})
;; A hívás végére a Hangup_Handler-t kötjük
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))
;; Kimenő hívás befejezésének kezelője
[sub-call-internal-ended]
;; változók
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)})
;; A szkript hívása, ami értesíti a CRM-ről a hívásról - ez kimenő,
;; tehát a befejezés után
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,ReturnA saját cikk szerzőinek eredeti dialplanjától való eltérés és jellemzője —
Dialplan .conf formátumban, ahogyan azt a FreePBX szeretné (igen, tud .ael-t, de nem minden verzióban és nem mindig kényelmes)
A hívás végét az exten=>h helyett hangup_handler-en keresztül dolgoztuk fel, mert a FreePBX dialplan csak ezzel működött
Javítva lett a szkript hívási sora, idézőjelek és a külső hívószám ExtNum hozzáadva
A feldolgozások _custom kontextusokba lettek kiemelve, így nem szükséges a FreePBX konfigurációkat módosítani — bejövő [ext-did-custom], kimenő [outbound-allroutes-custom]
] hívásokhoz nincs számra való kötés — a fájl univerzális és csak az útvonal beállítására és a szerverlinkre van szükség
A működéshez először engedélyezni kell a szkriptek elérhetőségét az AMI-n keresztül felhasználónévvel és jelszóval — ehhez a FreePBX-nek is van _custom fájlja
manager_custom.conf fájl
;; ez a felhasználónév
[callmeplus]
;; ez a jelszó
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0
;; én helyi géppel dolgozom - de ha kell, másokat is meg lehet adni
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,originateEzt a két fájlt a /etc/asterisk könyvtárba kell helyezni, majd újra kell olvasni a konfigurációkat (vagy újra kell indítani az Asterisket)
# astrisk -rv
Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
Dialplan reloaded.
#freepbx*CLI> exitMost áttérünk a PHP-ra
A szkriptek inicializálása és a szolgáltatás létrehozása
Mivel a Bitrix 24-zel való együttműködés az AMI-hoz nem teljesen egyszerű és átlátható, külön meg kell állni ezen. Az Asterisk az AMI aktiválásakor egyszerűen megnyit egy portot, és ennyi. Amikor egy kliens csatlakozik, kérnék az azonosítást, majd a kliens feliratkozik a kívánt eseményekre. Az események egyszerű szövegként érkeznek, amelyet a PAMI strukturált objektumokká alakít át, és lehetőséget ad a csak a saját érdeklődési körünkbe tartozó események, mezők, számok stb. szűrésére.
Amint a hívás érkezik, a NewExten esemény történik a szülő kontextus [from-pstn] kezdésével, majd a kontextusokban a sorok sorrendjének megfelelően következnek az események. Amikor információt kapunk a dialplanban megadott _custom változókból, mint CallMeCallerIDName és CallStart, meghívódik
A UserID lekérdezési funkció, amely megfelel a belső számnak, ahová a hívás érkezett. Mi a helyzet, ha ez egy hívási csoport? Politikai kérdés, azonnal mindenkit hívni kell (amikor mindenki egy időben hív), vagy fokozatosan hívni a körzés során? A legtöbb ügyfélnek a First Available stratégia van beállítva, ezért ezzel nincs probléma, csak egy hív. De a kérdést meg kell oldani.
A Bitrix24 hívásregisztráló funkció, amely visszaadja a CallID-t, amely szükséges a hívás paramétereiről és a felvétel linkjéről való értesítéshez. Vagy belső számot, vagy UserID-t igényel.

A hívás befejezése után hívódik meg a felvétel betöltő funkció, amely egyszerre közli a hívás befejezésének állapotát (Hívás alatt, Nincs válasz, Siker), és betölti a linket az mp3 fájlhoz a felvétellel (ha van).
Mivel a CallMeIn.php modulnak folyamatosan működnie kell, létrehoztak számára egy SystemD indítófájlt. callme.service, amit az /etc/systemd/system/callme.service mappába kell helyezni.
[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
#itt meg kell nézni, hogy milyen jogok vannak a mappákra
#User=www-data #Ubuntu - debian
#User=nginx #Centos
[Install]
WantedBy=multi-user.targetA szkript inicializálása és indítása systemctl vagy service segítségével történik.
# systemctl enable callme
# systemctl start callmeA szolgáltatás szükség esetén automatikusan újraindul (ha leáll). A bejövő hívások figyeléséhez nem szükséges webkiszolgáló, csak PHP szükséges (amely biztosan érhető el a FeePBX szerveren). De ha nincs hozzáférés a hívásfelvételekhez a webkiszolgálón keresztül (ráadásul HTTPS-el), nem lesz lehetőség a beszélgetések felvételeinek meghallgatására.
Most beszéljünk a kimenő hívásokról. A CallMeOut.php szkriptnek két funkciója van:
A hívás kezdeményezése, amikor a PHP szkriptre érkező kérés (ideértve a "Hívás" gomb megnyomását is a Bitrixben) történik. Webkiszolgáló nélkül nem működik, a kérés HTTP POST-on érkezik, a kérésben a token található.
Hívási értesítés, a hívás paramétereiről és a felvételekről a Bitrixbe. Az Asterisk kezdeményezi a dialplan [sub-call-internal-ended] során a hívás befejezésekor.

A webkiszolgáló csak két dologra szükséges — a Bitrix által a felvételi fájlok HTTPS-en való feltöltésére és a CallMeOut.php szkript hívására. Használhatjuk a FreePBX beépített szerverét, amely fájljai a /var/www/html alatt találhatók, telepíthetünk másik szervert, vagy másik útvonalat adhatunk meg.
Webkiszolgáló
Hagyjuk a webkiszolgáló beállítását önálló tanulmányozásra (, , ). Ha nincs domained, kipróbálhatod a FreeDomain-t ( ), amely ingyen ad neked nevet a fehér IP-dhez (ne felejtsd el megnyitni a 80-as és 443-as portokat az útválasztón, ha a külső cím csak rajta van). Ha most hoztad létre a DNS domaint, várnod kell (15 perctől 48 óráig), amíg minden szerver betöltődik. A hazai szolgáltatókkal szerzett tapasztalat alapján — 1 órától 1 napig terjed.
Telepítés automatizálása
A githubon elkezdődött egy telepítő fejlesztése, hogy még egyszerűbben lehessen telepíteni. De a papíron simán ment — most kézzel telepítjük mindezt, hála az égnek, hogy miután mindenbe beleáskódunk, kristálytisztán kiderül, hogy kivel barátkozik, hova megy és hogyan lehet hibát keresni. Jelenleg nincs telepítő (
Docker
Ha gyorsan szeretnéd kipróbálni a megoldást — van egy lehetőség Dockerrel — gyorsan létrehozhatsz egy konténert, megadhatod neki a portokat, beillesztheted a beállítási fájlokat és kipróbálhatod (ez a lehetőség a LetsEncrypt konténerrel, ha már van tanúsítvány, csak az visszafelé kell irányítani a proxy-t a FreePBX webkiszolgáló felé (ennek adtunk más portot — 88), LetsEncrypt a dockerben a következő cikk alapján
A fájlt a letöltött projekt mappában kell futtatni (a git clone után), de először belépni az Asterisk konfigurációkba (asterisk mappa), és ott megadni az utakat az ügyfélrögzítésekhez és a weboldalad URL-jéhez
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 # beállításhoz
- 5060:5060\/udp
- 5160:5160\/udp
- 127.0.0.1:5038:5038 # a CallMeOut.php-hez
# - 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:
Ez a docker-compose.yaml fájl a következő paranccsal futtatható
docker-compose up -d
Ha az nginx nem indult el, akkor valami nem stimmel az nginx\/ssl_docker.conf mappában található konfigurációval
Egyéb integrációk
És miért ne tennénk bele néhány CRM-et a szkriptekbe, gondoltuk. Megvizsgáltunk néhány más CRM API-t, különösen az ingyenes, néhány PBX-be beépített ShugarCRM-et és Vtiger-t, és igen! lehetséges, a elv ugyanaz. De ez már egy másik történet, amit később külön töltünk fel a githubra.
Hivatkozások
A kód a GitHub-on van -
Az alap cikk inspirációnak
Megjegyzés: bármilyen hasonlóság a valósággal fiktív, és ez nem én voltam,
Forrás: habr.com
