Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

Bitrix24 Àr en stor plattform som kombinerar bÄde CRM, dokumenthantering, redovisning och mÄnga andra funktioner som bÄde chefer uppskattar och IT-personal har lite svÄrare att gilla. Portalen anvÀnds av mÄnga smÄ och medelstora företag, inklusive smÄ kliniker, tillverkare och till och med skönhetssalonger. Den primÀra funktionen som chefer "Àlskar" Àr integrationen av telefoni och CRM, dÀr varje samtal omedelbart registreras i CRM-systemet, kundkort skapas, och vid ett inkommande samtal visas information om kunden direkt, vilket gör det tydligt vem de Àr, vad som kan sÀljas till dem och hur mycket de Àr skyldiga. Men telefonilösningen frÄn Bitrix24 och dess integration med CRM kostar pengar, ibland en hel del. I artikeln kommer jag att dela med mig av erfarenheter kring integration med öppna verktyg och populÀra IP PBX-system FreePBX, samt titta pÄ logiken bakom de olika delarna

Jag arbetar med outsourcing i ett företag som sÀljer och konfigurerar, integrerar IP-telefoni. NÀr jag blev tillfrÄgad om vi kunde erbjuda nÄgot för att integrera Bitrix24 med PBX-system som anvÀnds av kunder, liksom med virtuella PBX-system pÄ olika VDS-plattformar, vÀnde jag mig till Google. Och den gav mig naturligtvis en lÀnk till en artikel pÄ Habr, dÀr det finns bÄde beskrivning, och GitHub, och tydligen fungerar allt. Men nÀr jag försökte anvÀnda denna lösning visade det sig att Bitrix24 inte Àr som det var tidigare, och mycket behöver göras om. Dessutom, FreePBX Àr inte enbart en ren Asterisk, hÀr mÄste man tÀnka pÄ hur man kombinerar anvÀndarvÀnlighet med den hÄrda dialplanen i konfigurationsfilerna.

LÄt oss undersöka logiken

SĂ„, för att börja med, hur allt detta ska fungera. NĂ€r ett samtal kommer in till PBX (SIP INVITE-hĂ€ndelse frĂ„n leverantören) börjar behandling av dialplanen — reglerna för vad och i vilken ordning som ska göras med samtalet. FrĂ„n det första paketet kan man fĂ„ mycket information som sedan kan anvĂ€ndas i reglerna. Ett utmĂ€rkt verktyg för att studera SIP:s innersta vĂ€sen Ă€r analysverktyget sngrep (lĂ€nk) som enkelt installeras i populĂ€ra distributioner via apt install/yum install och liknande, men kan Ă€ven byggas frĂ„n kĂ€llkod. LĂ„t oss ta en titt pĂ„ samtalsloggen i sngrep

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

I en förenklad version hanterar dialplanen endast det första paketet, ibland sker Àven översÀttning av samtal, knapptryckningar (DTMF), olika intressanta funktioner som FollowMe, RingGroup, IVR och mer.

Vad som ingÄr i Invite-paketet

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

De flesta enkla dialplaner arbetar med de första tvĂ„ fĂ€lten och hela logiken kretsar kring DID och CallerID. DID – vart vi ringer, CallerID – vem som ringer.

Men vi har ju ett företag och inte bara en telefon – och dĂ€rför finns det troligtvis grupper för samtal i vĂ€xeln (samtidigt/sequential ringning av flera apparater) pĂ„ stadsnummer (Ring Group), IVR (Hej, du har ringt
 Tryck ett för
), Svarsapparater (Phrases), Tidsvillkor (Time Conditions), Vidarekoppling till andra nummer eller mobil (FollowMe, Forward). Det innebĂ€r att det Ă€r mycket svĂ„rt att bestĂ€mma vem som faktiskt kommer att fĂ„ samtalet och med vem man kommer att prata vid samtalets ankomst. HĂ€r Ă€r ett exempel pĂ„ hur ett typiskt samtal för vĂ„ra kunders vĂ€xel kan se ut.

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

Efter att samtalet har kommit in i vĂ€xeln gör det en resa genom dialplanen i olika "kontexter". En kontext ur Asterisks synvinkel Ă€r en numrerad uppsĂ€ttning kommandon, var och en av dem har ett filter för det uppringda numret (det kallas exten, för utgĂ„ende samtal i början Ă€r exten=DID). Kommandona i dialplanens rad kan vara vad som helst – interna funktioner (till exempel att ringa en intern abonnent – Dial(), lĂ€gga pĂ„ – Hangup()), villkorliga operatorer (IF, ELSE, ExecIF och liknande), övergĂ„ngar till andra regler i denna kontext (Goto, GotoIF), övergĂ„ng till andra kontexter i form av funktionsanrop (Gosub, Macro). Dessutom finns direktivet include namn_kontext, som lĂ€gger till kommandon frĂ„n en annan kontext i slutet av den aktuella kontexten. Kommandon som inkluderas via include körs alltid efter kommandona i den aktuella kontexten.

Hela logiken i FreePBX bygger pÄ att olika kontexter inkluderar varandra genom include och anrop genom Gosub, Macro och Handler-hanterare. LÄt oss se pÄ kontexten för inkommande samtal i FreePBX.

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

Samtalet gÄr igenom alla kontexter uppifrÄn och ner i ordning; i varje kontext kan det finnas anrop till andra kontexter som makron (Macro), funktioner (Gosub) eller helt enkelt övergÄngar (Goto), sÄ den verkliga strukturen av vad som anropas kan endast spÄras i loggarna.

Den typiska konfigurationen av en vanlig kontorsvÀxel visas nedan. NÀr ett samtal kommer in, kontrolleras DID i ingÄngsrutterna, tidsvillkoren verifieras och om allt Àr i ordning startas röstmenyn. FrÄn den, via knapp 1 eller timeout, kopplas man över till operatörernas grupp. Efter samtalet avslutas anropas makrot hangupcall, efter vilket inget annat kan utföras i dialplanen, förutom speciella hanterare (hangup handler).

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

Var i den hÀr samtalsalgoritmen ska vi skicka information om att samtalet har inletts till CRM, var ska vi börja inspelningen, var avsluta inspelningen och skicka den tillsammans med information om samtalet till CRM?

Integrering med externa system

Vad Àr integrationen mellan vÀxel och CRM? Det Àr instÀllningar och program som konverterar data och hÀndelser mellan dessa tvÄ plattformar och skickar information fram och tillbaka. Det vanligaste sÀttet att interagera med oberoende system Àr via API, och det mest populÀra sÀttet att fÄ tillgÄng till API Àr HTTP REST. Men inte för Asterisk.

Inuti Asterisk finns:

  • AGI — synkron anrop av externa program/komponenter, anvĂ€nds frĂ€mst i dialplanen, det finns bibliotek som phpagi, PAGI

  • AMI — textbaserad TCP-socket som fungerar enligt principen om prenumeration pĂ„ hĂ€ndelser och inmatning av textkommandon, liknande SMTP inifrĂ„n, kan spĂ„ra hĂ€ndelser och hantera samtal, det finns bibliotek PAMI — det mest populĂ€ra för att skapa anslutning till Asterisk

Exempel pÄ AMI-utdata

Event: Newchannel
Privilegium: call,all
Kanal: PJSIP/VMS_pjsip-0000078b
Kanalstatus: 4
Kanalstatusbeskrivning: Ring
CallerIDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
ConnectedLineName:
SprÄk: en
Kontokod:
Kontext: from-pstn
Exten: s
Prioritet: 1
Unik ID: 1599589046.5244
LĂ€nkad ID: 1599589046.5244

  • ARI — en blandning av det ena och det andra, allt via REST, WebSocket, i JSON-format — men med nya bibliotek och omslag Ă€r det inte riktigt pĂ„ topp, nuvarande exempel Ă€r (phparia, phpari) som stannade i sin utveckling för ungefĂ€r 3 Ă„r sedan.

Exempel pÄ ARI-utdata vid initiering av samtal

{ "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" }id»:»48:5b:aa:aa:aa:aa», «application»:»hello-world» }

BekvÀmlighet eller obekvÀmlighet, möjlighet eller omöjlighet att arbeta med olika API:er bestÀms av de uppgifter som mÄste lösas. Uppgifterna för integration med CRM Àr följande:

  • SpĂ„ra början av samtalet, dit det har blivit vidarebefordrat, hĂ€mta CallerID, DID, tider för början och slut, eventuellt data frĂ„n katalogen (för att hitta samband mellan telefon och anvĂ€ndare i CRM)

  • Starta och avsluta inspelning av samtalet, spara i önskat format, meddela var filen ligger efter inspelningen Ă€r klar

  • Initiera ett samtal vid ett externt evenemang (frĂ„n programmet), ringa ett internt nummer, ett externt och koppla ihop dem

  • Valfritt: integrera med CRM, grupper för samtalsöverföring och FollowME för automatisk vidarekoppling av samtal vid frĂ„nvaro (enligt informationen i CRM)

