FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Bitrix24 CRM, ish jarayoni, buxgalteriya hisobi va menejerlarga juda yoqadigan va IT xodimlariga unchalik yoqmaydigan ko'plab boshqa narsalarni birlashtirgan ulkan kombinatdir. Portaldan ko'plab kichik va o'rta kompaniyalar, jumladan, kichik klinikalar, ishlab chiqaruvchilar va hatto go'zallik salonlari foydalanadi. Menejerlar "sevadigan" asosiy funktsiya telefoniya va CRM ning integratsiyasi bo'lib, har qanday qo'ng'iroq darhol CRM-da qayd etilganda, mijoz kartalari yaratiladi, kirganda, mijoz haqida ma'lumot ko'rsatiladi va siz uning kimligini, u nima ekanligini darhol ko'rishingiz mumkin. sotishi mumkin va uning qarzi qancha. Ammo Bitrix24-dan telefoniya va uning CRM bilan integratsiyasi pulga, ba'zan esa juda qimmatga tushadi. Maqolada men sizga ochiq vositalar va mashhur IP PBX bilan integratsiya qilish tajribasini aytib beraman freepbx, shuningdek, turli qismlarning ish mantig'ini ko'rib chiqing

Men IP telefoniyani sotadigan va sozlaydigan, birlashtirgan kompaniyada autsorser sifatida ishlayman. Mendan Bitrix24-ni mijozlar ega bo'lgan ATS-lar, shuningdek, turli VDS kompaniyalaridagi virtual PBXlar bilan integratsiya qilish uchun biz bu va ushbu kompaniyaga biror narsa taklif qila olamizmi, deb so'rashganida, men Google-ga bordim. Va, albatta, u menga havola berdi habrdagi maqola, bu erda tavsif va github mavjud va hamma narsa ishlayotganga o'xshaydi. Ammo ushbu yechimdan foydalanishga harakat qilganda, Bitrix24 endi avvalgidek emasligi va ko'p narsalarni qayta tiklash kerakligi ma'lum bo'ldi. Bundan tashqari, FreePBX siz uchun yalang'och yulduzcha emas, bu erda siz konfiguratsiya fayllarida foydalanish qulayligi va qattiq dialplanni qanday birlashtirish haqida o'ylashingiz kerak.

Biz ish mantig'ini o'rganamiz

Shunday qilib, yangi boshlanuvchilar uchun hammasi qanday ishlashi kerak. ATSdan tashqaridan qo'ng'iroq qabul qilinganda (provayderdan SIP INVITE hodisasi) dialplanni qayta ishlash (terish rejasi, dialplan) boshlanadi - qo'ng'iroqni nima va qanday tartibda bajarish qoidalari. Birinchi paketdan siz juda ko'p ma'lumot olishingiz mumkin, keyin ularni qoidalarda ishlatishingiz mumkin. SIPning ichki qismlarini o'rganish uchun ajoyib vosita bu analizatordir sngrep (aloqa) apt install/yum install va shunga o'xshashlar orqali mashhur tarqatishlarda oddiygina o'rnatiladi, lekin uni manbadan ham qurish mumkin. Keling, sngrep-dagi qo'ng'iroqlar jurnalini ko'rib chiqaylik

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Soddalashtirilgan shaklda dialplan faqat birinchi paket bilan shug'ullanadi, ba'zan suhbat paytida ham qo'ng'iroqlar o'tkaziladi, tugmalar bosiladi (DTMF), FollowMe, RingGroup, IVR va boshqalar kabi turli xil qiziqarli narsalar.

Invite to'plami ichida nima bor

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Aslida, eng oddiy dialplanlar dastlabki ikkita maydon bilan ishlaydi va butun mantiq DID va CallerID atrofida aylanadi. DID - biz qo'ng'iroq qilayotgan joy, CallerID - kim qo'ng'iroq qilmoqda.

Axir, bizda bitta telefon emas, balki kompaniya bor - bu shuni anglatadiki, ATSda shahar raqamlari (Ring Group), IVR (Salom, siz qo'ng'iroq qildingiz) bo'yicha qo'ng'iroq guruhlari (bir nechta qurilmalarning bir vaqtning o'zida / ketma-ket jiringlashi) mavjud. biri ... uchun), Javob berish mashinalari (iboralar), Vaqt shartlari, Boshqa raqamlarga yoki hujayraga yo'naltirish (FollowMe, Forward). Bu shuni anglatadiki, qo'ng'iroqni kim qabul qilishini va qo'ng'iroq kelganda kim bilan suhbatlashishni aniq aniqlash juda qiyin. Mijozlarimizning ATS larida odatiy qo'ng'iroqning boshlanishiga misol keltiramiz

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Qo'ng'iroq ATS ga muvaffaqiyatli kirgandan so'ng, u dialplan bo'ylab turli "kontekstlarda" o'tadi. Yulduzcha nuqtai nazaridan kontekst raqamlangan buyruqlar to'plami bo'lib, ularning har biri terilgan raqam bo'yicha filtrni o'z ichiga oladi (u exten deb ataladi, tashqi qo'ng'iroqning dastlabki bosqichida exten=DID). Dialplan liniyasidagi buyruqlar har qanday bo'lishi mumkin - ichki funktsiyalar (masalan, ichki abonentga qo'ng'iroq qilish - Dial(), telefonni qo'ying - Hangup()), shartli operatorlar (IF, ELSE, ExecIF va shunga o'xshashlar), ushbu kontekstning boshqa qoidalariga o'tish (Goto, GotoIF), funktsiya chaqiruvi (Gosub, Macro) shaklida boshqa kontekstlarga o'tish. Alohida direktiva include имя_контекста, joriy kontekstning oxiriga boshqa kontekstdan buyruqlar qo'shadi. Include orqali kiritilgan buyruqlar doimo bajariladi после joriy kontekstning buyruqlari.

FreePBX ning butun mantig'i Gosub, Macro va Handler ishlov beruvchilari orqali qo'ng'iroq qilish va qo'ng'iroq qilish orqali turli kontekstlarni bir-biriga kiritishga asoslangan. Kiruvchi FreePBX qo'ng'iroqlari kontekstini ko'rib chiqing

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Qo'ng'iroq navbatma-navbat yuqoridan pastgacha barcha kontekstlardan o'tadi, har bir kontekstda makrolar (Makro), funktsiyalar (Gosub) yoki shunchaki o'tishlar (Goto) kabi boshqa kontekstlarga qo'ng'iroqlar bo'lishi mumkin, shuning uchun chaqirilgan narsaning haqiqiy daraxti faqat mumkin. jurnallarda kuzatilishi mumkin.

Oddiy PBX uchun odatiy sozlash diagrammasi quyida ko'rsatilgan. Qo'ng'iroq qilishda DID kiruvchi yo'nalishlarda qidiriladi, uning uchun vaqtinchalik sharoitlar tekshiriladi, agar hamma narsa tartibda bo'lsa, ovozli menyu ishga tushiriladi. Undan 1-tugmani yoki vaqt tugashini bosib, terish operatorlari guruhiga chiqing. Qo'ng'iroq tugagandan so'ng, hangupcall makrosi chaqiriladi, shundan so'ng dialplanda hech narsa qilib bo'lmaydi, maxsus ishlov beruvchilardan (hangup handler) tashqari.

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Ushbu qo'ng'iroq algoritmida biz CRM-ga qo'ng'iroqning boshlanishi haqida ma'lumot berishimiz kerak, yozishni qaerdan boshlash kerak, yozishni qayerda tugatish va uni CRM-ga qo'ng'iroq haqidagi ma'lumot bilan birga yuborish kerak?

Tashqi tizimlar bilan integratsiya

PBX va CRM integratsiyasi nima? Bu ikki platforma o'rtasida ma'lumotlar va hodisalarni o'zgartiradigan va ularni bir-biriga yuboradigan sozlamalar va dasturlar. Mustaqil tizimlar bilan muloqot qilishning eng keng tarqalgan usuli API orqali, API larga kirishning eng mashhur usuli esa HTTP REST hisoblanadi. Lekin yulduzcha uchun emas.

Yulduzchaning ichida:

  • AGI - tashqi dasturlar/komponentlarning sinxron chaqiruvi, asosan dialplanda qo'llaniladi, kabi kutubxonalar mavjud. phpagi, PAGI

  • AMI - voqealarga obuna bo'lish va matn buyruqlarini kiritish printsipi asosida ishlaydigan matnli TCP rozetkasi, ichkaridan SMTP ga o'xshaydi, voqealarni kuzatish va qo'ng'iroqlarni boshqarish, kutubxona mavjud PAMI - yulduzcha bilan aloqa o'rnatish uchun eng mashhur

AMI chiqish misoli

Tadbir: Yangi kanal
Imtiyoz: qo'ng'iroq qiling, hammasi
Kanal: PJSIP/VMS_pjsip-0000078b
Kanal holati: 4
ChannelStateDesc: Ring
Qo'ng'iroq qiluvchining IDNum: 111222
Qo'ng'iroq qiluvchining identifikatori: 111222
ConnectedLineNum:
ulangan chiziq nomi:
Til: uz
hisob kodi:
Kontekst: from-pstn
Kengaytma: s
Afzallik: 1
Noyob: 1599589046.5244
Linkedid: 1599589046.5244

  • ARI ikkalasining aralashmasidir, barchasi REST, WebSocket orqali, JSON formatida - lekin yangi kutubxonalar va o'ramlar bilan, unchalik yaxshi emas, oldindan topilgan (phparia, phpari) taxminan 3 yil oldin ularning rivojlanishiga kirgan.

Qo'ng'iroq boshlanganda ARI chiqishiga misol

