Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Bitrix24 ialah gabungan besar yang menggabungkan CRM, aliran kerja, perakaunan dan banyak perkara lain yang sangat disukai oleh pengurus dan kakitangan IT tidak begitu suka. Portal ini digunakan oleh banyak syarikat kecil dan sederhana, termasuk klinik kecil, pengilang dan juga salun kecantikan. Fungsi utama yang "sukai" oleh pengurus ialah penyepaduan telefon dan CRM, apabila sebarang panggilan direkodkan dengan serta-merta dalam CRM, kad pelanggan dibuat, apabila masuk, maklumat tentang pelanggan dipaparkan dan anda boleh segera melihat siapa dia, apa dia. boleh jual dan berapa banyak hutangnya. Tetapi telefon dari Bitrix24 dan penyepaduannya dengan CRM memerlukan wang, kadangkala banyak. Dalam artikel saya akan memberitahu anda pengalaman menyepadukan dengan alat terbuka dan IP PBX yang popular FreePBX, dan juga pertimbangkan logik kerja pelbagai bahagian

Saya bekerja sebagai penyumber luar dalam syarikat yang menjual dan mengkonfigurasi, menyepadukan telefon IP. Apabila saya ditanya sama ada kami boleh menawarkan sesuatu kepada syarikat ini dan ini untuk menyepadukan Bitrix24 dengan PBX yang pelanggan miliki, serta dengan PBX maya pada pelbagai syarikat VDS, saya pergi ke Google. Dan sudah tentu dia memberi saya pautan ke artikel dalam habr, di mana terdapat penerangan, dan github, dan segala-galanya nampaknya berfungsi. Tetapi apabila cuba menggunakan penyelesaian ini, ternyata Bitrix24 tidak lagi seperti dahulu, dan banyak yang perlu dibuat semula. Di samping itu, FreePBX bukanlah asterisk kosong untuk anda, di sini anda perlu memikirkan cara menggabungkan kemudahan penggunaan dan pelan dail tegar dalam fail konfigurasi.

Kami mengkaji logik kerja

Jadi sebagai permulaan, bagaimana ia sepatutnya berfungsi. Apabila panggilan diterima dari luar di PBX (acara SIP INVITE daripada pembekal), pemprosesan pelan dail (pelan dail, pelan dail) bermula - peraturan tentang apa dan dalam susunan apa yang perlu dilakukan dengan panggilan. Dari paket pertama, anda boleh mendapatkan banyak maklumat, yang kemudiannya boleh digunakan dalam peraturan. Alat yang sangat baik untuk mengkaji dalaman SIP ialah penganalisis sngrep (pautan) yang hanya dipasang dalam pengedaran popular melalui apt install/yum install dan seumpamanya, tetapi juga boleh dibina daripada sumber. Mari lihat log panggilan dalam sngrep

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Dalam bentuk yang mudah, pelan dail hanya berurusan dengan paket pertama, kadangkala juga semasa perbualan, panggilan dipindahkan, menekan butang (DTMF), pelbagai perkara menarik seperti FollowMe, RingGroup, IVR dan lain-lain.

Apa yang ada di dalam Pek Jemputan

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Sebenarnya, kebanyakan pelan dail mudah berfungsi dengan dua medan pertama, dan keseluruhan logik berkisar pada DID dan CallerID. JPS - tempat kami memanggil, CallerID - siapa yang memanggil.