Alla dessa uppgifter kan lösas via AMI eller ARI, men ARI ger betydligt mindre information, det saknas mĂ„nga hĂ€ndelser, mĂ„nga variabler spĂ„ras inte, vilka som finns i AMI (till exempel anrop av makron, tilldelning av variabler inom makron, inklusive inspelning av samtal). DĂ€rför, för korrekt och exakt spĂ„rning – kommer vi att vĂ€lja AMI (men inte slutgiltigt). Dessutom (vad skulle vi göra utan detta, vi Ă€r mĂ€nniskor som Ă€r lata) – i det ursprungliga arbetet (artikel pĂ„ Habra) anvĂ€nder PAMI. *Sedan mĂ„ste vi prova att skriva om det pĂ„ ARI, men det Ă€r inte sĂ€kert att det kommer att fungera.

Vi hittar pÄ integrationen pÄ nytt

För att vĂ„r FreePBX ska kunna rapportera till AMI pĂ„ enkla sĂ€tt om början av samtalet, sluttid, nummer, namn pĂ„ inspelade filer, och berĂ€kna samtalets varaktighet, Ă€r det enklast att anvĂ€nda samma trick som de ursprungliga författarna – införliva vĂ„ra variabler och analysera utdata för deras nĂ€rvaro. PAMI erbjuder att göra detta enkelt via en filterfunktion.

HĂ€r Ă€r ett exempel pĂ„ att stĂ€lla in en egen variabel för tidpunkten för samtalet (s – Ă€r ett speciellt nummer i dialplanen, som utförs FÖRE sökningen pĂ„ DID)

[ext-did-custom]

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

Exempel pÄ AMI-hÀndelse för denna rad

Event: Newchannel

Privilegium: call,all

Kanal: PJSIP/VMS_pjsip-0000078b

Kanalstatus: 4

Kanalstatusbeskrivning: Ring

CallerIDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

ConnectedLineName:

SprÄk: en

Kontokod:

Kontext: from-pstn

Exten: s

Prioritet: 1

Unik ID: 1599589046.5244

LĂ€nkad ID: 1599589046.5244

Application: Set AppData:

CallStart=1599571046

Eftersom FreePBX skriver över filerna extention.conf och extention_additional.conf, kommer vi att anvÀnda filen extention_custom.conf

FullstÀndig kod extention_custom.conf

[globals]	
;; Kontrollera sökvÀgar och rÀttigheter för mappar - anvÀndaren asterisk mÄste ha skrivrÀttigheter
;; HĂ€r kommer samtalen att sparas
WAV=\/var\/www\/html\/callme\/records\/wav 
MP3=\/var\/www\/html\/callme\/records\/mp3

;; HÀrifrÄn kommer inspelningar att spelas upp och laddas ner
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3

;; Adress för callback vid utgÄende samtal
URLPHP=https:\/\/www.host.ru\/callmeplus

;; Ja, vi spelar in samtalen
RECORDING=1

;; Detta Àr en makro för att spela in samtal i vÄr mapp.
;; Systeminspelning kan ocksÄ anvÀndas, men lÄt oss anvÀnda denna - 
;; den fungerar
[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()


;; Detta Àr huvudkontexten för att starta samtalet
[ext-did-custom]

;; Detta Àr galenskap, att göra det sÄ hÀr och hÀr, men det fungerar - vi lÀgger till '8' till numret
nexten =>  s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; HÀr Àr alla variabler för skriptet
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)})

;; Det viktigaste! Behandlare av samtalsavslut.
;; Vanliga sÀtt att hantera slutet genom (exten=>h,1, nÄnting hÀr) i FreePBX fungerar inte - Macro(hangupcall,) förstör allt.
;; DÀrför binder vi Hangup_Handler till samtalsavslutet
exten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Behandlare av inkommande samtal
[sub-call-from-cid-ended]

