Capisce u FreePBX è l'integra cù Bitrix24 è più

Bitrix24 hè una grande combinazione chì combina CRM, flussu di travagliu, cuntabilità è parechje altre cose chì i gestori piacenu veramente è u persunale di l'IT ùn piace micca veramente. U portale hè utilizatu da parechje cumpagnie chjuche è mediane, cumprese picculi cliniche, pruduttori è ancu saloni di bellezza. A funzione principale chì i gestori "amare" hè l'integrazione di a telefonia è CRM, quandu ogni chjama hè subitu registrata in CRM, i carte di i clienti sò creati, quandu entra, l'infurmazioni nantu à u cliente hè visualizatu è pudete vede immediatamente quale hè, ciò chì ellu. pò vende è quantu deve. Ma a telefonia da Bitrix24 è a so integrazione cù CRM custa soldi, qualchì volta assai. In l'articulu vi dicu l'esperienza di integrazione cù l'arnesi aperti è u populari IP PBX freepbx, è ancu cunsiderà a logica di u travagliu di diverse parti

U travagliu cum'è un outsourcer in una cumpagnia chì vende è cunfigurà, integra a telefonia IP. Quandu m'era dumandatu se pudemu offre qualcosa à questu è sta cumpagnia per integrà Bitrix24 cù PBX chì i clienti anu, è ancu cù PBX virtuali in diverse cumpagnie VDS, andò à Google. È di sicuru m'hà datu un ligame articulu in habr, induve ci hè una descrizzione, è github, è tuttu pare travaglià. Ma quandu pruvate d'utilizà sta suluzione, hè risultatu chì Bitrix24 ùn hè più u listessu cum'è prima, è assai ci vole à esse rifattu. Inoltre, FreePBX ùn hè micca un asteriscu nudu per voi, quì avete bisognu di pensà à cumu unisce a facilità d'usu è un dialplan hardcore in i schedarii di cunfigurazione.

Studiemu a logica di u travagliu

Allora, per principianti, cumu si deve travaglià. Quandu una chjama hè ricivuta da fora di u PBX (avvenimentu SIP INVITE da u fornitore), u prucessu di u dialplan (dialplan, dialplan) principia - e regule di ciò chì è in quale ordine fà cù a chjama. Da u primu pacchettu, pudete piglià assai infurmazioni, chì ponu esse utilizati in e regule. Un strumentu eccellente per studià l'internu di SIP hè l'analizzatore sngrep (ссылка) chì hè simplicemente installatu in distribuzioni populari via apt install/yum install è simili, ma pò ancu esse custruitu da a fonte. Fighjemu u logu di chjama in sngrep

Capisce u FreePBX è l'integra cù Bitrix24 è più

In una forma simplificata, u dialplan tratta solu cù u primu pacchettu, qualchì volta ancu durante a cunversazione, i chjami sò trasferiti, presse buttone (DTMF), diverse cose interessanti cum'è FollowMe, RingGroup, IVR è altri.

Chì ci hè in u Pack Invite

Capisce u FreePBX è l'integra cù Bitrix24 è più

In verità, a maiò parte di i dialplans simplici travaglianu cù i primi dui campi, è tutta a logica gira intornu à DID è CallerID. DID - induve chjamemu, CallerID - chì chjama.

Ma dopu tuttu, avemu una cumpagnia è micca un telefuninu - chì significa chì u PBX hà assai prubabilmente gruppi di chjama (sonneria simultanea / consecutiva di parechji dispositi) in numeri di cità (Ring Group), IVR (Salutu, avete chjamatu ... Press). unu per ...), Risponditori (Frasi), Cundizioni di tempu, Trasferimentu à altri numeri o à una cellula (FollowMe, Forward). Questu significa chì hè assai difficiuli di determinà senza ambiguità quale riceverà veramente una chjama è quale averà una conversazione cù quandu una chjama ghjunghje. Eccu un esempiu di u principiu di una chjama tipica in a PBX di i nostri clienti

Capisce u FreePBX è l'integra cù Bitrix24 è più

Dopu chì a chjama entra cù successu in u PBX, viaghja à traversu u dialplan in diversi "cuntesti". U cuntestu da u puntu di vista di l'Asterisk hè un inseme numeratu di cumandamenti, ognunu di i quali cuntene un filtru da u numeru chjamatu (hè chjamatu exten, per una chjama esterna in u stadiu iniziale exten = DID). I cumandamenti in a linea di dialplan ponu esse qualcosa - funzioni internu (per esempiu, chjamate un abbonatu internu - Dial(), mette u telefunu - Hangup()), operatori cundiziunali (IF, ELSE, ExecIF è simili), transizioni à altre regule di stu cuntestu (Goto, GotoIF), transizione à altri cuntesti in a forma di una funzione chjamata (Gosub, Macro). Una direttiva separata include имя_контекста, chì aghjunghje cumandamenti da un altru cuntestu à a fine di u cuntestu attuale. I cumandamenti inclusi via include sò sempre eseguiti после cumandamenti di u cuntestu attuale.

