A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

Bitrix24 egy hatalmas kombájn, amely egyesíti a CRM-et, a munkafolyamatot, a könyvelést és sok más olyan dolgot, amit a vezetők nagyon szeretnek, és az informatikusok nem igazán szeretnek. A portált nagyon sok kis- és középvállalat használja, köztük kis klinikák, gyártók, sőt szépségszalonok is. A menedzserek által „szeretett” fő funkció a telefonálás és a CRM integrációja, amikor minden hívás azonnal rögzítésre kerül a CRM-ben, ügyfélkártyák jönnek létre, bejövő információk megjelennek az ügyfélről, és azonnal láthatja, hogy ki ő, mi el tudja adni, és mennyivel tartozik. De a Bitrix24 telefonálása és a CRM-mel való integrációja pénzbe kerül, néha sokba. A cikkben elmondom a nyílt eszközökkel és a népszerű IP PBX-szel való integráció tapasztalatait Ingyenes PBX, és vegye figyelembe a különböző részek működésének logikáját is

Outsourcerként dolgozom egy IP telefonálást értékesítő, konfiguráló, integráló cégnél. Amikor megkérdezték tőlem, hogy tudnánk-e ajánlani valamit ennek és ennek a cégnek, hogy a Bitrix24-et integrálhassuk az ügyfelek által használt alközpontokkal, valamint a különböző VDS-cégek virtuális alközpontjaival, a Google-hoz fordultam. És persze adott egy linket cikk a habr, ahol van leírás, meg github, és úgy tűnik, minden működik. De amikor megpróbáltuk használni ezt a megoldást, kiderült, hogy a Bitrix24 már nem ugyanaz, mint korábban, és sok mindent újra kell alakítani. Ráadásul a FreePBX nem csupasz csillag az Ön számára, itt el kell gondolkodnia azon, hogyan kombinálhatja a könnyű kezelhetőséget és a hardcore telefonos tervet a konfigurációs fájlokban.

Tanulmányozzuk a munka logikáját

Kezdetnek tehát, hogyan kell mindennek működnie. Ha az alközponton kívülről érkezik hívás (SIP INVITE esemény a szolgáltatótól), akkor megkezdődik a tárcsázási terv (tárcsázási terv, tárcsázási terv) feldolgozása - a hívással mit és milyen sorrendben történő teendők szabályai. Az első csomagból rengeteg információhoz juthat, amit aztán felhasználhat a szabályokban. A SIP belső tulajdonságainak tanulmányozására kiváló eszköz az analizátor sngrep (link), amely egyszerűen telepíthető a népszerű disztribúciókban apt install/yum install és hasonlók segítségével, de forrásból is felépíthető. Nézzük meg az sngrep hívásnaplóját

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

A tárcsázási terv leegyszerűsítve csak az első csomaggal foglalkozik, néha beszélgetés közben is, hívások átvitele, gombnyomások (DTMF), különféle érdekességek, mint a FollowMe, a RingGroup, az IVR és egyebek.

A meghívócsomag tartalma

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

Valójában a legtöbb egyszerű tárcsázási terv az első két mezővel működik, és az egész logika a DID és a hívóazonosító körül forog. DID - ahova hívunk, CallerID - ki hív.

De végül is van egy cégünk és nem egy telefonunk - ami azt jelenti, hogy az alközpontban nagy valószínűséggel vannak híváscsoportok (több eszköz egyidejű / egymást követő csengetése) a városi számokon (Ring Group), IVR (Hello, Ön hívott ... Nyomja meg egy ...), Üzenetrögzítők (Kifejezések), Időfeltételek, Továbbítás más számokra vagy cellára (FollowMe, Forward). Ez azt jelenti, hogy nagyon nehéz egyértelműen meghatározni, hogy valójában ki fog hívást fogadni, és kivel fog beszélgetni, amikor egy hívás érkezik. Íme egy példa egy tipikus hívás kezdetére ügyfeleink alközpontjában

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

