est une Ă©norme plateforme qui combine Ă la fois CRM, gestion documentaire, comptabilitĂ© et encore beaucoup d'autres choses apprĂ©ciĂ©es par les managers mais moins par le personnel IT. 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 fonctionnalitĂ© principale que les managers « aiment » est l'intĂ©gration de la tĂ©lĂ©phonie et de la CRM, oĂč chaque appel est immĂ©diatement enregistrĂ© dans la CRM, des fiches clients sont créées, avec les informations sur le client affichĂ©es lors d'un appel entrant, et il est tout de suite visible qui il est, ce qu'on peut lui vendre et combien il doit. Cependant, la tĂ©lĂ©phonie de Bitrix24 et son intĂ©gration avec la CRM coĂ»tent de l'argent, parfois des sommes considĂ©rables. Dans cet article, je partagerai mon expĂ©rience d'intĂ©gration avec des outils open source et un IP PBX populaire , et j'examinerai Ă©galement la logique de fonctionnement des diffĂ©rentes parties
Je travaille en freelance pour une entreprise qui se spĂ©cialise dans la vente, la configuration et l'intĂ©gration de la tĂ©lĂ©phonie IP. Quand on m'a demandĂ© si nous pouvions proposer quelque chose pour intĂ©grer Bitrix24 avec les PBX que nos clients possĂšdent, ainsi qu'avec des PBX virtuels sur diffĂ©rents VDS d'entreprise, je me suis tournĂ© vers Google. Et bien sĂ»r, il m'a donnĂ© un lien vers , qui contient une description, un github, et il semble que tout fonctionne. Mais en essayant d'utiliser cette solution, il est devenu Ă©vident que Bitrix24 n'est plus ce qu'il Ă©tait auparavant, et beaucoup de choses doivent ĂȘtre retravaillĂ©es. De plus, FreePBX n'est pas juste un Asterisk nu, il faut rĂ©flĂ©chir Ă la façon de concilier facilitĂ© d'utilisation et un plan de numĂ©rotation complexe dans les fichiers de configuration.
Ătudions la logique de fonctionnement
Pour commencer, voici comment tout cela doit fonctionner. Lorsqu'un appel externe arrive sur le PBX (Ă©vĂ©nement SIP INVITE du fournisseur), le traitement du plan de numĂ©rotation (dialplan) commence â les rĂšgles concernant ce qu'il faut faire et dans quel ordre avec l'appel. Du premier paquet, il est possible d'obtenir beaucoup d'informations qui pourront ĂȘtre utilisĂ©es dans les rĂšgles. Un excellent outil pour explorer les entrailles du SIP est l'analyseur sngrep () qui peut ĂȘtre simplement installĂ© sur des distributions populaires via apt install/yum install et similaire, mais il est aussi possible de le compiler Ă partir des sources. Jetons un coup d'Ćil au journal des appels dans sngrep.

De maniÚre simplifiée, le plan de numérotation ne s'occupe que du premier paquet, et parfois, pendant l'appel, il y a également un transfert des appels, des pressions de touches (DTMF), diverses fonctionnalités intéressantes comme FollowMe, RingGroup, IVR et autres.
Que contient le paquet Invite

En fait, la plupart des simples plans de numĂ©rotation fonctionnent avec les deux premiers champs et toute la logique tourne autour du DID et du CallerID. DID â vers oĂč nous appelons, CallerID â qui appelle.
Mais notre entreprise a plusieurs tĂ©lĂ©phones â donc il y a probablement dans le PBX des groupes d'appels (appel simultanĂ©/sĂ©quentiel de plusieurs appareils) sur les numĂ©ros de tĂ©lĂ©phone fixe (Ring Group), IVR (Bonjour, vous avez appelé⊠Appuyez sur un pourâŠ), RĂ©pondeurs automatiques (Phrases), Conditions temporelles (Time Conditions), Renvoi vers d'autres numĂ©ros ou un mobile (FollowMe, Forward). Cela signifie qu'il est trĂšs difficile de dĂ©terminer clairement Ă qui l'appel arrivera rĂ©ellement et avec qui la conversation aura lieu lors de la rĂ©ception de l'appel. Voici un exemple du dĂ©but d'un appel typique dans le PBX de nos clients.

