FreePBX verstehen und mit Bitrix24 und mehr integrieren

Bitrix24 ist eine riesige Kombination, die CRM, Workflow, Buchhaltung und viele andere Dinge vereint, die Manager wirklich mögen und IT-Mitarbeiter nicht wirklich mögen. Das Portal wird von vielen kleinen und mittleren Unternehmen genutzt, darunter kleine Kliniken, Hersteller und sogar Schönheitssalons. Die Hauptfunktion, die Manager „lieben“, ist die Integration von Telefonie und CRM. Wenn jeder Anruf sofort im CRM aufgezeichnet wird, werden Kundenkarten erstellt, bei eingehenden Informationen werden Informationen über den Kunden angezeigt und Sie können sofort sehen, wer er ist und was er ist verkaufen kann und wie viel er schuldet. Aber Telefonie von Bitrix24 und ihre Integration mit CRM kostet Geld, manchmal sogar viel. In dem Artikel erzähle ich Ihnen von den Erfahrungen bei der Integration mit offenen Tools und der beliebten IP-PBX FreePBX, und berücksichtigen Sie auch die Logik der Arbeit verschiedener Teile

Ich arbeite als Outsourcer in einem Unternehmen, das IP-Telefonie verkauft, konfiguriert und integriert. Als ich gefragt wurde, ob wir diesem und diesem Unternehmen etwas anbieten könnten, um Bitrix24 mit PBX-Anlagen von Kunden sowie mit virtuellen PBX-Anlagen verschiedener VDS-Unternehmen zu integrieren, wandte ich mich an Google. Und natürlich hat er mir einen Link dazu gegeben Artikel in Habr, wo es eine Beschreibung und Github gibt, und alles scheint zu funktionieren. Beim Versuch, diese Lösung zu nutzen, stellte sich jedoch heraus, dass Bitrix24 nicht mehr dasselbe ist wie zuvor und vieles überarbeitet werden muss. Darüber hinaus ist FreePBX für Sie kein bloßes Asterisk, hier müssen Sie darüber nachdenken, wie Sie Benutzerfreundlichkeit und einen Hardcore-Wählplan in Konfigurationsdateien kombinieren können.

Wir studieren die Logik der Arbeit

Also für den Anfang, wie alles funktionieren sollte. Wenn ein Anruf von außen an der PBX eingeht (SIP INVITE-Ereignis vom Provider), beginnt die Verarbeitung des Wählplans (Wählplan, Dialplan) – die Regeln, was und in welcher Reihenfolge mit dem Anruf geschehen soll. Aus dem ersten Paket können viele Informationen gewonnen werden, die dann in den Regeln verwendet werden können. Ein hervorragendes Werkzeug zur Untersuchung der Interna von SIP ist der Analysator sngrep (Link), das in gängigen Distributionen einfach über apt install/yum install und dergleichen installiert wird, aber auch aus dem Quellcode erstellt werden kann. Schauen wir uns das Anrufprotokoll in sngrep an

FreePBX verstehen und mit Bitrix24 und mehr integrieren

In vereinfachter Form behandelt der Wählplan nur das erste Paket, manchmal auch während des Gesprächs, Anrufe werden weitergeleitet, Tastendrücke (DTMF), verschiedene interessante Dinge wie FollowMe, RingGroup, IVR und andere.

Was ist im Einladungspaket enthalten?

FreePBX verstehen und mit Bitrix24 und mehr integrieren

Tatsächlich arbeiten die meisten einfachen Wählpläne mit den ersten beiden Feldern und die gesamte Logik dreht sich um DID und CallerID. DID – wo wir anrufen, CallerID – wer anruft.

Aber schließlich haben wir eine Firma und nicht ein einziges Telefon – was bedeutet, dass die PBX höchstwahrscheinlich über Anrufgruppen (gleichzeitiges / aufeinanderfolgendes Klingeln mehrerer Geräte) für Stadtnummern (Ring Group), IVR (Hallo, Sie haben angerufen ...) verfügt eine für ...), Anrufbeantworter (Phrasen), Zeitbedingungen, Weiterleitung an andere Nummern oder an ein Mobiltelefon (FollowMe, Forward). Das bedeutet, dass es sehr schwierig ist, eindeutig zu bestimmen, wer einen Anruf tatsächlich entgegennimmt und mit wem ein Gespräch führt, wenn ein Anruf eintrifft. Hier ist ein Beispiel für den Beginn eines typischen Anrufs in der TK-Anlage unserer Kunden

