Comprendre FreePBX et l'intégrer à Bitrix24 et plus

Bitrix24 est une énorme combinaison qui combine CRM, workflow, comptabilité et bien d'autres choses que les managers aiment vraiment et que le personnel informatique n'aime pas vraiment. Le portail est utilisé par de nombreuses petites et moyennes entreprises, y compris de petites cliniques, des fabricants et même des salons de beauté. La fonction principale que les managers "adorent" est l'intégration de la téléphonie et du CRM, lorsque tout appel est immédiatement enregistré dans le CRM, des cartes client sont créées, lors de l'arrivée, des informations sur le client sont affichées et vous pouvez immédiatement voir qui il est, ce qu'il peut vendre et combien il doit. Mais la téléphonie de Bitrix24 et son intégration avec le CRM coûte de l'argent, parfois très cher. Dans l'article, je vais vous raconter l'expérience de l'intégration avec des outils ouverts et le populaire PBX IP FreePBX, et aussi considérer la logique du travail des différentes parties

Je travaille comme sous-traitant dans une entreprise qui vend et configure, intègre la téléphonie IP. Lorsqu'on m'a demandé si nous pouvions offrir quelque chose à telle ou telle entreprise pour intégrer Bitrix24 avec les PBX dont disposent les clients, ainsi qu'avec les PBX virtuels de diverses sociétés VDS, je suis allé voir Google. Et bien sûr, il m'a donné un lien vers article dans habr, où il y a une description, et github, et tout semble fonctionner. Mais en essayant d'utiliser cette solution, il s'est avéré que Bitrix24 n'est plus le même qu'avant et qu'il reste beaucoup à refaire. De plus, FreePBX n'est pas un simple astérisque pour vous, ici vous devez réfléchir à la façon de combiner la facilité d'utilisation et un plan de numérotation hardcore dans les fichiers de configuration.

Nous étudions la logique du travail

Donc, pour commencer, comment tout cela devrait fonctionner. Lorsqu'un appel est reçu de l'extérieur sur le PBX (événement SIP INVITE du fournisseur), le traitement du plan de numérotation (plan de numérotation, plan de numérotation) commence - les règles de quoi et dans quel ordre faire avec l'appel. Dès le premier paquet, vous pouvez obtenir de nombreuses informations, qui peuvent ensuite être utilisées dans les règles. Un excellent outil pour étudier les composants internes de SIP est l'analyseur sngrep (lien) qui est simplement installé dans les distributions populaires via apt install/yum install et autres, mais peut également être construit à partir des sources. Regardons le journal des appels dans sngrep

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

Dans une forme simplifiée, le plan de numérotation ne traite que du premier paquet, parfois aussi pendant la conversation, les appels sont transférés, les pressions sur les boutons (DTMF), diverses choses intéressantes comme FollowMe, RingGroup, IVR et autres.

Contenu du pack d'invitation

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

En fait, la plupart des plans de numérotation simples fonctionnent avec les deux premiers champs, et toute la logique tourne autour de DID et CallerID. DID - où nous appelons, CallerID - qui appelle.

Mais après tout, nous avons une entreprise et non un téléphone - ce qui signifie que le PBX a très probablement des groupes d'appels (sonnerie simultanée / consécutive de plusieurs appareils) sur des numéros de ville (Ring Group), IVR (Bonjour, vous avez appelé ... Appuyez sur un pour ...), Répondeurs (Phrases), Conditions horaires, Renvoi vers d'autres numéros ou vers une cellule (Suivez-moi, Renvoi). Cela signifie qu'il est très difficile de déterminer sans ambiguïté qui recevra réellement un appel et avec qui aura une conversation lorsqu'un appel arrivera. Voici un exemple de début d'appel type dans le PBX de nos clients

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

Une fois que l'appel est entré avec succès dans le PBX, il parcourt le plan de numérotation dans différents "contextes". Le contexte du point de vue d'Asterisk est un ensemble numéroté de commandes, chacune contenant un filtre par le numéro composé (on l'appelle exten, pour un appel externe à l'étape initiale exten=DID). Les commandes de la ligne du plan de numérotation peuvent être n'importe quoi - des fonctions internes (par exemple, appeler un abonné interne - Dial(), posez le téléphone - Hangup()), opérateurs conditionnels (IF, ELSE, ExecIF etc.), transitions vers d'autres règles de ce contexte (Goto, GotoIF), passage à d'autres contextes sous la forme d'un appel de fonction (Gosub, Macro). Une directive distincte include имя_контекста, qui ajoute des commandes d'un autre contexte à la fin du contexte actuel. Les commandes incluses via include sont toujours exécutées après commandes du contexte courant.

