Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

Bitrix24 to ogromny kombajn, który łączy w sobie CRM, workflow, księgowość i wiele innych rzeczy, które bardzo lubią menedżerowie, a których nie lubią pracownicy IT. Z portalu korzysta wiele małych i średnich firm, w tym małe kliniki, producenci, a nawet salony kosmetyczne. Główną funkcją, którą „uwielbiają” menedżerowie, jest integracja telefonii i CRM, kiedy każde połączenie jest natychmiast rejestrowane w CRM, tworzone są karty klientów, przy przychodzącym wyświetlana jest informacja o kliencie i od razu widać, kim jest, co robi może sprzedać i ile jest winien. Ale telefonia z Bitrix24 i jej integracja z CRM kosztuje, czasem bardzo dużo. W artykule opowiem o doświadczeniach z integracji z otwartymi narzędziami i popularną IP PBX Bezpłatna centrala PBX, a także rozważyć logikę pracy różnych części

Pracuję jako outsourcer w firmie zajmującej się sprzedażą i konfiguracją, integracją telefonii IP. Kiedy zapytano mnie, czy moglibyśmy zaoferować coś tej i tej firmie, aby zintegrować Bitrix24 z PBX, które mają klienci, a także z wirtualnymi PBX w różnych firmach VDS, udałem się do Google. I oczywiście dał mi link do artykuł w hab, gdzie jest opis i github, i wszystko wydaje się działać. Jednak przy próbie skorzystania z tego rozwiązania okazało się, że Bitrix24 nie jest już taki sam jak wcześniej i wiele wymaga przerobienia. Ponadto FreePBX nie jest dla Ciebie czystą gwiazdką, tutaj musisz pomyśleć o tym, jak połączyć łatwość obsługi i hardcorowy plan wybierania numerów w plikach konfiguracyjnych.

Studiujemy logikę pracy

Więc na początek, jak to wszystko powinno działać. W momencie odebrania połączenia spoza centrali (zdarzenie SIP INVITE od operatora) rozpoczyna się przetwarzanie planu wybierania (dialplan, dialplan) - czyli zasad co iw jakiej kolejności zrobić z połączeniem. Z pierwszego pakietu można uzyskać wiele informacji, które następnie można wykorzystać w regulaminie. Doskonałym narzędziem do badania wewnętrznych elementów SIP jest analizator sngrep (łącze), który jest po prostu instalowany w popularnych dystrybucjach przez apt install/yum install i tym podobne, ale można go również zbudować ze źródła. Spójrzmy na dziennik połączeń w sngrep

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

W uproszczeniu dialplan zajmuje się tylko pierwszym pakietem, czasami także w trakcie rozmowy, przekierowywane są połączenia, naciśnięcia klawiszy (DTMF), różne ciekawostki jak FollowMe, RingGroup, IVR i inne.

Co znajduje się w pakiecie zaproszeń

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

W rzeczywistości większość prostych planów wybierania działa z dwoma pierwszymi polami, a cała logika obraca się wokół DID i CallerID. DID - gdzie dzwonimy, CallerID - kto dzwoni.

Ale przecież mamy firmę a nie jeden telefon - co oznacza, że ​​centrala najprawdopodobniej ma grupy połączeń (jednoczesne/kolejne dzwonienie kilku urządzeń) na numery miast (Ring Group), IVR (Cześć, dzwoniłeś... Naciśnij jeden dla...), automatyczne sekretarki (zwroty), warunki czasowe, przekierowywanie na inne numery lub na komórkę (FollowMe, Forward). Oznacza to, że bardzo trudno jest jednoznacznie określić, kto faktycznie odbierze połączenie iz kim będzie rozmawiał, gdy nadejdzie połączenie. Oto przykład rozpoczęcia typowego połączenia w centralach naszych klientów

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

Po pomyślnym wejściu do centrali PBX połączenie przechodzi przez plan wybierania numerów w różnych „kontekstach”. Kontekst z punktu widzenia Asterisk to ponumerowany zestaw komend, z których każda zawiera filtr po wybranym numerze (nazywa się to exten, dla połączenia zewnętrznego na początkowym etapie exten=DID). Polecenia w linii planu wybierania mogą być dowolne - funkcje wewnętrzne (na przykład zadzwoń do abonenta wewnętrznego - Dial(), odłożył słuchawkę - Hangup()), operatory warunkowe (IF, ELSE, ExecIF i tym podobne), przejścia do innych reguł tego kontekstu (Goto, GotoIF), przejście do innych kontekstów w postaci wywołania funkcji (Gosub, Macro). Oddzielna dyrektywa include имя_контекста, który dodaje polecenia z innego kontekstu na koniec bieżącego kontekstu. Polecenia dołączone przez include są zawsze wykonywane później polecenia bieżącego kontekstu.

Cała logika FreePBX opiera się na włączaniu różnych kontekstów do siebie poprzez dołączanie i wywoływanie przez moduły obsługi Gosub, Macro i Handler. Rozważ kontekst przychodzących połączeń FreePBX

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

Wywołanie przechodzi kolejno przez wszystkie konteksty od góry do dołu, w każdym kontekście mogą występować wywołania do innych kontekstów, takich jak makra (Makro), funkcje (Gosub) lub po prostu przejścia (Goto), więc prawdziwe drzewo tego, co się nazywa, może być śledzone w dziennikach.

Poniżej przedstawiono typowy schemat konfiguracji typowej centrali PBX. Podczas dzwonienia DID jest wyszukiwany na trasach przychodzących, sprawdzane są tymczasowe warunki, jeśli wszystko jest w porządku, uruchamiane jest menu głosowe. Z niego, naciskając przycisk 1 lub limit czasu, wyjdź do grupy wybierających operatorów. Po zakończeniu połączenia wywoływane jest makro hangupcall, po którym nic nie można zrobić w planie wybierania, z wyjątkiem specjalnych programów obsługi (program obsługi rozłączenia).

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

Gdzie w tym algorytmie połączenia podać informację o rozpoczęciu połączenia do CRM, gdzie rozpocząć nagrywanie, gdzie zakończyć nagrywanie i przesłać je wraz z informacją o połączeniu do CRM?

Integracja z systemami zewnętrznymi

Na czym polega integracja PBX i CRM? Są to ustawienia i programy, które konwertują dane i zdarzenia między tymi dwiema platformami i przesyłają je do siebie. Najpopularniejszym sposobem komunikacji niezależnych systemów są interfejsy API, a najpopularniejszym sposobem uzyskiwania dostępu do interfejsów API jest HTTP REST. Ale nie dla gwiazdki.

Wewnątrz gwiazdki znajduje się:

  • AGI - synchroniczne wywołanie zewnętrznych programów/komponentów, używane głównie w dialplanie, są biblioteki typu phpag, PAGI

  • AMI - tekstowe gniazdo TCP, które działa na zasadzie subskrybowania zdarzeń i wprowadzania poleceń tekstowych, od środka przypomina SMTP, może śledzić zdarzenia i zarządzać połączeniami, jest biblioteka PAMI - najpopularniejszy do tworzenia połączenia z Asterisk

Przykład wyjścia AMI

Wydarzenie: nowy kanał
Przywilej: zadzwoń, wszyscy
Kanał: PJSIP/VMS_pjsip-0000078b
Stan kanału: 4
ChannelStateDesc: Dzwonek
Numer dzwoniącego: 111222
Identyfikator dzwoniącego: 111222
Połączona liczba linii:
połączona nazwa linii:
Język: en
kod do konta:
Kontekst: z-pstn
Rozszerz: s
Priorytet: 1
Unikalny identyfikator: 1599589046.5244
Linkowany identyfikator: 1599589046.5244

  • ARI to mieszanka obu, wszystko za pośrednictwem REST, WebSocket, w formacie JSON - ale ze świeżymi bibliotekami i opakowaniami, niezbyt dobrymi, znalezionymi od ręki (pharia, phpari), które stały się w ich rozwoju około 3 lata temu.