{ "o'zgaruvchi":"CallMeCallerIDName", "qiymat":"111222", "turi":"ChannelVarset", "vaqt tamg'asi":"2020-09-09:09:38+36.269", "kanal":{ "id" »:»0000″, «nom»:»PJSIP/VMSpjsip-000007b6″, "holat":"Qo'ng'iroq", "qo'ng'iroq qiluvchi":{ "name":"111222", "raqam":"111222" }, "ulangan":{ "ism":"", "raqam" :"" }, "hisob kodi":"", "dialplan":{ "kontekst":"from-pstn", "exten":"s", "priority":2, "ilovanomi":"Stasis", "ilovadata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"uz" }, "yulduzcha"id":"48:5b:aa:aa:aa:aa", "ilova":"salom-dunyo" }

Qulaylik yoki noqulaylik, muayyan API bilan ishlash imkoniyati yoki mumkin emasligi hal qilinishi kerak bo'lgan vazifalar bilan belgilanadi. CRM bilan integratsiya qilish vazifalari quyidagilardan iborat:

  • Qo'ng'iroqning boshlanishini, u o'tkazilgan joyni kuzatib boring, CallerID, DID, boshlanish va tugash vaqtlarini, ehtimol katalogdagi ma'lumotlarni oling (telefon va CRM foydalanuvchisi o'rtasidagi aloqani qidirish uchun)

  • Qo'ng'iroqni yozishni boshlang va tugating, uni kerakli formatda saqlang, yozuv oxirida fayl qayerda joylashganligi haqida xabar bering

  • Tashqi hodisaga (dasturdan) qo'ng'iroqni boshlang, ichki raqamga, tashqi raqamga qo'ng'iroq qiling va ularni ulang

  • Ixtiyoriy: joy yo'qligida qo'ng'iroqlarni avtomatik uzatish uchun CRM, terish guruhlari va FollowME bilan integratsiyalash (CRM bo'yicha)

Bu vazifalarning barchasini AMI yoki ARI orqali hal qilish mumkin, ammo ARI kamroq ma'lumot beradi, hodisalar ko'p emas, AMIda hali ham mavjud bo'lgan ko'plab o'zgaruvchilar (masalan, so'l qo'ng'iroqlar, makrolar ichidagi o'zgaruvchilarni sozlash, shu jumladan qo'ng'iroqlarni yozib olish) kuzatilmaydi. Shuning uchun, to'g'ri va aniq kuzatish uchun hozircha AMI ni tanlaylik (lekin to'liq emas). Bundan tashqari (yaxshi, busiz qaerda bo'lar edi, biz dangasa odamlarmiz) - asl asarda (habrdagi maqola) PAMI-dan foydalaning. *Keyin siz ARI-ga qayta yozishga harakat qilishingiz kerak, lekin u ishlaydi, deb emas.

Integratsiyani qayta kashf qilish

Bizning FreePBX qo'ng'iroqning boshlanishi, tugash vaqti, raqamlari, yozilgan fayllarning nomlari haqida AMIga oddiy usullar bilan xabar berishi uchun, asl mualliflar bilan bir xil hiyla yordamida qo'ng'iroqning davomiyligini hisoblash eng osondir. - o'zgaruvchilaringizni kiriting va ularning mavjudligi uchun chiqishni tahlil qiling. PAMI buni oddiygina filtr funksiyasi orqali qilishni taklif qiladi.

Qo'ng'iroqning boshlanish vaqti uchun o'z o'zgaruvchingizni o'rnatish misoli (s - bu DID qidiruvini boshlashdan oldin amalga oshiriladigan terish rejasidagi maxsus raqam)

[ext-did-custom]

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

Ushbu qator uchun misol AMI hodisasi

Tadbir: Yangi kanal

Imtiyoz: qo'ng'iroq qiling, hammasi

Kanal: PJSIP/VMS_pjsip-0000078b

Kanal holati: 4

ChannelStateDesc: Ring

Qo'ng'iroq qiluvchining IDNum: 111222

Qo'ng'iroq qiluvchining identifikatori: 111222

ConnectedLineNum:

ulangan chiziq nomi:

Til: uz

hisob kodi:

Kontekst: from-pstn

Kengaytma: s

Afzallik: 1

Noyob: 1599589046.5244

Linkedid: 1599589046.5244

Ilova: AppData sozlash:

CallStart=1599571046

Chunki FreePBX kengaytma.conf va kengaytma_ fayllarini qayta yozadiextra.conf, biz fayldan foydalanamiz kengaytma_Custom.conf

Extension_custom.conf toʻliq kodi

[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

Asl maqola mualliflarining asl dialplanidan xususiyat va farq -

  • FreePBX xohlaganicha .conf formatida terish rejasi (ha, u .ael bo'lishi mumkin, lekin hamma versiyalarda emas va har doim ham qulay emas)

  • Oxirini exten=>h orqali qayta ishlash o'rniga, qayta ishlash hangup_handler orqali joriy etildi, chunki FreePBX dialplan faqat u bilan ishlagan.

  • Ruxsat etilgan skript qo'ng'iroqlar qatori, qo'shilgan tirnoq va tashqi qo'ng'iroq raqami ExtNum

  • Qayta ishlash _custom kontekstlarga o'tkaziladi va FreePBX konfiguratsiyasiga tegmaslik yoki tahrirlash imkonini beradi - kiruvchi [ orqaliext-dod-customized], chiquvchi [ orqaliChiquvchi-haroue-odati]

  • Raqamlarga bog'lanish yo'q - fayl universal bo'lib, faqat yo'l va serverga ulanish uchun sozlanishi kerak

Boshlash uchun siz login va parol orqali AMI-da skriptlarni ishga tushirishingiz kerak - buning uchun FreePBX-da _custom fayli ham mavjud.

manager_custom.conf fayli

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

Ushbu ikkala fayl /etc/yulduzcha ichiga joylashtirilishi kerak, keyin konfiguratsiyalarni qayta o'qing (yoki yulduzchani qayta ishga tushiring)

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

Endi PHP ga o'tamiz

Skriptlarni ishga tushirish va xizmat yaratish

Bitrix 24, AMI uchun xizmat bilan ishlash sxemasi mutlaqo oddiy va shaffof emasligi sababli, uni alohida muhokama qilish kerak. Yulduzcha, AMI yoqilganda, shunchaki portni ochadi va tamom. Mijoz qo'shilganda, u avtorizatsiyani so'raydi, keyin mijoz kerakli tadbirlarga obuna bo'ladi. Voqealar oddiy matnda keladi, ularni PAMI tuzilgan ob'ektlarga aylantiradi va filtrlash funktsiyasini faqat qiziqish hodisalari, maydonlar, raqamlar va boshqalar uchun o'rnatish imkoniyatini beradi.

Qo'ng'iroq kelishi bilanoq, NewExten hodisasi ota-ona [from-pstn] kontekstidan boshlab ishga tushiriladi, keyin barcha hodisalar kontekstdagi satrlar tartibida ketadi. _custom dialplanda ko'rsatilgan CallMeCallerIDName va CallStart o'zgaruvchilaridan ma'lumot olinganda,

  1. Qo'ng'iroq kelgan kengaytma raqamiga mos keladigan UserID ni so'rash funktsiyasi. Agar bu dial-up guruhi bo'lsa-chi? Savol siyosiy, hammaga birdaniga qo'ng'iroq qilish kerakmi (hamma bir vaqtning o'zida qo'ng'iroq qilganda) yoki navbatma-navbat qo'ng'iroq qilganda ular qo'ng'iroq qilganidek yaratish kerakmi? Aksariyat mijozlar Fisrt Available strategiyasiga ega, shuning uchun bu bilan hech qanday muammo yo'q, faqat bitta qo'ng'iroq. Ammo muammoni hal qilish kerak.

  2. Bitrix24-da qo'ng'iroqlarni ro'yxatdan o'tkazish funksiyasi, u qo'ng'iroq parametrlarini va yozuvga havolani xabar qilish uchun zarur bo'lgan CallID-ni qaytaradi. Kengaytma raqami yoki UserID talab qilinadi

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Qo'ng'iroq tugagandan so'ng, yozuvni yuklab olish funktsiyasi chaqiriladi, u bir vaqtning o'zida qo'ng'iroqning tugallanganligi holati haqida xabar beradi (band, javob yo'q, muvaffaqiyat), shuningdek, yozuv bilan mp3 faylga havolani yuklab oladi (agar mavjud bo'lsa).

CallMeIn.php moduli uzluksiz ishlashi kerakligi sababli, u uchun SystemD ishga tushirish fayli yaratilgan callme.service, uni /etc/systemd/system/callme.service-ga qo'yish kerak

[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

skriptni ishga tushirish va ishga tushirish systemctl yoki xizmat orqali amalga oshiriladi

# systemctl enable callme
# systemctl start callme

Xizmat kerak bo'lganda o'zini qayta ishga tushiradi (halokatlar bo'lsa). Kirish qutisini kuzatish xizmati veb-serverni o'rnatishni talab qilmaydi, faqat PHP kerak (bu, albatta, FeePBX serverida). Ammo veb-server orqali qo'ng'iroq yozuvlariga kirish imkoni bo'lmasa (https bilan ham), qo'ng'iroq yozuvlarini tinglash mumkin bo'lmaydi.

Keling, chiquvchi qo'ng'iroqlar haqida gapiraylik. CallMeOut.php skripti ikkita funktsiyaga ega:

  • PHP skripti uchun so'rov qabul qilinganda qo'ng'iroqni boshlash (jumladan, Bitrixning o'zida "Qo'ng'iroq" tugmasidan foydalanish). U veb-serversiz ishlamaydi, so'rov HTTP POST orqali qabul qilinadi, so'rovda token mavjud

  • Bitrix-dagi qo'ng'iroq, uning parametrlari va yozuvlari haqida xabar. Qo'ng'iroq tugashi bilan [ichki qo'ng'iroqlar qo'ng'irog'i] terish rejasida yulduzcha tomonidan ishga tushiriladi

FreePBX-ni tushunish va uni Bitrix24 va boshqalar bilan birlashtirish

Veb-server faqat ikkita narsa uchun kerak - Bitrix yozuv fayllarini yuklab olish (HTTPS orqali) va CallMeOut.php skriptini chaqirish. Siz o'rnatilgan FreePBX serveridan foydalanishingiz mumkin, fayllari /var/www/html, siz boshqa serverni o'rnatishingiz yoki boshqa yo'lni belgilashingiz mumkin.

Veb-server

Keling, veb-server sozlamalarini mustaqil o'rganish uchun qoldiramiz (tyts, tyts, tyts). Agar sizda domen bo'lmasa, FreeDomain( https://www.freenom.com/ru/index.html), bu sizga oq IP-ga bepul nom beradi (agar tashqi manzil faqat unda bo'lsa, router orqali 80, 443 portlarini yo'naltirishni unutmang). Agar siz hozirgina DNS domenini yaratgan bo'lsangiz, barcha serverlar yuklanmaguncha kutishingiz kerak (15 daqiqadan 48 soatgacha). Mahalliy provayderlar bilan ishlash tajribasiga ko'ra - 1 soatdan bir kungacha.

O'rnatishni avtomatlashtirish

O'rnatishni yanada osonlashtirish uchun github'da o'rnatuvchi ishlab chiqilgan. Ammo bu qog'ozda silliq edi - biz barchasini qo'lda o'rnatayotganimizda, chunki bularning barchasi bilan shug'ullangandan so'ng, kim bilan do'st ekanligi, kim qaerga borishi va uni qanday tuzatish kerakligi aniq bo'ldi. Hali o'rnatuvchi yo'q

Docker

Agar siz yechimni tezda sinab ko'rmoqchi bo'lsangiz - Docker-da variant bor - tezda konteyner yarating, unga portlarni tashqi tomondan bering, sozlamalar fayllarini siljiting va harakat qilib ko'ring (bu LetsEncrypt konteyneridagi variant, agar sizda allaqachon sertifikat mavjud bo'lsa). , siz shunchaki teskari proksi-serverni FreePBX veb-serveriga yo'naltirishingiz kerak (biz unga boshqa port berdik - 88), LetsEncrypt docker-da Ushbu maqolaning

Faylni yuklab olingan loyiha papkasida (git clone-dan keyin) ishga tushirishingiz kerak, lekin avval yulduzcha konfiguratsiyasiga (yulduzcha papkasi) kiring va u yerda yozuvlar va saytingizning URL manzilini yozing.

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:

Ushbu docker-compose.yaml fayli orqali ishga tushiriladi

docker-compose up -d

Agar nginx ishga tushmasa, nginx/ssl_docker.conf jildidagi konfiguratsiyada nimadir noto'g'ri.

Boshqa integratsiyalar

Va nima uchun bir vaqtning o'zida bir nechta CRM-ni skriptlarga qo'ymaslik kerak, deb o'yladik. Biz bir nechta boshqa CRM API-larini, ayniqsa bepul o'rnatilgan PBX - ShugarCRM va Vtiger-ni o'rgandik va ha! ha, printsip bir xil. Ammo bu boshqa hikoya, biz uni keyinchalik github-ga alohida yuklaymiz.

Manbalar

Ogohlantirish: Haqiqat bilan har qanday o'xshashlik xayoliydir va bu men emasman.

Manba: www.habr.com

a Izoh qo'shish