Audit de l'existant avant la téléphonie
Cet audit a été mené le 3 novembre 2026 sur le code du dépôt (branche main), avant toute écriture de code de
téléphonie. Il fixe ce qui est réutilisé tel quel, ce qui est complété et ce qui manque, pour ne rien
réimplémenter. Les décisions qui en découlent sont dans l'ADR-0173.
Légende : existant (fonctionne, réutilisé), partiel (présent mais à compléter pour la téléphonie), manquant (à construire), exclu (volontairement absent).
Navin Platform Manager et ses agents
| Sujet | État | Constat |
|---|---|---|
| Architecture du Manager | existant | serveur FastAPI et PostgreSQL (navin-manager/server), moteur d'opérations en étapes et tâches, console React (navin-manager/ui), API décrite par OpenAPI et quatre SDK |
| Agents des hôtes | existant | agent Go livré sur les hôtes (l'agent Python reste une référence) : fichiers, paquets dnf, apt et pacman, unités systemd, Podman, pare-feu firewalld et ufw, certificats, faits, métriques, mise à jour signée |
| Découverte et inventaire | existant | une seule liste de nœuds, quatre méthodes d'ajout (commande, SSH, instance cloud, image), faits (CPU, mémoire, disques, GPU, plateforme), contrôles préalables |
| Catalogue des services | existant | schéma catalog/schema/service.schema.json, modes, composants, composants suiveurs, instances nommées, liaisons entre services, TLS, blocs de haute disponibilité, consoles, commandes, sauvegardes |
| Méthodes | existant | binary, podman, python et package ; une méthode peut être limitée par mode ; un paquet absent pour une famille d'OS est refusé (packages_unavailable) |
| Clusters | existant | clusters par environnement (production, préproduction, test, développement, bac à sable) et profils d'installation (standard, banking-secure, air-gapped) |
| Haute disponibilité | existant | modes HA déclarés par service (Patroni pour PostgreSQL, Sentinel et Cluster pour Redis, Raft pour OpenBao), groupes HA avec tests de bascule, garanties décrites par service (ADR-0166) |
| Gestion des configurations | existant | versions, diff, restauration, groupes, application progressive ou complète, consommateurs marqués à appliquer quand un fournisseur change |
| Supervision | existant | contrôles de santé par les agents, contrôles de service, découverte Prometheus (/clusters/{id}/sd/prometheus), alertes, tableau de bord par service |
| Sauvegarde et restauration | existant | sauvegardes par service, restauration vérifiée, reprise après sinistre |
| Installation hors ligne | existant | bundle hors ligne avec dépôt de paquets de l'OS et miroir d'images, hub d'artefacts signés |
| Téléphonie | manquant | ni Asterisk, ni Kamailio, ni RTPengine, ni LiveKit SIP, Egress, Ingress ou workers d'agents au catalogue |
Navin Enterprise AI Platform
| Sujet | État | Constat |
|---|---|---|
| Control Plane | existant | FastAPI et PostgreSQL (services/control-plane, schéma eai, migrations sql/postgres), domaines par brique, textes d'API en français et en anglais (eai.apitext) |
| Tenancy | existant | tenants, projets, organisations et unités (eai.domains.tenancy), tenant_id sur les tables métier |
| Opérations longues | existant | opérations asynchrones et worker (V188__operations.sql) |
| Audit | existant | outbox d'audit, événements partitionnés, scellement, conservation légale : réutilisé, pas de table d'audit propre à la téléphonie |
| Pont vers le Manager | existant | domaine platform_manager : lecture des services, nœuds, clusters et opérations du Manager, demandes d'opération au nom de l'utilisateur (X-NM-On-Behalf-Of), jeton du Manager dans le coffre |
| Voix temps réel | partiel | jetons de salle LiveKit signés par le Control Plane, protocole d'événements WebSocket, consentement, transcriptions et enregistrements de session (V145) ; aucune téléphonie |
| Portail | existant | Next.js 15, React 19, Tailwind, Radix, React Query, i18next (français et anglais), Recharts, livekit-client déjà présent ; navigation par sections et rôles |
| Téléphonie | manquant | ni tenants téléphoniques, ni extensions, trunks, numéros, routage, IVR, files, agents, CDR, enregistrements, ni écrans |
Stockage, bases de données et cache
| Sujet | État | Constat |
|---|---|---|
| SeaweedFS | existant | service du catalogue en modes single et distributed (maîtres, volumes, filer, passerelle S3, console d'administration), réplication paramétrable |
| Stockage côté Control Plane | existant | profils de stockage S3 (dont SeaweedFS), découverte des capacités, URL présignées, exports d'audit WORM (eai.domains.storage) |
| Organisation des objets téléphoniques | manquant | aucun compartiment ni préfixe par tenant et par catégorie (enregistrements, messagerie vocale, messages d'IVR) |
| MinIO | exclu | AGPL-3.0, refusé par l'ADR-0101 et test_platform_no_agpl.py ; SeaweedFS reste le seul stockage objet |
| PostgreSQL | existant | modes standalone et ha (Patroni 4.1.5 avec etcd), TLS, pgvector, sauvegardes pg_basebackup, instances nommées |
| Redis | existant | modes standalone, replication, sentinel et cluster, TLS, utilisateurs ACL ; déjà lié à LiveKit en mode distributed |
Sécurité, secrets, identité et certificats
| Sujet | État | Constat |
|---|---|---|
| Secrets du Control Plane | existant | API en écriture seule, valeurs chiffrées (OpenBao ou AES-GCM local), lecture côté serveur seulement (read_secret) |
| Secrets du Manager | existant | coffre du Manager et synchronisation avec OpenBao ; secrets générés à l'installation, jamais affichés |
| Authentification | existant | Keycloak (OIDC) et comptes locaux pour le portail ; comptes locaux, LDAP, OIDC et double facteur pour le Manager |
| Autorisation | existant | rôles du Control Plane (eai.auth, complétés par V161), relations OpenFGA (eai.domains.authz), politiques OPA |
| Certificats | existant | autorité du Manager, certificats installés par les agents (clé 0640, copie pour les conteneurs), rotation, mTLS des agents |
| Sortie réseau | existant | garde de sortie du Control Plane (eai.security.egress) : chaque hôte joint est déclaré |
| Sécurité téléphonique | manquant | ni anti-fraude, ni limitation CPS, ni restrictions de destinations, ni anti-bruteforce SIP |
Observabilité
| Sujet | État | Constat |
|---|---|---|
| Métriques et alertes | existant | Prometheus et Alertmanager du catalogue, découverte des cibles par le Manager |
| Journaux | existant | Alloy vers OpenSearch, tableaux de bord OpenSearch Dashboards |
| Traces | existant | OpenTelemetry Collector et Jaeger |
| Grafana et Loki | exclu | AGPL-3.0, refusés par l'ADR-0101 et test_platform_no_agpl.py : la téléphonie utilise Prometheus, Alertmanager, Alloy, OpenSearch et OpenTelemetry déjà en place |
| Métriques téléphoniques | manquant | ni métriques Asterisk ou Kamailio, ni règles d'alerte, ni indicateurs métier d'appels |
Ce qui est construit
- Au catalogue du Manager :
asterisk,kamailio,rtpengine(optionnel),livekit-sip,livekit-egress,livekit-ingress(optionnel) etlivekit-agents, avec leurs ports, contrôles de santé, sauvegardes, modes HA et métriques ;livekitcomplété sans changer son comportement par défaut. - Dans le Control Plane : le domaine
eai.domains.telephony(données, API, compilateurs, publication par AMI, JSONRPC et API LiveKit, appels, CDR, enregistrements dans SeaweedFS, agents vocaux IA). - Dans le portail : la section Téléphonie, l'IVR Builder et le softphone WebRTC.
- Les règles d'alerte, la documentation, la matrice des licences et la nomenclature logicielle.