AprĂšs l'entrĂ©e rĂ©ussie de l'appel dans le PBX, il voyage Ă travers le plan de numĂ©rotation dans diffĂ©rents « contextes ». Un contexte, du point de vue d'Asterisk, est un ensemble numĂ©rotĂ© de commandes, chacune contenant un filtre basĂ© sur le numĂ©ro composĂ© (il est appelĂ© exten, pour un appel sortant, au dĂ©but exten=DID). Les commandes dans la ligne de plan de numĂ©rotation peuvent ĂȘtre n'importe quoi â des fonctions internes (par exemple, appeler un abonnĂ© interne â Dial(), raccrocher â Hangup()), des opĂ©rateurs conditionnels (IF, ELSE, ExecIF et similaires), des transitions vers d'autres rĂšgles de ce contexte (Goto, GotoIF), des transitions vers d'autres contextes sous forme d'appels de fonctions (Gosub, Macro). La directive include nom_contexte, ajoute les commandes d'un autre contexte Ă la fin du contexte actuel. Les commandes incluses via include sont toujours exĂ©cutĂ©es aprĂšs aprĂšs la commande du contexte actuel.
Toute la logique de fonctionnement de FreePBX repose sur l'inclusion les uns des autres de différents contextes via include et des appels via Gosub, Macro et les gestionnaires Handler. Examinons le contexte des appels entrants de FreePBX.

L'appel passe par tous les contextes du haut vers le bas, dans chaque contexte, il peut y avoir des appels d'autres contextes sous forme de macros (Macro), de fonctions (Gosub) ou simplement des transitions (Goto), donc l'arbre rĂ©el de ce qui est appelĂ© ne peut ĂȘtre suivi que dans les journaux.
Le schĂ©ma typique de configuration d'un systĂšme de tĂ©lĂ©phonie d'entreprise standard est illustrĂ© ci-dessous. Lors d'un appel, il recherche le DID dans les itinĂ©raires entrants, vĂ©rifie les conditions temporelles, et si tout est en ordre, il lance le menu vocal. De lĂ , on peut accĂ©der au groupe d'opĂ©rateurs en appuyant sur le bouton 1 ou par expiration du dĂ©lai. Ă la fin de l'appel, le macro hangupcall est exĂ©cutĂ©, aprĂšs quoi aucune autre action ne pourra ĂȘtre effectuĂ©e dans le plan de numĂ©rotation, Ă l'exception des gestionnaires spĂ©ciaux (hangup handler).

Ă quel moment dans cet algorithme d'appel devons-nous fournir les informations sur le dĂ©but de l'appel au CRM, oĂč commencer l'enregistrement, oĂč mettre fin Ă l'enregistrement et l'envoyer avec les informations sur l'appel vers le CRM ?
Intégration avec des systÚmes externes
Qu'est-ce que l'intégration d'un systÚme téléphonique et d'un CRM ? Ce sont des configurations et des programmes qui convertissent les données et les événements entre ces deux plateformes et se les échangent. Le moyen le plus courant d'interaction entre des systÚmes indépendants est l'API, et le moyen le plus populaire d'accéder à l'API est le HTTP REST. Mais pas pour Asterisk.
à l'intérieur d'Asterisk, il y a :
AGI â appel synchrone de programmes/composants externes, utilisĂ© principalement dans le plan de numĂ©rotation, il existe des bibliothĂšques comme ,
AMI â socket TCP texte, fonctionnant sur le principe de la souscription aux Ă©vĂ©nements et de l'envoi de commandes textuelles, qui ressemble Ă SMTP de l'intĂ©rieur, capable de suivre des Ă©vĂ©nements et de gĂ©rer des appels, il existe une bibliothĂšque â la plus populaire pour Ă©tablir un lien avec Asterisk
Exemple de sortie AMI
ĂvĂ©nement : Newchannel
PrivilĂšge : call,all
Canal : PJSIP/VMS_pjsip-0000078b
Ătat du canal : 4
Description de l'état du canal : Ring
Numéro de l'appelant : 111222
Nom de l'appelant : 111222
Numéro de ligne connectée :
Nom de ligne connectée :
Langue : en
Code compte :
Contexte : from-pstn
Exten : s
Priorité : 1
Identifiant unique : 1599589046.5244
Identifiant lié : 1599589046.5244
ARI â un mĂ©lange de l'un et de l'autre, tout via REST, WebSocket, en format JSON â mais avec des bibliothĂšques et des wrappers rĂ©cents c'est un peu dĂ©licat, on a trouvĂ© (, ) qui s'Ă©taient stagnĂ©s dans leur dĂ©veloppement il y a environ 3 ans.
Exemple de sortie ARI lors de l'initiation d'un appel
{ "variable":"CallMeCallerIDName", "value":"111222", "type":"ChannelVarset", "timestamp":"2020-09-09T09:38:36.269+0000", "channel":{"id":"1599644315.5334", "name":"PJSIP/VMSpjsip-000007b6", "state":"Ring", "caller":{"name":"111222", "number":"111222"}, "connected":{"name":"", "number":""}, "accountcode":"", "dialplan":{"context":"from-pstn", "exten":"s", "priority":2, "appname":"Stasis", "appdata":"hello-world" }, "creationtime":"2020-09-09T09:38:35.926+0000", "language":"ru" }, "asteriskid":"48:5b:aa:aa:aa:aa", "application":"hello-world" }
La commodité ou l'incommode, la possibilité ou l'impossibilité d'interagir avec une API donnée dépendent des tùches à accomplir. Les tùches pour l'intégration avec le CRM sont les suivantes :
Suivre le dĂ©but de l'appel, oĂč il a Ă©tĂ© transfĂ©rĂ©, extraire le CallerID, le DID, les heures de dĂ©but et de fin, et Ă©ventuellement des donnĂ©es du rĂ©pertoire (pour Ă©tablir le lien entre le tĂ©lĂ©phone et l'utilisateur du CRM)
Commencer et terminer l'enregistrement de l'appel, le sauvegarder dans le format requis, informer Ă la fin de l'enregistrement oĂč le fichier est stockĂ©
Initier un appel en fonction d'un événement externe (depuis le programme), appeler un numéro interne, externe et les connecter
En option: intégrer avec le CRM, les groupes d'appel et FollowME pour le transfert automatique des appels en cas d'absence (selon les informations du CRM)
Toutes ces tĂąches peuvent ĂȘtre rĂ©solues via AMI ou ARI, mais l'ARI fournit beaucoup moins d'informations, de nombreux Ă©vĂ©nements ne sont pas suivis et plusieurs variables qui existent dans l'AMI ne sont pas prĂ©sentes (par exemple, les appels de macros, la dĂ©finition de variables Ă l'intĂ©rieur des macros, y compris l'enregistrement des appels). Ainsi, pour un suivi correct et prĂ©cis, choisissons pour l'instant l'AMI (mais ce n'est pas dĂ©finitif). De plus (eh bien, que ferions-nous sans cela, nous sommes des ĂȘtres humains paresseux) â dans le travail initial () utilise PAMI. *Ensuite, il faut essayer de réécrire en ARI, mais ce n'est pas sĂ»r que cela fonctionnera.
Réinventions de l'intégration
Pour que notre FreePBX puisse communiquer dans AMI de maniĂšre simple sur le dĂ©but de l'appel, l'heure de la fin, les numĂ©ros, les noms des fichiers enregistrĂ©s, il est plus simple d'utiliser le mĂȘme truc que les auteurs d'origine â introduire nos propres variables et analyser la sortie pour leur prĂ©sence. PAMI propose cela simplement via une fonction-filtre.
Voici un exemple de dĂ©finition de notre variable pour l'heure de dĂ©but de l'appel (s â c'est un numĂ©ro spĂ©cial dans le dialplan, qui est exĂ©cutĂ© AVANT le dĂ©but de la recherche par DID)
[ext-did-custom]
exten => s,1,Set(CallStart=${STRFTIME(epoch,,%s)})Exemple d'événement AMI pour cette ligne
ĂvĂ©nement : Newchannel
PrivilĂšge : call,all
Canal : PJSIP/VMS_pjsip-0000078b
Ătat du canal : 4
Description de l'état du canal : Ring
Numéro de l'appelant : 111222
Nom de l'appelant : 111222
Numéro de ligne connectée :
Nom de ligne connectée :
Langue : en
Code compte :
Contexte : from-pstn
Exten : s
Priorité : 1
Identifiant unique : 1599589046.5244
Identifiant lié : 1599589046.5244
Application: Set AppData :
CallStart=1599571046
Ătant donnĂ© que FreePBX réécrit les fichiers extention.conf et extention_additional.conf, nous utiliserons le fichier extention_custom.conf
Code complet de extention_custom.conf
[globals]
;; Vérifiez les chemins et les droits d'accÚs des dossiers - L'utilisateur asterisk doit avoir des droits d'écriture
;; Les conversations seront enregistrées ici
WAV=\/var\/www\/html\/callme\/records\/wav
MP3=\/var\/www\/html\/callme\/records\/mp3
;; Les enregistrements seront reproduits et téléchargés par ces chemins
URLRECORDS=https:\/\/www.host.ru\/callmeplus\/records\/mp3
;; Adresse pour le callback lors d'un appel sortant
URLPHP=https:\/\/www.host.ru\/callmeplus
;; Oui, nous enregistrons les conversations
RECORDING=1
;; Ceci est un macro pour enregistrer les conversations dans notre dossier.
;; Vous pouvez utiliser l'enregistrement systĂšme, mais pour l'instant, restons avec celui-ci -
;; il fonctionne
[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()
;; Ceci est le contexte principal pour commencer la conversation
[ext-did-custom]
;; C'est un peu borderline de faire ça ici, mais ça fonctionne - ajoutons '8' au numéro
nexten => s,1,Set(CALLERID(num)=8${CALLERID(num)})
;; Variables pour le script
nexten => 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)})
;; Le plus important ! Le gestionnaire de fin de conversation.
;; Les chemins habituels de traitement de la fin via (exten=>h,1,somethinghere) dans FreePBX ne fonctionnent pas - Macro(hangupcall,) tout dérange.
;; Donc, nous attachons le Hangup_Handler Ă la fin de l'appel
nexten => s,n,Set(CHANNEL(hangup_handler_push)=sub-call-from-cid-ended,s,1(${CALLERID(num)},${EXTEN}))
;; Gestionnaire de fin d'appel entrant
[sub-call-from-cid-ended]
;; Indique les valeurs Ă la fin de l'appel
nexten => s,1,Set(CDR_PROP(disable)=true)
exten => s,n,Set(CallStop=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDURATION=${MATH(${CallStop}-${CallStart},int)})
;; Statut de l'appel - Répondu, non répondu...
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Return
;; Gestionnaire des appels sortants - tout est similaire
[outbound-allroutes-custom]
;; Enregistrement
nexten => _.,1,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
;; Variables
nexten => _.,n,Set(__CallIntNum=${CALLERID(num)})
exten => _.,n,Set(CallExtNum=${EXTEN})
exten => _.,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => _.,n,Set(CallmeCALLID=${SIPCALLID})
;; Nous attachons le Hangup_Handler Ă la fin de l'appel
nexten => _.,n,Set(CHANNEL(hangup_handler_push)=sub-call-internal-ended,s,1(${CALLERID(num)},${EXTEN}))
;; Gestionnaire de fin d'appel sortant
[sub-call-internal-ended]
;; Variables
nexten => 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)})
;; Appel du script qui notifiera l'appel dans le CRM - c'est sortant,
;; donc Ă la fin
nexten => 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,ReturnLa caractéristique et la différence par rapport au plan de dial original des auteurs de l'article source -
Plan de dial au format .conf, comme le souhaite FreePBX (oui, il prend en charge .ael, mais pas toutes les versions et ce n'est pas toujours pratique)
Au lieu de traiter la fin via exten=>h, le traitement est introduit par hangup_handler, car FreePBX ne fonctionnait qu'avec cela
La ligne d'appel du script a été corrigée, avec des guillemets ajoutés et le numéro externe ExtNum
Les traitements ont été extraits dans des contextes _custom et permettent de ne pas toucher ni modifier les configurations de FreePBX - entrant via [ext-did-custom], sortant via [outbound-allroutes-custom]
Aucune liaison aux numéros - le fichier est universel et nécessite seulement la configuration du chemin et un lien vers le serveur
Pour commencer à travailler, il faut également autoriser les scripts dans AMI avec un identifiant et un mot de passe - pour cela, il y a également un fichier _custom dans FreePBX
Fichier manager_custom.conf
;; ceci est le login
[callmeplus]
;; ceci est le mot de passe
secret = trampampamturlala
denier = 0.0.0.0/0.0.0.0
;; je travaille avec la machine locale - mais si nĂ©cessaire, d'autres peuvent aussi ĂȘtre inscrits
permettre = 127.0.0.1/255.255.255.255
lire = systeme,appel,journal,verbose,agent,utilisateur,config,dtmf,reporting,cdr,dialplan
Ă©crire = systeme,appel,agent,journal,verbose,utilisateur,config,commande,reporting,originateCes deux fichiers doivent ĂȘtre placĂ©s dans /etc/asterisk, puis les configurations doivent ĂȘtre relues (ou le systĂšme Asterisk redĂ©marrĂ©)
# astrisk -rv
Connected to Asterisk 16.6.2 currently running on freepbx (pid = 31629)
#freepbx*CLI> dialplan reload
Dialplan reloaded.
#freepbx*CLI> exitPassons maintenant Ă PHP
Initialisation des scripts et création du service
Comme le schĂ©ma de travail avec Bitrix 24, le service pour AMI n'est pas tout Ă fait simple et transparent, il mĂ©rite donc une attention sĂ©parĂ©e. Asterisk, lors de l'activation de l'AMI, ouvre simplement un port et c'est tout. Lorsqu'un client se connecte, il demande une autorisation, puis le client s'abonne aux Ă©vĂ©nements nĂ©cessaires. Les Ă©vĂ©nements arrivent sous forme de texte simple, que PAMI transforme en objets structurĂ©s et permet de dĂ©finir une fonction de filtrage uniquement pour les Ă©vĂ©nements, champs, numĂ©ros d'intĂ©rĂȘt, etc.
DÚs qu'un appel arrive, un événement NewExten se déclenche à partir du contexte parent [from-pstn], puis tous les événements se succÚdent dans l'ordre des lignes dans les contextes. Lors de la réception d'informations à partir des variables _custom CallMeCallerIDName et CallStart définies dans le plan de dial, cela est appelé
La fonction de demande UserID, correspondant au numĂ©ro interne oĂč l'appel est arrivĂ©. Et si c'est un groupe d'appel? C'est une question politique, faut-il appeler tout le monde en mĂȘme temps (lorsque tout le monde appelle en mĂȘme temps) ou crĂ©er des appels au fur et Ă mesure lors d'appels successifs ? La plupart des clients ont la stratĂ©gie First Available, donc il n'y a pas de problĂšme, un seul doit appeler. Mais la question doit ĂȘtre rĂ©solue.
La fonction d'enregistrement d'appel dans Bitrix24, qui renvoie CallID, nécessaire ensuite pour communiquer les paramÚtres de l'appel et le lien vers l'enregistrement. Cela exige soit le numéro interne soit UserID.

AprÚs la fin de l'appel, la fonction de téléchargement de l'enregistrement est appelée, qui informe simultanément de l'état de fin d'appel (Occupé, Pas de réponse, SuccÚs), et charge également le lien vers le fichier mp3 de l'enregistrement (s'il existe).
Ătant donnĂ© que le module CallMeIn.php doit fonctionner en continu, un fichier de dĂ©marrage SystemD a Ă©tĂ© créé pour lui. callme.service, qui doit ĂȘtre placĂ© 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
# ici, il faut vérifier quels droits sur les dossiers
#User=www-data #Ubuntu - debian
#User=nginx #Centos
[Install]
WantedBy=multi-user.targetL'initialisation et l'exécution du script se fait via systemctl ou service.
# systemctl enable callme
# systemctl start callmeLe service se redémarrera automatiquement si nécessaire (en cas de pannes). Le service de surveillance des appels entrants ne nécessite pas l'installation d'un serveur web, seulement php (qui est certainement présent sur le serveur FeePBX). Mais sans accÚs aux enregistrements des appels via le serveur web (et avec https) il n'y aura pas de possibilité d'écouter les enregistrements des conversations.
Maintenant, parlons des appels sortants. Le script CallMeOut.php a deux fonctions :
Initiation de l'appel à la réception d'une demande au script php (y compris via le bouton « Appeler » dans Bitrix). Cela ne fonctionne pas sans serveur web, la demande arrive via HTTP POST, avec le jeton dans la demande.
Notification d'appel, de ses paramĂštres et d'enregistrements dans Bitrix. Cela se produit Ă l'initiative d'Asterisk dans le plan d'appel [sub-call-internal-ended] Ă la fin de l'appel.

