FreePBXти түшүнүү жана аны Bitrix24 жана башкалар менен интеграциялоо

Bitrix24 бул CRM, иш процесси, бухгалтердик эсепти жана менеджерлерге чындап жага турган жана IT кызматкерлерине жакпаган башка көптөгөн нерселерди бириктирген чоң комбайн. Порталды көптөгөн чакан жана орто компаниялар, анын ичинде чакан клиникалар, өндүрүүчүлөр жана ал тургай сулуулук салондору колдонот. Менеджерлер "сүйгөн" негизги функция - бул телефония менен CRMдин интеграциясы, каалаган чалуу дароо CRMге жазылып, кардар карталары түзүлүп, киргенде кардар тууралуу маалымат көрсөтүлүп, анын ким экенин, ал эмне экенин дароо көрө аласыз. сата алат жана ал канча карыз. Бирок Bitrix24 телефониясы жана анын CRM менен интеграциясы акчаны, кээде көптү талап кылат. Макалада мен сизге ачык инструменттер жана популярдуу IP АТС менен интеграциялоо тажрыйбасын айтып берем freepbx, ошондой эле ар кандай бөлүктөрүнүн иштөө логикасын карап көрөлү

Мен IP телефонияны саткан жана конфигурациялаган, интеграциялаган компанияда аутсорсер болуп иштейм. Менден Bitrix24ту кардарлардын АТСтери менен, ошондой эле ар кандай VDS компанияларындагы виртуалдык АТСтер менен интеграциялоо үчүн бир нерсе сунуштай алабызбы деп сурашканда, мен Google'га бардым. Анан, албетте, ал мага шилтеме берди макалада habr, анда сүрөттөмө жана github бар жана баары иштейт окшойт. Бирок бул чечимди колдонууга аракет кылып жатканда, Bitrix24 мурункудай болбой калганы жана көп нерсени кайра жасоо керек экени белгилүү болду. Кошумчалай кетсек, FreePBX сиз үчүн жылаңач жылдызча эмес, бул жерде сиз конфигурация файлдарында колдонуунун жөнөкөйлүгү менен хардкордук терүү планын кантип айкалыштыруу жөнүндө ойлонушуңуз керек.

Биз иштин логикасын изилдейбиз

Ошентип, башталгычтар үчүн, мунун баары кантип иштеши керек. АТСке сырттан чалуу келип түшкөндө (провайдерден SIP INVITE окуясы) терүү планын (терүү планын, терүү планын) иштетүү башталат - чалууну эмне жана кандай тартипте аткаруу эрежелери. Биринчи пакеттен сиз көп маалыматты ала аласыз, андан кийин эрежелерде колдонулушу мүмкүн. SIPтин ички түзүлүшүн изилдөө үчүн эң сонун курал - анализатор sngrep (байланыш) ал жөн гана apt install/yum install жана ушул сыяктуулар аркылуу популярдуу дистрибьюцияларда орнотулган, бирок аны булактан да курууга болот. Келгиле, sngrepдеги чалуу журналын карап көрөлү

FreePBXти түшүнүү жана аны Bitrix24 жана башкалар менен интеграциялоо

Жөнөкөйлөтүлгөн формада терүү планы биринчи пакет менен гана алектенет, кээде сүйлөшүү учурунда да чалуулар, баскычтарды басуу (DTMF), FollowMe, RingGroup, IVR жана башкалар сыяктуу ар кандай кызыктуу нерселер.

Чакыруу топтомунун ичинде эмне бар

FreePBXти түшүнүү жана аны Bitrix24 жана башкалар менен интеграциялоо

Чынында, көпчүлүк жөнөкөй терүү пландары биринчи эки талаа менен иштейт, жана бүт логика DID жана CallerID айланасында айланат. DID - биз чалып жаткан жер, CallerID - ким чалып жатат.

Бирок, баары бир, бизде бир эле телефон эмес, компания бар - демек, АТСте шаардын номерлеринде (Ring Group), IVR (Салам, сиз чалдыңыз) боюнча чалуу топтору (бир эле учурда / бир нече түзмөктөрдүн ырааттуу коңгуроолору) болушу мүмкүн. бирөө үчүн ...), Автоматтык жооп берүү машиналары ( Сөз айкаштары), Убакыт шарттары, Башка сандарга же уячага жөнөтүү (FollowMe, Forward). Бул чындыгында чалууну ким кабыл алаарын жана чакыруу келгенде ким менен баарлашарын так аныктоо өтө кыйын экенин билдирет. Бул жерде биздин кардарлардын АТСинде типтүү чалуунун башталышынын мисалы келтирилген

FreePBXти түшүнүү жана аны Bitrix24 жана башкалар менен интеграциялоо

