Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

Bitrix24 estas grandega kombinaĵo, kiu kombinas CRM, laborfluon, kontadon kaj multajn aliajn aferojn, kiujn administrantoj tre ŝatas kaj IT-kunlaborantaro ne vere ŝatas. La portalo estas uzata de multaj malgrandaj kaj mezgrandaj kompanioj, inkluzive de malgrandaj klinikoj, fabrikistoj kaj eĉ belecaj salonoj. La ĉefa funkcio, kiun administrantoj "amas" estas la integriĝo de telefonio kaj CRM, kiam iu alvoko estas tuj registrita en CRM, klientkartoj estas kreitaj, kiam envenantaj, informoj pri la kliento estas montrata kaj vi povas tuj vidi kiu li estas, kio li estas. povas vendi kaj kiom li ŝuldas. Sed telefonio de Bitrix24 kaj ĝia integriĝo kun CRM kostas monon, foje multe. En la artikolo mi rakontos al vi la sperton de integriĝo kun malfermitaj iloj kaj la populara IP PBX Senpaga PBX, kaj ankaŭ konsideri la logikon de la laboro de diversaj partoj

Mi laboras kiel subkontraktisto en firmao kiu vendas kaj agordas, integras IP-telefonion. Kiam oni demandis min, ĉu ni povus proponi ion al ĉi tiu kaj ĉi tiu kompanio por integri Bitrix24 kun PBX-oj kiujn havas klientoj, same kiel kun virtualaj PBX-oj en diversaj VDS-kompanioj, mi iris al Guglo. Kaj kompreneble li donis al mi ligilon al artikolo en habr, kie estas priskribo, kaj github, kaj ĉio ŝajnas funkcii. Sed kiam oni provis uzi ĉi tiun solvon, montriĝis, ke Bitrix24 ne plu estas la sama kiel antaŭe, kaj multe devas esti refarita. Krome, FreePBX ne estas nuda asterisko por vi, ĉi tie vi devas pensi pri kiel kombini facilecon de uzado kaj ĝisosta dialplano en agordaj dosieroj.

Ni studas la logikon de laboro

Do por komenci, kiel ĉio devus funkcii. Kiam voko estas ricevita de ekster la PBX (SIP INVITE-okazaĵo de la provizanto), la prilaborado de la telefonplano (ciferdiskoplano, dialplano) komenciĝas - la reguloj pri kio kaj en kia ordo fari kun la voko. De la unua pako, vi povas ricevi multajn informojn, kiuj tiam povas esti uzataj en la reguloj. Bonega ilo por studi la internon de SIP estas la analizilo sngrep (ligilo) kiu estas simple instalita en popularaj distribuoj per apt install/yum install kaj similaj, sed ĝi ankaŭ povas esti konstruita de fonto. Ni rigardu la alvokon en sngrep

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

En simpligita formo, la dialplano traktas nur la unuan pakaĵon, foje ankaŭ dum la konversacio, alvokoj estas transdonitaj, butonpremoj (DTMF), diversaj interesaj aferoj kiel FollowMe, RingGroup, IVR kaj aliaj.

Kio estas ene de la Invita Pako

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

Efektive, la plej multaj simplaj dialplanoj funkcias kun la unuaj du kampoj, kaj la tuta logiko rondiras ĉirkaŭ DID kaj CallerID. DID - kie ni vokas, CallerID - kiu vokas.

Sed finfine, ni havas kompanion kaj ne unu telefonon - kio signifas, ke la PBX plej verŝajne havas alvokogrupojn (samtempa/sinsekva sonorado de pluraj aparatoj) sur urbaj numeroj (Ring Group), IVR (Saluton, vi vokis... Gazetaro). unu por ...), Respondiloj (Frazoj), Tempo-Kondiĉoj, Plusendado al aliaj nombroj aŭ al ĉelo (FollowMe, Forward). Ĉi tio signifas, ke estas tre malfacile klare determini, kiu efektive ricevos vokon kaj kun kiu havos konversacion kiam alvoko alvenos. Jen ekzemplo de la komenco de tipa voko en la PBX de niaj klientoj

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