FreePBX verstehen und mit Bitrix24 und mehr integrieren

Nachdem der Anruf erfolgreich bei der PBX eingegangen ist, durchläuft er den Wählplan in verschiedenen „Kontexten“. Der Kontext aus Sicht von Asterisk ist ein nummerierter Satz von Befehlen, von denen jeder einen Filter nach der gewählten Nummer enthält (er heißt exten, für einen externen Anruf in der Anfangsphase exten=DID). Die Befehle in der Dialplan-Zeile können alles sein - interne Funktionen (z. B. einen internen Teilnehmer anrufen - Dial(), Pack das Telephon weg - Hangup()), bedingte Operatoren (IF, ELSE, ExecIF und dergleichen), Übergänge zu anderen Regeln dieses Kontextes (Goto, GotoIF), Übergang in andere Kontexte in Form eines Funktionsaufrufs (Gosub, Macro). Eine separate Richtlinie include имя_контекста, Dadurch werden Befehle aus einem anderen Kontext am Ende des aktuellen Kontexts hinzugefügt. Über include eingebundene Befehle werden immer ausgeführt nach Befehle des aktuellen Kontexts.

Die gesamte Logik von FreePBX basiert auf der Einbeziehung verschiedener Kontexte ineinander durch Einbinden und Aufrufen über Gosub-, Makro- und Handler-Handler. Berücksichtigen Sie den Kontext eingehender FreePBX-Anrufe

FreePBX verstehen und mit Bitrix24 und mehr integrieren

Der Aufruf durchläuft nacheinander alle Kontexte von oben nach unten. In jedem Kontext kann es Aufrufe zu anderen Kontexten wie Makros (Macro), Funktionen (Gosub) oder einfach nur Übergängen (Goto) geben, sodass nur der eigentliche Baum dessen aufgerufen werden kann in den Protokollen nachverfolgt werden.

Ein typisches Setup-Diagramm für eine typische PBX-Anlage ist unten dargestellt. Beim Anruf wird in eingehenden Routen nach DID gesucht, temporäre Bedingungen dafür überprüft, wenn alles in Ordnung ist, wird das Sprachmenü gestartet. Von dort gelangen Sie durch Drücken der Taste 1 oder Timeout zur Gruppe der Wählbetreiber. Nach Beendigung des Anrufs wird das Makro „Hangupcall“ aufgerufen, woraufhin im Wählplan außer speziellen Handlern (Hangup-Handler) nichts mehr gemacht werden kann.

FreePBX verstehen und mit Bitrix24 und mehr integrieren

Wo in diesem Anrufalgorithmus sollten wir Informationen über den Beginn des Anrufs an CRM liefern, wo mit der Aufzeichnung begonnen werden soll, wo die Aufzeichnung enden und zusammen mit Informationen über den Anruf an CRM gesendet werden sollen?

Integration mit externen Systemen

Was ist PBX- und CRM-Integration? Dabei handelt es sich um Einstellungen und Programme, die Daten und Ereignisse zwischen diesen beiden Plattformen konvertieren und aneinander senden. Die gängigste Art der Kommunikation unabhängiger Systeme erfolgt über APIs, und der beliebteste Weg, auf APIs zuzugreifen, ist HTTP REST. Aber nicht für Asterisk.

In Asterisk ist:

  • AGI – synchroner Aufruf externer Programme/Komponenten, wird hauptsächlich im Dialplan verwendet, es gibt Bibliotheken wie phpagi, PAGI

  • AMI - ein Text-TCP-Socket, der nach dem Prinzip des Abonnierens von Ereignissen und der Eingabe von Textbefehlen funktioniert, von innen SMTP ähnelt, Ereignisse verfolgen und Anrufe verwalten kann, es gibt eine Bibliothek PAMI - am beliebtesten zum Herstellen einer Verbindung mit Asterisk

Beispiel für eine AMI-Ausgabe