Чалуу АТСке ийгиликтүү киргенден кийин, ал ар кандай "контексттерде" диалплан аркылуу өтөт. Жылдызчанын көз карашы боюнча контекст бул командалардын номерленген жыйындысы, алардын ар бири терилген номер боюнча чыпкадан турат (ал экстен деп аталат, баштапкы этаптагы тышкы чалуу үчүн exten=DID). Диалплан сапындагы буйруктар каалаган нерсе болушу мүмкүн - ички функциялар (мисалы, ички абонентти чалуу - Dial(), телефонду коюп - Hangup()), шарттуу операторлор (IF, ELSE, ExecIF жана ушул сыяктуулар), ушул контексттин башка эрежелерине өтүү (Goto, GotoIF), функция чакыруу формасында башка контексттерге өтүү (Gosub, Macro). Өзүнчө директива include имя_контекста, учурдагы контексттин аягына башка контексттен буйруктарды кошот. Include аркылуу камтылган буйруктар дайыма аткарылат после учурдагы контексттин буйруктары.

FreePBXтин бүт логикасы Gosub, Macro жана Handler иштеткичтери аркылуу кошуу жана чалуу аркылуу ар кандай контексттерди бири-бирине кошууга негизделген. Кирүүчү FreePBX чалууларынын контекстин карап көрөлү

FreePBXти түшүнүү жана аны Bitrix24 жана башкалар менен интеграциялоо

Чалуу кезеги менен өйдөдөн ылдыйга бардык контексттер аркылуу өтөт, ар бир контекстте макрос (Макро), функциялар (Gosub) же жөн эле өтүү (Goto) сыяктуу башка контексттерге чалуулар болушу мүмкүн, ошондуктан аталган нерсенин чыныгы дарагы гана журналдарда байкоого болот.

Төмөндө типтүү АТС үчүн типтүү орнотуу диаграммасы көрсөтүлгөн. Чалуу учурунда DID кирүүчү каттамдар боюнча изделет, ал үчүн убактылуу шарттар текшерилет, эгерде баары жайында болсо, үн менюсу ишке киргизилет. Андан, 1 баскычын басып же тайм-аут, терүү операторлорунун тобуна чыкыңыз. Чалуу аяктагандан кийин, hangupcall макросу чакырылат, андан кийин терүү планында атайын иштеткичтерден башка эч нерсе кылуу мүмкүн эмес (hangup handler).

FreePBXти түшүнүү жана аны Bitrix24 жана башкалар менен интеграциялоо

Бул чалуу алгоритминде биз CRMге чалуунун башталышы жөнүндө маалыматты кайдан беришибиз керек, жазууну кайдан баштоо керек, жазууну кайдан бүтүрүү жана аны CRMге чалуу жөнүндө маалымат менен бирге жөнөтүү керек?

Тышкы системалар менен интеграция

PBX жана CRM интеграциясы деген эмне? Бул эки аянтчанын ортосундагы маалыматтарды жана окуяларды өзгөртүп, аларды бири-бирине жөнөтүүчү орнотуулар жана программалар. Көз карандысыз системалардын баарлашуусунун эң кеңири таралган жолу API аркылуу, ал эми API'лерге кирүүнүн эң популярдуу жолу HTTP REST. Бирок жылдызча үчүн эмес.

Жылдызчанын ичинде:

  • AGI - тышкы программаларды/компоненттерди синхрондуу чакыруу, негизинен диалпланда колдонулат, сыяктуу китепканалар бар. phpagi, PAGI

  • AMI - окуяларга жазылуу жана тексттик буйруктарды киргизүү принцибинде иштеген тексттик TCP розеткасы, ичинен SMTPге окшош, окуяларга көз салып, чалууларды башкара алат, китепкана бар ПАМИ - жылдызча менен байланыш түзүү үчүн абдан популярдуу

AMI чыгаруу мисалы

Окуя: Жаңы канал
Артыкчылык: чалыңыз, баары
Канал: PJSIP/VMS_pjsip-0000078b
Канал абалы: 4
ChannelStateDesc: Ring
Чалуучунун IDNum: 111222
CallerIDName: 111222
ConnectedLineNum:
туташкан линиянын аты:
Тили: en
эсеп коду:
Контекст: from-pstn
Узартуу: с
Артыкчылык: 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", "канал":{ "id" »:»1599644315.5334″, «аты»:»PJSIP/VMSpjsip-000007b6″, "стат":"Шыңгыроо", "чалуу":{ "аты":"111222", "номер":"111222" }, "туташкан":{ "аты":"", "номер" :"" }, "эсеп коду":"", "dialplan":{ "контекст":"from-pstn", "exten":"s", "priority":2, "колдонмоname":"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: Ring

Чалуучунун IDNum: 111222

CallerIDName: 111222

ConnectedLineNum:

туташкан линиянын аты:

Тили: en

эсеп коду:

Контекст: from-pstn

Узартуу: с

Артыкчылык: 1

Uniqueid: 1599589046.5244

Шилтеме: 1599589046.5244

Колдонмо: AppData орнотуу:

CallStart=1599571046

Анткени FreePBX extention.conf жана extension_ файлдарынын үстүнөн жазатextra.conf, биз файлды колдонобуз узартуу_колдонуучунун.conf

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