Post kiam la voko sukcese eniras la PBX, ĝi vojaĝas tra la dialplano en malsamaj "kuntekstoj". La kunteksto el la vidpunkto de Asterisko estas numerita aro de komandoj, el kiuj ĉiu enhavas filtrilon laŭ la diskita nombro (ĝi nomiĝas exten, por ekstera voko ĉe la komenca stadio exten=DID). La komandoj en la dialplan-linio povas esti io ajn - internaj funkcioj (ekzemple, voku internan abonanton - Dial(), demetu la telefonon - Hangup()), kondiĉaj operatoroj (IF, ELSE, ExecIF kaj similaj), transiroj al aliaj reguloj de ĉi tiu kunteksto (Goto, GotoIF), transiro al aliaj kuntekstoj en formo de funkciovoko (Gosub, Makro). Aparta direktivo include имя_контекста, kiu aldonas komandojn de alia kunteksto al la fino de la nuna kunteksto. Komandoj inkluzivitaj per include estas ĉiam ekzekutitaj после ordonoj de la nuna kunteksto.

La tuta logiko de FreePBX estas konstruita sur la inkludo de malsamaj kuntekstoj unu en la alian per inkluzivi kaj voki per Gosub, Macro kaj Handler-traktiloj. Konsideru la kuntekston de alvenantaj FreePBX-vokoj

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

La alvoko trairas ĉiujn kuntekstojn de supre ĝis malsupre laŭvice, en ĉiu kunteksto povas esti alvokoj al aliaj kuntekstoj kiel makrooj (Makro), funkcioj (Gosub) aŭ nur transiroj (Goto), do la vera arbo de tio, kion oni nomas, povas nur esti spurita en la protokoloj.

Tipa aranĝodiagramo por tipa PBX estas montrita malsupre. Dum vokado, DID estas serĉata en envenantaj itineroj, provizoraj kondiĉoj estas kontrolitaj por ĝi, se ĉio estas en ordo, la voĉa menuo estas lanĉita. De ĝi, premante la butonon 1 aŭ eltempo, eliru al la grupo de diskaj telefonistoj. Post kiam la voko finiĝas, la hangupcall makroo estas vokita, post kio nenio povas esti farita en la dialplano, krom specialaj pritraktiloj (hangup-traktilo).

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

Kie en ĉi tiu alvoko-algoritmo ni liveri informojn pri la komenco de la voko al CRM, kie komenci registradon, kie fini la registradon kaj sendi ĝin kune kun informoj pri la voko al CRM?

Integriĝo kun eksteraj sistemoj

Kio estas PBX kaj CRM-integriĝo? Ĉi tiuj estas agordoj kaj programoj, kiuj konvertas datumojn kaj eventojn inter ĉi tiuj du platformoj kaj sendas ilin unu al la alia. La plej ofta maniero por sendependaj sistemoj komuniki estas per API-oj, kaj la plej populara maniero aliri API-ojn estas HTTP REST. Sed ne por asterisko.

Ene de Asterisko estas:

  • AGI - sinkrona alvoko de eksteraj programoj/komponentoj, uzata ĉefe en la dialplano, ekzistas bibliotekoj kiel phpagi, PAGI

  • AMI - teksta TCP-soko, kiu funkcias laŭ la principo de abono al eventoj kaj enigo de tekstaj komandoj, similas SMTP de interne, povas spuri eventojn kaj administri vokojn, ekzistas biblioteko. PAMI - la plej populara por krei ligon kun Asterisk

Ekzemplo de eligo de AMI