Ereignis: Neuer Kanal
Privileg: Anruf, alle
Kanal: PJSIP/VMS_pjsip-0000078b
Kanalstatus: 4
ChannelStateDesc: Klingeln
Anrufer-ID-Nummer: 111222
Anrufer-ID-Name: 111222
ConnectedLineNum:
Name der verbundenen Leitung:
Sprache: en
Konto Code:
Kontext: from-pstn
Erweiterung: s
Priorität: 1
Eindeutige ID: 1599589046.5244
Verlinkte ID: 1599589046.5244

  • ARI ist eine Mischung aus beidem, alles über REST, WebSocket, im JSON-Format – aber mit frischen Bibliotheken und Wrappern, nicht sehr gut, wie man spontan fand (phparia, phpari), die in ihrer Entwicklung vor etwa 3 Jahren entstanden sind.

Beispiel einer ARI-Ausgabe, wenn ein Anruf initiiert wird

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

Bequemlichkeit oder Unannehmlichkeit, die Möglichkeit oder Unmöglichkeit, mit einer bestimmten API zu arbeiten, werden durch die zu lösenden Aufgaben bestimmt. Die Aufgaben für die Integration mit CRM sind wie folgt:

  • Verfolgen Sie den Beginn des Anrufs, wohin er weitergeleitet wurde, rufen Sie Anrufer-ID, DID, Start- und Endzeiten und möglicherweise Daten aus dem Verzeichnis ab (um nach einer Verbindung zwischen dem Telefon und dem CRM-Benutzer zu suchen).

  • Aufzeichnung des Gesprächs starten und beenden, im gewünschten Format speichern, am Ende der Aufzeichnung mitteilen, wo sich die Datei befindet

  • Starten Sie einen Anruf bei einem externen Ereignis (aus dem Programm), rufen Sie eine interne Nummer und eine externe Nummer an und verbinden Sie sie

  • Optional: Integration mit CRM, Dialer-Gruppen und FollowME für die automatische Weiterleitung von Anrufen bei Abwesenheit eines Ortes (laut CRM)

Alle diese Aufgaben können durch AMI oder ARI gelöst werden, aber ARI liefert viel weniger Informationen, es gibt nicht viele Ereignisse, viele Variablen, die AMI noch hat (z. B. Makroaufrufe, Festlegen von Variablen innerhalb von Makros, einschließlich Anrufaufzeichnung), werden nicht verfolgt. Für eine korrekte und genaue Nachverfolgung wählen wir daher zunächst AMI (aber nicht vollständig). Außerdem (na ja, wo wäre es ohne das, wir sind faule Leute) - im Originalwerk (Artikel in Habr) Verwenden Sie PAMI. *Dann müssen Sie versuchen, ARI umzuschreiben, aber nicht die Tatsache, dass es funktionieren wird.

Integration neu erfinden

Damit unsere FreePBX AMI auf einfache Weise über den Beginn des Anrufs, die Endzeit, Nummern und Namen der aufgezeichneten Dateien berichten kann, ist es am einfachsten, die Dauer des Anrufs mit dem gleichen Trick wie die ursprünglichen Autoren zu berechnen - Geben Sie Ihre Variablen ein und analysieren Sie die Ausgabe auf deren Vorhandensein. PAMI schlägt vor, dies einfach über eine Filterfunktion zu tun.

Hier ist ein Beispiel für das Festlegen einer eigenen Variablen für die Startzeit des Anrufs (s ist eine spezielle Nummer im Wählplan, die VOR dem Start der DID-Suche ausgeführt wird).

[ext-did-custom]

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

Ein Beispiel-AMI-Ereignis für diese Zeile

Ereignis: Neuer Kanal

Privileg: Anruf, alle

Kanal: PJSIP/VMS_pjsip-0000078b

Kanalstatus: 4

ChannelStateDesc: Klingeln

Anrufer-ID-Nummer: 111222

Anrufer-ID-Name: 111222

ConnectedLineNum:

Name der verbundenen Leitung:

Sprache: en

Konto Code:

Kontext: from-pstn

Erweiterung: s

Priorität: 1

Eindeutige ID: 1599589046.5244

Verlinkte ID: 1599589046.5244

Anwendung: AppData festlegen:

CallStart=1599571046

Weil FreePBX die Dateien extension.conf und extension_ überschreibt„additional.conf“ verwenden wir die Datei Erweiterung_Original.conf