Toute la logique de FreePBX repose sur l'inclusion de différents contextes les uns dans les autres via l'inclusion et l'appel via les gestionnaires Gosub, Macro et Handler. Considérez le contexte des appels FreePBX entrants

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

L'appel passe par tous les contextes de haut en bas tour à tour, dans chaque contexte, il peut y avoir des appels à d'autres contextes comme des macros (Macro), des fonctions (Gosub) ou simplement des transitions (Goto), donc l'arbre réel de ce qui est appelé ne peut que être suivi dans les journaux.

Un schéma de configuration typique pour un PBX typique est présenté ci-dessous. Lors de l'appel, DID est recherché dans les itinéraires entrants, les conditions temporaires sont vérifiées, si tout est en ordre, le menu vocal est lancé. De là, en appuyant sur le bouton 1 ou timeout, sortez au groupe d'opérateurs de numérotation. Une fois l'appel terminé, la macro hangupcall est appelée, après quoi rien ne peut être fait dans le plan de numérotation, à l'exception des gestionnaires spéciaux (gestionnaire de raccrochage).

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

Où dans cet algorithme d'appel devons-nous fournir des informations sur le début de l'appel au CRM, où commencer l'enregistrement, où terminer l'enregistrement et l'envoyer avec des informations sur l'appel au CRM ?

Intégration avec des systèmes externes

Qu'est-ce que l'intégration PBX et CRM ? Ce sont des paramètres et des programmes qui convertissent les données et les événements entre ces deux plates-formes et les envoient l'une à l'autre. Le moyen le plus courant pour les systèmes indépendants de communiquer est via les API, et le moyen le plus populaire d'accéder aux API est HTTP REST. Mais pas pour l'astérisque.

A l'intérieur d'Asterisk se trouve :

  • AGI - appel synchrone de programmes/composants externes, utilisé principalement dans le plan de numérotation, il existe des bibliothèques comme phpagi, PAGI

  • AMI - un socket TCP texte qui fonctionne sur le principe de l'abonnement aux événements et de la saisie de commandes de texte, ressemble à SMTP de l'intérieur, peut suivre les événements et gérer les appels, il existe une bibliothèque PAMI - le plus populaire pour créer une connexion avec Asterisk

Exemple de sortie AMI

Événement : nouvelle chaîne
Privilège : appeler, tous
Canal : PJSIP/VMS_pjsip-0000078b
État du canal : 4
ChannelStateDesc : Sonnerie
Numéro d'identification de l'appelant : 111222
Nom de l'ID de l'appelant : 111222
ConnectedLineNum :
nom de la ligne connectée :
Langue : fr
code de compte:
Contexte : from-pstn
Étendu : s
Priorité: 1
ID unique : 1599589046.5244
ID de lien : 1599589046.5244

  • ARI est un mélange des deux, le tout via REST, WebSocket, au format JSON - mais avec de nouvelles bibliothèques et wrappers, pas très bons, trouvés de manière désinvolte (phpaire, Phpari) qui est devenu dans leur développement il y a environ 3 ans.

Exemple de sortie ARI lorsqu'un appel est lancé

{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{ "id »:»1599644315.5334″, «nom»:»PJSIP/VMSpjsip-000007b6″, "state":"Ring", "caller":{ "name":"111222″, "number":"111222″ }, "connected":{ "name":"", "number" :"" }, "accountcode":"", "dialplan":{ "context":"from-pstn", "exten":"s", "priority":2, "appname":"Stase", "applicationdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"fr" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }

La commodité ou l'inconvénient, la possibilité ou l'impossibilité de travailler avec une API particulière sont déterminées par les tâches à résoudre. Les tâches d'intégration avec CRM sont les suivantes :

  • Suivez le début de l'appel, où il a été transféré, extrayez CallerID, DID, les heures de début et de fin, peut-être les données du répertoire (pour rechercher une connexion entre le téléphone et l'utilisateur du CRM)

  • Démarrer et terminer l'enregistrement de l'appel, le sauvegarder au format souhaité, informer à la fin de l'enregistrement où se trouve le fichier

  • Initier un appel sur un événement externe (depuis le programme), appeler un numéro interne, un numéro externe et les connecter

  • Facultatif: intégration avec CRM, groupes de numérotation et FollowME pour transfert automatique des appels en l'absence de place (selon CRM)