Okazaĵo: Nova kanalo
Privilegio: voki, ĉiujn
Kanalo: PJSIP/VMS_pjsip-0000078b
Kanalo Ŝtato: 4
ChannelStateDesc: Ringo
VokantoIDNumero: 111222
VokantoIDNomo: 111222
ConnectedLineNum:
ligita linionomo:
Lingvo: eo
kontokodo:
Kunteksto: de-pstn
Etendu: s
Prioritato: 1
Unikaid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI estas miksaĵo de ambaŭ, ĉio per REST, WebSocket, en JSON-formato - sed kun freŝaj bibliotekoj kaj envolvaĵoj, ne tre bonaj, senpaciende trovitaj (phparia, phpari) kiuj fariĝis en ilia evoluo antaŭ ĉirkaŭ 3 jaroj.

Ekzemplo de ARI-produktaĵo kiam voko estas iniciatita

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «nomo»:»PJSIP/VMSpjsip-000007b6″, "state":"Sonigo", "vokanto":{ "nomo":"111222″, "numero":"111222″ }, "konektita":{ "nomo":"", "nombro" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Stazo", "appdata":"saluton-mondo" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"eo" }, "asterisko"id":"48:5b:aa:aa:aa:aa", "application":"saluton-mondo"}

Komforto aŭ ĝeno, la ebleco aŭ neeblo labori kun aparta API estas determinitaj de la taskoj, kiuj devas esti solvitaj. La taskoj por integriĝo kun CRM estas kiel sekvas:

  • Spuri la komencon de la voko, kie ĝi estis translokigita, eltiru CallerID, DID, komenco kaj fintempoj, eble datumojn de la dosierujo (por serĉi konekton inter la telefono kaj la uzanto de CRM)

  • Komencu kaj fini la registradon de la alvoko, konservu ĝin en la dezirata formato, informu ĉe la fino de la registrado, kie troviĝas la dosiero.

  • Komencu vokon pri ekstera evento (de la programo), voku internan numeron, eksteran numeron kaj konektu ilin

  • Laŭvola: integriĝu kun CRM, dialgrupoj kaj FollowME por aŭtomata translokigo de vokoj en foresto de loko (laŭ CRM)

Ĉiuj ĉi tiuj taskoj povas esti solvitaj per AMI aŭ ARI, sed ARI provizas multe malpli da informoj, ne estas multaj eventoj, multaj variabloj, kiujn AMI ankoraŭ havas (ekzemple, makrovokoj, agordado de variabloj ene de makrooj, inkluzive de voka registrado) ne estas spuritaj. Tial, por ĝusta kaj preciza spurado, ni elektu AMI nuntempe (sed ne tute). Krome (nu, kie estus sen tio, ni estas maldiligentaj homoj) - en la originala verko (artikolo en habr) uzu PAMI. *Tiam vi devas provi reverki al ARI, sed ne la fakton, ke ĝi funkcios.

Reinventante integriĝon

Por ke nia FreePBX povu raporti al AMI per simplaj manieroj pri la komenco de la alvoko, fintempo, nombroj, nomoj de registritaj dosieroj, estas plej facile kalkuli la daŭron de la voko uzante la saman lertaĵon kiel la originalaj aŭtoroj. - enigu viajn variablojn kaj analizu la eliron por ilia ĉeesto. PAMI sugestas fari tion simple per filtrila funkcio.

Jen ekzemplo de agordo de via propra variablo por la komenca tempo de la voko (s estas speciala numero en la dialplano, kiu estas farita ANTAŬ komenci la DID-serĉon)

[ext-did-custom]

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

Ekzempla AMI-okazaĵo por ĉi tiu linio

Okazaĵo: Nova kanalo

Privilegio: voki, ĉiujn

Kanalo: PJSIP/VMS_pjsip-0000078b

Kanalo Ŝtato: 4

ChannelStateDesc: Ringo

VokantoIDNumero: 111222

VokantoIDNomo: 111222

ConnectedLineNum:

ligita linionomo:

Lingvo: eo

kontokodo:

Kunteksto: de-pstn

Etendu: s

Prioritato: 1

Unikaid: 1599589046.5244

Linkedid: 1599589046.5244

Apliko: Agordu AppData:

CallStart=1599571046