Vollständiger Code von 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

Merkmal und Unterschied zum Original-Wählplan der Autoren des Originalartikels -

  • Dialplan im .conf-Format, wie FreePBX es möchte (ja, es kann .ael, aber nicht alle Versionen und es ist nicht immer praktisch)

  • Anstatt das Ende über exten=>h zu verarbeiten, wurde die Verarbeitung über den hangup_handler eingeführt, da der FreePBX-Wählplan nur damit funktionierte

  • Skript-Anrufzeichenfolge korrigiert, Anführungszeichen und externe Rufnummer ExtNum hinzugefügt

  • Die Verarbeitung wird in _custom-Kontexte verschoben und ermöglicht es Ihnen, FreePBX-Konfigurationen nicht zu berühren oder zu bearbeiten – eingehend über [ext-did-custom], ausgehend über [Outbound-Allroutes-Custom]

  • Keine Bindung an Zahlen – die Datei ist universell und muss nur für den Pfad und die Verbindung zum Server konfiguriert werden

Um zu beginnen, müssen Sie außerdem Skripte in AMI mit Login und Passwort ausführen – dafür verfügt FreePBX auch über eine _custom-Datei

manager_custom.conf-Datei

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

Beide Dateien müssen in /etc/asterisk abgelegt werden, dann die Konfigurationen erneut lesen (oder den Asterisk neu starten)

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

Kommen wir nun zu PHP

Skripte initialisieren und einen Dienst erstellen

Da das Schema für die Arbeit mit Bitrix 24, einem Dienst für AMI, nicht ganz einfach und transparent ist, muss es gesondert besprochen werden. Asterisk öffnet bei aktiviertem AMI einfach den Port und fertig. Wenn ein Client beitritt, fordert er eine Autorisierung an und abonniert dann die erforderlichen Ereignisse. Ereignisse liegen im Klartext vor, den PAMI in strukturierte Objekte umwandelt und die Möglichkeit bietet, die Filterfunktion nur für Ereignisse von Interesse, Felder, Zahlen usw. festzulegen.

Sobald der Anruf eingeht, wird das NewExten-Ereignis ausgehend vom übergeordneten [from-pstn]-Kontext ausgelöst. Anschließend werden alle Ereignisse in der Reihenfolge der Zeilen in den Kontexten ausgeführt. Wenn Informationen von den im _custom-Wählplan angegebenen CallMeCallerIDName- und CallStart-Variablen empfangen werden, wird die

  1. Die Funktion zum Anfordern der Benutzer-ID, die der Nebenstellennummer entspricht, unter der der Anruf eingegangen ist. Was ist, wenn es sich um eine Einwahlgruppe handelt? Die Frage ist politisch: Müssen Sie einen Anruf an alle gleichzeitig erstellen (wenn alle gleichzeitig anrufen) oder so erstellen, dass sie anrufen, wenn sie der Reihe nach anrufen? Die meisten Clients verfügen über die Strategie „Fisrt Available“, sodass es kein Problem damit gibt, nur einer ruft an. Aber das Problem muss gelöst werden.

  2. Die Anrufregistrierungsfunktion in Bitrix24, die die CallID zurückgibt, die dann zur Meldung der Anrufparameter und eines Links zur Aufzeichnung benötigt wird. Erfordert entweder eine Nebenstellennummer oder eine Benutzer-ID

FreePBX verstehen und mit Bitrix24 und mehr integrieren

Nach Beendigung des Anrufs wird die Funktion zum Herunterladen der Aufzeichnung aufgerufen, die gleichzeitig den Status des Anrufabschlusses meldet (Besetzt, Keine Antwort, Erfolgreich) und außerdem einen Link zur MP3-Datei mit der Aufzeichnung (falls vorhanden) herunterlädt.

Da das CallMeIn.php-Modul kontinuierlich ausgeführt werden muss, wurde eine SystemD-Startdatei dafür erstellt callme.service, die in /etc/systemd/system/callme.service abgelegt werden muss