Le serveur web est nécessaire uniquement pour deux choses : le téléchargement des fichiers d'enregistrement par Bitrix (via HTTPS) et l'appel du script CallMeOut.php. On peut utiliser le serveur intégré de FreePBX, dont les fichiers se trouvent dans /var/www/html, ou installer un autre serveur ou définir un autre chemin.
Serveur web
Laissez la configuration du serveur web pour une Ă©tude autonome (, , ). Si vous n'avez pas de domaine, vous pouvez essayer FreeDomain ( ), qui vous donnera gratuitement un nom pour votre IP publique (n'oubliez pas de rediriger les ports 80, 443 via le routeur, si l'adresse externe n'est prĂ©sente que sur celui-ci). Si vous venez de crĂ©er un domaine DNS, il faut attendre (de 15 minutes Ă 48 heures) que tous les serveurs se propagent. D'aprĂšs mon expĂ©rience avec les fournisseurs nationaux â cela prend de 1 heure Ă un jour.
Automatisation de l'installation
Le dĂ©veloppement d'un installateur a commencĂ© sur GitHub, afin de simplifier encore plus l'installation. Mais c'Ă©tait facile sur le papier â pour l'instant, nous installons tout cela manuellement, heureusement, aprĂšs avoir fouillĂ© dans tout cela, il est devenu clair qui s'entend avec qui, oĂč aller et comment dĂ©boguer. L'installateur n'est pas encore disponible (
Docker
Si vous souhaitez tester rapidement la solution, il existe une option avec Docker â crĂ©er rapidement un conteneur, lui donner des ports externes, fournir des fichiers de configuration et essayer (c'est une option avec un conteneur LetsEncrypt, si vous avez dĂ©jĂ le certificat, il suffit de rediriger le proxy inverse vers le serveur web FreePBX (nous lui avons donnĂ© un autre port â 88), LetsEncrypt dans Docker est basĂ© sur
Vous devez exécuter le fichier dans le dossier de projet téléchargé (aprÚs git clone), mais d'abord, allez dans les config d'Asterisk (dossier asterisk) et y inscrire les chemins vers les enregistrements et l'URL de votre site
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 # pour la configuration
- 5060:5060\/udp
- 5160:5160\/udp
- 127.0.0.1:5038:5038 # pour 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 se lance via
docker-compose up -d
Si nginx ne s'est pas lancé, cela signifie qu'il y a un problÚme avec la configuration dans le dossier nginx\/ssl_docker.conf
Autres intégrations
Et pourquoi ne pas intĂ©grer quelques CRM dans les scripts, avons-nous pensĂ©. Nous avons Ă©tudiĂ© plusieurs API d'autres CRM, en particulier celle intĂ©grĂ©e gratuitement dans certains PABX â ShugarCRM et Vtiger, et oui ! c'est possible, le principe est le mĂȘme. Mais c'est une autre histoire, que nous allons mettre sur GitHub sĂ©parĂ©ment.
Liens
Le code lui-mĂȘme est sur GitHub â
Article de départ pour l'inspiration
Avertissement : toute similitude avec des événements réels est purement fortuite et ce n'est pas moi.
Source : habr.com