Ĉar FreePBX anstataŭigas la extention.conf kaj extension_ dosierojnaddition.conf, ni uzos la dosieron etendo_kutimo.konf

Plena kodo de extension_custom.conf

[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

Karakterizaĵo kaj diferenco de la origina ciferplano de la aŭtoroj de la origina artikolo -

  • Dialplan en .conf-formato, kiel FreePBX volas ĝin (jes, ĝi povas .ael, sed ne ĉiuj versioj kaj ĝi ne ĉiam estas oportuna)

  • Anstataŭ prilabori la finon per exten => h, prilaborado estis enkondukita per hangup_handler, ĉar la dialplano FreePBX funkciis nur kun ĝi.

  • Fiksa skripto alvokoŝnuro, aldonitaj citaĵoj kaj ekstera alvoknumero ExtNum

  • Pretigo estas movita al _personaj kuntekstoj kaj permesas vin ne tuŝi aŭ redakti FreePBX-agordojn - envenantajn per [ext-did-custom], eliranta tra [outbound-allroutes-custom]

  • Neniu ligo al nombroj - la dosiero estas universala kaj nur bezonas esti agordita por la vojo kaj ligo al la servilo

Por komenci, vi ankaŭ devas ruli skriptojn en AMI per ensaluto kaj pasvorto - por tio, FreePBX ankaŭ havas _propan dosieron

manager_custom.conf dosiero

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

Ambaŭ ĉi tiuj dosieroj devas esti metitaj en /etc/asterisk, poste relegu la agordojn (aŭ rekomencu la asteriskon)

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

Nun ni transiru al PHP

Inicializante skriptojn kaj kreante servon

Ĉar la skemo por labori kun Bitrix 24, servo por AMI, ne estas tute simpla kaj travidebla, ĝi devas esti diskutita aparte. Asterisko, kiam AMI estas aktivigita, simple malfermas la havenon kaj jen ĝi. Kiam kliento aliĝas, ĝi petas rajtigon, tiam la kliento abonas la necesajn eventojn. Okazaĵoj venas en simpla teksto, kiun PAMI konvertas en strukturitajn objektojn kaj disponigas la kapablon agordi la filtran funkcion nur por eventoj de intereso, kampoj, nombroj, ktp.

Tuj kiam la voko envenas, la evento NewExten estas pafita ekde la gepatra [de-pstn] kunteksto, tiam ĉiuj eventoj iras en la ordo de la linioj en la kuntekstoj. Kiam informoj estas ricevitaj de la variabloj CallMeCallerIDName kaj CallStart specifitaj en la _propra dialplano, la

  1. La funkcio peti la UserID respondan al la etendonumero kie venis la voko. Kio se ĝi estas telefona grupo? La demando estas politika, ĉu vi bezonas krei alvokon al ĉiuj samtempe (kiam ĉiuj vokas samtempe) aŭ krei kiel ili vokas kiam ili vokas laŭvice? Plej multaj klientoj havas la strategion de Fisrt Havebla, do ne estas problemo pri tio, nur unu vokas. Sed la afero devas esti solvita.

  2. La alvoka registra funkcio en Bitrix24, kiu resendas la CallID, kiu tiam estas postulata por raporti la alvokoparametrojn kaj ligon al la registrado. Postulas aŭ etendaĵon aŭ UserID

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

Post la fino de la alvoko, la rekorda elŝuta funkcio estas vokita, kiu samtempe raportas la staton de la alvokoplenigo (Okupita, Neniu respondo, Sukceso), kaj ankaŭ elŝutas ligilon al la mp3-dosiero kun la rekordo (se ekzistas).

Ĉar la modulo CallMeIn.php devas funkcii senĉese, por ĝi estas kreita startdosiero SystemD voku min.servo, kiu devas esti enmetita en /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

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

[Install]
WantedBy=multi-user.target

inicialigo kaj lanĉo de la skripto okazas per systemctl aŭ servo

# systemctl enable callme
# systemctl start callme

La servo rekomencos sin laŭbezone (kaze de kraŝoj). La enirkesto spura servo ne postulas retservilon por esti instalita, nur php estas bezonata (kiu certe estas sur la FeePBX-servilo). Sed se manko de aliro al alvokaj registroj per la TTT-servilo (ankaŭ kun https), ne eblos aŭskulti alvokostojn.

Nun ni parolu pri eksiĝintaj vokoj. La skripto CallMeOut.php havas du funkciojn:

  • Komenco de voko kiam oni ricevas peton por php-skripto (inkluzive de uzado de la butono "Voko" en la Bitrix mem). Ĝi ne funkcias sen retservilo, la peto ricevas per HTTP POST, la peto enhavas ĵetonon

  • Mesaĝo pri la voko, ĝiaj parametroj kaj registroj en Bitrix. Pafite de Asterisk en la [sub-voko-interna-finita] telefonplano kiam voko finiĝas

Kompreni FreePBX kaj integri ĝin kun Bitrix24 kaj pli

La retservilo bezonas nur por du aferoj - elŝuti Bitrix-rekordajn dosierojn (per HTTPS) kaj voki la skripton CallMeOut.php. Vi povas uzi la enkonstruitan FreePBX-servilon, kies dosieroj estas /var/www/html, vi povas instali alian servilon aŭ specifi alian vojon.

TTT-servilo

Ni lasu la aranĝon de retservilo por sendependa studo (tyts, tyts, tyts). Se vi ne havas domajnon, vi povas provi FreeDomain( https://www.freenom.com/ru/index.html), kiu donos al vi liberan nomon por via blanka IP (ne forgesu plusendi la havenojn 80, 443 tra la enkursigilo se la ekstera adreso estas nur sur ĝi). Se vi ĵus kreis DNS-domajnon, tiam vi devas atendi (de 15 minutoj ĝis 48 horoj) ĝis ĉiuj serviloj estas ŝarĝitaj. Laŭ la sperto labori kun hejmaj provizantoj - de 1 horo ĝis tago.

Instala aŭtomatigo

Instalilo estis evoluigita sur github por faciligi la instaladon. Sed ĝi estis glata sur papero - dum ni instalas ĉion permane, ĉar post tuŝado de ĉio ĉi evidentiĝis, kio estas amikoj kun kiu, kiu iras kien kaj kiel sencimigi ĝin. Ankoraŭ ne ekzistas instalilo

Docker

Se vi volas rapide provi la solvon - ekzistas opcio kun Docker - rapide kreu ujon, donu al ĝi pordojn eksteren, glitu la agordajn dosierojn kaj provu (ĉi tiu estas la opcio kun la LetsEncrypt-ujo, se vi jam havas atestilon. , vi nur bezonas redirekti la inversan prokurilon al la retservilo FreePBX (ni donis al ĝi alian havenon estas 88), LetsEncrypt en docker bazita sur ĉi tiu artikolo

Vi devas ruli la dosieron en la elŝutita projekta dosierujo (post git-klono), sed unue eniru la asteriskajn agordojn (asteriska dosierujo) kaj skribu la vojojn al la registroj kaj la URL de via retejo tie.

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:

Ĉi tiu dosiero docker-compose.yaml estas rulita per

docker-compose up -d

Se nginx ne komenciĝas, tiam io misas kun la agordo en la dosierujo nginx/ssl_docker.conf

Aliaj integriĝoj

Kaj kial ne meti iom da CRM en skriptojn samtempe, ni pensis. Ni studis plurajn aliajn CRM-APIojn, precipe la senpagan enkonstruitan PBX - ShugarCRM kaj Vtiger, kaj jes! jes, la principo estas la sama. Sed ĉi tio estas alia rakonto, kiun ni poste alŝutos al la github aparte.

referencoj

Malgarantio: Ajna simileco al realeco estas fikcia kaj ĝi ne estis mi.

fonto: www.habr.com

Aldoni komenton