Toutes ces tâches peuvent être résolues via AMI ou ARI, mais ARI fournit beaucoup moins d'informations, il n'y a pas beaucoup d'événements, de nombreuses variables que AMI a encore (par exemple, les appels de macro, la définition de variables à l'intérieur des macros, y compris l'enregistrement des appels) ne sont pas suivies. Par conséquent, pour un suivi correct et précis, choisissons AMI pour l'instant (mais pas complètement). De plus (enfin, où en serait-il sans cela, nous sommes des paresseux) - dans l'œuvre originale (article dans habr) utiliser PAMI. *Ensuite, vous devez essayer de réécrire en ARI, mais pas le fait que cela fonctionnera.

Réinventer l'intégration

Pour que notre FreePBX puisse signaler à AMI de manière simple le début de l'appel, l'heure de fin, les numéros, les noms des fichiers enregistrés, il est plus simple de calculer la durée de l'appel en utilisant la même astuce que les auteurs originaux - entrez vos variables et analysez la sortie pour leur présence. PAMI suggère de le faire simplement via une fonction de filtrage.

Voici un exemple de définition de votre propre variable pour l'heure de début de l'appel (s est un numéro spécial dans le plan de numérotation qui est effectué AVANT de lancer la recherche DID)

[ext-did-custom]

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

Un exemple d'événement AMI pour cette ligne

Événement : nouvelle chaîne

Privilège : appeler, tous

Canal : PJSIP/VMS_pjsip-0000078b

État du canal : 4

ChannelStateDesc : Sonnerie

Numéro d'identification de l'appelant : 111222

Nom de l'ID de l'appelant : 111222

ConnectedLineNum :

nom de la ligne connectée :

Langue : fr

code de compte:

Contexte : from-pstn

Étendu : s

Priorité: 1

ID unique : 1599589046.5244

ID de lien : 1599589046.5244

Application : Définissez AppData :

AppelDébut=1599571046

Parce que FreePBX écrase les fichiers extention.conf et extention_additional.conf, nous utiliserons le fichier extension_Customiser.conf

Code complet de 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

