Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

Bitrix24 — 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. FreePBX, é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 Habr cikkhez, 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 (link) 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.

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

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

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

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.

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

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.

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkció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).

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

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 phpagi, PAGI

  • 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, PAMI — 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:phparia, phpari) 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 (cikk a habr-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,Return

A 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,originate

Ezt 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> exit

Most á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

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

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

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

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

A szkript inicializálása és indítása systemctl vagy service segítségével történik.

# systemctl enable callme
# systemctl start callme

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

Bővítsük a FreePBX-t és integráljuk a Bitrix24-t, valamint még sok más funkciót.

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 (kattintson, kattintson, kattintson). Ha nincs domained, kipróbálhatod a FreeDomain-t ( https://www.freenom.com/ru/index.html), 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 ezen cikket

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

Megjegyzés: bármilyen hasonlóság a valósággal fiktív, és ez nem én voltam,

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster