Bienvenue
Ce guide accompagne l’opérateur et ses revendeurs : ceux qui installent le centrex, créent les
clients et leur fournissent numéros et trunks. Le guide du client, servi
sous /guide/, couvre ce que voient les clients et leurs collaborateurs ; en mode admin, vous
y faites ce qu’ils font.
| Rôle | Ce qu’il fait |
|---|---|
| Admin revendeur | Crée et suit ses clients, leur affecte des numéros, gère ses grilles de vente. |
| Admin opérateur | Gère toute l’installation : revendeurs, clients, stock de numéros, trunks, diagnostic, réglages. |
| Support opérateur | Consulte tout et agit sur le diagnostic, sans rien modifier d’autre. |
La connexion et le compte sont les mêmes que pour un client : voir Se connecter et Mon compte. L’opérateur qui installe le centrex commence par Installation et exploitation : prérequis, dimensionnement, démarrage rapide, mises à jour, sauvegardes.
Ce guide s’ouvre depuis le lien Documentation du menu du portail, pour les équipes de l’opérateur et des revendeurs ; la documentation complète de l’API aussi (voir API de l’opérateur).
Clients et utilisateurs
La page Clients liste vos clients. Nouveau client en crée un : son nom et son
domaine, le nom de domaine SIP du client (par exemple client.operateur.exemple). Le
domaine ne change plus ensuite : les téléphones s’y enregistrent.
La fiche d’un client regroupe :
- Utilisateurs : Ajouter un utilisateur avec son nom, son adresse e-mail, son rôle (admin client ou utilisateur) et, s’il a un téléphone, son numéro interne (2 à 8 chiffres). Il reçoit son invitation par e-mail ; Renvoyer l’invitation lui en envoie une nouvelle (lien expiré, mot de passe oublié). Gérer modifie son nom, son adresse et son rôle, le désactive ou le supprime avec son poste (voir Collaborateurs). Chaque poste montre son téléphone (connecté ou non), son numéro présenté et ses restrictions (surtaxés, international, tous les sortants).
- Numéros : ceux du client et leur destination (voir Numéros).
- Parcours des appels et Journal d’appels du client, comme son admin client les voit.
- Rejouer la publication : réécrit le parcours publié dans le serveur téléphonique, sans nouvelle version. Utile en diagnostic, quand un appel ne suit pas le parcours affiché.
- Abonnement : voir plus bas.
Un utilisateur qui a perdu son second facteur : Gérer, puis Réinitialiser la vérification en deux étapes ; il en configurera une nouvelle à sa prochaine connexion. Seul un compte de niveau supérieur peut le faire. L’assistant ne le fait pas : la sécurité des comptes lui reste fermée.
Les autres admins de votre revendeur s’ajoutent depuis la page Utilisateurs (voir Revendeurs et équipe).
Espace du client (mode admin)
Ouvrir l’espace du client, sur sa fiche, affiche le portail tel que l’administrateur du client le voit : son menu (accueil, parcours, collaborateurs, journal, messagerie…) et tout son standard, pour comprendre ce qu’il voit ou le dépanner. Un bandeau rouge le rappelle : vous agissez avec vos propres droits, et chaque action reste à votre nom au journal d’audit. Changer de client… passe à l’espace d’un autre client, sur la même page ; Quitter l’espace du client revient à sa fiche.
Abonnement d’un client
La carte Abonnement de la fiche du client :
- Renommer : le nom du client (raison sociale) ; son domaine ne change pas.
- Suspendre : ses comptes ne se connectent plus, ses clés d’API ne passent plus, ses téléphones ne s’enregistrent plus et ses numéros ne sonnent plus. Il ne compte plus dans la licence. Tout reste en place : Réactiver remet le service tel qu’il était. Dans la liste des clients, il porte la mention « suspendu ».
- Résilier : définitif. Postes, messageries et messages, parcours, enregistrements, annonces, répertoire, comptes et clés d’API sont supprimés. Retirez d’abord ses numéros (ils reviennent au stock) ; un client qui a un trunk se résilie après sa suppression par l’opérateur. Le journal d’audit et les appels des mois passés restent consultables dans les exports.
Un admin du client ne peut ni suspendre ni résilier son propre client.
Numéros
La page Numéros montre les numéros qui vous sont réservés par l’opérateur et ceux de vos clients, avec leur état : libre, affecté, en portabilité entrante ou sortante, résilié.
Pour donner un numéro à un client, depuis sa fiche : Affecter un numéro du stock, choisissez un numéro libre, puis Affecter. Choisissez ensuite sa destination : un poste, ou un module de son parcours des appels. L’admin client peut aussi changer la destination depuis son parcours.
Retirer rend le numéro au stock ; ses appels ne sont plus routés vers le client.
Grilles et consommation
Chaque appel sortant décroché est valorisé à sa réception, sur trois grilles : le prix d’achat de l’opérateur, sa vente au revendeur, la vente au client. Les entrants, les appels internes et les appels sans réponse ne sont pas valorisés. Un appel reçu renvoyé vers un numéro extérieur est valorisé comme un appel sortant vers ce numéro, du décroché du correspondant au raccroché.
Grilles tarifaires
La page Grilles les regroupe par nature : Achat, Vente aux revendeurs et Vente aux clients pour l’opérateur ; Vente aux clients pour un revendeur, qui ne voit jamais les prix d’achat de l’opérateur.
Nouvelle grille : un nom, une date d’effet (une grille d’achat ne s’applique qu’aux appels à partir de cette date, comptée dès minuit dans le fuseau du client appelant ; par défaut, aujourd’hui dans le vôtre) et ses lignes, de deux façons :
- Fichier CSV : une ligne par préfixe,
prefixe;destination;prix_minute;frais;palier, par exemple+336;Mobiles;0,05;0;60/30. Prix en euros HT. Le palierminimum/incrémenten secondes :1/1à la seconde,60/60à la minute entamée,60/30première minute indivisible puis par 30 secondes. - Depuis une autre grille, avec une marge : mêmes lignes, prix et frais majorés du pourcentage indiqué.
La grille par défaut d’une nature s’applique à tout client (ou revendeur) qui n’en a pas d’attribuée. Cliquez sur une grille pour voir ses lignes et chercher un préfixe ou une destination. Supprimer une grille ne change pas les appels déjà valorisés.
Attribuer une grille
Sur la fiche d’un client, la carte Tarification choisit sa grille de vente parmi celles de son opérateur ou de son revendeur ; sur la fiche d’un revendeur, l’opérateur choisit sa grille de vente au revendeur. Le changement vaut pour les appels suivants.
L’admin du client lit sa grille de vente, sans pouvoir la changer, dans le menu Tarifs de son espace : nom de la grille, date d’effet, prix par destination. Il ne voit ni le prix d’achat, ni la grille de vente au revendeur.
Consommation
La liste des Clients montre, pour le mois choisi (en haut de la page) et pour chaque client, les appels valorisés, les minutes facturées et les montants : l’achat (opérateur seulement), la vente au revendeur et la vente au client, avec le total. Les mois suivent le fuseau de votre organisation. Exporter les appels (CSV) télécharge le détail des appels sortants du même mois, base de la facturation.
Accueil
Votre équipe (admin opérateur, support) arrive sur la page Accueil à la connexion. Elle réunit ce qui demande attention et l’état du parc ; chaque ligne mène à la page où agir.
À traiter :
- FreeSWITCH qui ne répond pas ;
- le trunk d’un client non enregistré, avec le refus du fournisseur (code et motif) : un 403 signale en général un identifiant ou un mot de passe faux ;
- des adresses IP bannies : un téléphone mal configuré bloque peut-être tout un site (voir le Diagnostic) ;
- des webhooks abandonnés après plusieurs échecs ;
- une licence échue, bloquée ou qui expire dans moins de 30 jours ;
- une nouvelle version disponible.
Le parc : clients actifs et suspendus, utilisateurs (et le nombre prévu par la licence), numéros affectés et numéros libres du stock, appels en cours. La santé, les adresses bannies et les appels en cours se mettent à jour toutes les 30 secondes.
Ce mois-ci : appels valorisés, ventes aux clients et achats, hors taxes (voir Grilles et consommation). Dernières actions : les cinq dernières entrées du journal d’audit.
Un bloc que votre rôle ne permet pas de lire n’apparaît pas. Les revendeurs arrivent sur la liste de leurs clients.
Revendeurs et équipe
Revendeurs
Un revendeur vend le centrex à ses propres clients, sous votre installation. Il ne voit que ses clients ; vous voyez tout. La fonction Revendeurs s’active d’abord dans les Paramètres : sans elle, ni menu ni création.
La page Revendeurs les liste, avec leur nombre de clients. Nouveau revendeur en crée un : son nom suffit. Sa fiche montre :
- Admins du revendeur : ses comptes. Ajouter un compte avec le nom et l’adresse e-mail ; l’invitation part par e-mail (serveur réglé dans les réglages). Ils gèrent les clients du revendeur, leurs utilisateurs et leurs postes, et voient les numéros que vous leur réservez.
- Clients du revendeur.
Pour créer un client chez un revendeur : page Clients, Nouveau client, puis Rattaché à le revendeur. Sans revendeur, le client dépend directement de vous.
Équipe
La page Utilisateurs liste les comptes de votre organisation. Ajouter un compte en crée un, avec son rôle :
- Admin opérateur : tout le centrex, réglages compris ;
- Support opérateur : consulte tout et fait les actions de diagnostic (trace d’un appel, appel coupé, rechargement), sans rien créer ni modifier. Il n’écoute ni les messages vocaux ni les enregistrements des clients.
Chaque compte reçoit son invitation par e-mail ; le second facteur lui est demandé à sa première connexion. Renvoyer l’invitation lui envoie un nouveau lien. Gérer change son nom, son adresse ou son rôle, le désactive (plus de connexion) ou le supprime ; votre propre compte se règle dans Mon compte.
Un admin revendeur a aussi sa page Utilisateurs, pour ajouter les autres admins de son revendeur.
Un admin revendeur trouve aussi, sur sa page Utilisateurs, ses alertes par e-mail (voir Réglages de l’instance) ; le webhook de son parc et ses clés d’API sont dans le menu API (voir API de l’opérateur).
Stock de numéros
La page Numéros gère le stock de l’installation.
Ajouter au stock : un numéro par ligne au format international, avec le pays et le
fournisseur s’il le faut (+33123456789;FR;fournisseur ; FR par défaut pour un +33), ou un
fichier CSV de même format.
Pour chaque numéro : son pays, son fournisseur, le client qui l’utilise, son état (libre, affecté, portabilité entrante, portabilité sortante, résilié) et sa date de portabilité, modifiables depuis la liste. Un numéro réservé à un revendeur porte la mention « réservé » ; la réservation se fait par l’API ou par l’assistant. Filtrer par état retrouve, par exemple, les portabilités en cours.
L’affectation d’un numéro à un client se fait depuis la fiche du client, comme pour un revendeur (Numéros).
Trunk d’un client
Le trunk relie le standard d’un client au réseau téléphonique, par le C5 du fournisseur. Sans trunk, le client ne peut ni appeler l’extérieur ni recevoir d’appel.
Sur la fiche du client, Configurer le trunk. Si le fournisseur a un profil de trunk, choisissez-le dans Profil : il ne reste qu’à saisir l’Identifiant, le Mot de passe et le NDI. Sinon, choisissez Aucun : tout saisir :
- Fournisseur et Serveur : l’adresse du C5,
hôteouhôte:port; - Identifiant et Mot de passe du compte SIP, ou trunk par adresse IP ;
- Format des numéros : le numéro appelé, en France et à l’international, et le numéro présenté, au format attendu par le fournisseur. Appliquer un modèle préremplit les formats d’un fournisseur connu ;
- NDI : le numéro de tête de ligne, présenté sur tout appel qui sort sans numéro propre (poste sans numéro présenté, membre externe d’un groupe, renvoi vers l’extérieur) ;
- Hôte du P-Asserted-Identity : vide, le domaine du client ;
- Réseaux du fournisseur : les adresses d’où viennent ses appels, un réseau par ligne.
La fiche montre ensuite l’état du trunk (enregistré ou non) et le dernier refus du fournisseur, avec son code : un 403 signale en général un identifiant ou un mot de passe faux. Le mot de passe n’est jamais réaffiché : laissez le champ vide pour le garder.
Diagnostic
La page Diagnostic sert à comprendre et corriger un incident sans accès au serveur.
Santé
L’état de l’installation : version installée, serveur téléphonique (répond ou non, appels en cours), base de données, dernier appel reçu, envois de webhooks abandonnés, état des trunks des clients.
Quand une nouvelle version est disponible, la santé l’indique (« mise à jour disponible »). Elle
s’installe sur le serveur, par la personne qui l’administre (apt upgrade) : le portail ne
l’installe pas lui-même.
- Réenregistrer relance un trunk ; son état se met à jour en quelques secondes.
- Recharger la configuration recharge celle du serveur téléphonique pour toute l’installation, sans couper les appels en cours.
Appels en cours
Les appels de toute l’installation : client, appelant, appelé, état. Couper met fin à un appel bloqué. Le journal d’un client montre, pour chaque appel passé, sa trace : qui a raccroché, avec qui il a été mis en relation, le média.
Capture en direct
Pour comprendre un appel qui échoue ou un téléphone qui ne s’enregistre pas : choisissez le client, Démarrer la capture, puis faites passer l’appel ou redémarrer le téléphone. Les messages SIP et les journaux du serveur téléphonique qui concernent ce client s’affichent au fil de l’eau, cinq minutes au plus. Arrêter termine la capture, Télécharger garde le texte pour le transmettre au support. Rien n’est conservé sur le serveur ; chaque capture est au journal d’audit.
Échelle SIP trace les messages SIP en diagramme en échelle : une colonne par adresse (FreeSWITCH et ses correspondants : téléphones, trunk), une flèche par message, en rouge pour un échec (4xx, 5xx, 6xx). Choisissez un dialogue pour ne suivre qu’un appel ou un enregistrement ; cliquez sur une flèche pour lire le message entier. Télécharger le pcap donne un fichier à ouvrir dans Wireshark (Téléphonie, Flux SIP) : les messages y sont tels que FreeSWITCH les a envoyés ou reçus, déjà déchiffrés pour TLS ; les en-têtes IP et UDP ou TCP sont reconstruits, et le média (RTP) n’y figure pas.
Redémarrer FreeSWITCH
En dernier recours (l’admin de l’opérateur seulement). Par défaut, le redémarrage attend la fin des appels en cours et refuse les nouveaux en attendant ; cochez Tout de suite pour couper les appels en cours. Le serveur revient en une minute environ.
Journal d’audit
La page Journal d’audit montre qui a fait quoi, quand et d’où : connexions (réussies et
refusées), créations, modifications, actions de diagnostic. Filtrez par action (début du nom :
utilisateur., connexion) ou sur les refus ; cliquez sur une action pour son détail. Les
entrées ne se modifient ni ne s’effacent. Chacun voit son organisation et ce qui en dépend :
l’opérateur tout, un revendeur ses clients, l’admin d’un client son entreprise.
Adresses IP bannies
Après trop d’échecs d’enregistrement SIP depuis une adresse (un téléphone mal configuré, ou un robot qui cherche des mots de passe), l’adresse est bannie pour le SIP et le RTP seulement : le portail reste joignable. Le bannissement s’arrête seul à la fin.
La liste montre la raison, le compte et l’appareil en cause : un softphone mal configuré chez un client bloque tout son site, le diagnostic le montre. Débannir lève le blocage tout de suite, une fois l’appareil corrigé.
Bannir une adresse la bannit à la main, pour la durée choisie (celle des réglages par défaut) : un robot repéré dans la capture, un appareil à couper. Une adresse de la liste blanche ou d’un trunk ne peut pas l’être.
Réglages du bannissement : nombre d’échecs, fenêtre et durée (par défaut 10 échecs en 5 minutes, banni une heure), et une liste blanche de réseaux jamais bannis. Les réseaux des trunks, les adresses avec un téléphone inscrit et celles d’une connexion récente au portail sont déjà épargnés.
Accès de l’assistance
L’équipe d’assistance de l’éditeur a un compte sur votre instance, mais il est fermé par défaut : elle n’y entre que si vous l’ouvrez. Un admin de votre équipe choisit une durée (de 4 heures à 7 jours) puis Ouvrir l’accès ; Fermer l’accès le coupe aussitôt. À l’échéance, il se ferme seul. Ouvertures, fermetures et toutes les actions de l’assistance figurent dans le journal d’audit.
Sur la machine, la commande centrex acces-assistance ouvrir|fermer|etat fait de même.
Réglages de l’instance
Ces réglages sont sur la page Paramètres : l’admin opérateur les modifie, le support les consulte. Ceux de la machine (base, adresse publique, voix de synthèse) sont dans le fichier du service : voir Réglages du serveur. Le dépannage reste sur la page Diagnostic.
Fonctions
Deux fonctions sont coupées sur une instance neuve, pour ne pas encombrer le portail :
- Revendeurs : le menu Revendeurs, la colonne du revendeur dans la liste des clients et les grilles de vente au revendeur. Elle ne se coupe plus tant qu’un revendeur existe.
- Assistant IA : le menu Assistant, pour votre équipe et les admins des clients, et le réglage de l’assistant. Coupé, son réglage (clé, budgets) est gardé.
Coupée, une fonction disparaît du portail pour tous les comptes, et l’API refuse ce qui en dépend.
Profils de trunk
Un profil réunit ce qui est commun à tous les trunks d’un fournisseur : son nom (« Netwo »), le serveur du C5, le format des numéros, l’hôte du P-Asserted-Identity et ses réseaux. Nouveau profil, puis Appliquer un modèle… pour préremplir le format d’un fournisseur connu.
Sur la fiche d’un client, le trunk tiré d’un profil ne demande plus que l’identifiant, le mot de passe et le NDI. Modifier un profil met à jour tous les trunks qui en sont tirés : leur passerelle est rechargée si le serveur change, leurs routes sortantes si le format change. Un profil encore utilisé ne peut pas être supprimé.
Plafond de consommation
Protection contre le piratage d’un téléphone ou d’un compte SIP : la consommation sortante de chaque client, au prix d’achat HT, est comptée sur une heure glissante et sur un jour glissant.
- À 80 % d’un seuil, un e-mail d’alerte part aux adresses d’alerte de l’opérateur et du revendeur du client, et aux admins du client.
- Au seuil, les appels sortants du client sont restreints à la France fixe et mobile (01 à 05, 06, 07, 09) ; les urgences restent joignables, la durée des appels n’est pas limitée. Un second e-mail le signale.
- La restriction reste en place jusqu’à sa levée, sur la fiche du client (Lever la restriction) : le seuil horaire se lève par l’admin du client ou par vous, le seuil journalier par vous seul (pas par le revendeur). Le comptage de la fenêtre repart de la levée.
La carte Plafond de consommation règle les seuils par défaut (5 € par heure et 20 € par jour à l’installation). Sur la fiche d’un client, la même carte montre sa consommation et ses seuils, et vous permet de lui en donner d’autres ; vides, ceux de l’instance s’appliquent. Les appels sans prix d’achat (pas de grille d’achat) ne sont pas comptés.
Marque
Le nom, la couleur et le logo que voient vos clients : portail, page de connexion, page d’installation des téléphones et application mobile.
- Nom affiché : vide, celui de votre organisation.
- Couleur d’accent : celle des boutons et des liens. Une couleur trop claire, sur laquelle le texte blanc des boutons serait illisible, est refusée.
- Logo : PNG, JPEG ou WebP de 256 Kio au plus, affiché à 28 pixels de haut sur le fond sombre du menu. Sans logo, un carré de la couleur d’accent.
Les changements s’appliquent aussitôt, pour tous. Le portail installé sur un téléphone (voir Accueil) porte ce nom et une icône à l’initiale du nom, sur la couleur d’accent.
Langue et fuseau horaire
Langue : français ou anglais, pour votre équipe (portail, invitations, mot de passe
oublié) et, par défaut, pour les clients créés ensuite. Chaque client peut régler la sienne, et
chaque compte la sienne dans Mon compte. La langue d’un client fixe aussi
la voix de ses annonces, de sa messagerie et de ses salles de conférence (voix française, ou
Callie en anglais). La voix de
synthèse anglaise est facultative : CENTREX_VOIX_PIPER_EN (modèle Piper anglais) ; sans elle,
un client réglé en anglais dépose des enregistrements.
Fuseau horaire : celui de votre organisation, Europe/Paris par défaut, repris par les
revendeurs et les clients créés ensuite ; chacun peut régler le sien. Il fixe les heures
d’ouverture des parcours, les dates affichées dans le portail et annoncées par la messagerie,
le découpage des mois (consommation, export du parc, webhook de fin de mois) et le jour du
relevé de licence. Les horaires publiés d’un client passent aussitôt à son nouveau fuseau.
Alertes par e-mail
Les adresses qui reçoivent les alertes de votre parc : trunk d’un client tombé (avec le motif donné par le fournisseur) puis rétabli, licence échue ou bloquée, et pour l’opérateur seul, stockage presque plein (volume des enregistrements à 80 % puis 95 %, disque système sous 20 % puis 10 % libres). Une alerte par changement, pas à chaque tentative. Elles partent par le serveur d’e-mails ci-dessous ; chaque revendeur règle les siennes pour ses clients (page Utilisateurs).
E-mails (SMTP)
Les e-mails du centrex (messagerie vocale, invitations, alertes) partent par ce serveur : serveur, port, chiffrement (STARTTLS, TLS ou relais local), identifiant, mot de passe, adresse et nom de l’expéditeur. Envoyer l’essai vérifie le réglage. Sans serveur, le centrex n’envoie aucun e-mail, invitations comprises : réglez-le avant de créer les premiers utilisateurs.
Transcription des messages vocaux
Le service qui transcrit les messages des boîtes où la transcription est activée : adresse de l’API, modèle, langue, clé. Essayer vérifie qu’il répond. Laissez la langue vide pour que chaque message soit transcrit dans la langue de son client (français ou anglais) ; une langue saisie s’impose à tous les clients. Pour un service installé chez vous, voir Transcription locale.
Application mobile
Le Cloud ID de votre application mobile Acrobits (Cloud Softphone, à vos couleurs) : les
liens d’installation des postes l’ouvrent directement. Dans le portail Cloud Softphone
d’Acrobits, réglez « Initial external provisioning » sur l’adresse affichée sous le champ,
telle quelle (elle se termine par ?p=%password%).
Sans Cloud ID, les postes s’installent avec l’application Acrobits Softphone (payante) ou, sur l’ordinateur, avec Linphone.
Connexion depuis votre portail
Votre outil (portail client, Odoo, extranet) peut connecter vos clients au standard sans qu’ils retapent leur mot de passe. Créer la clé affiche une clé, une seule fois : copiez-la dans votre outil. Remplacer la clé en crée une nouvelle (l’ancienne cesse aussitôt de fonctionner) ; Retirer la clé ferme ce mode de connexion.
Votre outil envoie le navigateur du client sur le lien de connexion affiché, suivi d’un jeton JWT signé avec la clé (HS256). Le jeton porte :
| Champ | Valeur |
|---|---|
aud | l’audience affichée : l’adresse du standard |
email | l’adresse e-mail du compte du client |
iat, exp | émission et expiration (secondes Unix), dix minutes d’écart au plus ; une minute suffit |
jti | un identifiant unique : un jeton ne sert qu’une fois |
client | facultatif : l’identifiant du client (dans l’adresse de sa fiche), pour créer le compte s’il n’existe pas et si le client l’a accepté |
name | facultatif : le nom du compte à créer |
Exemple en Python (bibliothèque PyJWT) :
import time, uuid, jwt
maintenant = int(time.time())
jeton = jwt.encode(
{"aud": AUDIENCE, "email": courriel, "iat": maintenant, "exp": maintenant + 60,
"jti": str(uuid.uuid4())},
CLE, algorithm="HS256")
redirection = f"{AUDIENCE}/api/v1/sso/jeton?jeton={jeton}"
Seuls les comptes des clients (admin client, utilisateur) se connectent ainsi : la clé de votre outil n’ouvre jamais un compte de votre équipe ni d’un revendeur. Le second facteur n’est pas redemandé : votre outil en répond. Un jeton refusé (expiré, déjà utilisé, compte inconnu ou désactivé) ramène le client sur la page de connexion, avec le motif ; chaque connexion et chaque refus sont au journal d’audit.
Connexion par votre annuaire
Si votre équipe ou vos clients ont un annuaire (Microsoft Entra, Google Workspace, Keycloak ou tout fournisseur OpenID Connect), ils peuvent se connecter avec leur compte de cet annuaire. Déclarez d’abord une application chez l’annuaire, avec l’adresse de retour affichée sur la carte, puis renseignez ici l’adresse de l’émetteur, l’ID de l’application et son secret, le nom affiché (« Microsoft », « Google ») et, si vous voulez, les domaines acceptés. Le standard vérifie l’émetteur à l’enregistrement.
Réglé sur l’opérateur, l’annuaire vaut pour tous les comptes de l’installation qui n’ont pas le leur : un client peut régler son propre annuaire dans ses réglages, qui l’emporte pour ses comptes. Le compte doit déjà exister (même adresse e-mail) ; la vérification en deux étapes est celle de l’annuaire. Sur la page de connexion, le bouton Utiliser l’annuaire de mon entreprise part de l’adresse saisie.
Assistant de configuration
Une fois la fonction Assistant IA activée (voir Fonctions), pour proposer l’assistant aux administrateurs : une clé d’API Claude, le modèle, un budget mensuel pour l’installation et, si vous voulez, par client. Le consommé du mois s’affiche ; au budget atteint, l’assistant se met en pause jusqu’au mois suivant.
Licence
Chaque jour, le nombre d’utilisateurs est relevé et signé. Selon votre contrat, le relevé part tout seul à l’éditeur, ou vous le téléchargez pour le lui transmettre. Le détail par client et les relevés des jours passés sont consultables ici.
L’éditeur vous rend une licence, valable jusqu’à une date : elle arrive toute seule avec la réponse au relevé, ou vous la recevez en fichier et la chargez avec Charger la licence de l’éditeur. La carte montre sa date de fin. Une fois échue, vous avez 30 jours, signalés par un bandeau en haut du portail ; ensuite, la création de nouveaux utilisateurs est bloquée jusqu’au renouvellement. Les appels, eux, ne sont jamais coupés.
Destinations bloquées
Des préfixes internationaux refusés pour tous les clients, renvois compris (+882 Satellites).
Les numéros d’urgence restent toujours joignables.
RGPD
Durées de conservation
Section Durées de conservation des Paramètres (et des réglages de chaque client, qui peut avoir les siennes). Au-delà de la durée, la purge, qui passe chaque heure, efface :
- Enregistrements d’appels : 6 mois au plus, et par défaut ; l’appel reste au journal. Un enregistrement dont l’appel n’est pas au journal est effacé lui aussi après 6 mois.
- Messages vocaux, avec leur transcription : sans limite par défaut.
- Journal des appels (CDR) : un an au moins, obligation de conservation des données de trafic (CPCE, art. L34-1) ; sans limite par défaut.
Un champ vide reprend la durée du niveau au-dessus (le client celle de l’opérateur, l’opérateur la valeur par défaut).
Droits des personnes
- Accès et portabilité : chacun télécharge ses données depuis Mon compte (Mes données) ; un admin le fait pour un collaborateur (onglet Compte, Exporter ses données). Le fichier JSON contient le compte, le poste, les sessions, les connexions et actions, les appels du poste sur douze mois et les messages vocaux.
- Effacement : Effacer (RGPD) supprime le compte, le poste, la messagerie et les enregistrements des appels du poste. Restent le journal des appels, conservé un an par obligation légale, et le journal d’audit, protégé contre toute modification.
Chaque export et chaque effacement est au journal d’audit.
Fiche de traitement type
À reprendre dans votre registre des traitements (article 30 du RGPD).
| Rubrique | Contenu |
|---|---|
| Traitement | Standard téléphonique hébergé (centrex) fourni aux clients de l’opérateur |
| Responsable | L’opérateur, pour ses comptes et la facturation ; chaque client, pour ses collaborateurs et leurs communications (l’opérateur est alors son sous-traitant) |
| Finalités | Acheminer les appels ; messagerie vocale ; enregistrement des appels quand le client l’active ; facturation ; sécurité et diagnostic |
| Personnes | Collaborateurs des clients ; correspondants qui appellent ou sont appelés |
| Données | Nom, adresse e-mail, poste, numéros présentés ; journal des appels (numéros, horodatage, durée) ; messages vocaux et leur transcription ; enregistrements ; adresses IP de connexion et d’enregistrement des téléphones ; journal d’audit |
| Destinataires | L’opérateur et ses revendeurs selon leurs droits ; l’admin de chaque client ; les numéros sont masqués par défaut au journal, leur affichage complet est réservé et tracé |
| Durées | Voir plus haut ; journal des appels un an au moins (CPCE L34-1) |
| Transferts | Aucun hors de l’Union européenne par le standard lui-même ; transcription et assistant seulement si l’opérateur règle un fournisseur, à déclarer selon celui-ci |
| Sécurité | Second facteur obligatoire pour les équipes de l’opérateur et des revendeurs, imposable par chaque client ; secrets chiffrés ; journal d’audit chaîné ; bannissement des adresses abusives ; mises à jour par le dépôt de l’éditeur |
| Éditeur | L’éditeur du logiciel n’accède à aucune donnée personnelle : le relevé de licence ne compte que des utilisateurs par client, désignés par un identifiant |
API de l’opérateur
Tout ce que fait le portail passe par l’API publique : revendeurs, clients, numéros, grilles, trunks, diagnostic et réglages de l’instance s’automatisent avec une clé d’API de votre organisation.
Clés d’API
Menu API (admin opérateur, admin revendeur) : donnez à la clé un usage (« Supervision »), un rôle de votre organisation et, si vous voulez, une date d’expiration, puis Créer la clé. Copiez-la tout de suite : elle ne sera plus affichée. Une clé n’a jamais plus de droits que vous, et seule une personne connectée crée ou révoque une clé. Révoquer coupe l’accès de l’outil qui l’utilise. Les clients ont la même page dans leur espace.
Webhook du parc
Votre outil (supervision, CRM, facturation) reçoit les événements de votre parc à une adresse
https, signés par un secret affiché une fois : cdr.month (appels du mois écoulé), client.created,
extension.created, trunk.down, trunk.up. Le corps JSON porte l’événement, son instant et
l’identifiant du client (customer_id). Les derniers envois et leur état s’affichent sous le
réglage. Un revendeur a le même réglage pour ses clients.
Supervision
La carte Supervision (Prometheus) de la même page crée le jeton qui ouvre /metrics à
votre Prometheus : voir Supervision.
Documentation
Deux documentations sont servies par le centrex :
- la complète, pour vous et vos revendeurs :
/api/docs/operateur(/api/docs/operateur/enen anglais ; description OpenAPI :/api/v1/openapi.jsonet/api/v1/openapi.en.json) ; - celle de l’espace client, que vos clients voient :
/api/docs(description/api/v1/openapi-client.json), limitée à leurs propres opérations.
Le serveur MCP (/api/v1/mcp) expose les mêmes opérations, avec les droits de la clé utilisée :
voir Assistants IA (MCP).
Une erreur porte un code stable et un detail ; avec l’en-tête Accept-Language: en, le
detail est en anglais. Chaque clé peut envoyer 300 requêtes d’affilée, puis 10 par seconde ;
au-delà, la réponse est 429 (trop_de_requetes) avec Retry-After.
Assistants IA (MCP)
Le centrex expose un serveur MCP (Model Context Protocol) : un assistant IA, qu’il s’agisse de Claude, de ChatGPT, de Le Chat ou de tout autre client MCP, utilise les opérations de l’API avec les droits d’une clé d’API. Vous lui demandez en langage naturel « quels trunks sont en échec ? », il appelle les opérations nécessaires et vous répond.
Avant de commencer
- Adresse du serveur :
https://<adresse du portail>/api/v1/mcp, en HTTP streamable. Dans les exemples ci-dessous, remplacezportail.exemplepar l’adresse de votre portail. - Clé d’API : créez-en une dans le menu API (Clés d’API). Le client
MCP l’envoie dans l’en-tête
Authorization: Bearer <clé>. - Droits : l’assistant a exactement les droits de la clé. Choisissez le rôle le plus restreint
qui suffit, en lecture seule pour commencer. Chaque écriture est tracée au journal d’audit, au
canal
mcp, au nom de la clé. - Une clé par outil : la révoquer coupe cet outil seul.
- Secret : ne collez pas la clé dans une conversation. Placez-la dans la configuration de
l’outil, ou mieux dans une variable d’environnement (
CENTREX_CLEci-dessous). - Données transmises : les réponses de l’API (journal d’appels, numéros, noms des utilisateurs) partent chez le fournisseur de l’assistant. Vérifiez que cet usage est compatible avec vos engagements RGPD.
- Réseau : les outils installés sur votre poste (Claude Code, Claude Desktop, Codex, Vibe) joignent le portail depuis votre poste. Les assistants web (claude.ai, Le Chat, API d’OpenAI) le joignent depuis les serveurs de leur fournisseur : le portail doit être accessible depuis internet.
Claude
Claude Code : une commande, puis /mcp dans Claude Code pour vérifier la connexion.
claude mcp add --transport http centrex https://portail.exemple/api/v1/mcp \
--header "Authorization: Bearer $CENTREX_CLE"
Claude Desktop : passez par le pont mcp-remote (Node.js requis). Ajoutez ce serveur à
claude_desktop_config.json (menu Réglages, Développeur, Modifier la configuration),
puis redémarrez l’application.
{
"mcpServers": {
"centrex": {
"command": "npx",
"args": ["mcp-remote", "https://portail.exemple/api/v1/mcp",
"--header", "Authorization:${CENTREX_AUTH}"],
"env": { "CENTREX_AUTH": "Bearer <clé>" }
}
}
}
claude.ai (web et mobile) : un connecteur personnalisé n’accepte une clé fixe que si votre
organisation Claude a accès aux en-têtes de requête (en bêta). Le propriétaire de l’organisation
ajoute alors le connecteur avec l’en-tête Authorization et la valeur Bearer <clé>. Sinon,
utilisez Claude Desktop ou Claude Code.
OpenAI
ChatGPT : ses connecteurs n’acceptent qu’OAuth ou aucune authentification. Il ne peut pas utiliser une clé d’API pour l’instant.
Codex (en ligne de commande et extension d’éditeur) : ajoutez le serveur à
~/.codex/config.toml, exportez CENTREX_CLE avant de lancer Codex, puis vérifiez avec
codex mcp list.
[mcp_servers.centrex]
url = "https://portail.exemple/api/v1/mcp"
bearer_token_env_var = "CENTREX_CLE"
API d’OpenAI (Responses), pour vos propres intégrations : déclarez le serveur dans les outils
de la requête. allowed_tools limite les opérations proposées au modèle, et require_approval
vous fait valider chaque appel.
"tools": [{
"type": "mcp",
"server_label": "centrex",
"server_url": "https://portail.exemple/api/v1/mcp",
"authorization": "<clé>",
"require_approval": "always"
}]
Mistral
Le Chat : un administrateur de l’espace ouvre Connecteurs, Ajouter un connecteur,
onglet Connecteur MCP personnalisé. Il donne un nom sans espace (centrex) et l’adresse du
serveur, puis choisit l’authentification HTTP Bearer Token et colle la clé.
Vibe (en ligne de commande) : ajoutez le serveur à ~/.vibe/config.toml, et exportez
CENTREX_CLE avant de lancer Vibe.
[[mcp_servers]]
name = "centrex"
transport = "http"
url = "https://portail.exemple/api/v1/mcp"
api_key_env = "CENTREX_CLE"
api_key_header = "Authorization"
api_key_format = "Bearer {token}"
Autres clients MCP
Tout client MCP qui envoie un en-tête fixe convient. Configuration usuelle :
{
"mcpServers": {
"centrex": {
"type": "http",
"url": "https://portail.exemple/api/v1/mcp",
"headers": { "Authorization": "Bearer <clé>" }
}
}
}
Chaque opération de l’API est un outil du même nom que dans sa
documentation (listerClients, reglerRenvois…). Avec l’en-tête
Accept-Language: en, les descriptions des outils et le détail des erreurs sont en anglais.
Exemples de demandes
- « Quels trunks sont en échec, et depuis quand ? »
- « Liste les clients du revendeur Exemple avec leur nombre de postes. »
- « Pourquoi le poste 100 du client Exemple ne s’enregistre pas ? »
- « Quelles adresses IP sont bannies, et pour quel compte ? »
Pour couper l’accès d’un assistant, révoquez sa clé dans le menu API.
Prérequis
Ce qu’il faut réunir avant d’installer le centrex : une machine virtuelle, son réseau, un nom et un certificat, un trunk SIP et un serveur d’e-mails.
Machine virtuelle
Le centrex se livre en image de VM complète : Debian 13, PostgreSQL, FreeSWITCH, FusionPBX, le centrex et nginx, prêts à démarrer (voir Installer depuis l’image).
| Hyperviseur | KVM, Proxmox ou OpenStack (image qcow2) ; VMware ou VirtualBox (image OVA). |
| Processeur et mémoire | 2 vCPU et 4 Go par défaut, jusqu’à 200 appels simultanés ; voir Dimensionnement. |
| Disque | 12 Go au minimum ; l’image s’agrandit au premier démarrage à la taille donnée. Prévoir davantage pour les enregistrements d’appels et la messagerie (environ 1 Mo par minute en WAV 8 kHz). |
| Accès | Une clé SSH publique, donnée au premier démarrage par cloud-init : l’image n’a aucun mot de passe. |
Pour la haute disponibilité, deux VM identiques sur le même réseau, plus une adresse IP libre (l’IP flottante) : voir Actif/passif.
Réseau
Une adresse IP publique fixe, de préférence portée directement par la VM : les téléphones
et le fournisseur du trunk la joignent. Derrière un NAT, vérifiez que FreeSWITCH annonce bien
l’adresse publique (variables external_sip_ip et external_rtp_ip de FusionPBX), sinon la voix
ne passe que dans un sens.
Ports à ouvrir vers la VM (l’image n’installe pas de pare-feu : filtrer en amont, ou sur la VM) :
| Port | Protocole | Pour |
|---|---|---|
| 443 | TCP | Portail et API (HTTPS). |
| 80 | TCP | Redirection vers HTTPS, et validation d’un certificat Let’s Encrypt. |
| 5060 | UDP et TCP | SIP des téléphones et softphones (profil internal). |
| 5061 | TCP | SIP en TLS des softphones (profil internal). |
| 5080 | UDP et TCP | SIP du trunk : fournisseur ou C5 (profil external). Peut être limité aux adresses du fournisseur. |
| 16384 à 32768 | UDP | Voix (RTP). |
| 22 | TCP | Administration (SSH), depuis vos adresses seulement. |
Entre les deux VM d’un actif/passif : VRRP (protocole IP 112), PostgreSQL (5432) et SSH (22).
Le SIP des téléphones est en clair sur 5060, comme le centrex actuel, et en TLS sur 5061, avec le certificat de la machine : Linphone l’utilise chez les clients qui choisissent les appels chiffrés (Réglages). Un téléphone qui échoue trop souvent à s’authentifier fait bannir son adresse (voir Diagnostic) : ajoutez vos propres adresses à la liste blanche dès l’installation.
Le profil external a aussi le TLS (5081) : les connecteurs SIP des clients s’enregistrent en
TLS auprès de leur service. Ces connexions partent de la machine : le port 5081 n’a pas à être
ouvert en entrée.
Nom et certificat
- Un nom de machine complet (
pbx.operateur.exemple), avec son enregistrement DNS vers l’adresse publique. Il donne l’adresse du portail et le domaine par défaut. - Un domaine pour les clients, de préférence en joker (
*.pbx.operateur.exemple) : chaque client a son domaine SIP (client.pbx.operateur.exemple), sur lequel ses téléphones s’enregistrent. - Un certificat TLS au nom de la machine, pour le portail et le SIP en TLS : celui de l’opérateur, ou Let’s Encrypt (certbot). Au premier démarrage, la VM utilise un certificat autosigné, à remplacer : les softphones le refusent.
Trunk SIP
Un compte chez un fournisseur SIP (ou un C5) pour chaque client qui appelle l’extérieur : identifiant et mot de passe, ou authentification par adresse IP. Les appels entre clients sortent aussi par le trunk. Voir Trunk d’un client.
E-mails
Un serveur SMTP (adresse, port, identifiants, expéditeur) : les invitations, les liens de mot de passe, les messages vocaux et les alertes partent par e-mail. Il se règle dans le portail, avant de créer les premiers utilisateurs.
Facultatif
- Transcription des messages vocaux : un service compatible avec l’API de transcription d’OpenAI (service en ligne, ou moteur local : voir Transcription locale).
- Assistant de configuration : une clé de l’API de Claude (Anthropic).
- Supervision : Prometheus, pour les métriques et les alertes livrées (Supervision).
- Sauvegardes : un espace hors de la VM où copier les archives (Sauvegarde).
Dimensionnement
Ce qu’une VM supporte, mesuré sur l’image : 50 clients de 20 postes, appels de poste à poste authentifiés, voix G.711 relayée par FreeSWITCH, qualité calculée sur chaque appel (MOS).
Repères
| VM | Appels simultanés | Postes (repère) |
|---|---|---|
| 1 vCPU, 2 Go | 100 | 700 à 1 000 |
| 2 vCPU, 4 Go (image par défaut) | 200 | 1 300 à 2 000 |
- La capacité suit le nombre de vCPU : un vCPU tient 100 appels avec de la marge. La mémoire n’est pas une limite (moins de 800 Mo à 300 appels).
- La colonne postes suppose 10 à 15 % des postes en ligne à l’heure de pointe, l’ordre de grandeur habituel en entreprise ; un centre d’appels en demande bien plus. Le nombre de clients compte peu : c’est le nombre d’appels simultanés qui charge la machine.
- La qualité reste intacte (MOS 4,48) tant que le processeur ne sature pas : au-delà de 250 appels sur 2 vCPU, ou de 125 sur 1 vCPU, elle se dégrade.
- Les enregistrements SIP ne sont pas une limite : 1 000 téléphones qui se réenregistrent chaque minute font environ 17 enregistrements par seconde, une VM de 2 vCPU en absorbe 200.
Quand agrandir
- Processeur au-delà de 75 % en pointe : seuil d’alerte conseillé. Ajoutez des vCPU.
- Usages plus coûteux que l’appel de poste à poste, non mesurés : transcodage (G.722, Opus), enregistrement des appels, conférences, groupes en sonnerie simultanée, files d’attente. Gardez de la marge si vos clients en font un usage intensif.
- Enregistrements : environ 16 Mo par heure d’appel enregistré, sur leur propre volume (50 Go par défaut, environ 3 000 heures) : voir Volume des enregistrements.
- Disponibilité : une seule VM est un point de panne unique. Deux VM en actif/passif rétablissent le service en moins de 2 minutes.
Limites de FreeSWITCH
- 1 000 sessions au plus (environ 500 appels établis).
- 100 nouvelles sessions par seconde ; au-delà, FreeSWITCH refuse les nouveaux appels quelques
minutes (
503). Un appel interne en coûte environ trois, et une sonnerie de groupe une par poste : une VM accepte une trentaine de nouveaux appels internes par seconde.
Démarrage rapide
De l’image au premier appel, en une page. Le détail de chaque étape est dans les pages suivantes.
-
Importer l’image dans l’hyperviseur (OVA pour VMware, qcow2 pour Proxmox), avec au moins 2 vCPU et 4 Go. Donner au premier démarrage une clé SSH et le nom complet de la machine (
pbx.operateur.exemple) : propriétés de l’OVA, ou cloud-init. Voir Installer depuis l’image. -
Démarrer la VM. Au premier démarrage, elle tire ses propres secrets, prépare FusionPBX et FreeSWITCH, puis démarre le centrex et nginx. Se connecter en SSH avec le compte
debian(OVA) ou celui donné à cloud-init, puis vérifier la machine :sudo sh -c 'set -a; . /etc/centrex-v3/centrex.env; centrex verifier'. -
Créer l’opérateur et son premier administrateur :
sudo -u centrex sh -c 'set -a; . /etc/centrex-v3/centrex.env; centrex initialiser \ --operateur "Nom de l'\''opérateur" --admin-courriel admin@operateur.exemple \ --admin-nom "Prénom Nom"'La commande affiche un lien à usage unique : l’ouvrir pour choisir le mot de passe, puis activer le second facteur (obligatoire pour l’opérateur).
-
Remplacer le certificat autosigné par le vôtre, ou par Let’s Encrypt :
sudo apt install certbot python3-certbot-nginx, puissudo certbot --nginx -d pbx.operateur.exemple --deploy-hook /usr/local/sbin/centrex-certificat-sip. Le hook le donne aussi au SIP en TLS, à chaque renouvellement. Un certificat à vous :sudo centrex-certificat-sip chaine.pem cle.pempour le SIP, en plus de nginx. -
Régler les e-mails : portail, page Paramètres, section E-mails (SMTP), puis Envoyer l’essai. Sans eux, les invitations ne partent pas.
-
Ouvrir le réseau : HTTPS, SIP 5060, 5061 (TLS) et 5080, RTP 16384 à 32768 (voir Prérequis). Ajouter vos adresses à la liste blanche du bannissement (page Diagnostic).
-
Créer un client : page Clients, Nouveau client, avec son nom et son domaine SIP (
client.pbx.operateur.exemple). Lui donner un trunk et un numéro (Trunk d’un client, Stock de numéros). -
Créer un utilisateur avec un poste sur la fiche du client, puis Ouvrir l’espace du client, Collaborateurs, onglet Téléphone : Envoyer le lien par e-mail ou Afficher les liens (code QR) installe et configure le téléphone (Collaborateurs et postes).
-
Appeler : de poste à poste, puis vers l’extérieur et depuis l’extérieur. La page Diagnostic montre la santé de l’instance, les appels en cours et la trace de chaque appel.
Ensuite : déclarer le dépôt de mises à jour, planifier les sauvegardes, brancher la supervision.
Installer depuis l’image
L’image est une VM complète prête à démarrer : Debian 13, PostgreSQL, FreeSWITCH et FusionPBX, le centrex et nginx devant le portail, la voix de synthèse (Piper, voix française et anglaise), ainsi que keepalived et rsync pour l’actif/passif, inactifs tant qu’il n’est pas configuré. C’est la façon recommandée d’installer le centrex.
| Fichier | Pour |
|---|---|
centrex-v3-<version>.qcow2 | KVM, Proxmox, OpenStack. |
centrex-v3-<version>.ova | VMware, VirtualBox (2 vCPU, 4 Go, carte VMXNET3). |
centrex-v3-<version>.sha256 | Empreintes des deux : à vérifier avant l’import. |
Disque de 12 Go, agrandi au premier démarrage à la taille donnée à la VM. Ajoutez un second disque, vide, pour les enregistrements d’appels : voir Volume des enregistrements.
Donner l’accès
L’image n’a aucun compte ouvert ni mot de passe : l’accès se donne au premier démarrage, par cloud-init, comme pour les images Debian ou Ubuntu de ce type.
- OVA (VMware) : l’assistant d’import demande les propriétés de la VM.
- Clé SSH publique : autorisée pour le compte
debian(administrateur, sudo). - Nom de la machine : nom complet (
pbx.operateur.exemple). Il donne l’adresse du portail et le domaine par défaut. - Configuration cloud-init (facultative) : un document
#cloud-configen base64.
- Clé SSH publique : autorisée pour le compte
- qcow2 (Proxmox, OpenStack) : l’onglet ou les champs cloud-init de l’hyperviseur (utilisateur, clé SSH, nom), ou une source NoCloud. Exemple :
#cloud-config
fqdn: pbx.operateur.exemple
prefer_fqdn_over_hostname: true
users:
- name: admin
sudo: "ALL=(ALL) NOPASSWD:ALL"
ssh_authorized_keys:
- ssh-ed25519 AAAA… admin@operateur
Sans clé (VirtualBox, OVA importée sans renseigner la clé), personne ne peut se connecter : réimporter en donnant la clé, ou joindre un CD NoCloud.
Premier démarrage
Une seule fois, après cloud-init, la VM :
- tire ses propres secrets : mots de passe de la base, de l’event socket et des CDR, certificat autosigné, première clé de chiffrement des secrets ;
- crée la base de FusionPBX, avec le nom de la machine comme domaine par défaut ;
- règle FreeSWITCH : event socket local (
sudo fs_clisans mot de passe), CDR vers le centrex, voix française, 100 nouvelles sessions par seconde, SIP en TLS sur 5061 avec le certificat autosigné ; - remplit les réglages du centrex (
/etc/centrex-v3/centrex.env), avechttps://<nom de la machine>comme adresse publique ; - met les enregistrements d’appels sur leur propre volume : le second disque s’il y en a un, sinon un fichier de 50 Go (Volume des enregistrements) ;
- démarre PostgreSQL, FreeSWITCH, le centrex et nginx.
Aucun secret n’est commun à deux VM issues de la même image : clés SSH, identifiant de machine et état de cloud-init sont effacés à la construction.
Ensuite
-
Créer l’opérateur et son premier administrateur :
sudo -u centrex sh -c 'set -a; . /etc/centrex-v3/centrex.env; centrex initialiser \ --operateur "Nom de l'\''opérateur" --admin-courriel admin@operateur.exemple \ --admin-nom "Prénom Nom"'Elle affiche un lien à usage unique pour choisir le mot de passe.
-
Remplacer le certificat autosigné de nginx (
/etc/nginx/sites-available/centrex) et du SIP en TLS : par certbot, avec--deploy-hook /usr/local/sbin/centrex-certificat-sip, ou par le vôtre, quesudo centrex-certificat-sip chaine.pem cle.pemdonne au SIP (Démarrage rapide). -
Corriger l’adresse publique (
CENTREX_URL_PUBLIQUEdans/etc/centrex-v3/centrex.env, puissudo systemctl restart centrex) si le portail n’est pas servi sous le nom de la machine : les liens des invitations et des téléphones l’utilisent. -
Régler les e-mails dans le portail (page Paramètres), avant de créer les utilisateurs.
-
Déclarer le dépôt de mises à jour (Mises à jour) : sans lui, aucune nouvelle version n’est signalée.
Sources des logiciels libres
Les sources de FreeSWITCH (MPL 1.1), sofia-sip et spandsp (LGPL-2.1) et libks, aux versions
compilées, sont dans /usr/share/centrex-pbx/sources ; FusionPBX est installé en source, non
modifié, dans /var/www/fusionpbx. Les mentions des bibliothèques du centrex sont dans
/usr/share/doc/centrex-v3/.
Installer le paquet
Le centrex se livre aussi en paquet Debian, centrex-v3, pour une machine où FusionPBX et
FreeSWITCH sont déjà installés. L’image reste la voie recommandée : elle règle
FreeSWITCH et FusionPBX comme le centrex l’attend, ce qu’il faut ici faire à la main.
Machine attendue
- Debian 13, PostgreSQL (le client
postgresql-clientde la même version, pour les sauvegardes) ; - FreeSWITCH 1.11 et FusionPBX 5.6.5, les versions testées ;
- nginx devant le portail, en TLS.
Ce que contient le paquet
| Chemin | Rôle |
|---|---|
/usr/bin/centrex | Le binaire : API, portail, serveur MCP, tâches de fond, commandes d’exploitation. |
/usr/share/centrex-v3/portail | Le portail et ce guide (guide/, guide/en/). |
centrex.service | Le service, sous le compte centrex (groupe www-data, pour les fichiers de FreeSWITCH et le cache de FusionPBX). |
/etc/centrex-v3/centrex.env | Les réglages, créés à la première installation depuis le modèle /usr/share/centrex-v3/centrex.env, jamais réécrits ensuite. |
/etc/centrex-v3/cles | Le trousseau des clés de chiffrement des secrets, créé avec une première clé. |
/usr/share/doc/centrex-v3/ | Licence, mentions des bibliothèques tierces, alertes Prometheus de référence. |
Installer
-
Déclarer le dépôt de l’éditeur (Mises à jour), puis
sudo apt update && sudo apt install centrex-v3. -
Régler FreeSWITCH comme le fait le premier démarrage de l’image :
- event socket : écoute sur
127.0.0.1, ACLloopback.auto, mot de passe propre à la machine (event_socket.conf.xml) ; - CDR : charger
mod_json_cdret l’envoyer vershttp://127.0.0.1:8085/cdr, en authentificationbasicavec un identifiant et un mot de passe tirés pour l’occasion (json_cdr.conf.xml) ; - sessions :
sessions-per-secondà 100 (switch.conf.xml) ; - SIP en TLS : variables
internal_ssl_enableàtrueetsip_tls_versionàtlsv1.2,tlsv1.3(FusionPBX, Avancé > Variables), puis dans/etc/freeswitch/tlsagent.pem(certificat, chaîne et clé) etcafile.pem(la chaîne), lisibles parwww-data;fs_cli -x reloadcertles fait relire à chaque renouvellement ; - fichiers : groupe
www-dataet bit setgid sur/var/lib/freeswitch/recordings,/var/lib/freeswitch/storage(etvoicemail,json_cdren dessous) et/var/cache/fusionpbx, où le centrex écrit.
- event socket : écoute sur
-
Remplir
/etc/centrex-v3/centrex.env(Réglages du serveur) : base PostgreSQL de FusionPBX, adresse publique, event socket, identifiants des CDR. -
Créer l’opérateur et son premier administrateur, comme pour l’image :
sudo -u centrex sh -c 'set -a; . /etc/centrex-v3/centrex.env; centrex migrate; \ centrex initialiser --operateur "…" --admin-courriel … --admin-nom "…"' -
Facultatif, la voix de synthèse : sans elle, les annonces se déposent en fichiers audio. Installer Piper et ses voix comme l’image, puis régler
CENTREX_PIPER,CENTREX_VOIX_PIPERetCENTREX_VOIX_PIPER_EN:sudo apt install python3-venv sudo python3 -m venv /opt/centrex-v3/piper sudo /opt/centrex-v3/piper/bin/pip install piper-tts==1.8.0 sudo mkdir -p /usr/share/centrex-v3/voix && cd /usr/share/centrex-v3/voix v=https://huggingface.co/rhasspy/piper-voices/resolve/main for f in fr/fr_FR/siwis/medium/fr_FR-siwis-medium en/en_US/ljspeech/medium/en_US-ljspeech-medium; do sudo curl -fsSLO "$v/$f.onnx" && sudo curl -fsSLO "$v/$f.onnx.json" done -
sudo systemctl start centrex, puis nginx en TLS devant, vers127.0.0.1:8080, en transmettantHost(avec le port),X-Forwarded-ForetX-Forwarded-Proto, et en acceptant des envois de 21 Mo (fichiers audio). -
Donner aux enregistrements leur propre volume (Volume des enregistrements).
-
Dans le portail : les e-mails (page Paramètres), puis votre équipe et vos revendeurs (fonction Revendeurs à activer d’abord, même page).
Le service applique les migrations de la base à chaque démarrage. Tant que les réglages sont vides, le paquet ne le démarre pas.
Retirer
apt remove arrête le service et retire le binaire ; apt purge retire aussi les réglages, mais
garde le trousseau : sans lui, les secrets de la base seraient illisibles.
Réglages du serveur
Les réglages du service sont dans /etc/centrex-v3/centrex.env (root:centrex, 0640 : il
contient des mots de passe). Sur une VM installée depuis l’image, le premier démarrage les
remplit. Après un changement : sudo systemctl restart centrex.
Tout le reste (marque, langue, fuseau, e-mails, transcription, SSO, assistant, licence…) se règle dans le portail : voir Réglages de l’instance.
Obligatoires
| Variable | Valeur |
|---|---|
CENTREX_BASE_URL | Base PostgreSQL de FusionPBX (postgres://utilisateur:mot de passe@127.0.0.1:5432/fusionpbx) ; le centrex y crée son schéma centrex. |
CENTREX_URL_PUBLIQUE | Adresse publique du portail (https://pbx.operateur.exemple) : liens envoyés par e-mail, liens des téléphones, passkeys. |
CENTREX_ESL_ADRESSE | Event socket de FreeSWITCH (127.0.0.1:8021). |
CENTREX_ESL_MOT_DE_PASSE | Son mot de passe. |
CENTREX_CDR_IDENTIFIANTS | identifiant:mot de passe attendus de mod_json_cdr ; sans eux, aucun appel n’arrive au journal. |
CENTREX_TROUSSEAU | Trousseau des clés de chiffrement (/etc/centrex-v3/cles). |
Facultatifs
| Variable | Par défaut | Pour |
|---|---|---|
CENTREX_PIPER, CENTREX_VOIX_PIPER | absents (réglés par l’image) | Voix de synthèse (programme Piper et modèle de voix française) ; sans elle, les annonces se déposent en fichiers audio. |
CENTREX_VOIX_PIPER_EN | absent (réglé par l’image) | Modèle de voix anglaise, pour les clients réglés en anglais. |
CENTREX_HUB_URL | absent | Hub de l’éditeur, qui reçoit les relevés de licence ; sans lui, relevé téléchargé depuis le portail. |
CENTREX_PARE_FEU | nftables | Bannissement des adresses (nftables) ou rien (aucun, bannissements notés en base seulement). |
CENTREX_ECOUTE | 127.0.0.1:8080 | Écoute du portail et de l’API, derrière nginx. |
CENTREX_CDR_ECOUTE | 127.0.0.1:8085 | Écoute des CDR de FreeSWITCH. |
CENTREX_LOG | info | Niveau des journaux (debug pour un dépannage : il peut écrire des liens signés). |
Commandes
Elles se lancent sur la VM avec les réglages du service :
sudo sh -c 'set -a; . /etc/centrex-v3/centrex.env; centrex <commande>'.
| Commande | Pour |
|---|---|
initialiser --operateur … --admin-courriel … --admin-nom … | Créer l’opérateur et son premier administrateur, une fois. |
inviter --courriel … | Afficher un nouveau lien pour choisir son mot de passe (e-mails pas encore réglés). |
reinitialiser-second-facteur --courriel … | Téléphone perdu : retirer le second facteur d’un compte et fermer ses sessions. |
sauvegarder, restaurer | Sauvegarde et restauration. |
verifier | Valider la machine : réglages, trousseau, base et schéma, FusionPBX, FreeSWITCH (profils SIP, CDR), fichiers, portail, service. Chaque point ok, attention ou ÉCHEC ; code de sortie 1 en cas d’échec. Lecture seule. |
migrate | Appliquer les migrations de la base (le service le fait à son démarrage). |
bascule … | Actif/passif. |
acces-assistance ouvrir --heures …, fermer, etat | Accès de l’assistance de l’éditeur, fermé par défaut, 7 jours au plus. |
audit verifier | Vérifier que le journal d’audit n’a pas été altéré (code de sortie 1 sinon). |
secrets nouvelle-cle, rechiffrer, etat | Rotation de la clé de chiffrement des secrets. |
Volume des enregistrements
Les enregistrements d’appels sont sur leur propre volume, de taille fixe, monté sur
/var/lib/freeswitch/recordings. Plein, il ne fait échouer que les nouveaux enregistrements :
les appels continuent normalement, et la base, FreeSWITCH et la messagerie, qui sont sur le
disque système, gardent leur place. Les annonces des clients sont dans le même dossier : volume
plein, le dépôt d’une nouvelle annonce échoue aussi.
À l’installation
L’image le pose à son premier démarrage :
- avec un second disque vide ajouté à la VM (recommandé en production) : il est formaté et monté en entier ; sa taille est celle que vous lui donnez ;
- sinon, un fichier de 50 Go (
/var/lib/centrex-v3/enregistrements.img), monté au même endroit. Si le disque système n’a pas la place, le volume est réduit (5 Go restent libres sur le disque système) et le journal du premier démarrage le signale ; trop petit, l’instance démarre sans volume dédié et l’accueil du portail le signale.
Un disque n’est pris que s’il est entièrement vide (ni partition, ni système de fichiers) ; un disque qui porte des données n’est jamais formaté.
Avec le paquet, posez-le vous-même, FreeSWITCH arrêté (les appels sont coupés le temps de l’opération) :
sudo systemctl stop freeswitch
sudo centrex-volume-enregistrements creer --disque /dev/vdb # un disque vide dédié
sudo centrex-volume-enregistrements creer --taille 50G # ou un fichier
sudo systemctl start freeswitch
Les enregistrements déjà présents sont recopiés dans le volume.
Combien de place
FreeSWITCH enregistre en MP3 stéréo : environ 16 Mo par heure d’appel enregistré. 50 Go tiennent donc environ 3 000 heures. La rétention (6 mois au plus) efface les plus anciens toutes les heures : comptez les heures enregistrées sur cette durée.
Surveiller et agrandir
sudo centrex-volume-enregistrements etat: taille, place occupée et libre.- L’accueil du portail prévient à 80 % d’occupation, alerte à 95 %, et signale des enregistrements sans volume dédié ; les alertes par e-mail de l’opérateur partent aux mêmes seuils, et sous 20 % puis 10 % de place libre sur le disque système.
- Prometheus :
centrex_volume_taille_octets,centrex_volume_libre_octetsetcentrex_enregistrements_volume_dedie, avec des alertes de référence (voir Supervision).
Pour agrandir, à chaud (appels et enregistrements continuent) :
- fichier :
sudo centrex-volume-enregistrements agrandir 100G(le disque système doit avoir la place) ; - second disque : agrandissez-le dans l’hyperviseur, puis
sudo centrex-volume-enregistrements agrandir.
Un volume ne se réduit pas. Pour libérer de la place sans l’agrandir, raccourcissez la rétention des enregistrements (page Paramètres, ou par client).
Mises à jour
Le centrex se met à jour par apt, depuis le dépôt signé de l’éditeur. Rien ne s’installe tout
seul : une nouvelle version est signalée, et l’opérateur choisit quand l’installer.
Déclarer le dépôt
L’éditeur vous donne l’adresse du dépôt (ici https://depot.editeur.exemple) :
sudo curl -fsSL https://depot.editeur.exemple/centrex-v3.gpg \
-o /usr/share/keyrings/centrex-v3.gpg
sudo tee /etc/apt/sources.list.d/centrex-v3.sources >/dev/null <<'EOF'
Types: deb
URIs: https://depot.editeur.exemple
Suites: stable
Components: main
Signed-By: /usr/share/keyrings/centrex-v3.gpg
EOF
sudo apt update
Être prévenu
La liste des paquets se rafraîchit chaque jour. Quand une version plus récente attend :
- la santé du diagnostic affiche la version installée et celle qui attend ;
- la métrique
centrex_mise_a_jour_disponiblepasse à 1 (alerteMiseAJourDisponible, voir Supervision).
Mettre à jour
- Sauvegarder d’abord (Sauvegarde).
sudo apt update && sudo apt upgrade. Le service redémarre et applique les migrations de la base ; les appels en cours sont coupés : choisissez un moment creux.- Vérifier la santé dans le portail (page Diagnostic).
Avant toute migration, le centrex prend un instantané de sa propre base dans
/var/backups/centrex-v3 (les trois derniers sont gardés). Ce n’est pas une sauvegarde
complète : ni les tables de FusionPBX, ni le trousseau, ni les fichiers n’y sont.
En actif/passif : la passive d’abord, puis centrex bascule ceder sur
l’active (la passive promue migre la base), puis l’ancienne active.
Revenir à une version antérieure
sudo apt install --allow-downgrades centrex-v3=<version>
Le paquet de la version visée ramène d’abord la base à son schéma, avec le binaire encore installé ; si ce retour échoue, la version installée est gardée et repart. Le retour détruit les données des migrations annulées (l’instantané les garde) : faites une sauvegarde complète avant. En actif/passif, revenez en arrière sur l’active.
Réglages après une mise à jour
/etc/centrex-v3/centrex.env n’est jamais réécrit par une mise à jour, sans question. Un
réglage nouveau, toujours facultatif, figure commenté dans le modèle
/usr/share/centrex-v3/centrex.env : comparez-le à vos réglages après une mise à jour.
Sauvegarde et restauration
Les sauvegardes sont à la charge de l’opérateur ; le centrex fournit les deux commandes. Elles se lancent sur la VM, en root, avec les réglages du service.
Contenu d’une sauvegarde
Une archive .tar :
- la base entière : le centrex et les tables de FusionPBX ;
- le trousseau des clés de chiffrement. Sans lui, les secrets de la base (mots de passe des trunks et du serveur d’e-mails, secrets des webhooks et du second facteur…) seraient illisibles ; il est donc inclus, et l’archive est aussi sensible que la machine : elle est créée lisible par son seul propriétaire, à garder hors de la VM, chiffrée ou dans un lieu protégé ;
- les fichiers de FreeSWITCH : enregistrements d’appels, messagerie, annonces, musiques d’attente ;
- un manifeste : version du centrex, du schéma, date.
La configuration de la machine (nginx et son certificat, /etc/freeswitch, unités systemd) n’en
fait pas partie : elle vient de l’installation.
Sauvegarder
À chaud, services en marche :
sudo sh -c 'set -a; . /etc/centrex-v3/centrex.env; \
centrex sauvegarder --sortie /srv/sauvegardes/centrex-$(date +%F).tar'
Planifiez-la chaque jour (minuteur systemd ou cron), copiez l’archive hors de la VM, et gardez-en plusieurs générations.
Restaurer
Sur une VM installée avec la même version (ou une version plus récente) du centrex :
-
Décrire l’archive, sans rien remplacer :
sudo sh -c 'set -a; . /etc/centrex-v3/centrex.env; centrex restaurer --archive centrex-2026-10-12.tar' -
Arrêter le centrex et FreeSWITCH (
sudo systemctl stop centrex freeswitch), puis restaurer, avec--confirmer. La base est remplacée en une transaction ; les clés et les fichiers sont recopiés. -
Si l’archive vient d’une version antérieure :
centrex migrate. Une archive d’une version plus récente est refusée. -
Redémarrer FreeSWITCH puis le centrex.
Essayez une restauration sur une VM de test de temps en temps : une sauvegarde jamais restaurée n’est pas une sauvegarde.
Actif/passif
Deux VM identiques sur le même réseau : l’active porte une IP flottante et rend le service, la passive tient une copie à jour et prend la main si l’active tombe. Le service revient en moins de 2 minutes ; les appels en cours sont perdus.
Ce qui est copié
- La base, entière, en continu (réplication de PostgreSQL) : quelques secondes de retard au plus. Les enregistrements des téléphones en font partie : après une bascule, ils n’ont pas à se réenregistrer.
- Les fichiers (messagerie, annonces, musiques, enregistrements) et le trousseau : chaque minute. Une bascule peut perdre la dernière minute de messages vocaux.
- La configuration : copiée à l’appairage.
L’IP flottante est l’adresse du service : SIP, voix, portail, API et trunks. Le DNS, les téléphones et les fournisseurs ne voient qu’elle.
Mettre en place
Deux VM installées depuis l’image, chacune avec son adresse fixe, plus une adresse libre pour l’IP flottante. Entre elles : VRRP (protocole IP 112), PostgreSQL (5432) et SSH (22). En root :
# Active 192.0.2.11, passive 192.0.2.12, IP flottante 192.0.2.10.
centrex bascule cle # sur la passive : affiche sa clé SSH publique
centrex bascule preparer --ip-flottante 192.0.2.10/24 --autre 192.0.2.12 \
--cle-autre "ssh-ed25519 …" # sur l'active
centrex bascule rejoindre --actif 192.0.2.11 --cle-actif "ssh-ed25519 …" # sur la passive
preparer affiche la commande rejoindre complète. Options : --temoin (adresse que chaque VM
doit joindre pour garder ou prendre l’IP ; par défaut la passerelle) et --routeur
(identifiant VRRP, 51 par défaut, unique sur le réseau).
La réplication de PostgreSQL entre les deux VM n’est pas chiffrée : reliez-les par un réseau privé.
Bascule
- L’active annonce sa présence chaque seconde ; après 3 secondes de silence, la passive prend l’IP.
- Un contrôle de santé (PostgreSQL, FreeSWITCH, centrex) tourne sur l’active ; trois échecs de suite, et elle rend l’IP.
- Une VM qui ne joint plus le témoin rend l’IP et s’arrête : une VM isolée ne se promeut jamais.
- Une ancienne active qui revient reste passive : pas de retour automatique.
Exploiter
| Commande | Pour |
|---|---|
centrex bascule etat | Rôle de la VM, état des deux bases, témoin, services, retard de réplication, dernière copie des fichiers. |
centrex bascule ceder | Sur l’active : la passive prend la main (maintenance, mise à jour). |
- Journal :
/var/log/centrex-bascule.log. - Mise à jour : la passive d’abord, puis
cedersur l’active, puis l’ancienne active (Mises à jour). - Supervision : sur l’active,
centrex_bascule_passives_connectees(1 en régime établi) etcentrex_replication_retard_secondes(Supervision).
Supervision
Le centrex expose ses métriques au format Prometheus, et livre des alertes de référence.
Brancher Prometheus
Deux façons de lire /metrics :
-
Depuis la VM, sans rien régler : Prometheus, ou un agent local qui relaie (Grafana Agent, node_exporter…), interroge
127.0.0.1:8080.scrape_configs: - job_name: centrex static_configs: - targets: ["127.0.0.1:8080"] -
Depuis votre Prometheus, à travers https, avec un jeton de supervision : menu API du portail, carte Supervision (Prometheus), Créer un jeton. La configuration à copier s’affiche une seule fois, jeton compris :
scrape_configs: - job_name: centrex scheme: https authorization: credentials: cxs_… static_configs: - targets: ["centrex.operateur.exemple"]Un seul jeton à la fois : Remplacer le jeton invalide aussitôt l’ancien, Révoquer rend
/metricsde nouveau local seulement. La carte montre la dernière lecture par Prometheus. Sans jeton valide, une requête qui passe par nginx est refusée. Seul un admin opérateur, connecté en personne, gère ce jeton : ni une clé d’API, ni l’accès d’assistance de l’éditeur.
Métriques
| Métrique | Sens |
|---|---|
centrex_info{version, schema} | Version installée et schéma de la base. |
centrex_mise_a_jour_disponible | 1 si une version plus récente attend dans le dépôt. |
centrex_freeswitch_joignable | 1 si FreeSWITCH répond. |
centrex_appels_en_cours | Appels en cours sur l’instance. |
centrex_postes_inscrits | Postes et softphones inscrits. |
centrex_licence_jours_restants | Jours de licence restants ; négatif : échue depuis tant de jours. |
centrex_licence_bloquee | 1 si la licence est échue depuis plus de 30 jours (création d’utilisateurs bloquée). |
centrex_trunks{etat} | Trunks des clients par état d’enregistrement (REGED, FAIL_WAIT, NOREG pour un trunk par adresse IP, INCONNU). |
centrex_cdr_recus | Appels gardés au journal. |
centrex_cdr_dernier_horodatage_secondes | Réception du dernier appel au journal. |
centrex_webhooks_en_attente | Envois de webhooks à livrer. |
centrex_webhooks_abandonnes | Envois abandonnés après toutes leurs tentatives. |
centrex_ip_bannies | Adresses bannies en ce moment. |
centrex_volume_taille_octets{volume} | Taille du volume : enregistrements (le leur, voir Volume des enregistrements) ou systeme. |
centrex_volume_libre_octets{volume} | Octets libres du volume. |
centrex_enregistrements_volume_dedie | 1 si les enregistrements ont leur propre volume, 0 s’ils partagent le disque système. |
centrex_bascule_passives_connectees | Actif/passif, sur l’active : passives en réplication (1 en régime établi). |
centrex_replication_retard_secondes | Actif/passif, sur l’active : retard de la passive. |
Alertes de référence
/usr/share/doc/centrex-v3/supervision/alertes.yml, à charger dans Prometheus : centrex ou
FreeSWITCH injoignable, trunk non enregistré, plus d’appels au journal en journée, webhooks en
attente ou abandonnés, trop d’adresses bannies, mise à jour en attente depuis une semaine,
actif/passif sans passive ou en retard, licence bientôt échue ou échue, chute brutale des postes
inscrits, volume des enregistrements à 80 % puis 95 % ou partagé avec le disque système, moins
de 10 % libres sur le disque système. Les seuils sont des points de départ, à ajuster.
Ajoutez une alerte sur le processeur (au-delà de 75 % en pointe, voir Dimensionnement) et sur l’espace disque, avec votre agent système.
En actif/passif, le centrex est arrêté sur la passive : supervisez les deux VM, et ne déclenchez « centrex injoignable » que si aucune des deux ne répond.
Dans le portail
La page Diagnostic montre la santé de l’instance (FreeSWITCH, base, appels au journal, webhooks, trunks), les appels en cours et les adresses bannies ; les alertes par e-mail (trunk tombé ou rétabli, licence) se règlent dans les réglages de l’instance.
Transcription locale
Le centrex transcrit les messages vocaux par l’API de transcription compatible OpenAI
(POST …/audio/transcriptions). Le service peut être en ligne (OpenAI, Mistral…) ou installé chez
vous : les messages ne quittent alors pas votre réseau. Le centrex ne fournit pas de moteur ;
n’importe quel serveur qui expose cette API convient.
Exemple : Speaches (faster-whisper)
Speaches sert les modèles Whisper par faster-whisper derrière cette API. Sur une VM à part, avec Docker :
# Processeur seul (remplacer latest-cpu par latest-cuda et ajouter --gpus=all avec une carte NVIDIA)
docker run --detach --restart unless-stopped --name speaches \
--publish 8000:8000 \
--volume hf-hub-cache:/home/ubuntu/.cache/huggingface/hub \
ghcr.io/speaches-ai/speaches:latest-cpu
# Télécharger un modèle multilingue (français et anglais)
curl -X POST http://localhost:8000/v1/models/Systran/faster-whisper-small
Puis, dans le portail, page Réglages, section Transcription des messages vocaux :
| Champ | Valeur |
|---|---|
| Adresse | http://ADRESSE-DE-LA-VM:8000/v1 |
| Modèle | Systran/faster-whisper-small |
| Langue | vide : chaque message dans la langue de son client |
| Clé | vide, sauf si vous protégez le service |
Essayer vérifie que le service répond.
- Modèle :
smalltient sur un processeur de 4 cœurs pour quelques centaines de messages par jour ;mediumoularge-v3transcrivent mieux, avec une carte graphique de préférence. N’utilisez pas les modèles en.en, anglais seulement. - Réseau : le service n’a pas d’authentification par défaut ; ne l’ouvrez qu’au centrex (pare-feu), ou placez-le derrière un proxy qui exige une clé.
- Panne : une transcription peut prendre jusqu’à 7 minutes. En échec, le centrex réessaie après 1 minute puis après 5 minutes, puis envoie l’e-mail du message sans le texte.
Ces commandes viennent de la documentation de Speaches, à suivre pour les versions récentes.
Sécurité du logiciel
Le logiciel n’a pas fait l’objet d’un audit de sécurité externe (test d’intrusion par un cabinet). À la place, chaque version passe par :
- l’analyse statique du code (avertissements du compilateur traités comme des erreurs) ;
- l’audit des dépendances : failles connues, licences et provenance de chaque bibliothèque ;
- la recherche de secrets dans tout l’historique du code ;
- des tests d’isolation entre clients : un client, un revendeur ou une clé d’API ne lit ni ne modifie rien hors de son périmètre ;
- des tests sur un vrai FreeSWITCH : appels, parcours, renvois, chiffrement, à chaque modification ;
- une revue de sécurité écrite, refaite à chaque version majeure.
Si votre activité l’exige, vous pouvez faire réaliser un test d’intrusion à vos frais : prévenez l’éditeur, qui vous indiquera le périmètre et répondra aux constats.
Ce qui protège votre instance
- Comptes : mots de passe longs, blocage après 5 échecs, second facteur imposé aux équipes de l’opérateur et des revendeurs, passkeys.
- API : clés révocables, droits limités à leur organisation.
- SIP : bannissement des adresses qui échouent trop souvent à s’authentifier (Diagnostic), SIP en TLS et SRTP proposés.
- Secrets (trunks, serveur d’e-mails, clés) chiffrés dans la base ; aucun n’est renvoyé par l’API.
- Journal d’audit de chaque modification, lisible dans le portail.
Signaler une faille
Écrivez à l’éditeur, à l’adresse de sécurité de votre contrat, avec « Sécurité » dans l’objet.
Indiquez la version (version dans /api/v1/sante), ce qui reproduit le problème et son effet.
Réponse sous 3 jours ouvrés. Le correctif est publié dans le dépôt apt et vous êtes prévenu
directement, avec la version qui corrige : appliquez-le comme une
mise à jour.
Dépannage
La plupart des incidents se traitent depuis le portail, page Diagnostic (voir Diagnostic), sans SSH : santé, appels en cours, capture SIP en direct, trace d’un appel, adresses bannies, rechargement et redémarrage de FreeSWITCH. Chaque action y est tracée au journal d’audit, et existe aussi dans l’API et le serveur MCP.
Incidents types
| Symptôme | Où regarder | Que faire |
|---|---|---|
| Un client n’a plus d’appels entrants ni sortants | Santé : son trunk n’est pas REGED, avec le dernier refus du fournisseur | 401/403 : corriger l’identifiant ou le mot de passe sur la fiche du trunk ; 404 : compte inconnu du fournisseur ; 408/503 ou FAIL_WAIT : le fournisseur ne répond pas (adresse, réseau). Puis Réenregistrer. |
| Tout un site n’a plus de téléphone, le portail répond | Adresses IP bannies : l’adresse du site, le compte visé et l’appareil fautif | Corriger l’appareil (mot de passe, domaine), puis Débannir ; une adresse qui ne doit jamais l’être va dans la liste blanche. |
| Un robot essaie des mots de passe | Capture en direct, Adresses IP bannies | Bannir une adresse à la main, pour la durée choisie. |
| « Mon appel n’a pas abouti », « ça a coupé » | Journal d’appels du client, puis Trace de l’appel | La trace montre les étapes suivies, la cause et le code SIP. Une erreur de parcours : Rejouer la publication sur la fiche du client. |
| Un téléphone ne s’enregistre pas, un appel échoue sans explication | Capture en direct | Les messages SIP du client, en texte, en diagramme en échelle ou en pcap pour Wireshark. |
| Un poste réglé pour enregistrer n’a aucun enregistrement | sudo centrex verifier (ligne « FusionPBX ») et le journal du service | Le modèle d’enregistrement de FusionPBX doit être lisible (CENTREX_MODELES_FUSIONPBX, par défaut sous /var/www/fusionpbx) ; le service l’ajoute aux clients qui ne l’ont pas à son redémarrage. Volume plein : voir Enregistrements. |
| Un appel reste bloqué | Appels en cours | Couper. |
| Rien ne va plus dans FreeSWITCH | Santé | Recharger la configuration, puis en dernier recours Redémarrer FreeSWITCH. |
Sur la VM
| Pour | Commande |
|---|---|
| Tout vérifier d’un coup | centrex verifier |
| État des services | systemctl status centrex freeswitch nginx postgresql |
| Journaux du centrex | journalctl -u centrex (niveau réglé par CENTREX_LOG) |
| Journaux de FreeSWITCH | /var/log/freeswitch/freeswitch.log |
| Premier démarrage de l’image | journalctl -u centrex-premier-demarrage |
| Actif/passif | centrex bascule etat, /var/log/centrex-bascule.log |
| Intégrité du journal d’audit | centrex audit verifier |
Les commandes centrex se lancent avec les réglages du service : voir Réglages du
serveur.
Comptes
- Mot de passe oublié : le lien « Mot de passe oublié » de la page de connexion, ou
Renvoyer l’invitation sur la fiche du client. Sans e-mails réglés :
centrex inviter --courriel …affiche le lien. - Téléphone du second facteur perdu : un administrateur le réinitialise dans le portail, ou
centrex reinitialiser-second-facteur --courriel …sur la VM. - Compte bloqué après 5 échecs : il se débloque seul au bout de 15 minutes.
Interface FusionPBX
Le centrex écrit dans FusionPBX, mais son interface est fermée : nginx ne la sert pas. Pour un dépannage, ouvrez-la en local, le temps de l’intervention. Ne modifiez rien depuis cette interface : le centrex n’y retrouverait pas ses réglages. Ses dialplans y paraissent incomplets, c’est normal.
-
Sur la VM, installer PHP-FPM et servir FusionPBX sur l’adresse locale seulement :
sudo apt install php8.4-fpm sudo tee /etc/nginx/sites-available/fusionpbx-local >/dev/null <<'NGINX' server { listen 127.0.0.1:8081; root /var/www/fusionpbx; index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.4-fpm.sock; } location ~ /\. { deny all; } location ~ \.(db|sql|conf)$ { deny all; } } NGINX sudo ln -s ../sites-available/fusionpbx-local /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx -
Créer un compte superadmin de FusionPBX, comme le fait son installeur, dans le domaine par défaut, créé au premier démarrage au nom de la machine :
read -r -s -p "Mot de passe : " MDP; echo HASH=$(MDP="$MDP" php -r 'echo password_hash(getenv("MDP"), PASSWORD_DEFAULT);') sudo -u postgres psql -v ON_ERROR_STOP=1 -v hash="$HASH" -v domaine="$(hostname -f)" fusionpbx <<'SQL' with d as (select domain_uuid from v_domains where domain_name = :'domaine'), u as (insert into v_users (user_uuid, domain_uuid, username, password, salt, user_enabled) select gen_random_uuid(), domain_uuid, 'depannage', :'hash', '', 'true' from d returning user_uuid, domain_uuid) insert into v_user_groups (user_group_uuid, domain_uuid, group_name, group_uuid, user_uuid) select gen_random_uuid(), u.domain_uuid, 'superadmin', g.group_uuid, u.user_uuid from u, v_groups g where g.group_name = 'superadmin'; SQL -
Depuis votre poste, ouvrir un tunnel SSH, puis
http://127.0.0.1:8081dans le navigateur :ssh -L 8081:127.0.0.1:8081 debian@VMSe connecter avec
depannage@suivi du nom de la machine (hostname -f) : l’adresse127.0.0.1ne désigne aucun domaine, le nom après@le donne. -
Après l’intervention, refermer :
sudo rm /etc/nginx/sites-enabled/fusionpbx-local && sudo systemctl reload nginx sudo systemctl disable --now php8.4-fpm sudo -u postgres psql fusionpbx -c "update v_users set user_enabled = 'false' where username = 'depannage'"
Assistance de l’éditeur
Pour une intervention de l’éditeur, ouvrez-lui un accès limité dans le temps : portail, page
Diagnostic, section Accès de l’assistance, ou centrex acces-assistance ouvrir --heures 24.
Il est fermé par défaut, refermable à tout moment, et chacune de ses actions est au journal
d’audit.