Tetapi selepas semua, kami mempunyai syarikat dan bukan satu telefon - yang bermaksud bahawa PBX kemungkinan besar mempunyai kumpulan panggilan (deringan serentak / berturut-turut beberapa peranti) pada nombor bandar (Kumpulan Dering), IVR (Hello, anda menelefon ... Tekan satu untuk ...), Mesin menjawab ( Frasa), Keadaan Masa, Majukan ke nombor lain atau ke sel (Ikut Saya, Maju). Ini bermakna sangat sukar untuk menentukan dengan jelas siapa sebenarnya yang akan menerima panggilan dan siapa yang akan bercakap dengannya apabila panggilan tiba. Berikut ialah contoh permulaan panggilan biasa dalam PBX pelanggan kami

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Selepas panggilan berjaya memasuki PBX, ia bergerak melalui pelan dail dalam "konteks" yang berbeza. Konteks dari sudut pandangan Asterisk ialah set perintah bernombor, setiap satunya mengandungi penapis mengikut nombor yang didail (ia dipanggil exten, untuk panggilan luaran pada peringkat awal exten=DID). Perintah dalam talian pelan dail boleh berupa apa sahaja - fungsi dalaman (contohnya, hubungi pelanggan dalaman - Dial(), letak telefon - Hangup()), pengendali bersyarat (IF, ELSE, ExecIF dan seumpamanya), peralihan kepada peraturan lain dalam konteks ini (Goto, GotoIF), peralihan kepada konteks lain dalam bentuk panggilan fungsi (Gosub, Makro). Arahan yang berasingan include имя_контекста, yang menambah arahan daripada konteks lain ke penghujung konteks semasa. Perintah yang disertakan melalui include sentiasa dilaksanakan selepas arahan konteks semasa.

Keseluruhan logik FreePBX dibina berdasarkan kemasukan konteks yang berbeza antara satu sama lain melalui sertakan dan panggilan melalui pengendali Gosub, Makro dan Pengendali. Pertimbangkan konteks panggilan FreePBX masuk

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Panggilan melalui semua konteks dari atas ke bawah secara bergilir-gilir, dalam setiap konteks boleh terdapat panggilan ke konteks lain seperti makro (Makro), fungsi (Gosub) atau hanya peralihan (Goto), jadi pokok sebenar apa yang dipanggil hanya boleh dikesan dalam log.

Gambar rajah persediaan biasa untuk PBX biasa ditunjukkan di bawah. Apabila memanggil, JPS dicari dalam laluan masuk, keadaan sementara diperiksa untuknya, jika semuanya teratur, menu suara dilancarkan. Daripadanya, dengan menekan butang 1 atau tamat masa, keluar ke kumpulan pengendali pendailan. Selepas panggilan tamat, makro hangupcall dipanggil, selepas itu tiada apa yang boleh dilakukan dalam pelan dail, kecuali pengendali khas (pengendali hangup).

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Di manakah dalam algoritma panggilan ini kita harus membekalkan maklumat tentang permulaan panggilan ke CRM, di mana untuk memulakan rakaman, di mana untuk menamatkan rakaman dan menghantarnya bersama-sama dengan maklumat tentang panggilan ke CRM?

Integrasi dengan sistem luaran

Apakah integrasi PBX dan CRM? Ini adalah tetapan dan program yang menukar data dan peristiwa antara kedua-dua platform ini dan menghantarnya kepada satu sama lain. Cara paling biasa untuk sistem bebas berkomunikasi adalah melalui API, dan cara paling popular untuk mengakses API ialah HTTP REST. Tetapi bukan untuk asterisk.

Di dalam Asterisk ialah:

  • AGI - panggilan segerak program/komponen luaran, digunakan terutamanya dalam pelan dail, terdapat perpustakaan seperti phpagi, PAGI

  • AMI - soket TCP teks yang berfungsi berdasarkan prinsip melanggan acara dan memasukkan arahan teks, menyerupai SMTP dari dalam, boleh menjejaki acara dan mengurus panggilan, terdapat perpustakaan PAMI - yang paling popular untuk membuat sambungan dengan Asterisk

Contoh output AMI