Miután a hívás sikeresen bekerült az alközpontba, különböző "kontextusokban" halad át a tárcsázási terven. A kontextus az Asterisk szempontjából parancsok számozott halmaza, amelyek mindegyike tartalmaz egy szűrőt a tárcsázott szám alapján (ezt exten-nek hívják, külső hívás esetén exten=DID). A tárcsázási sorban lévő parancsok bármiek lehetnek - belső funkciók (például belső előfizető hívása - Dial(), tedd le a telefont - Hangup()), feltételes operátorok (IF, ELSE, ExecIF és hasonlók), áttér ennek a kontextusnak a többi szabályára (Goto, GotoIF), áttérés más kontextusba függvényhívás formájában (Gosub, Macro). Külön irányelv include имя_контекста, amely egy másik kontextusból származó parancsokat ad hozzá az aktuális kontextus végéhez. Az include-on keresztül szereplő parancsok mindig végrehajtásra kerülnek után az aktuális környezet parancsai.

A FreePBX teljes logikája arra épül, hogy a Gosub, Macro és Handler kezelőkön keresztül beépítsék és hívják a különböző kontextusokat. Vegye figyelembe a bejövő FreePBX-hívások kontextusát

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

A hívás felváltva végigmegy az összes kontextuson felülről lefelé, minden kontextusban lehetnek hívások más kontextusokhoz, például makrókhoz (Macro), függvényekhez (Gosub) vagy csak átmenetekhez (Goto), így a hívott valódi fa csak nyomon követhető a naplókban.

Az alábbiakban egy tipikus alközpont tipikus beállítási diagramja látható. Híváskor megkeresi a DID-t a bejövő útvonalakon, ellenőrzi az ideiglenes feltételeket, ha minden rendben van, elindul a hangmenü. Ebből az 1-es gomb megnyomásával vagy időtúllépéssel lépjen ki a tárcsázó operátorok csoportjába. A hívás befejezése után a hangupcall makró meghívásra kerül, ami után a tárcsázási tervben nem lehet semmit tenni, kivéve a speciális kezelőket (hangup handler).

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

Ebben a hívási algoritmusban hol kell megadnunk a CRM-be irányuló hívás kezdetére vonatkozó információkat, hol kezdjük a rögzítést, hol fejezzük be a felvételt és küldjük el a hívás információival együtt a CRM-nek?

Integráció külső rendszerekkel

Mi az a PBX és CRM integráció? Ezek olyan beállítások és programok, amelyek adatokat és eseményeket konvertálnak a két platform között, és elküldik őket egymásnak. A független rendszerek kommunikációjának legáltalánosabb módja az API-kon keresztül, az API-k elérésének legnépszerűbb módja a HTTP REST. De nem a csillag miatt.

Az Asterisk belsejében:

  • AGI - külső programok/komponensek szinkron hívása, főként a tárcsázási tervben használatos, vannak olyan könyvtárak, mint pl. phpagi, PAGI

  • AMI - szöveges TCP socket, amely az eseményekre való feliratkozás és szöveges parancsok bevitelének elvén működik, belülről hasonlít az SMTP-re, nyomon követheti az eseményeket és kezelheti a hívásokat, van könyvtár PAMI - a legnépszerűbb az Asteriskkel való kapcsolat létrehozásához

AMI kimeneti példa

Esemény: Új csatorna
Kiváltság: hívj, mindenkit
Csatorna: PJSIP/VMS_pjsip-0000078b
Csatorna állapota: 4
ChannelStateDesc: Csengetés
Hívóazonosító: 111222
Hívóazonosító: 111222
ConnectedLineNum:
csatlakoztatott vonalnév:
Nyelv: en
fiók kód:
Kontextus: from-pstn
Terjedelem: s
Prioritás: 1
Egyedi azonosító: 1599589046.5244
Linked: 1599589046.5244

  • Az ARI mindkettő keveréke, mind REST-en, WebSocket-en keresztül, JSON formátumban - de friss könyvtárakkal és burkolóanyagokkal, nem túl jó, kézből találva (phparia, phpari), amely körülbelül 3 éve alakult ki.