Түпнуска макаланын авторлорунун баштапкы диалпланынан өзгөчөлүгү жана айырмасы -

  • FreePBX каалагандай .conf форматында терүү (ооба, ал .ael болот, бирок бардык версияларда эмес жана бул дайыма эле ыңгайлуу эмес)

  • Аягын exten=>h аркылуу иштетүүнүн ордуна, иштетүү hangup_handler аркылуу киргизилди, анткени FreePBX терүү планы аны менен гана иштеген.

  • Бекитилген скрипт чалуу сабы, кошумча тырмакчалар жана тышкы чалуу номери ExtNum

  • Иштетүү _custom контексттерине жылдырылып, FreePBX конфигурацияларына тийбөөгө же түзөтбөөгө мүмкүндүк берет - [ext-eded-customer], чыгуучу [ аркылуу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/yıldızчага жайгаштырылышы керек, андан кийин конфигурацияларды кайра окуп чыгыңыз (же жылдызчаны кайра иштетиңиз)

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

Эми PHPге өтөбүз

Скрипттерди баштоо жана кызматты түзүү

AMI үчүн кызмат Bitrix 24 менен иштөө схемасы жөнөкөй жана ачык-айкын болбогондуктан, аны өзүнчө талкуулоо керек. Жылдызча, AMI иштетилгенде, жөн гана портту ачат жана бүттү. Кардар кошулганда, ал авторизацияны сурайт, андан кийин кардар керектүү окуяларга жазылат. Окуялар жөнөкөй текстте келет, аны PAMI структураланган объекттерге айландырат жана чыпкалоо функциясын кызыктырган окуяларга, талааларга, сандарга ж.б. коюу мүмкүнчүлүгүн берет.

Чалуу келери менен NewExten окуясы ата-энелик [from-pstn] контекстинен баштап иштетилет, андан кийин бардык окуялар контексттердеги саптардын иретинде өтөт. Маалымат CallMeCallerIDName жана CallStart өзгөрмөлөрүнөн алынганда, _өзгөчө терүү планында,

  1. Чалуу келген кошумча номерге ылайыктуу UserIDди суроо функциясы. Ал диал-ап тобу болсочу? Суроо саясий өңүттө, бардыгына бир убакта (баары бир убакта чалганда) чакыруу түзүү керекпи же кезек менен чалганда алар чакыргандай түзүү керекпи? Көпчүлүк кардарларда Fisrt Available стратегиясы бар, андыктан бул боюнча эч кандай көйгөй жок, бир гана чалуу. Бирок маселени чечүү керек.

  2. Bitrix24 чалууларды каттоо функциясы, ал CallIDди кайтарат, ал андан кийин чалуу параметрлери жана жазууга шилтеме берүү үчүн талап кылынат. Кеңейтүүчү номер же UserID талап кылынат

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, башка серверди орнотуп же башка жолду көрсөтсөңүз болот.

Веб сервер

Көз карандысыз изилдөө үчүн веб-сервер орнотуусун калтыралы (тыц, тыц, тыц). Эгер домениңиз жок болсо, FreeDomain( https://www.freenom.com/ru/index.html), бул сизге ак IP үчүн бекер ат берет (эгер тышкы дарек анда гана болсо, 80, 443 портторун роутер аркылуу жөнөтүүнү унутпаңыз). Эгер сиз жаңы эле DNS доменин түзгөн болсоңуз, анда бардык серверлер жүктөлгөнчө күтүшүңүз керек (15 мүнөттөн 48 саатка чейин). Ата мекендик провайдерлер менен иштөө тажрыйбасы боюнча - 1 сааттан суткага чейин.

Монтаждоону автоматташтыруу

Орнотууну ого бетер жеңилдетүү үчүн githubда орнотуучу иштелип чыккан. Бирок бул кагаз бетинде жылмакай болду - биз муну кол менен орнотуп жаткан учурда, мунун баарын кылдаттык менен карап чыккандан кийин, ким менен дос, ким кайда барат жана аны кантип оңдоо керектиги айкын болду. Азырынча орнотуучу жок

ютуб

Эгерде сиз чечимди тез сынап көргүңүз келсе - Docker менен бир вариант бар - тез контейнер түзүп, ага сырттан портторду бериңиз, жөндөө файлдарын жылдырып, аракет кылыңыз (бул LetsEncrypt контейнериндеги вариант, эгер сизде сертификат бар болсо, анда сиз жөн гана тескери проксиди FreePBX веб-серверине багыттоо керек (биз ага башка порт бердик 88), LetsEncrypt докерге негизделген бул макалада

Жүктөлүп алынган долбоордун папкасында файлды иштетишиңиз керек (git clone кийин), бирок адегенде жылдызча конфигурацияларына (жылдызча папка) кирип, жазууларга жана сайтыңыздын URL дарегине жолду жазыңыз.

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 киргизбеш керек, деп ойлодук. Биз бир нече башка CRM API'лерин, айрыкча акысыз орнотулган АТСти - ShugarCRM жана Vtigerди изилдедик жана ооба! ооба, принцип бирдей. Бирок бул дагы бир окуя, аны кийинчерээк githubга өзүнчө жүктөйбүз.

шилтемелер

Жоопкерчиликтен баш тартуу: Чындыкка окшоштуктар ойдон чыгарылган жана ал мен эмесмин.

Source: www.habr.com

Комментарий кошуу