Acara: Saluran baharu
Keistimewaan: panggilan, semua
Saluran: PJSIP/VMS_pjsip-0000078b
Keadaan Saluran: 4
ChannelStateDesc: Dering
Nombor Panggilan: 111222
CallerIDNama: 111222
ConnectedLineNum:
nama talian yang disambungkan:
Bahasa: en
kod akaun:
Konteks: dari-pstn
Lanjutan: s
Keutamaan: 1
Unik: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI ialah campuran kedua-duanya, semuanya melalui REST, WebSocket, dalam format JSON - tetapi dengan perpustakaan dan pembungkus baru, tidak begitu baik, ditemui begitu sahaja (phparia, phpari) yang menjadi dalam perkembangan mereka kira-kira 3 tahun lalu.

Contoh output ARI apabila panggilan dimulakan

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «nama»:»PJSIP/VMSpjsip-000007b6″, "state":"Ring", "caller":{ "name":"111222″, "nombor":"111222″ }, "connected":{ "name":"", "nombor" :"" }, "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" }

Keselesaan atau kesulitan, kemungkinan atau kemustahilan bekerja dengan API tertentu ditentukan oleh tugas yang perlu diselesaikan. Tugas untuk penyepaduan dengan CRM adalah seperti berikut:

  • Jejaki permulaan panggilan, tempat ia dipindahkan, tarik keluar CallerID, JPS, masa mula dan tamat, mungkin data dari direktori (untuk mencari sambungan antara telefon dan pengguna CRM)

  • Mulakan dan tamatkan rakaman panggilan, simpan dalam format yang dikehendaki, maklumkan pada penghujung rakaman di mana fail itu terletak

  • Mulakan panggilan pada acara luaran (daripada program), hubungi nombor dalaman, nombor luaran dan sambungkannya

  • Pilihan: berintegrasi dengan CRM, kumpulan pendail dan FollowME untuk pemindahan automatik panggilan tanpa ketiadaan tempat (mengikut CRM)

Semua tugas ini boleh diselesaikan melalui AMI atau ARI, tetapi ARI memberikan maklumat yang lebih sedikit, tidak banyak peristiwa, banyak pembolehubah yang masih ada AMI (contohnya, panggilan makro, menetapkan pembolehubah di dalam makro, termasuk rakaman panggilan) tidak dijejaki. Oleh itu, untuk penjejakan yang betul dan tepat, mari pilih AMI buat masa ini (tetapi tidak sepenuhnya). Di samping itu (baik, di mana tidak ada ini, kita adalah orang yang malas) - dalam karya asal (artikel dalam habr) guna PAMI. *Kemudian anda perlu cuba menulis semula ke ARI, tetapi bukan hakikat bahawa ia akan berfungsi.

Mencipta semula integrasi

Agar FreePBX kami dapat melaporkan kepada AMI dengan cara mudah tentang permulaan panggilan, masa tamat, nombor, nama fail yang dirakam, adalah paling mudah untuk mengira tempoh panggilan menggunakan helah yang sama seperti pengarang asal. - masukkan pembolehubah anda dan huraikan output untuk kehadirannya. PAMI mencadangkan melakukan ini hanya melalui fungsi penapis.

Berikut ialah contoh menetapkan pembolehubah anda sendiri untuk masa mula panggilan (s ialah nombor khas dalam pelan dail yang dilakukan SEBELUM memulakan carian JPS)

[ext-did-custom]

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

Contoh acara AMI untuk baris ini

Acara: Saluran baharu

Keistimewaan: panggilan, semua

Saluran: PJSIP/VMS_pjsip-0000078b

Keadaan Saluran: 4

ChannelStateDesc: Dering

Nombor Panggilan: 111222

CallerIDNama: 111222

ConnectedLineNum:

nama talian yang disambungkan:

Bahasa: en

kod akaun:

Konteks: dari-pstn

Lanjutan: s

Keutamaan: 1

Unik: 1599589046.5244

Linkedid: 1599589046.5244

Aplikasi: Tetapkan AppData:

CallStart=1599571046

Kerana FreePBX menimpa fail extention.conf dan extention_additional.conf, kami akan menggunakan fail tersebut extension_adat.conf

Kod penuh 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