Przykład wyjścia ARI po zainicjowaniu połączenia

{ "variable": "CallMeCallerIDName", "value": "111222", "type": "ChannelVarset", "timestamp": "2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «nazwa»:»PJSIP/VMSpjsip-000007b6″, "state": "Dzwonek", "dzwoniący":{ "nazwa":"111222″, "number":"111222″ }, "connected":{ "name":"", "number" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Zastój", "aplikacjadata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "język":"en" }, "gwiazdkaid":"48:5b:aa:aa:aa:aa", "aplikacja":"witaj świecie" }

Wygoda lub niedogodność, możliwość lub niemożność pracy z określonym API są określane przez zadania, które należy rozwiązać. Zadania do integracji z CRM to:

  • Śledź początek połączenia, gdzie zostało przekazane, wyciągnij CallerID, DID, czas rozpoczęcia i zakończenia, może dane z książki telefonicznej (aby wyszukać połączenie między telefonem a użytkownikiem CRM)

  • Rozpocznij i zakończ nagrywanie rozmowy, zapisz je w wybranym formacie, poinformuj na końcu nagrania, gdzie znajduje się plik

  • Zainicjuj połączenie na zdarzenie zewnętrzne (z programu), zadzwoń na numer wewnętrzny, numer zewnętrzny i połącz je

  • Opcjonalny: integracja z CRM, grupami dialerów i FollowME w celu automatycznego przekazywania połączeń w przypadku braku miejsca (zgodnie z CRM)

Wszystkie te zadania można rozwiązać za pomocą AMI lub ARI, ale ARI dostarcza znacznie mniej informacji, nie ma wielu zdarzeń, wiele zmiennych, które wciąż ma AMI (na przykład wywołania makr, ustawianie zmiennych w makrach, w tym nagrywanie rozmów) nie jest śledzonych. Dlatego dla poprawnego i dokładnego śledzenia wybierzmy na razie AMI (ale nie do końca). Ponadto (cóż, gdzie by to było bez tego, jesteśmy leniwymi ludźmi) - w oryginalnej pracy (artykuł w hab) użyj PAMI. *Następnie musisz spróbować przepisać do ARI, ale nie fakt, że będzie działać.

Integracja na nowo

Aby nasza FreePBX mogła w prosty sposób raportować do AMI o rozpoczęciu rozmowy, czasie jej zakończenia, numerach, nazwach nagranych plików, najłatwiej jest obliczyć czas trwania rozmowy, stosując ten sam trik, co oryginalni autorzy - wprowadź swoje zmienne i przeanalizuj dane wyjściowe pod kątem ich obecności. PAMI sugeruje zrobienie tego po prostu za pomocą funkcji filtrowania.

Oto przykład ustawienia własnej zmiennej dla czasu rozpoczęcia połączenia (s to specjalny numer w planie wybierania, który jest wykonywany PRZED rozpoczęciem wyszukiwania DID)

[ext-did-custom]

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

Przykładowe zdarzenie AMI dla tej linii

Wydarzenie: nowy kanał

Przywilej: zadzwoń, wszyscy

Kanał: PJSIP/VMS_pjsip-0000078b

Stan kanału: 4

ChannelStateDesc: Dzwonek

Numer dzwoniącego: 111222

Identyfikator dzwoniącego: 111222

Połączona liczba linii:

połączona nazwa linii:

Język: en

kod do konta:

Kontekst: z-pstn

Rozszerz: s

Priorytet: 1

Unikalny identyfikator: 1599589046.5244

Linkowany identyfikator: 1599589046.5244

Aplikacja: Ustaw dane aplikacji:

Początek połączenia=1599571046

Ponieważ FreePBX nadpisuje pliki extension.conf i extension_extra.conf, użyjemy tego pliku rozszerzenie_zwyczaj.konf

Pełny kod pliku 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

Cecha i różnica w stosunku do oryginalnego planu wybierania autorów oryginalnego artykułu -

  • Dialplan w formacie .conf, jak chce FreePBX (tak, może .ael, ale nie we wszystkich wersjach i nie zawsze jest to wygodne)

  • Zamiast przetwarzania końca przez exten=>h, przetwarzanie zostało wprowadzone przez hangup_handler, ponieważ dialplan FreePBX działał tylko z nim

  • Naprawiono ciąg wywołania skryptu, dodano cudzysłowy i numer połączenia zewnętrznego ExtNum

  • Przetwarzanie zostało przeniesione do _niestandardowych kontekstów i pozwala nie dotykać ani nie edytować konfiguracji FreePBX — przychodzące przez [ext-do-custom], wychodzące przez [wychodzące-allroutes-niestandardowe]

  • Brak powiązania z liczbami - plik jest uniwersalny i wymaga jedynie skonfigurowania ścieżki i łącza do serwera

Aby rozpocząć, musisz także uruchomić skrypty w AMI za pomocą loginu i hasła - w tym celu FreePBX ma również plik _custom

plik 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

Oba te pliki należy umieścić w /etc/asterisk, a następnie ponownie przeczytać konfiguracje (lub ponownie uruchomić gwiazdkę)

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

Przejdźmy teraz do PHP

Inicjowanie skryptów i tworzenie usługi

Ponieważ schemat pracy z Bitrix 24, usługą dla AMI, nie jest całkowicie prosty i przejrzysty, należy go omówić osobno. Asterisk, gdy AMI jest aktywowany, po prostu otwiera port i to wszystko. Gdy klient dołącza, żąda autoryzacji, a następnie subskrybuje niezbędne zdarzenia. Zdarzenia mają postać zwykłego tekstu, który PAMI konwertuje na obiekty strukturalne i zapewnia możliwość ustawienia funkcji filtrowania tylko dla interesujących nas zdarzeń, pól, liczb itp.

Gdy tylko nadejdzie wywołanie, zdarzenie NewExten jest uruchamiane, zaczynając od kontekstu nadrzędnego [from-pstn], a następnie wszystkie zdarzenia idą w kolejności wierszy w kontekstach. Po otrzymaniu informacji ze zmiennych CallMeCallerIDName i CallStart określonych w niestandardowym planie wybierania numerów,

  1. Funkcja żądania UserID odpowiadającego numerowi wewnętrznemu, z którego nadeszło połączenie. A jeśli to grupa dial-up? Pytanie jest polityczne, czy musisz utworzyć połączenie do wszystkich naraz (gdy wszyscy dzwonią na raz), czy utworzyć, gdy dzwonią, dzwoniąc po kolei? Większość klientów ma strategię First Available, więc nie ma z tym problemu, tylko jedno połączenie. Ale problem musi zostać rozwiązany.

  2. Funkcja rejestracji połączeń w Bitrix24, która zwraca CallID, który jest następnie wymagany do zgłoszenia parametrów rozmowy i linku do nagrania. Wymaga numeru wewnętrznego lub identyfikatora użytkownika

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

Po zakończeniu połączenia wywoływana jest funkcja pobierania nagrania, która jednocześnie informuje o stanie realizacji połączenia (Zajęty, Brak odpowiedzi, Sukces), a także pobiera link do pliku mp3 z nagraniem (jeśli istnieje).

Ponieważ moduł CallMeIn.php musi działać nieprzerwanie, utworzono dla niego plik startowy SystemD Zadzwoń do mnie.usługa, który należy umieścić w /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

inicjalizacja i uruchomienie skryptu następuje przez systemctl lub service

# systemctl enable callme
# systemctl start callme

Usługa uruchomi się ponownie w razie potrzeby (w przypadku awarii). Usługa śledzenia skrzynki odbiorczej nie wymaga instalacji serwera WWW, potrzebny jest tylko php (który zdecydowanie znajduje się na serwerze FeePBX). Jednak w przypadku braku dostępu do nagrań rozmów przez serwer WWW (również przez https), nie będzie możliwości odsłuchania nagrań rozmów.

Porozmawiajmy teraz o połączeniach wychodzących. Skrypt CallMeOut.php ma dwie funkcje:

  • Inicjowanie połączenia po otrzymaniu żądania skryptu php (w tym użycie przycisku „Zadzwoń” w samym Bitrixie). Nie działa bez serwera WWW, żądanie jest odbierane przez HTTP POST, żądanie zawiera token

  • Wiadomość o połączeniu, jego parametrach i zapisach w Bitrixie. Uruchamiany przez Asterisk w planie połączeń [sub-call-internal-ended] po zakończeniu połączenia

Zrozumienie FreePBX i integracja z Bitrix24 i nie tylko

Serwer WWW jest potrzebny tylko do dwóch rzeczy - pobierania plików rekordów Bitrix (przez HTTPS) i wywoływania skryptu CallMeOut.php. Możesz skorzystać z wbudowanego serwera FreePBX, dla którego pliki to /var/www/html, możesz zainstalować inny serwer lub podać inną ścieżkę.

serwer internetowy

Pozostawmy konfigurację serwera WWW do niezależnej analizy (tyt, tyt, tyt). Jeśli nie masz domeny, możesz wypróbować FreeDomain( https://www.freenom.com/ru/index.html), co da ci darmową nazwę dla twojego białego adresu IP (nie zapomnij przekierować portów 80, 443 przez router, jeśli adres zewnętrzny jest tylko na nim). Jeśli właśnie utworzyłeś domenę DNS, musisz poczekać (od 15 minut do 48 godzin), aż wszystkie serwery zostaną załadowane. Zgodnie z doświadczeniem w pracy z dostawcami krajowymi - od 1 godziny do dnia.

Automatyzacja instalacji

Instalator został opracowany na github, aby instalacja była jeszcze łatwiejsza. Ale na papierze było gładko - podczas gdy instalowaliśmy to wszystko ręcznie, ponieważ po majstrowaniu przy tym wszystkim stało się krystalicznie jasne, z kim są przyjaciele, kto idzie gdzie i jak to debugować. Nie ma jeszcze instalatora

Doker

Jeśli chcesz szybko wypróbować rozwiązanie - jest taka opcja z Dockerem - szybko utwórz kontener, wyprowadź go na zewnątrz, wsuń pliki ustawień i spróbuj (jest to opcja z kontenerem LetsEncrypt, jeśli masz już certyfikat , wystarczy przekierować odwrotne proxy do serwera WWW FreePBX (daliśmy mu inny port to 88), LetsEncrypt w dockerze na podstawie ten artykuł

Musisz uruchomić plik w pobranym folderze projektu (po git clone), ale najpierw wejdź do konfiguracji gwiazdki (folder gwiazdki) i wpisz tam ścieżki do rekordów i adres URL swojej witryny

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:

Ten plik docker-compose.yaml jest uruchamiany przez

docker-compose up -d

Jeśli nginx się nie uruchamia, to coś jest nie tak z konfiguracją w folderze nginx/ssl_docker.conf

Inne integracje

Pomyśleliśmy, że dlaczego nie umieścić jednocześnie CRM w skryptach. Przebadaliśmy kilka innych interfejsów API CRM, zwłaszcza bezpłatną wbudowaną PBX - ShugarCRM i Vtiger, i tak! tak, zasada jest ta sama. Ale to już inna historia, którą później osobno wrzucimy na github.

referencje

Zastrzeżenie: Wszelkie podobieństwo do rzeczywistości jest fikcyjne i nie byłem to ja.

Źródło: www.habr.com

Dodaj komentarz