Példa ARI kimenetre hívás kezdeményezésekor

{ "változó":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "csatorna":{ "id »:»1599644315.5334", «név»:»PJSIP/VMSpjsip-000007b6″, "state":"Csengetés", "hívó":{ "név":"111222", "szám":"111222" }, "csatlakozott":{ "név":", "szám" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appnév":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"hu" }, "csillagid":"48:5b:aa:aa:aa:aa", "alkalmazás":"hello-world" }

A kényelmet vagy kényelmetlenséget, az adott API-val való munkavégzés lehetőségét vagy lehetetlenségét a megoldandó feladatok határozzák meg. A CRM-mel való integráció feladatai a következők:

  • Kövesse nyomon a hívás kezdetét, hova került át, húzza ki a CallerID, DID, kezdési és befejezési időpontokat, esetleg adatokat a telefonkönyvből (a telefon és a CRM-felhasználó közötti kapcsolat kereséséhez)

  • Indítsa el és fejezze be a hívás rögzítését, mentse el a kívánt formátumban, a felvétel végén tájékoztassa a fájl helyét

  • Külső esemény hívása (a programból), belső szám, külső szám felhívása és összekapcsolása

  • Választható: integrálható a CRM-mel, a tárcsázó csoportokkal és a FollowME-vel a hívások automatikus átviteléhez hely hiányában (CRM szerint)

Mindezek a feladatok megoldhatók AMI-n vagy ARI-n keresztül, de az ARI sokkal kevesebb információt ad, nincs sok esemény, sok olyan változó, ami az AMI-ben még megvan (például makróhívások, makrókon belüli beállítási változók, beleértve a hívásrögzítést is) nem követhető nyomon. Ezért a helyes és pontos nyomon követés érdekében egyelőre válasszuk az AMI-t (de ne teljesen). Ráadásul (na, hol lenne e nélkül, lusták vagyunk) - az eredeti műben (cikk a habr) használd a PAMI-t. *Ezután meg kell próbálnia átírni az ARI-t, de nem azt a tényt, hogy működni fog.

Az integráció újragondolása

Annak érdekében, hogy a FreePBX-ünk egyszerű módszerekkel tudjon jelenteni az AMI felé a hívás kezdetéről, befejezéséről, számokról, rögzített fájlok nevéről, a legegyszerűbb a hívás időtartamát ugyanazzal a trükkel kiszámítani, mint az eredeti szerzők. - írja be a változóit, és elemezze a kimenetet a jelenlétükre. A PAMI azt javasolja, hogy ezt egyszerűen egy szűrő funkción keresztül végezze el.

Íme egy példa a saját változó beállítására a hívás kezdési időpontjában (s egy speciális szám a tárcsázási tervben, amelyet a DID keresés indítása előtt hajtanak végre)

[ext-did-custom]

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

Példa AMI eseményre ehhez a sorhoz

Esemény: Új csatorna

Kiváltság: hívj, mindenkit

Csatorna: PJSIP/VMS_pjsip-0000078b

Csatorna állapota: 4

ChannelStateDesc: Csengetés

Hívóazonosító: 111222

Hívóazonosító: 111222

ConnectedLineNum:

csatlakoztatott vonalnév:

Nyelv: en

fiók kód:

Kontextus: from-pstn

Terjedelem: s

Prioritás: 1

Egyedi azonosító: 1599589046.5244

Linked: 1599589046.5244

Alkalmazás: AppData beállítása:

CallStart=1599571046

Mivel a FreePBX felülírja az extendion.conf és extension_ fájlokatAdditional.conf, akkor a fájlt fogjuk használni kiterjesztés_szokásfájlban

Az extension_custom.conf teljes kódja

[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

Jellemzők és eltérések az eredeti cikk szerzőinek eredeti tárcsázási tervétől -

  • Dialplan .conf formátumban, ahogy a FreePBX akarja (igen, lehet .ael, de nem minden verzió, és nem mindig kényelmes)

  • Az exten=>h-n keresztüli feldolgozás helyett a hangup_handler-en keresztül vezették be a feldolgozást, mivel a FreePBX tárcsázási terv csak vele működött

  • Javítva a szkripthívási karakterlánc, hozzáadott idézetek és külső hívási szám ExtNum

  • A feldolgozás átkerül az _egyéni kontextusba, és lehetővé teszi, hogy ne érintse meg és ne szerkessze a FreePBX konfigurációkat – bejövő a [ext-did-custom], kimenő: [kimenő-allroutes-custom]

  • Nincs számokhoz kötés – a fájl univerzális, és csak a kiszolgáló elérési útját és hivatkozását kell beállítani

A kezdéshez szkripteket is kell futtatnia az AMI-ben bejelentkezési és jelszó alapján - ehhez a FreePBX rendelkezik egy _custom fájllal is

manager_custom.conf fájl

;;  это логин
[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

Mindkét fájlt el kell helyezni az /etc/asterisk mappába, majd olvassa el újra a konfigurációkat (vagy indítsa újra a csillagot)

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

Most térjünk át a PHP-re

Szkriptek inicializálása és szolgáltatás létrehozása

Mivel a Bitrix 24, az AMI szolgáltatása nem teljesen egyszerű és átlátható, külön kell tárgyalni. Asterisk, amikor az AMI aktiválva van, egyszerűen megnyitja a portot és ennyi. Amikor egy kliens csatlakozik, engedélyt kér, majd a kliens feliratkozik a szükséges eseményekre. Az események egyszerű szövegben jelennek meg, amelyeket a PAMI strukturált objektumokká alakít át, és lehetővé teszi a szűrési funkció beállítását csak az érdeklődésre számot tartó eseményekre, mezőkre, számokra stb.

Amint a hívás beérkezik, a NewExten esemény a szülő [from-pstn] kontextusból indul ki, majd minden esemény a kontextusban lévő sorok sorrendjében megy. Amikor információ érkezik az _custom dialplan-ban megadott CallMeCallerIDName és CallStart változókból, a

  1. A hívás érkezett mellékszámának megfelelő felhasználói azonosító kérésének funkciója. Mi van, ha ez egy betárcsázós csoport? A kérdés politikai, egyszerre kell létrehozni egy hívást mindenkinek (amikor mindenki egyszerre hív), vagy úgy kell létrehozni, ahogy hívják, amikor sorra hívják? A legtöbb ügyfél rendelkezik a Fisrt Available stratégiával, így ezzel nincs probléma, csak egy hív. De a problémát kezelni kell

  2. A Bitrix24 hívásregisztrációs funkciója, amely visszaadja a CallID-t, amelyre szükség van a hívásparaméterek jelentéséhez és a rögzítésre mutató hivatkozáshoz. Mellékszám vagy felhasználói azonosító szükséges

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

A hívás befejezése után meghívódik a rekordletöltés funkció, amely egyidejűleg jelenti a hívás befejezésének állapotát (Foglalt, Nincs válasz, Sikeres), valamint letölti a rekordot tartalmazó mp3 fájl hivatkozását (ha van).

Mivel a CallMeIn.php modulnak folyamatosan futnia kell, egy SystemD indítófájl készült hozzá callme.service, amelyet az /etc/systemd/system/callme.service könyvtárba 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

#тут надо смотреть,какие права на папки
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

a szkript inicializálása és elindítása a systemctl vagy a service segítségével történik

# systemctl enable callme
# systemctl start callme

A szolgáltatás szükség szerint újraindul (összeomlás esetén). A beérkező levelek nyomkövető szolgáltatásához nem kell webszervert telepíteni, csak php kell (ami mindenképpen a FeePBX szerveren van). De a hívásrekordokhoz való hozzáférés hiányában a webszerveren keresztül (szintén https-sel) nem lehet meghallgatni a hívási rekordokat.

Most beszéljünk a kimenő hívásokról. A CallMeOut.php szkriptnek két funkciója van:

  • Hívás kezdeményezése, amikor egy php-szkriptre vonatkozó kérés érkezik (beleértve a "Hívás" gomb használatát magában a Bitrixben). Webszerver nélkül nem működik, a kérés HTTP POST-on keresztül érkezik, a kérés tokent tartalmaz

  • Üzenet a hívásról, annak paramétereiről és a Bitrix rekordjairól. Asterisk aktiválja a [sub-call-internal-ended] tárcsázási tervben, amikor egy hívás befejeződik

A FreePBX megértése és integrálása a Bitrix24-gyel és még sok mással

A webszerverre csak két dologra van szükség – a Bitrix rekordfájlok letöltésére (HTTPS-en keresztül) és a CallMeOut.php szkript meghívására. Használhatja a beépített FreePBX szervert, amelynek fájljai a /var/www/html, telepíthet másik szervert, vagy megadhat más elérési utat.

web szerver

Hagyjuk a webszerver beállítását független tanulmányozásra (tyts, tyts, tyts). Ha nincs domainje, kipróbálhatja a FreeDomain( https://www.freenom.com/ru/index.html), amely ingyenes nevet ad a fehér IP-címének (ne felejtse el továbbítani a 80-as, 443-as portokat a routeren keresztül, ha a külső cím csak rajta van). Ha most hozott létre egy DNS-tartományt, akkor várnia kell (15 perctől 48 óráig), amíg az összes szerver betöltődik. A hazai szolgáltatókkal végzett munka tapasztalatai szerint - 1 órától egy napig.

Telepítési automatizálás

Egy telepítőt fejlesztettek ki a githubon, hogy a telepítés még egyszerűbb legyen. De papíron gördülékenyen ment - miközben manuálisan telepítjük az egészet, hiszen mindezt bütykölve kristálytisztán kiderült, hogy ki kivel barátkozik, ki hova megy és hogyan kell hibakeresni. Telepítő még nincs

Dokkmunkás

Ha gyorsan ki akarja próbálni a megoldást - a Dockernél van lehetőség - gyorsan hozzon létre egy tárolót, adjon neki portokat kifelé, csúsztassa be a beállítási fájlokat és próbálkozzon (ez a lehetőség a LetsEncrypt tárolónál, ha már van tanúsítványa , csak át kell irányítani a fordított proxyt a FreePBX webszerverre (másik portot adtunk neki 88), LetsEncrypt a dockerben ez a cikk

Futtassa a fájlt a letöltött projekt mappában (a git klón után), de először lépjen be a csillag konfigurációkba (csillag mappa), és írja oda a rekordok elérési útját és a webhely URL-jét

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:

Ez a docker-compose.yaml fájl a következőn keresztül fut

docker-compose up -d

Ha az nginx nem indul el, akkor valami nem stimmel a konfigurációval az nginx/ssl_docker.conf mappában

Egyéb integrációk

És miért nem teszünk bele néhány CRM-et egyidejűleg a szkriptekbe, gondoltuk. Számos más CRM API-t tanulmányoztunk, különösen az ingyenes beépített PBX-et ​​- ShugarCRM és Vtiger, és igen! igen, az elv ugyanaz. De ez egy másik történet, amit később külön töltünk fel a githubra.

referenciák

Jogi nyilatkozat: A valósággal való bármilyen hasonlóság fiktív, és nem én voltam az.

Forrás: will.com

Hozzászólás