Ciri dan perbezaan daripada pelan dail asal pengarang artikel asal -

  • Pelan dail dalam format .conf, seperti yang FreePBX mahukannya (ya, ia boleh .ael, tetapi bukan semua versi dan ia tidak selalunya mudah)

  • Daripada memproses hujung melalui exten=>h, pemprosesan telah diperkenalkan melalui hangup_handler, kerana pelan dail FreePBX hanya berfungsi dengannya

  • Rentetan panggilan skrip tetap, petikan tambahan dan nombor panggilan luaran ExtNum

  • Pemprosesan dialihkan ke _konteks tersuai dan membenarkan anda untuk tidak menyentuh atau mengedit konfigurasi FreePBX - masuk melalui [ext-did-custom], keluar melalui [keluar-semua-laluan-tersuai]

  • Tiada pengikatan kepada nombor - fail adalah universal dan hanya perlu dikonfigurasikan untuk laluan dan pautan ke pelayan

Untuk bermula, anda juga perlu menjalankan skrip dalam AMI dengan log masuk dan kata laluan - untuk ini, FreePBX juga mempunyai _fail tersuai

fail 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

Kedua-dua fail ini mesti diletakkan dalam /etc/asterisk, kemudian baca semula konfigurasi (atau mulakan semula asterisk)

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

Sekarang mari kita beralih kepada PHP

Memulakan skrip dan mencipta perkhidmatan

Memandangkan skim untuk bekerja dengan Bitrix 24, perkhidmatan untuk AMI, tidak sepenuhnya mudah dan telus, ia mesti dibincangkan secara berasingan. Asterisk, apabila AMI diaktifkan, hanya membuka port dan itu sahaja. Apabila pelanggan menyertai, ia meminta kebenaran, kemudian pelanggan melanggan acara yang diperlukan. Peristiwa datang dalam teks biasa, yang PAMI tukarkan kepada objek berstruktur dan menyediakan keupayaan untuk menetapkan fungsi penapisan hanya untuk acara yang diminati, medan, nombor, dsb.

Sebaik sahaja panggilan masuk, acara NewExten dicetuskan bermula daripada konteks induk [dari-pstn], kemudian semua peristiwa pergi dalam susunan baris dalam konteks. Apabila maklumat diterima daripada pembolehubah CallMeCallerIDName dan CallStart yang dinyatakan dalam pelan dail tersuai,

  1. Fungsi meminta ID Pengguna sepadan dengan nombor sambungan tempat panggilan datang. Bagaimana jika ia adalah kumpulan dial-up? Persoalannya adalah politik, adakah anda perlu membuat panggilan kepada semua orang sekali gus (apabila semua orang memanggil serentak) atau mencipta semasa mereka memanggil semasa membuat panggilan secara bergilir-gilir? Kebanyakan pelanggan mempunyai strategi Fisrt Available, jadi tiada masalah dengan ini, hanya satu panggilan. Tetapi isu itu perlu ditangani

  2. Fungsi pendaftaran panggilan dalam Bitrix24, yang mengembalikan CallID, yang kemudiannya diperlukan untuk melaporkan parameter panggilan dan pautan ke rakaman. Memerlukan sama ada nombor sambungan atau ID Pengguna

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Selepas tamat panggilan, fungsi muat turun rekod dipanggil, yang secara serentak melaporkan status penyiapan panggilan (Sibuk, Tiada jawapan, Berjaya), dan juga memuat turun pautan ke fail mp3 dengan rekod (jika ada).

Oleh kerana modul CallMeIn.php perlu dijalankan secara berterusan, fail permulaan SystemD telah dibuat untuknya callme.service, yang mesti dimasukkan ke dalam /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

permulaan dan pelancaran skrip berlaku melalui systemctl atau perkhidmatan

# systemctl enable callme
# systemctl start callme

Perkhidmatan akan dimulakan semula seperti yang diperlukan (sekiranya berlaku ranap). Perkhidmatan pengesanan peti masuk tidak memerlukan pelayan web untuk dipasang, hanya php diperlukan (yang pastinya pada pelayan FeePBX). Tetapi jika tiada akses kepada rekod panggilan melalui pelayan Web (juga dengan https), anda tidak akan dapat mendengar rekod panggilan.

Sekarang mari kita bercakap tentang panggilan keluar. Skrip CallMeOut.php mempunyai dua fungsi:

  • Permulaan panggilan apabila permintaan diterima untuk skrip php (termasuk menggunakan butang "Panggil" dalam Bitrix itu sendiri). Ia tidak berfungsi tanpa pelayan web, permintaan diterima melalui HTTP POST, permintaan itu mengandungi token

  • Mesej tentang panggilan, parameter dan rekodnya dalam Bitrix. Dicetuskan oleh Asterisk dalam pelan dail [sub-call-internal-ended] apabila panggilan ditamatkan

Memahami FreePBX dan menyepadukannya dengan Bitrix24 dan banyak lagi

Pelayan web hanya diperlukan untuk dua perkara - memuat turun fail rekod Bitrix (melalui HTTPS) dan memanggil skrip CallMeOut.php. Anda boleh menggunakan pelayan FreePBX terbina dalam, fail untuknya adalah /var/www/html, anda boleh memasang pelayan lain atau menentukan laluan lain.

Pelayan web

Mari tinggalkan persediaan pelayan web untuk kajian bebas (tyts, tyts, tyts). Jika anda tidak mempunyai domain, anda boleh mencuba FreeDomain( https://www.freenom.com/ru/index.html), yang akan memberi anda nama percuma untuk IP putih anda (jangan lupa untuk memajukan port 80, 443 melalui penghala jika alamat luaran hanya padanya). Jika anda baru mencipta domain DNS, maka anda perlu menunggu (dari 15 minit hingga 48 jam) sehingga semua pelayan dimuatkan. Mengikut pengalaman bekerja dengan pembekal domestik - dari 1 jam hingga sehari.

Automasi pemasangan

Pemasang telah dibangunkan pada github untuk memudahkan pemasangan. Tetapi ia lancar di atas kertas - semasa kami memasang semuanya secara manual, kerana selepas memikirkan semua ini, ia menjadi jelas apa yang kawan dengan siapa, siapa pergi ke mana dan bagaimana untuk menyahpepijatnya. Belum ada pemasang

buruh pelabuhan

Jika anda ingin mencuba penyelesaian dengan cepat - terdapat pilihan dengan Docker - cepat buat bekas, berikannya port ke luar, selipkan fail tetapan dan cuba (ini adalah pilihan dengan bekas LetsEncrypt, jika anda sudah mempunyai sijil , anda hanya perlu mengubah hala proksi terbalik ke pelayan web FreePBX (kami memberikan port lain ialah 88), LetsEncrypt dalam docker berdasarkan artikel ini

Anda perlu menjalankan fail dalam folder projek yang dimuat turun (selepas klon git), tetapi mula-mula masuk ke konfigurasi asterisk (folder asterisk) dan tulis laluan ke rekod dan URL tapak anda di sana

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:

Fail docker-compose.yaml ini dijalankan melalui

docker-compose up -d

Jika nginx tidak bermula, maka ada yang tidak kena dengan konfigurasi dalam folder nginx/ssl_docker.conf

Penyepaduan lain

Dan mengapa tidak meletakkan beberapa CRM ke dalam skrip pada masa yang sama, kami fikir. Kami mengkaji beberapa API CRM lain, terutamanya PBX terbina dalam percuma - ShugarCRM dan Vtiger, dan ya! ya, prinsipnya sama. Tetapi ini adalah cerita lain, yang kemudiannya akan kami muat naik ke github secara berasingan.

rujukan

Penafian: Sebarang persamaan dengan realiti adalah rekaan dan itu bukan saya.

Sumber: www.habr.com

Tambah komen