[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

Die Initialisierung und der Start des Skripts erfolgen über systemctl oder service

# systemctl enable callme
# systemctl start callme

Der Dienst startet sich bei Bedarf neu (bei Abstürzen). Für den Inbox-Tracking-Dienst muss kein Webserver installiert werden, es wird lediglich PHP benötigt (das sich definitiv auf dem FeePBX-Server befindet). Ohne Zugriff auf Anrufaufzeichnungen über den Webserver (auch mit https) ist es jedoch nicht möglich, Anrufaufzeichnungen abzuhören.

Lassen Sie uns nun über ausgehende Anrufe sprechen. Das CallMeOut.php-Skript hat zwei Funktionen:

  • Einleiten eines Anrufs, wenn eine Anfrage für ein PHP-Skript eingeht (einschließlich der Verwendung der Schaltfläche „Anrufen“ in Bitrix selbst). Ohne Webserver geht es nicht, die Anfrage kommt per HTTP POST, die Anfrage enthält ein Token

  • Nachricht über den Anruf, seine Parameter und Datensätze in Bitrix. Wird von Asterisk im Wählplan [sub-call-internal-ended] ausgelöst, wenn ein Anruf beendet wird

FreePBX verstehen und mit Bitrix24 und mehr integrieren

Der Webserver wird nur für zwei Dinge benötigt – zum Herunterladen von Bitrix-Datensatzdateien (über HTTPS) und zum Aufrufen des CallMeOut.php-Skripts. Sie können den integrierten FreePBX-Server verwenden, dessen Dateien /var/www/html sind, Sie können einen anderen Server installieren oder einen anderen Pfad angeben.

Webserver

Überlassen wir das Webserver-Setup dem unabhängigen Studium (tyts, tyts, tyts). Wenn Sie keine Domain haben, können Sie FreeDomain( https://www.freenom.com/ru/index.html), wodurch Sie einen freien Namen für Ihre weiße IP erhalten (vergessen Sie nicht, die Ports 80, 443 über den Router weiterzuleiten, wenn die externe Adresse nur darauf liegt). Wenn Sie gerade eine DNS-Domäne erstellt haben, müssen Sie warten (zwischen 15 Minuten und 48 Stunden), bis alle Server geladen sind. Je nach Erfahrung in der Zusammenarbeit mit inländischen Anbietern - von 1 Stunde bis zu einem Tag.

Installationsautomatisierung

Um die Installation noch einfacher zu machen, wurde auf Github ein Installer entwickelt. Aber auf dem Papier verlief alles reibungslos – während wir alles manuell installierten, denn nachdem wir daran herumgebastelt hatten, wurde glasklar, was mit wem befreundet ist, wer wohin geht und wie man es debuggt. Es gibt noch kein Installationsprogramm

Docker

Wenn Sie die Lösung schnell ausprobieren möchten – es gibt eine Option mit Docker – erstellen Sie schnell einen Container, geben Sie ihm Ports nach außen, schieben Sie die Einstellungsdateien hinein und versuchen Sie es (dies ist die Option mit dem LetsEncrypt-Container, wenn Sie bereits ein Zertifikat haben, Sie Sie müssen lediglich den Reverse-Proxy auf den FreePBX-Webserver umleiten (wir haben ihm einen anderen Port gegeben, nämlich 88), basierend auf LetsEncrypt im Docker dieser Artikel

Sie müssen die Datei im heruntergeladenen Projektordner (nach dem Git-Klon) ausführen, gehen aber zuerst in die Asterisk-Konfigurationen (Asterisk-Ordner) und schreiben dort die Pfade zu den Datensätzen und die URL Ihrer Site

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:

Diese docker-compose.yaml-Datei wird über ausgeführt

docker-compose up -d

Wenn nginx nicht startet, stimmt etwas mit der Konfiguration im Ordner nginx/ssl_docker.conf nicht

Andere Integrationen

Und warum nicht gleichzeitig etwas CRM in Skripte integrieren, dachten wir. Wir haben mehrere andere CRM-APIs untersucht, insbesondere die kostenlose integrierte PBX – ShugarCRM und Vtiger, und ja! ja, das Prinzip ist das gleiche. Aber das ist eine andere Geschichte, die wir später separat auf Github hochladen werden.

Referenzen

Haftungsausschluss: Jegliche Ähnlichkeit mit der Realität ist fiktiv und stammt nicht von mir.

Source: habr.com

Kommentar hinzufügen