Tutta a logica di FreePBX hè custruita annantu à l'inclusione di diversi cuntesti in l'altri attraversu include è chjamate attraversu Gosub, Macro è Handler handlers. Cunsiderate u cuntestu di chjamate FreePBX entranti

Capisce u FreePBX è l'integra cù Bitrix24 è più

A chjama passa per tutti i cuntesti da cima à fondu à turnu, in ogni cuntestu pò esse chjamati à altri cuntesti cum'è macros (Macro), funzioni (Gosub) o solu transizioni (Goto), cusì l'arburu veru di ciò chì hè chjamatu pò solu solu. esse tracciatu in i logs.

Un diagramma di configurazione tipica per un PBX tipicu hè mostratu quì sottu. Quandu chjamate, DID hè cercatu in rotte in entrata, e cundizioni temporali sò verificati per questu, se tuttu hè in ordine, u menu di voce hè lanciatu. Da ellu, pressendu u buttone 1 o timeout, surtite à u gruppu di operatori di marcatura. Dopu chì a chjama finisci, a macro di hangupcall hè chjamata, dopu à quale nunda ùn pò esse fattu in u dialplan, eccettu per i manipulatori speciali (hangup handler).

Capisce u FreePBX è l'integra cù Bitrix24 è più

Induve in questu algoritmu di chjama duvemu furnisce infurmazioni nantu à l'iniziu di a chjama à CRM, induve principià a registrazione, induve finisce a registrazione è mandà cù l'infurmazioni nantu à a chjama à CRM?

Integrazione cù sistemi esterni

Cos'è l'integrazione PBX e CRM? Quessi sò paràmetri è prugrammi chì cunvertisce dati è avvenimenti trà sti dui piattaforme è li mandanu à l'altri. U modu più cumuni per i sistemi indipendenti per cumunicà hè attraversu l'API, è u modu più populari per accede à l'API hè HTTP REST. Ma micca per l'asteriscu.

Dentru Asterisk hè:

  • AGI - chiamata sincrona à prugrammi / cumpunenti esterni, utilizatu principarmenti in u dialplan, ci sò biblioteche cum'è phpagi, PAGI

  • AMI - un socket TCP di testu chì travaglia nantu à u principiu di abbunamentu à l'avvenimenti è inserisce cumandamenti di testu, s'assumiglia à SMTP da l'internu, pò seguità l'avvenimenti è gestisce e chjama, ci hè una biblioteca. PAMI - u più pupulare per creà una cunnessione cù Asterisk

Esempiu di output AMI

Avvenimentu: Novu canali
Privilegiu: chjamate, tutti
Canale: PJSIP/VMS_pjsip-0000078b
Statu di u Canale: 4
ChannelStateDesc: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
nome di linea cunnessu:
Langue : fr
codice contu:
Cuntestu: da-pstn
Estennu: s
Priurità: 1
Uniqueid: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI hè una mistura di i dui, tutti via REST, WebSocket, in formatu JSON - ma cù librerie fresche è wrappers, micca assai boni, truvati fora (phparia, phpari) chì hè diventatu in u so sviluppu circa 3 anni fà.

Esempiu di output ARI quandu una chjama hè iniziata

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «nome»:»PJSIP/VMSpjsip-000007b6″, "state":"Ring", "caller":{ "name":"111222″, "number":"111222″ }, "connected":{ "name":"", "number" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Stasi", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world"}

