Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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ôleCe qu’il fait
Admin revendeurCrée et suit ses clients, leur affecte des numéros, gère ses grilles de vente.
Admin opérateurGère toute l’installation : revendeurs, clients, stock de numéros, trunks, diagnostic, réglages.
Support opérateurConsulte 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 palier minimum/incrément en secondes : 1/1 à la seconde, 60/60 à la minute entamée, 60/30 premiè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ôte ou hô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 :

ChampValeur
audl’audience affichée : l’adresse du standard
emaill’adresse e-mail du compte du client
iat, expémission et expiration (secondes Unix), dix minutes d’écart au plus ; une minute suffit
jtiun identifiant unique : un jeton ne sert qu’une fois
clientfacultatif : 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é
namefacultatif : 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).

RubriqueContenu
TraitementStandard téléphonique hébergé (centrex) fourni aux clients de l’opérateur
ResponsableL’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ésAcheminer les appels ; messagerie vocale ; enregistrement des appels quand le client l’active ; facturation ; sécurité et diagnostic
PersonnesCollaborateurs des clients ; correspondants qui appellent ou sont appelés
DonnéesNom, 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
DestinatairesL’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éesVoir plus haut ; journal des appels un an au moins (CPCE L34-1)
TransfertsAucun 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
ÉditeurL’é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/en en anglais ; description OpenAPI : /api/v1/openapi.json et /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, remplacez portail.exemple par 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_CLE ci-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).

HyperviseurKVM, Proxmox ou OpenStack (image qcow2) ; VMware ou VirtualBox (image OVA).
Processeur et mémoire2 vCPU et 4 Go par défaut, jusqu’à 200 appels simultanés ; voir Dimensionnement.
Disque12 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èsUne 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) :

PortProtocolePour
443TCPPortail et API (HTTPS).
80TCPRedirection vers HTTPS, et validation d’un certificat Let’s Encrypt.
5060UDP et TCPSIP des téléphones et softphones (profil internal).
5061TCPSIP en TLS des softphones (profil internal).
5080UDP et TCPSIP du trunk : fournisseur ou C5 (profil external). Peut être limité aux adresses du fournisseur.
16384 à 32768UDPVoix (RTP).
22TCPAdministration (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

VMAppels simultanésPostes (repère)
1 vCPU, 2 Go100700 à 1 000
2 vCPU, 4 Go (image par défaut)2001 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.

  1. 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.

  2. 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'.

  3. 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).

  4. Remplacer le certificat autosigné par le vôtre, ou par Let’s Encrypt : sudo apt install certbot python3-certbot-nginx, puis sudo 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.pem pour le SIP, en plus de nginx.

  5. Régler les e-mails : portail, page Paramètres, section E-mails (SMTP), puis Envoyer l’essai. Sans eux, les invitations ne partent pas.

  6. 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).

  7. 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).

  8. 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).

  9. 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.