;; Vi meddelar om vÀrdena vid samtalsavslut
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)})

;; Samtalsstatus - Svar, inget svar...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return


;; Behandlare för utgÄende samtal - allt likadant
[outbound-allroutes-custom]

;; Inspelning
exten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Variabler
exten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})

;; Binder Hangup_Handler till samtalsavslutet
exten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))

;; Behandlare av avslutade utgÄende samtal
[sub-call-internal-ended]

;; variabler
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)})

;; Anropar skriptet som meddelar om samtalet i CRM - det Àr utgÄende, 
;; sÄ det faktiska avslutet
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

Funktionen och skillnaderna frÄn originaldialplanen frÄn författarna till den ursprungliga artikeln -

  • Dialplan i .conf-format, som FreePBX vill ha (ja, den kan hantera .ael, men inte alla versioner och inte alltid praktiskt)

  • IstĂ€llet för att hantera avslutningen genom exten=>h har hanteringen Ă€ndrats till hangup_handler, eftersom FreePBX-dialplanen bara fungerade med den

  • Anropet av skriptet har justerats, citat och extern nummer ExtNum har lagts till

  • Behandlingarna har flyttats till _custom-kontexter och tillĂ„ter att inte röra och redigera FreePBX-konfigurationer - inkommande genom [ext-did-custom], utgĂ„ende genom [outbound-allroutes-custom]

  • Det finns ingen koppling till nummer - filen Ă€r universell och krĂ€ver bara att sökvĂ€gen och lĂ€nken till servern stĂ€lls in

För att börja arbeta mÄste skripten slÀppas i AMI med inloggning och lösenord - för detta finns det ocksÄ en _custom-fil i FreePBX

Fil manager_custom.conf

;; detta Àr anvÀndarnamnet
[callmeplus]
;; detta Àr lösenordet
secret = trampampamturlala
deny = 0.0.0.0/0.0.0.0

;; jag arbetar med en lokal maskin - men om det behövs kan andra ocksÄ anges
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

Dessa tvÄ filer mÄste placeras i /etc/asterisk, och sedan mÄste konfigurationerna lÀsas om (eller Asterisk startas om)

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

Nu gÄr vi vidare till PHP

Initiering av skripten och skapande av tjÀnsten

Eftersom arbetsmetoden med Bitrix 24, tjÀnsten för AMI, inte Àr helt enkel och transparent, mÄste vi stanna vid den separat. Asterisk öppnar bara en port vid aktivering av AMI. NÀr en klient ansluter begÀr den autentisering, sedan prenumererar klienten pÄ de nödvÀndiga hÀndelserna. HÀndelserna kommer som ren text, som PAMI omvandlar till strukturerade objekt och möjliggör filtrering av intressanta hÀndelser, fÀlt, nummer, och sÄ vidare.

SÄ snart samtalet kommer in, intrÀffar hÀndelsen NewExten som börjar med överordnad kontext [from-pstn], och sedan följer alla hÀndelser i ordning baserat pÄ raderna i kontexterna. Vid mottagande av information frÄn de angivna i dialplanen _custom-variablerna CallMeCallerIDName och CallStart anropas

  1. Funktionen för att hÀmta UserID, motsvarande det interna numret dit samtalet kom. Och vad hÀnder om det Àr en gruppuppringning? Det Àr en politisk frÄga, vi behöver skapa en uppringning till alla samtidigt (nÀr alla ringer pÄ en gÄng) eller skapa samtal efter hand vid successiv uppringning? De flesta kunder har strategin First Available, sÄ det finns inga problem, det ringer bara en. Men frÄgan mÄste lösas.

  2. Funktionen för att registrera ett samtal i Bitrix24 som returnerar CallID, vilket sedan behövs för att rapportera samtalsparametrar och lÀnken till inspelningen. Den krÀver antingen ett internt nummer eller UserID.

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

Efter samtalets slut anropas funktionen för att ladda upp inspelningen, som samtidigt rapporterar status för avslutningen av samtalet (Upptaget, Inget svar, Lyckad), samt laddar ner lÀnken till mp3-filen med inspelningen (om det finns).

Eftersom modulen CallMeIn.php mÄste fungera kontinuerligt har en SystemD-startfil skapats för den. callme.service, som mÄste placeras i /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