A cunvenzione o l'inconvenienza, a pussibilità o l'impossibilità di travaglià cù una API particulari sò determinate da i travaglii chì devenu esse risolti. I travaglii per l'integrazione cù CRM sò i seguenti:

  • Segui u principiu di a chjama, induve hè stata trasferita, caccià CallerID, DID, i tempi di iniziu è di fine, forse dati da u cartulare (per circà una cunnessione trà u telefunu è l'utilizatore CRM)

  • Cumincià è finisce a registrazione di a chjama, salvate in u formatu desideratu, informate à a fine di a registrazione induve si trova u schedariu

  • Inizià una chjama nantu à un avvenimentu esternu (da u prugramma), chjamate un numeru internu, un numeru esternu è cunnette

  • Facultativu: integrate cù CRM, gruppi di dialer è FollowME per u trasferimentu automaticu di e chjama in assenza di un locu (sicondu CRM)

Tutti issi compiti ponu esse risolti attraversu AMI o ARI, ma ARI furnisce assai menu infurmazione, ùn sò micca assai avvenimenti, assai variàbili chì AMI hà sempre (per esempiu, macro calls, setting variables inside macros, inclusive call recording) ùn sò micca tracciati. Dunque, per un seguimentu currettu è precisu, scegliemu AMI per avà (ma micca cumpletamente). Inoltre (bene, induve saria senza questu, simu pigri) - in u travagliu originale (articulu in habr) aduprà PAMI. *Allora avete bisognu di pruvà à riscrive in ARI, ma micca u fattu chì hà da travaglià.

Reinventà l'integrazione

Per chì u nostru FreePBX sia capace di riportà à l'AMI in modi simplici nantu à u principiu di a chjama, l'ora di a fine, i numeri, i nomi di i fugliali arregistrati, hè più faciule per calculà a durata di a chjama cù u listessu truccu cum'è l'autori originali. - inserite e vostre variabili è analizà l'output per a so presenza. PAMI suggerisce di fà questu solu per mezu di una funzione di filtru.

Eccu un esempiu di stabilisce a vostra propria variabile per l'ora di iniziu di a chjama (s hè un numeru speciale in u dialplan chì hè realizatu prima di inizià a ricerca DID)

[ext-did-custom]

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

Un esempiu AMI eventu per questa linea

Avvenimentu: Novu canali

Privilegiu: chjamate, tutti

Canale: PJSIP/VMS_pjsip-0000078b

Statu di u Canale: 4

ChannelStateDesc: Ring

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

nome di linea cunnessu:

Langue : fr

codice contu:

Cuntestu: da-pstn

Estennu: s

Priurità: 1

Uniqueid: 1599589046.5244

Linkedid: 1599589046.5244

Applicazione: Set AppData:

CallStart=1599571046

Perchè FreePBX sovrascrive i schedari extention.conf è extention_supplementu.conf, avemu aduprà u schedariu estensione_abitùdine.conf

Codice cumpletu di extention_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

Caratteristica è differenza da u dialplan originale di l'autori di l'articulu originale -

  • Dialplan in formatu .conf, cum'è FreePBX vole (iè, pò .ael, ma micca tutte e versioni è ùn hè micca sempre cunvene)

  • Invece di trasfurmà a fine attraversu exten => h, u prucessu hè statu introduttu per hangup_handler, perchè u dialplan FreePBX hà travagliatu solu cun ellu.

  • Fixed script call string, quotes aghjunte è numeru di chjama esterna ExtNum

  • U processamentu hè spustatu à i cuntesti _custom è vi permette micca di tuccà o edità FreePBX configs - entrante via [ext-did-custom], in uscita per [outbound-allroutes-custom]

  • Nisun ligame à i numeri - u schedariu hè universale è solu deve esse cunfiguratu per a strada è ligame à u servitore

Per cumincià, avete ancu bisognu di eseguisce script in AMI per login è password - per questu, FreePBX hà ancu un schedariu _custom.

u schedariu manager_custom.conf

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

Issi dui fugliali devenu esse posti in /etc/asterisk, dopu rileghjite a cunfigurazione (o riavviate l'asteriscu)

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

Avà andemu à PHP

Initializing scripts è creà un serviziu

Siccomu u schema per travaglià cù Bitrix 24, un serviziu per AMI, ùn hè micca solu simplice è trasparente, deve esse discutitu separatamente. Asterisk, quandu AMI hè attivatu, si apre u portu è basta. Quandu un cliente si unisce, dumanda l'autorizazione, allora u cliente si abbona à l'avvenimenti necessarii. L'avvenimenti venenu in testu chjaru, chì PAMI cunvertisce in oggetti strutturati è furnisce l'abilità di stabilisce a funzione di filtrazione solu per avvenimenti d'interessu, campi, numeri, etc.

Appena a chjama entra, l'avvenimentu NewExten hè sparatu partendu da u cuntestu parent [from-pstn], allora tutti l'avvenimenti vanu in l'ordine di e linee in i cuntesti. Quandu l'infurmazioni sò ricevute da e variabili CallMeCallerIDName è CallStart specificate in u dialplan _custom, u

  1. A funzione di dumandà u UserID currispundente à u numeru di estensione induve a chjama hè ghjunta. E s'ellu hè un gruppu dial-up? A quistione hè pulitica, avete bisognu di creà una chjama à tutti à una volta (quandu tutti chjamanu à una volta) o creanu cumu chjamanu quandu chjamanu à turnu? A maiò parte di i clienti anu a strategia Fisrt Available, cusì ùn ci hè micca prublema cù questu, solu una chjama. Ma u prublema deve esse risolta.

  2. A funzione di registrazione di a chjama in Bitrix24, chì torna u CallID, chì hè tandu necessariu di rapportà i paràmetri di a chjama è un ligame à a registrazione. Richiede un numeru di estensione o UserID

Capisce u FreePBX è l'integra cù Bitrix24 è più

Dopu à a fine di a chjama, a funzione di scaricamentu di u record hè chjamata, chì rapprisenta simultaneamente u statutu di u cumpletu di a chjama (Busy, No answer, Success), è scarica ancu un ligame à u schedariu mp3 cù u record (s'ellu ci hè).

Perchè u modulu CallMeIn.php hà bisognu di eseguisce continuamente, un schedariu di startup SystemD hè statu creatu per questu callme.service, chì deve esse messu in /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

L'inizializazione è u lanciamentu di u script si faci à traversu systemctl o serviziu

# systemctl enable callme
# systemctl start callme

U serviziu riavviarà da ellu stessu cum'è necessariu (in casu di crashes). U serviziu di seguimentu di l'inbox ùn hà micca bisognu di un servitore web per esse installatu, solu php hè necessariu (chì hè definitu nantu à u servitore FeePBX). Ma in l'absenza di l'accessu à i registri di chjamà attraversu u servitore Web (ancu cù https), ùn serà micca pussibule di sente i registri di chjama.

Avà parlemu di e chjama in uscita. L'script CallMeOut.php hà duie funzioni:

  • Iniziazione di una chjama quandu una dumanda hè ricevutu per un script php (cumpresu cù u buttone "Call" in u Bitrix stessu). Ùn funziona micca senza un servitore web, a dumanda hè ricevuta via HTTP POST, a dumanda cuntene un token

  • Missaghju nantu à a chjama, i so paràmetri è i registri in Bitrix. Sparatu da Asterisk in u dialplan [sub-call-internal-ended] quandu una chjama finisce

Capisce u FreePBX è l'integra cù Bitrix24 è più

U servitore web hè necessariu solu per duie cose - scaricamentu di schedarii di registrazione Bitrix (via HTTPS) è chjamà u script CallMeOut.php. Pudete utilizà u servitore FreePBX integratu, i schedarii per quale sò /var/www/html, pudete installà un altru servitore o specificà una strada diversa.

Servitore web

Lasciamu a configurazione di u servitore web per un studiu indipendente (tyts, tyts, tyts). Se ùn avete micca un duminiu, pudete pruvà FreeDomain ( https://www.freenom.com/ru/index.html), chì vi darà un nome gratuitu per u vostru IP biancu (ùn vi scurdate di trasmette i porti 80, 443 attraversu u router se l'indirizzu esternu hè solu nantu à questu). Se avete appena creatu un duminiu DNS, avete da aspittà (da 15 minuti à 48 ore) finu à chì tutti i servitori sò caricati. Sicondu l'esperienza di travaglià cù i fornituri domestici - da 1 ora à un ghjornu.

L'automatizazione di l'installazione

Un installatore hè statu sviluppatu nantu à github per fà a stallazione ancu più faciule. Ma hè stata liscia nantu à a carta - mentre avemu stallatu tuttu manualmente, postu chì dopu avè tinkering cù tuttu questu, hè diventatu chjaru ciò chì hè amici cù quale, quale va induve è cumu debug. Ùn ci hè ancu un installatore

Docker

Se vulete pruvà rapidamente a suluzione - ci hè una opzione cù Docker - crea rapidamente un containeru, dà porti fora, slip i schedarii di paràmetri è pruvate (questa hè l'opzione cù u container LetsEncrypt, se avete digià un certificatu, avete basta à redirige u proxy inversu à u servitore web FreePBX (avemu datu un altru portu hè 88), LetsEncrypt in docker basatu in stu articulu

Avete bisognu di eseguisce u schedariu in u cartulare di u prughjettu telecaricatu (dopu à git clone), ma prima entre in l'asterisk configs (asterisk folder) è scrivite i chjassi à i registri è l'URL di u vostru situ quì.

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:

Stu schedariu docker-compose.yaml hè gestitu via

docker-compose up -d

Se nginx ùn principia micca, allora qualcosa hè sbagliatu cù a cunfigurazione in u cartulare nginx/ssl_docker.conf

Altre integrazioni

E perchè ùn mette micca qualchì CRM in scripts à u stessu tempu, avemu pensatu. Avemu studiatu parechje altre API CRM, in particulare u PBX integratu gratuitu - ShugarCRM è Vtiger, è sì! iè, u principiu hè listessu. Ma questu hè un'altra storia, chì dopu caricheremu in github separatamente.

referenze

Disclaimer: Ogni somiglianza cù a realtà hè fittizia è ùn era micca mè.

Source: www.habr.com

Add a comment