FichierPour
centrex-v3-<version>.qcow2KVM, Proxmox, OpenStack.
centrex-v3-<version>.ovaVMware, VirtualBox (2 vCPU, 4 Go, carte VMXNET3).
centrex-v3-<version>.sha256Empreintes 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-config en base64.
  • 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 :

  1. 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 ;
  2. crée la base de FusionPBX, avec le nom de la machine comme domaine par défaut ;
  3. règle FreeSWITCH : event socket local (sudo fs_cli sans mot de passe), CDR vers le centrex, voix française, 100 nouvelles sessions par seconde, SIP en TLS sur 5061 avec le certificat autosigné ;
  4. remplit les réglages du centrex (/etc/centrex-v3/centrex.env), avec https://<nom de la machine> comme adresse publique ;
  5. 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) ;
  6. 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

  1. 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.

  2. 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, que sudo centrex-certificat-sip chaine.pem cle.pem donne au SIP (Démarrage rapide).

  3. Corriger l’adresse publique (CENTREX_URL_PUBLIQUE dans /etc/centrex-v3/centrex.env, puis sudo 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.

  4. Régler les e-mails dans le portail (page Paramètres), avant de créer les utilisateurs.

  5. 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-client de 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

CheminRôle
/usr/bin/centrexLe binaire : API, portail, serveur MCP, tâches de fond, commandes d’exploitation.
/usr/share/centrex-v3/portailLe portail et ce guide (guide/, guide/en/).
centrex.serviceLe service, sous le compte centrex (groupe www-data, pour les fichiers de FreeSWITCH et le cache de FusionPBX).
/etc/centrex-v3/centrex.envLes 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/clesLe 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

  1. Déclarer le dépôt de l’éditeur (Mises à jour), puis sudo apt update && sudo apt install centrex-v3.

  2. Régler FreeSWITCH comme le fait le premier démarrage de l’image :

    • event socket : écoute sur 127.0.0.1, ACL loopback.auto, mot de passe propre à la machine (event_socket.conf.xml) ;
    • CDR : charger mod_json_cdr et l’envoyer vers http://127.0.0.1:8085/cdr, en authentification basic avec 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 à true et sip_tls_version à tlsv1.2,tlsv1.3 (FusionPBX, Avancé > Variables), puis dans /etc/freeswitch/tls agent.pem (certificat, chaîne et clé) et cafile.pem (la chaîne), lisibles par www-data ; fs_cli -x reloadcert les fait relire à chaque renouvellement ;
    • fichiers : groupe www-data et bit setgid sur /var/lib/freeswitch/recordings, /var/lib/freeswitch/storage (et voicemail, json_cdr en dessous) et /var/cache/fusionpbx, où le centrex écrit.
  3. Remplir /etc/centrex-v3/centrex.env (Réglages du serveur) : base PostgreSQL de FusionPBX, adresse publique, event socket, identifiants des CDR.

  4. 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 "…"'
    
  5. 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_PIPER et CENTREX_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
    
  6. sudo systemctl start centrex, puis nginx en TLS devant, vers 127.0.0.1:8080, en transmettant Host (avec le port), X-Forwarded-For et X-Forwarded-Proto, et en acceptant des envois de 21 Mo (fichiers audio).

  7. Donner aux enregistrements leur propre volume (Volume des enregistrements).

  8. 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

VariableValeur
CENTREX_BASE_URLBase 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_PUBLIQUEAdresse publique du portail (https://pbx.operateur.exemple) : liens envoyés par e-mail, liens des téléphones, passkeys.
CENTREX_ESL_ADRESSEEvent socket de FreeSWITCH (127.0.0.1:8021).
CENTREX_ESL_MOT_DE_PASSESon mot de passe.
CENTREX_CDR_IDENTIFIANTSidentifiant:mot de passe attendus de mod_json_cdr ; sans eux, aucun appel n’arrive au journal.
CENTREX_TROUSSEAUTrousseau des clés de chiffrement (/etc/centrex-v3/cles).

Facultatifs

VariablePar défautPour
CENTREX_PIPER, CENTREX_VOIX_PIPERabsents (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_ENabsent (réglé par l’image)Modèle de voix anglaise, pour les clients réglés en anglais.
CENTREX_HUB_URLabsentHub de l’éditeur, qui reçoit les relevés de licence ; sans lui, relevé téléchargé depuis le portail.
CENTREX_PARE_FEUnftablesBannissement des adresses (nftables) ou rien (aucun, bannissements notés en base seulement).
CENTREX_ECOUTE127.0.0.1:8080Écoute du portail et de l’API, derrière nginx.
CENTREX_CDR_ECOUTE127.0.0.1:8085Écoute des CDR de FreeSWITCH.
CENTREX_LOGinfoNiveau 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>'.

CommandePour
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, restaurerSauvegarde et restauration.
verifierValider 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.
migrateAppliquer les migrations de la base (le service le fait à son démarrage).
bascule …Actif/passif.
acces-assistance ouvrir --heures …, fermer, etatAccès de l’assistance de l’éditeur, fermé par défaut, 7 jours au plus.
audit verifierVérifier que le journal d’audit n’a pas été altéré (code de sortie 1 sinon).
secrets nouvelle-cle, rechiffrer, etatRotation 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_octets et centrex_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_disponible passe à 1 (alerte MiseAJourDisponible, voir Supervision).

Mettre à jour

  1. Sauvegarder d’abord (Sauvegarde).
  2. 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.
  3. 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 :

  1. 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'
    
  2. 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.

  3. Si l’archive vient d’une version antérieure : centrex migrate. Une archive d’une version plus récente est refusée.

  4. 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

CommandePour
centrex bascule etatRôle de la VM, état des deux bases, témoin, services, retard de réplication, dernière copie des fichiers.
centrex bascule cederSur l’active : la passive prend la main (maintenance, mise à jour).
  • Journal : /var/log/centrex-bascule.log.
  • Mise à jour : la passive d’abord, puis ceder sur l’active, puis l’ancienne active (Mises à jour).
  • Supervision : sur l’active, centrex_bascule_passives_connectees (1 en régime établi) et centrex_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 /metrics de 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étriqueSens
centrex_info{version, schema}Version installée et schéma de la base.
centrex_mise_a_jour_disponible1 si une version plus récente attend dans le dépôt.
centrex_freeswitch_joignable1 si FreeSWITCH répond.
centrex_appels_en_coursAppels en cours sur l’instance.
centrex_postes_inscritsPostes et softphones inscrits.
centrex_licence_jours_restantsJours de licence restants ; négatif : échue depuis tant de jours.
centrex_licence_bloquee1 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_recusAppels gardés au journal.
centrex_cdr_dernier_horodatage_secondesRéception du dernier appel au journal.
centrex_webhooks_en_attenteEnvois de webhooks à livrer.
centrex_webhooks_abandonnesEnvois abandonnés après toutes leurs tentatives.
centrex_ip_banniesAdresses 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_dedie1 si les enregistrements ont leur propre volume, 0 s’ils partagent le disque système.
centrex_bascule_passives_connecteesActif/passif, sur l’active : passives en réplication (1 en régime établi).
centrex_replication_retard_secondesActif/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 :

ChampValeur
Adressehttp://ADRESSE-DE-LA-VM:8000/v1
ModèleSystran/faster-whisper-small
Languevide : 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 : small tient sur un processeur de 4 cœurs pour quelques centaines de messages par jour ; medium ou large-v3 transcrivent 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ômeOù regarderQue faire
Un client n’a plus d’appels entrants ni sortantsSanté : son trunk n’est pas REGED, avec le dernier refus du fournisseur401/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épondAdresses IP bannies : l’adresse du site, le compte visé et l’appareil fautifCorriger 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 passeCapture en direct, Adresses IP banniesBannir 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’appelLa 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 explicationCapture en directLes messages SIP du client, en texte, en diagramme en échelle ou en pcap pour Wireshark.
Un poste réglé pour enregistrer n’a aucun enregistrementsudo centrex verifier (ligne « FusionPBX ») et le journal du serviceLe 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 coursCouper.
Rien ne va plus dans FreeSWITCHSantéRecharger la configuration, puis en dernier recours Redémarrer FreeSWITCH.

Sur la VM

PourCommande
Tout vérifier d’un coupcentrex verifier
État des servicessystemctl status centrex freeswitch nginx postgresql
Journaux du centrexjournalctl -u centrex (niveau réglé par CENTREX_LOG)
Journaux de FreeSWITCH/var/log/freeswitch/freeswitch.log
Premier démarrage de l’imagejournalctl -u centrex-premier-demarrage
Actif/passifcentrex bascule etat, /var/log/centrex-bascule.log
Intégrité du journal d’auditcentrex 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.

  1. 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
    
  2. 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
    
  3. Depuis votre poste, ouvrir un tunnel SSH, puis http://127.0.0.1:8081 dans le navigateur :

    ssh -L 8081:127.0.0.1:8081 debian@VM
    

    Se connecter avec depannage@ suivi du nom de la machine (hostname -f) : l’adresse 127.0.0.1 ne désigne aucun domaine, le nom après @ le donne.

  4. 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.