# hÀr mÄste man titta pÄ vilka rÀttigheter som krÀvs för mapparna
#User=www-data  #Ubuntu - debian
#User=nginx #Centos

[Install]
WantedBy=multi-user.target

Initieringen och körningen av skriptet sker via systemctl eller service.

# systemctl enable callme
# systemctl start callme

TjÀnsten kommer att starta om sig sjÀlv vid behov (vid krasch). TjÀnsten för att övervaka inkommande samtal krÀver ingen installation av webserver, endast php behövs (vilket garanterat finns pÄ servern FeePBX). Men utan Ätkomst till samtalsinspelningar genom webserver (och via https) kommer det inte att vara möjligt att lyssna pÄ samtalsinspelningarna.

Nu talar vi om utgÄende samtal. Skriptet CallMeOut.php har tvÄ funktioner:

  • Initiering av samtalet nĂ€r en begĂ€ran skickas till php-skriptet (inklusive via knappen "Ring" i Bitrix). Utan webserver fungerar det inte, begĂ€ran skickas via HTTP POST dĂ€r token ingĂ„r.

  • Rapportering av samtalet, dess parametrar och inspelningar till Bitrix. Detta sker pĂ„ initiativ av Asterisk i dialplanen [sub-call-internal-ended] vid samtalets slut.

Vi gÄr igenom FreePBX och integrerar det med Bitrix24 och mycket mer

Webservern behövs endast för tvĂ„ saker – att ladda upp inspelningar till Bitrix (via HTTPS) och att anropa skriptet CallMeOut.php. Den inbyggda servern i FreePBX kan anvĂ€ndas, filerna för den finns i /var/www/html, man kan installera en annan server eller ange en annan sökvĂ€g.

Webserver

LÄt oss lÀmna konfigurationen av webbservern för sjÀlvstudier (klicka hÀr, klicka hÀr, klicka hÀr). Om du inte har en domÀn kan du prova FreeDomain( https://www.freenom.com/ru/index.html), som gratis ger dig ett namn för din vita IP (glöm inte att öppna portar 80, 443 via routern om den externa adressen finns endast dÀr). Om du just har skapat en DNS-domÀn mÄste du vÀnta (frÄn 15 minuter till 48 timmar) tills alla servrar har laddats. UtifrÄn erfarenhet med inhemska leverantörer - frÄn 1 timme till en dag.

Automatisering av installation

Utvecklingen av en installerare har pĂ„börjats pĂ„ GitHub, sĂ„ att det ska bli Ă€nnu enklare att installera. Men allt sĂ„g bra ut pĂ„ papper — just nu installerar vi allt manuellt, tack och lov har det blivit kristallklart efter att ha petat pĂ„ allt detta, vem som samarbetar, vart man gĂ„r och hur man felsöker. Det finns Ă€nnu ingen installerare (

Docker

Om du snabbt vill testa lösningen - finns det ett alternativ med Docker - snabbt skapa en container, öppna portar, lÀgga till konfigurationsfiler och försöka (detta alternativ Àr med LetsEncrypt-containern, om certifikatet redan finns, behöver man bara omdirigera revers proxy till webbservern FreePBX (vi gav den en annan port - 88), LetsEncrypt i Docker Àr inspirerat av denna artikel

Du mÄste köra filen i den nedladdade projektmappen (efter git clone), men först gÄ in i Asterisks konfigurationer (mappen asterisk) och ange dÀr vÀgarna till inspelningar och URL:en till din webbplats

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 # för konfiguration
      - 5060:5060\/udp
      - 5160:5160\/udp
      - 127.0.0.1:5038:5038 # för 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:

Den hÀr filen docker-compose.yaml körs via

docker-compose up -d

Om nginx inte har startat, betyder det att nÄgot Àr fel med konfigurationen i mappen nginx/ssl_docker.conf

Andra integrationer

Och varför inte ocksÄ lÀgga till nÄgra CRM-system i skripten, tÀnkte vi. Vi studerade flera API:er frÄn andra CRM-system, sÀrskilt den kostnadsfria som finns inbyggd i vissa PBX-system - ShugarCRM och Vtiger, och ja! det Àr möjligt, principen Àr densamma. Men det Àr en annan historia som vi senare kommer att ladda upp pÄ GitHub separat.

LĂ€nkar

AvrÄdan: eventuella likheter med verkligheten Àr pÄhittade och det var inte jag,

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster