درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

Bitrix24 ترکیبی عظیم است که CRM، گردش کار، حسابداری و بسیاری چیزهای دیگر را که مدیران واقعاً دوست دارند و کارکنان فناوری اطلاعات واقعاً دوست ندارند، ترکیب می کند. این پورتال توسط بسیاری از شرکت های کوچک و متوسط ​​از جمله کلینیک های کوچک، تولید کنندگان و حتی سالن های زیبایی استفاده می شود. عملکرد اصلی که مدیران "دوست دارند" ادغام تلفن و CRM است، هنگامی که هر تماسی بلافاصله در CRM ضبط می شود، کارت های مشتری ایجاد می شود، هنگام دریافت، اطلاعات مربوط به مشتری نمایش داده می شود و بلافاصله می توانید ببینید که او کیست، چه چیزی است. می تواند بفروشد و چقدر بدهکار است. اما تلفن Bitrix24 و ادغام آن با CRM هزینه، گاهی اوقات بسیار زیاد است. در مقاله تجربه ادغام با ابزارهای باز و IP PBX محبوب را به شما خواهم گفت freepbx، و همچنین منطق کار قسمت های مختلف را در نظر بگیرید

من به عنوان برون سپاری در شرکتی کار می کنم که می فروشد و پیکربندی می کند، تلفن IP را یکپارچه می کند. وقتی از من پرسیدند که آیا می‌توانیم چیزی را به این شرکت و این شرکت ارائه دهیم تا Bitrix24 را با سانترال‌هایی که مشتریان دارند و همچنین با سانترال‌های مجازی در شرکت‌های مختلف VDS یکپارچه کنیم، به Google مراجعه کردم. و البته به من لینک داد مقاله در habr، جایی که توضیحات و github وجود دارد و به نظر می رسد همه چیز کار می کند. اما هنگام تلاش برای استفاده از این راه حل، مشخص شد که Bitrix24 دیگر مانند قبل نیست و باید کارهای زیادی انجام شود. علاوه بر این، FreePBX برای شما یک ستاره ساده نیست، در اینجا باید در مورد نحوه ترکیب سهولت استفاده و شماره گیری هاردکور در فایل های پیکربندی فکر کنید.

ما منطق کار را مطالعه می کنیم

بنابراین برای شروع، چگونه باید همه کار کنند. هنگامی که تماسی از خارج از PBX می‌رسد (رویداد SIP INVITE از ارائه‌دهنده)، پردازش طرح شماره‌گیری (طرح شماره‌گیری، پلان شماره‌گیری) آغاز می‌شود - قوانین اینکه چه کاری و به چه ترتیبی باید با تماس انجام شود. از اولین بسته، می توانید اطلاعات زیادی را دریافت کنید که سپس می توان از آنها در قوانین استفاده کرد. یک ابزار عالی برای مطالعه داخلی SIP، آنالایزر است sngrep (پیوند) که به سادگی در توزیع های محبوب از طریق apt install/yum install و موارد مشابه نصب می شود، اما می توان آن را از منبع نیز ساخت. بیایید به ثبت تماس در sngrep نگاه کنیم

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

به شکل ساده شده، Dialplan فقط با اولین بسته سروکار دارد، گاهی اوقات همچنین در طول مکالمه، تماس ها منتقل می شوند، فشار دادن دکمه ها (DTMF)، چیزهای جالب مختلفی مانند FollowMe، RingGroup، IVR و موارد دیگر.

آنچه در داخل بسته دعوت وجود دارد

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

در واقع، اکثر پلن های شماره گیری ساده با دو فیلد اول کار می کنند و کل منطق حول محور DID و CallerID می چرخد. DID - جایی که ما در حال تماس هستیم، CallerID - چه کسی در حال تماس است.

اما بالاخره ما یک شرکت داریم و نه یک تلفن - به این معنی که سانترال به احتمال زیاد دارای گروه های تماس (زنگ همزمان / متوالی چند دستگاه) روی شماره های شهر (گروه زنگ)، تلفن گویا (سلام، شما تماس گرفتید ... را فشار دهید). یکی برای ...)، دستگاه های منشی (عبارات)، شرایط زمانی، ارسال به اعداد دیگر یا به سلول (FollowMe، Forward). این به این معنی است که تعیین بدون ابهام اینکه چه کسی واقعاً یک تماس دریافت می کند و با چه کسی در هنگام رسیدن تماس بسیار دشوار است. در اینجا نمونه ای از شروع یک تماس معمولی در PBX مشتریان ما است

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