Caractéristique et différence par rapport au plan de numérotation original des auteurs de l'article original -

  • Dialplan au format .conf, comme le veut FreePBX (oui, ça peut .ael, mais pas toutes les versions et ce n'est pas toujours pratique)

  • Au lieu de traiter la fin via exten=>h, le traitement a été introduit via hangup_handler, car le plan de numérotation FreePBX ne fonctionnait qu'avec lui

  • Chaîne d'appel de script fixe, ajout de guillemets et numéro d'appel externe ExtNum

  • Le traitement est déplacé vers des contextes _custom et vous permet de ne pas toucher ou modifier les configurations FreePBX - entrant via [ext-a-personnalisé], sortant par [sortant-allroutes-personnalisé]

  • Aucune liaison aux nombres - le fichier est universel et ne doit être configuré que pour le chemin et le lien vers le serveur

Pour commencer, vous devez également exécuter des scripts dans AMI par identifiant et mot de passe - pour cela, FreePBX dispose également d'un fichier _custom

fichier 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

Ces deux fichiers doivent être placés dans /etc/asterisk, puis relisez les configs (ou redémarrez l'astérisque)

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

Passons maintenant à PHP

Initialisation des scripts et création d'un service

Étant donné que le schéma de travail avec Bitrix 24, un service pour AMI, n'est pas entièrement simple et transparent, il doit être discuté séparément. Asterisk, lorsque AMI est activé, ouvre simplement le port et c'est tout. Lorsqu'un client se joint, il demande une autorisation, puis le client s'abonne aux événements nécessaires. Les événements sont en texte brut, que PAMI convertit en objets structurés et offre la possibilité de définir la fonction de filtrage uniquement pour les événements d'intérêt, les champs, les nombres, etc.

Dès que l'appel arrive, l'événement NewExten est déclenché à partir du contexte parent [from-pstn], puis tous les événements se déroulent dans l'ordre des lignes dans les contextes. Lorsque des informations sont reçues des variables CallMeCallerIDName et CallStart spécifiées dans le plan de numérotation _custom, le

  1. La fonction de demander l'ID utilisateur correspondant au numéro de poste où l'appel est venu. Et s'il s'agit d'un groupe d'accès à distance ? La question est politique, faut-il créer un appel à tout le monde en même temps (quand tout le monde appelle en même temps) ou créer comme ils appellent en appelant à tour de rôle ? La plupart des clients ont la stratégie First Available, il n'y a donc aucun problème avec cela, un seul appel. Mais il faut régler le problème

  2. La fonction d'enregistrement d'appel dans Bitrix24, qui renvoie le CallID, qui est ensuite nécessaire pour signaler les paramètres d'appel et un lien vers l'enregistrement. Nécessite un numéro de poste ou un ID utilisateur

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

Après la fin de l'appel, la fonction de téléchargement d'enregistrement est appelée, qui signale simultanément l'état de l'achèvement de l'appel (occupé, pas de réponse, succès) et télécharge également un lien vers le fichier mp3 avec l'enregistrement (le cas échéant).

Parce que le module CallMeIn.php doit fonctionner en continu, un fichier de démarrage SystemD a été créé pour lui appelez-moi.service, qui doit être mis dans /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

l'initialisation et le lancement du script se font via systemctl ou service

# systemctl enable callme
# systemctl start callme

Le service redémarrera au besoin (en cas de plantage). Le service de suivi de la boîte de réception ne nécessite pas l'installation d'un serveur Web, seul php est nécessaire (qui est définitivement sur le serveur FeePBX). Mais en l'absence d'accès aux enregistrements d'appels via le serveur Web (également avec https), il ne sera pas possible d'écouter les enregistrements d'appels.

Parlons maintenant des appels sortants. Le script CallMeOut.php a deux fonctions :

  • Initiation d'un appel lorsqu'une demande est reçue pour un script php (y compris en utilisant le bouton "Appeler" dans le Bitrix lui-même). Cela ne fonctionne pas sans serveur Web, la requête est reçue via HTTP POST, la requête contient un jeton

  • Message sur l'appel, ses paramètres et enregistrements dans Bitrix. Déclenché par Asterisk dans le plan de numérotation [sub-call-internal-ended] lorsqu'un appel se termine

Comprendre FreePBX et l'intégrer à Bitrix24 et plus

Le serveur Web n'est nécessaire que pour deux choses : télécharger les fichiers d'enregistrement Bitrix (via HTTPS) et appeler le script CallMeOut.php. Vous pouvez utiliser le serveur FreePBX intégré, dont les fichiers sont /var/www/html, vous pouvez installer un autre serveur ou spécifier un chemin différent.

serveur Web

Laissons la configuration du serveur Web pour une étude indépendante (tyts, tyts, tyts). Si vous n'avez pas de domaine, vous pouvez essayer FreeDomain( https://www.freenom.com/ru/index.html), ce qui vous donnera un nom libre pour votre IP blanche (n'oubliez pas de rediriger les ports 80, 443 via le routeur si l'adresse externe est uniquement dessus). Si vous venez de créer un domaine DNS, vous devez attendre (de 15 minutes à 48 heures) que tous les serveurs soient chargés. Selon l'expérience de travail avec des fournisseurs nationaux - de 1 heure à une journée.

Automatisation des installations

Un installateur a été développé sur github pour rendre l'installation encore plus facile. Mais c'était fluide sur le papier - pendant que nous installons tout cela manuellement, car après avoir bricolé tout cela, il est devenu parfaitement clair ce qui est ami avec qui, qui va où et comment le déboguer. Il n'y a pas encore d'installateur

Docker

Si vous voulez essayer rapidement la solution - il y a une option avec Docker - créez rapidement un conteneur, donnez-lui des ports vers l'extérieur, glissez les fichiers de paramètres et essayez (c'est l'option avec le conteneur LetsEncrypt, si vous avez déjà un certificat , il vous suffit de rediriger le proxy inverse vers le serveur Web FreePBX (nous lui avons donné un autre port est le 88), LetsEncrypt dans docker basé sur cet article

Vous devez exécuter le fichier dans le dossier de projet téléchargé (après git clone), mais entrez d'abord dans les configurations d'astérisque (dossier d'astérisque) et écrivez les chemins vers les enregistrements et l'URL de votre site là-bas

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:

Ce fichier docker-compose.yaml est exécuté via

docker-compose up -d

Si nginx ne démarre pas, alors quelque chose ne va pas avec la configuration dans le dossier nginx/ssl_docker.conf

Autres intégrations

Et pourquoi ne pas mettre du CRM dans des scripts en même temps, nous avons pensé. Nous avons étudié plusieurs autres API CRM, en particulier le PBX intégré gratuit - ShugarCRM et Vtiger, et oui ! oui le principe est le même. Mais c'est une autre histoire, que nous téléchargerons plus tard sur le github séparément.

références

Avertissement : Toute ressemblance avec la réalité est fictive et ce n'était pas moi.

Source: habr.com

Ajouter un commentaire