پس از اینکه تماس با موفقیت وارد سانترال شد، از طریق Dialplan در "زمینه های" مختلف حرکت می کند. زمینه از دیدگاه ستاره مجموعه ای شماره گذاری شده از دستورات است که هر کدام حاوی یک فیلتر با شماره شماره گیری شده است (برای یک تماس خارجی در مرحله اولیه exten=DID، exten نامیده می شود). دستورات در خط شماره گیری می تواند هر چیزی باشد - عملکردهای داخلی (به عنوان مثال، تماس با یک مشترک داخلی - Dial()، گوشی را بگذارید - Hangup()عملگرهای شرطی (IF, ELSE, ExecIF و مانند آن)، انتقال به قوانین دیگر این زمینه (Goto, GotoIF، انتقال به زمینه های دیگر در قالب فراخوانی تابع (Gosub، Macro). بخشنامه جداگانه include имя_контекста, که دستوراتی را از یک زمینه دیگر به انتهای متن فعلی اضافه می کند. دستورات موجود از طریق include همیشه اجرا می شوند پس از دستورات زمینه فعلی

کل منطق FreePBX مبتنی بر گنجاندن زمینه های مختلف در یکدیگر از طریق شامل و فراخوانی از طریق کنترل کننده های Gosub، Macro و Handler است. زمینه تماس های دریافتی FreePBX را در نظر بگیرید

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

فراخوانی به نوبه خود از تمام زمینه ها از بالا به پایین عبور می کند، در هر زمینه می تواند فراخوانی هایی به زمینه های دیگر مانند ماکروها (Macro)، توابع (Gosub) یا فقط انتقال ها (Goto) وجود داشته باشد، بنابراین درخت واقعی چیزی که نامیده می شود فقط می تواند در سیاهههای مربوط ردیابی شود.

یک نمودار تنظیم معمولی برای یک PBX معمولی در زیر نشان داده شده است. هنگام تماس، DID در مسیرهای ورودی جستجو می شود، شرایط موقت برای آن بررسی می شود، اگر همه چیز مرتب باشد، منوی صوتی راه اندازی می شود. از آن، با فشار دادن دکمه 1 یا مهلت زمانی، به گروه اپراتورهای شماره گیری خارج شوید. پس از پایان تماس، ماکرو hangupcall فراخوانی می شود که پس از آن هیچ کاری در پلان شماره گیری نمی توان انجام داد، به جز هندلرهای خاص (Hangup handler).

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

در کجای این الگوریتم تماس باید اطلاعات مربوط به شروع تماس با CRM، از کجا شروع به ضبط، کجا پایان ضبط و ارسال آن به همراه اطلاعات تماس به CRM را ارائه دهیم؟

ادغام با سیستم های خارجی

ادغام PBX و CRM چیست؟ اینها تنظیمات و برنامه هایی هستند که داده ها و رویدادها را بین این دو پلتفرم تبدیل کرده و به یکدیگر ارسال می کنند. رایج ترین راه برای ارتباط سیستم های مستقل از طریق API ها و محبوب ترین راه برای دسترسی به API ها HTTP REST است. اما نه برای ستاره.

Inside Asterisk عبارت است از:

  • AGI - فراخوانی همزمان برنامه ها/کامپوننت های خارجی، که عمدتاً در پلان شماره گیری استفاده می شود، کتابخانه هایی مانند phpagi, PAGI

  • AMI - یک سوکت TCP متنی که بر اساس اصل اشتراک در رویدادها و وارد کردن دستورات متنی کار می کند، از داخل شبیه SMTP است، می تواند رویدادها را ردیابی و تماس ها را مدیریت کند، یک کتابخانه وجود دارد. PAMI - محبوب ترین برای ایجاد ارتباط با استریسک

نمونه خروجی AMI

رویداد: کانال جدید
امتیاز: تماس، همه
کانال: PJSIP/VMS_pjsip-0000078b
وضعیت کانال: 4
ChannelStateDesc: زنگ
شماره تماس گیرنده: 111222
نام تماس گیرنده: 111222
ConnectedLineNum:
نام خط متصل:
زبان: en
کد حساب:
زمینه: from-pstn
گسترش: s
اولویت: 1
Uniqueid: 1599589046.5244
لینکدید: 1599589046.5244

  • ARI ترکیبی از هر دو است، همه از طریق REST، WebSocket، در قالب JSON - اما با کتابخانه‌ها و بسته‌بندی‌های تازه، نه خیلی خوب، و به‌خوبی یافت می‌شوند (phparia, phpari) که حدود 3 سال پیش در توسعه آنها قرار گرفت.

نمونه ای از خروجی ARI هنگام برقراری تماس

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334 اینچ، «نام»:»PJSIP/VMSpjsip-000007b6″، "state":" زنگ"، "تماس گیرنده":{ "name":"111222″، "number":"111222″ }، "connected":{ "name":"، "شماره" :"" }، "accountcode":"، "dialplan":{ "context":"from-pstn"، "exten":"s"، "priority":2، "appname":"Stasis"، "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"en" }, "ستارهid":"48:5b:aa:aa:aa:aa"، "application":"hello-world" }

راحتی یا ناراحتی، امکان یا عدم امکان کار با یک API خاص توسط وظایفی که باید حل شوند تعیین می شود. وظایف یکپارچه سازی با CRM به شرح زیر است:

  • شروع تماس را دنبال کنید، جایی که تماس گرفته شده است، CallerID، DID، زمان شروع و پایان، شاید داده‌ها را از دایرکتوری خارج کنید (برای جستجوی ارتباط بین تلفن و کاربر CRM)

  • شروع و پایان ضبط مکالمه، ذخیره آن در فرمت دلخواه، در پایان ضبط اطلاع دهید که فایل در کجا قرار دارد.

  • یک تماس با یک رویداد خارجی (از برنامه) آغاز کنید، یک شماره داخلی، یک شماره خارجی تماس بگیرید و آنها را متصل کنید

  • اختیاری: ادغام با CRM، گروه های شماره گیر و FollowME برای انتقال خودکار تماس ها در صورت عدم وجود مکان (طبق CRM)

همه این وظایف را می توان از طریق AMI یا ARI حل کرد، اما ARI اطلاعات بسیار کمتری ارائه می دهد، رویدادهای زیادی وجود ندارد، بسیاری از متغیرهایی که AMI هنوز دارد (به عنوان مثال، تماس های ماکرو، تنظیم متغیرها در داخل ماکروها، از جمله ضبط تماس) ردیابی نمی شوند. بنابراین، برای ردیابی صحیح و دقیق، فعلاً (اما نه به طور کامل) AMI را انتخاب کنید. علاوه بر این (خب، بدون این کجا می شد، ما افراد تنبل هستیم) - در کار اصلی (مقاله در habr) از PAMI استفاده کنید *سپس باید سعی کنید در ARI بازنویسی کنید، اما نه اینکه کار کند.

اختراع مجدد ادغام

برای اینکه FreePBX ما بتواند به روش های ساده در مورد شروع تماس، زمان پایان، اعداد، نام فایل های ضبط شده به AMI گزارش دهد، محاسبه مدت زمان تماس با استفاده از همان ترفند نویسندگان اصلی ساده تر است. - متغیرهای خود را وارد کنید و خروجی را برای حضور آنها تجزیه کنید. PAMI پیشنهاد می کند این کار را به سادگی از طریق یک عملکرد فیلتر انجام دهید.

در اینجا مثالی از تنظیم متغیر خود برای زمان شروع تماس آورده شده است (s یک شماره خاص در طرح شماره گیری است که قبل از شروع جستجوی DID انجام می شود)

[ext-did-custom]

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

نمونه ای از رویداد AMI برای این خط

رویداد: کانال جدید

امتیاز: تماس، همه

کانال: PJSIP/VMS_pjsip-0000078b

وضعیت کانال: 4

ChannelStateDesc: زنگ

شماره تماس گیرنده: 111222

نام تماس گیرنده: 111222

ConnectedLineNum:

نام خط متصل:

زبان: en

کد حساب:

زمینه: from-pstn

گسترش: s

اولویت: 1

Uniqueid: 1599589046.5244

لینکدید: 1599589046.5244

برنامه: تنظیم AppData:

CallStart=1599571046

زیرا FreePBX فایل های extension.conf و extension_ را بازنویسی می کنداضافی.conf، از فایل استفاده خواهیم کرد گسترش_سفارشیتأیید کنید

کد کامل 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

ویژگی و تفاوت با طرح شماره گیری اصلی نویسندگان مقاله اصلی -

  • Dialplan در قالب .conf، همانطور که FreePBX می خواهد (بله، می تواند ael. اما نه همه نسخه ها و همیشه راحت نیست)

  • به جای پایان پردازش از طریق exten=>h، پردازش از طریق hangup_handler معرفی شد، زیرا پلان شماره گیری FreePBX فقط با آن کار می کرد.

  • رشته تماس اسکریپت ثابت، نقل قول اضافه شده و شماره تماس خارجی ExtNum

  • پردازش به متن های _custom منتقل می شود و به شما امکان می دهد پیکربندی های FreePBX را لمس یا ویرایش نکنید - ورودی از طریق [ext-did-custom]، خروجی از طریق [outbound-allroutes-custom]

  • بدون اتصال به اعداد - فایل جهانی است و فقط باید برای مسیر و پیوند به سرور پیکربندی شود

برای شروع، شما همچنین باید اسکریپت ها را در AMI با ورود و رمز عبور اجرا کنید - برای این، FreePBX یک فایل _custom نیز دارد.

فایل 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

هر دوی این فایل ها باید در /etc/asterisk قرار داده شوند، سپس تنظیمات را دوباره بخوانید (یا ستاره را دوباره راه اندازی کنید)

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

حالا بیایید به سراغ PHP برویم

راه اندازی اسکریپت ها و ایجاد یک سرویس

از آنجایی که طرح کار با Bitrix 24، یک سرویس برای AMI، کاملاً ساده و شفاف نیست، باید به طور جداگانه مورد بحث قرار گیرد. ستاره وقتی AMI فعال می شود، به سادگی پورت را باز می کند و تمام. هنگامی که مشتری ملحق می شود، درخواست مجوز می کند، سپس مشتری در رویدادهای ضروری مشترک می شود. رویدادها به صورت متن ساده می آیند، که PAMI آنها را به اشیاء ساختاریافته تبدیل می کند و امکان تنظیم عملکرد فیلتر را فقط برای رویدادهای مورد علاقه، فیلدها، اعداد و غیره فراهم می کند.

به محض اینکه تماس وارد شد، رویداد NewExten با شروع از متن اصلی [from-pstn] اجرا می‌شود، سپس همه رویدادها به ترتیب خطوط در زمینه‌ها انجام می‌شوند. هنگامی که اطلاعات از متغیرهای CallMeCallerIDName و CallStart مشخص شده در _custom dialplan دریافت می شود،

  1. عملکرد درخواست UserID مربوط به شماره داخلی محل تماس. اگر یک گروه شماره گیری باشد چه؟ سوال سیاسی است، آیا لازم است یک تماس برای همه ایجاد کنید (زمانی که همه به یکباره تماس می گیرند) یا هنگام تماس به نوبت همانطور که آنها تماس می گیرند ایجاد کنید؟ اکثر مشتریان دارای استراتژی Fisrt Available هستند، بنابراین مشکلی در این مورد وجود ندارد، فقط یک تماس برقرار می کند. اما مسئله باید حل شود.

  2. تابع ثبت تماس در Bitrix24، که CallID را برمی‌گرداند، که سپس برای گزارش پارامترهای تماس و پیوندی به ضبط مورد نیاز است. به شماره داخلی یا شناسه کاربری نیاز دارد

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

پس از پایان تماس، تابع دانلود رکورد فراخوانی می شود که به طور همزمان وضعیت تکمیل تماس (مشغول، بدون پاسخ، موفقیت) را گزارش می دهد و همچنین لینک فایل mp3 را با رکورد (در صورت وجود) دانلود می کند.

از آنجایی که ماژول CallMeIn.php باید به طور مداوم اجرا شود، یک فایل راه اندازی SystemD برای آن ایجاد شده است callme.service، که باید در /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

مقداردهی اولیه و راه اندازی اسکریپت از طریق systemctl یا سرویس رخ می دهد

# systemctl enable callme
# systemctl start callme

سرویس در صورت نیاز خود مجدداً راه اندازی می شود (در صورت خرابی). سرویس ردیابی صندوق ورودی نیازی به نصب وب سرور ندارد، فقط به php نیاز است (که قطعاً در سرور FeePBX وجود دارد). اما در صورت عدم دسترسی به سوابق تماس از طریق وب سرور (همچنین با https)، امکان گوش دادن به سوابق تماس وجود نخواهد داشت.

حالا بیایید در مورد تماس های خروجی صحبت کنیم. اسکریپت CallMeOut.php دو عملکرد دارد:

  • هنگامی که درخواستی برای یک اسکریپت php دریافت می شود (از جمله استفاده از دکمه "تماس" در خود Bitrix) شروع به تماس می کند. بدون وب سرور کار نمی کند، درخواست از طریق HTTP POST دریافت می شود، درخواست حاوی یک رمز است.

  • پیامی در مورد تماس، پارامترها و رکوردهای آن در Bitrix. با پایان تماس توسط ستاره در پلن شماره گیری [فرعی-تماس داخلی-پایان] اجرا می شود

درک FreePBX و ادغام آن با Bitrix24 و موارد دیگر

سرور وب فقط برای دو چیز مورد نیاز است - دانلود فایل های رکورد Bitrix (از طریق HTTPS) و فراخوانی اسکریپت CallMeOut.php. می توانید از سرور داخلی FreePBX که فایل های آن /var/www/html هستند استفاده کنید، می توانید سرور دیگری را نصب کنید یا مسیر دیگری را مشخص کنید.

وب سرور

بیایید راه اندازی وب سرور را برای مطالعه مستقل رها کنیم (tyts, tyts, tyts). اگر دامنه ندارید، می توانید FreeDomain را امتحان کنید( https://www.freenom.com/ru/index.html) که به شما یک نام رایگان برای IP سفید شما می دهد (فراموش نکنید که پورت های 80، 443 را از طریق روتر فوروارد کنید اگر آدرس خارجی فقط روی آن باشد). اگر به تازگی یک دامنه DNS ایجاد کرده اید، باید منتظر بمانید (از 15 دقیقه تا 48 ساعت) تا تمام سرورها بارگیری شوند. با توجه به تجربه کار با ارائه دهندگان داخلی - از 1 ساعت تا یک روز.

اتوماسیون نصب

نصب کننده ای در github ایجاد شده است تا نصب را آسان تر کند. اما روی کاغذ صاف بود - در حالی که ما همه آن را به صورت دستی نصب می کنیم ، زیرا پس از سرهم بندی همه اینها کاملاً مشخص شد که چه کسی با چه کسی دوست است ، چه کسی کجا می رود و چگونه آن را اشکال زدایی کند. هنوز نصب کننده ای وجود ندارد

کارگر بارانداز

اگر می خواهید راه حل را به سرعت امتحان کنید - گزینه ای با Docker وجود دارد - به سرعت یک کانتینر ایجاد کنید، به آن پورت ها را به بیرون بدهید، فایل های تنظیمات را بریزید و امتحان کنید (این گزینه با کانتینر LetsEncrypt است، اگر قبلاً گواهی دارید. ، فقط باید پروکسی معکوس را به وب سرور FreePBX هدایت کنید (ما به آن پورت دیگر 88 دادیم)، LetsEncrypt در docker بر اساس از این مقاله

باید فایل را در پوشه پروژه دانلود شده اجرا کنید (بعد از git clone) اما ابتدا وارد تنظیمات ستاره (پوشه ستاره) شوید و مسیرهای رکوردها و آدرس سایت خود را در آنجا بنویسید.

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:

این فایل docker-compose.yaml از طریق اجرا می شود

docker-compose up -d

اگر nginx شروع نشود، مشکلی در پیکربندی در پوشه nginx/ssl_docker.conf وجود دارد.

ادغام های دیگر

و ما فکر کردیم چرا مقداری CRM را همزمان در اسکریپت ها قرار ندهیم. ما چندین API دیگر CRM، به ویژه PBX داخلی رایگان - ShugarCRM و Vtiger را مطالعه کردیم، و بله! بله، اصل یکسان است. اما این داستان دیگری است که بعداً به طور جداگانه در github آپلود خواهیم کرد.

مراجع

سلب مسئولیت: هر شباهتی به واقعیت ساختگی است و من نبودم.

منبع: www.habr.com

اضافه کردن نظر