Fonctions documentées: Exploitation et disponibilité
Readiness, failover et supervision13 composants
Liveness applicative et readiness edge localeCode + lab
- Rôle / owner
- livez/readyz applicatifs, collecteur edge 14 checks et contrôleur d’admission local. Owners applicatif et edge séparés.
- Interfaces / confiance
- HTTP privé app; edge sans listener ni port, timer 15 s, RPC Kamailio Unix local.
- État / dépendances
- Quatre fichiers /run bornés et bail htable Kamailio de 30 s.
- HA / panne
- Snapshot exact âgé de plus de 25 s refusé pour admission; panne collecteur demande le drain, sinon le bail expire; appels établis non gated.
- Sécurité / preuve / source
- 0700/0640, aucune donnée d’appel/adresse/média/payload/sortie de commande. Health-lab injecté et runtime-lab réel. Source:
health.py,admission.pyet labs.
Consommateur carrier du contrat A/BInterne présent, externe non prouvé
- Rôle / owner
- Refuse l’activation interne d’un carrier non qualifié, puis décrit A puis B pour chaque nouvel appel. Autorité: Navy Phone pour la gate interne; carrier cible non contracté pour la bascule réelle.
- Interfaces / confiance
- Reçu signé v1, preuve active et digest exact de configuration en interne; deux cibles SIP mTLS directes, 503
Cell Drainingou absence de réponse à l’extérieur.
- État / dépendances
- La gate interne exige 20 contrôles, deux signatures RSA distinctes et une fenêtre de 30 jours au plus. Priorités 10/20, timeout 4 s et hold-down 30 s dans le modèle local; zéro qualification opérateur réelle.
- HA / panne
- Qualification absente, expirée ou divergente: activation refusée. Deux échecs externes fermeraient le nouvel appel; aucun actif ne migre et toute redirection SIP reste interdite.
- Sécurité / preuve / source
- Contrôle interne implémenté dans
carrier-ingress-qualification.ts, store et migration 0039; vérification sans mutation par défaut et commit atomique explicite. Aucun carrier, PSTN ou action externe; zéro qualification terrain. Production NO-GO. Voir résilience et preuves.
Exporter privé edge-healthCode + lab
- Rôle / owner
- Envoie l’état content-free hors chemin d’appel. Owner SRE edge.
- Interfaces / confiance
- Snapshot local vers POST mTLS TCP/9443 avec identité telemetry A/B.
- État / dépendances
- Spool de trois enveloppes; dépend du timer santé et de la cible privée.
- HA / panne
- Retry idempotent; panne distante sans impact sur appel ou admission locale.
- Fiche / preuve
- Fiche exporter. Telemetry-lab local; VIP et cloud absents.
VIP et load balancer privésCible
- Rôle / owner
- Adresse stable et répartition TCP vers collecteurs A/B. Owner SRE plateforme.
- Interfaces / confiance
10.72.40.50:9443, passthrough TLS sans Proxy Protocol.
- État / dépendances
- Health check TCP; dépend du réseau privé et du service LB Scaleway.
- HA / panne
- Aucun runtime; SPOF et source backend restent non qualifiés.
- Fiche / preuve
- Fiche VIP/LB. Contrat statique, aucun déploiement.
Collecteur privé edge-healthCode + lab
- Rôle / owner
- Réception, déduplication et métriques A/B. Owner SRE edge.
- Interfaces / confiance
- POST mTLS TCP/9443 et GET /metrics; identités telemetry/monitoring séparées.
- État / dépendances
- SQLite borné à 256 enveloppes par cellule; sorties content-free.
- HA / panne
- Aucune réplication ni sauvegarde; appels indépendants.
- Fiche / preuve
- Fiche collecteur. Lab mTLS A/B, aucun cloud.
Prometheus A/B edge-healthCode + runtime-lab
- Rôle / owner
- Scrape et agrégation par cellule/scope. Owner SRE observabilité.
- Interfaces / confiance
- GET /metrics mTLS direct A/B; sortie vers les deux Alertmanager.
- État / dépendances
- Deux Prometheus 3.14.0 digest-pinnés exercés; TSDB durable et rétention à figer.
- HA / panne
- Deux scrapes par Prometheus et perte de A exercés localement; panne double, charge et SLO absents.
- Fiche / preuve
- Fiche Prometheus. Runtime-lab fermé 12/12, aucun déploiement souverain.
Alertmanager A/B edge-healthCode + runtime-lab
- Rôle / owner
- Groupage, inhibition et routage vers receiver. Owner SRE/astreinte.
- Interfaces / confiance
- Gossip mTLS 9094, API d’injection et webhook notification mTLS privé.
- État / dépendances
- Deux Alertmanager 0.33.1 A/B réels sont exercés localement. Prometheus réel n’est pas lancé.
- HA / panne
passes=2couvre arrêt contrôlé exit 0 et SIGKILL exit 137. Une passe isolée garde A/B vivants mais coupe le gossip: chacun voit un membre, notifie firing puis resolved, puis retrouve deux membres après reconnexion B avec la même IP.
- Fiche / preuve
- Fiche Alertmanager. Deux runs indépendants identiques: 47 fichiers au digest
3a4d23bd20c1db25149babbe555f04baf959a4304cc4d200cc81df71cc671eb8, vérificateur 3/3, mutations 81/81, 1 425 contrôles exécutés, 846 uniques, 579 répétés, 31 scénarios,totalRuntimePasses=3. La chaîne déduplique durablement les doublons physiques. Aucune garantie générale de notification unique; production et humain absents.
Receiver privé durable d’alertesCode + E2E HTTPS local
- Rôle / owner
- Validation, idempotence et watchdog deadman. Owner SRE/astreinte.
- Interfaces / confiance
- POST /v1/alerts et /v1/deadman mTLS sur
10.72.40.60:9444.
- État / dépendances
- SQLite, snapshot et outbox atomique; deadman hors outbox; bridge isolé par broker Unix.
- HA / panne
- Les deux arrêts gardent
duplicate_count=0. Pendant la partition gossip, le receiver voit les doublons physiques de A et B, mais ne garde qu’un firing et un resolved durables; l’aval converge et le cluster se reforme à deux.
- Fiche / preuve
- Fiche receiver. Même preuve finale: 47 fichiers, digest
3a4d23bd20c1db25149babbe555f04baf959a4304cc4d200cc81df71cc671eb8, 3/3, 81/81, 1 425/846/579, 31 scénarios,passes=2ettotalRuntimePasses=3. Autres partitions, répétitions, Prometheus réel, production, réplica, restauration et humain restent non prouvés.
Bridge receiver vers PostgreSQL Operations edge-healthCode + labs Unix/PG
- Rôle / owner
- Transforme durablement chaque transition
firing/resolveddes huit alertes d’exploitation en écriture privée vers PostgreSQL Operations. Owner cible: SRE supervision; le runbook et la prise en charge humaine restent séparés.
- Interfaces / confiance
- Le broker Unix local borné et isolé est implémenté et prouvé sous Linux exact: le bridge distinct ne voit ni la base principale ni l’outbox interne. Deux instances A/B visent PostgreSQL Operations v2 sur TCP/5432 avec identités mTLS A/B distinctes. Le deadman est explicitement exclu.
- État / dépendances
- Migration v1 fail-closed: le préflight exige zéro incident
firingactif avant bootstrap. Si un incident est actif, l’upgrade est refusé ou rollbacké; aucun rattrapage tardif et aucun faux firing tardif ne sont permis.
- HA / panne
- Le candidat borne les leases, délais et huit tentatives, puis isole l’événement en DLQ. Crash après commit, replay, révocation mTLS en vol, poison et cleanup sont exercés. Les comptes
navy-phone-edge-health-bridge-aetnavy-phone-edge-health-bridge-bont exactement 31 caractères et sont résolus aprèsuseraddparpwd.getpwnam. La disponibilité du déploiement cède à l’intégrité des alertes: le service conserve l’ancienne version ou reste arrêté plutôt que d’inventer un état. Le provisioningsystemd-sysusers, le boot systemd PID1 réel, la récupération opérateur de la DLQ locale et la HA restent à exercer.
- Fiche / preuve
- Les preuves ciblées restent acquises: wrapper avec 40 assertions dans 13 scénarios, receiver avec 2107 assertions dans 27 scénarios et lab PostgreSQL avec 109 assertions sur deux passes. Deux runs indépendants identiques sur 47 fichiers au digest
3a4d23bd20c1db25149babbe555f04baf959a4304cc4d200cc81df71cc671eb8ajoutent 3/3, 81/81, 1 425/846/579 et 31 scénarios.passes=2couvre les pannes;totalRuntimePasses=3ajoute une partition gossip isolée. Les doublons physiques convergent vers un firing et un resolved durables. Production et humain restent absents. Promotion NO-GO.
PostgreSQL des opérations edge-healthCandidat + E2E local
- Rôle / owner
- Journalise transitions, obligations, tentatives, acquittements et escalades. L’owner d’objets
navy_phone_edge_health_ownerestNOLOGIN,NOSUPERUSERet distinct de l’owner métier cible SRE opérations et plateforme données.
- Interfaces / confiance
- PostgreSQL 18.6 avec
pgcrypto; rôlesNOLOGINingest/dispatch/operator/recovery et fonctions bornées dont lesearch_pathplacepg_tempen dernière position. Le lab prouve qu’un objet temporaire homonyme ne détourne pas la fonction privilégiée et n’ouvre aucun port hôte.
- État / dépendances
- Cinq journaux append-only et une outbox transactionnelle.
schema.sqlv2 n’est pas une migration in-place du prototype v1: une base v1 doit suivre un parcours d’export, de contrôle et de migration dédié. Chaque tentative produitstartedpuisresultdans la même table; répéterstartedavec le même lease est idempotent. Le sink consulte d’abord l’issue terminale de l’idempotency key, puis lalifecycle_revision: une clé déjà appliquée resteacceptedsans rejouer l’effet; une clé déjà supprimée restesuppressed. La completion inscrit un outcome distinctsuppressedpour un effet réellement écarté. Le payload révisé et les tombstonesresolved/acknowledgedgouvernent les autres effets obsolètes.
- HA / panne
- Le lab exerce les deux permutations
firing/resolvedetescalation/acknowledgedavec perte de completion DB, retry de lease et redémarrage réel: deux requêtes, un seul effet et aucun faux auditsuppressed. Un lease en vol n’est jamais présenté comme annulé; une résolution compensatrice et les races résolution/ACK restent auditées dans les deux ordres exercés. Le stress a reproduit trois fois une course intermittente de même génération avant le verrou transactionnel PostgreSQL dérivé degeneration_id; la série propre 5/5 confirme 22 contrôles par passage, cleanup vrai et aucune nouvelleunique_violation. Le lab ciblé séparé prouve la persistance du sink synthétique etpg_dump/pg_restorepréserve l’owner. Les nouveaux scénarios font converger la résolution du survivor après arrêt contrôlé puis après SIGKILL du sender avecduplicate_count=0. Ils prouvent localement ces deux failovers bornés, pas une partition, une répétition ou une garantie générale de notification unique.
- Fiche / preuve
- Fiche PostgreSQL opérations. Même preuve finale 3/3, 81/81, 1 425/846/579, 31 scénarios,
passes=2ettotalRuntimePasses=3. Pendant la partition, les doublons physiques convergent vers un firing et un resolved durables dans Operations et le sink. Autres partitions, répétitions, production, systemd, humain, charge et SLO restent hors preuve. Promotion NO-GO.
Dispatcher privé des événements opérateur edge-healthCandidat + labs locaux
- Rôle / owner
- Réclame les obligations operations v2, journalise la tentative avant le réseau et transmet chaque événement au sink. Owner cible: SRE opérations.
- Interfaces / confiance
- PostgreSQL mTLS par identité A/B, puis HTTPS mTLS vers
10.72.40.70:9445. Identités base et sink séparées.
- État / dépendances
- Aucun état métier local. Dépend des leases, témoins epoch/watermark et completions idempotentes de PostgreSQL operations v2.
- HA / panne
- Deux workers, concurrence et délais bornés. Dans la configuration candidate destinée à la production, le timeout vers le sink est fixé à exactement 5 000 ms. Les erreurs temporaires sont rejouées; les réponses invalides sont bloquées sans immobiliser l’événement sain suivant.
- Fiche / preuve
- Vérificateur contractuel, 78 tests HTTPS mTLS et lab PostgreSQL acquis. La preuve finale ajoute deux pannes puis une partition gossip isolée. Malgré les doublons physiques de A et B, dispatcher et sink ne gardent qu’un firing et un resolved durables.
passes=2;totalRuntimePasses=3. Autres partitions, répétitions, Prometheus réel, production et humain restent hors preuve. Promotion NO-GO.
Sink opérateur transactionnel edge-healthCandidat + lab local
- Rôle / owner
- Engage les reçus opérateur, écarte les révisions dépassées et crée une obligation durable non consommée. Owner cible: SRE opérations et plateforme données.
- Interfaces / confiance
- HTTPS mTLS privé TCP/9445 avec identité SAN et adresse source A/B, JSON canonique fermé et PostgreSQL dédié.
- État / dépendances
- Reçus idempotents, tête de révision par génération, watermark global, inbox et obligations de canal annulables.
- HA / panne
- Le lab local couvre concurrence, crash après commit, restauration ancienne, changement d’epoch et révisions obsolètes. Les budgets PostgreSQL restent sous le timeout fermé à 5 secondes; pause pendant le commit, abandon client et drain de huit requêtes ne créent aucun reçu tardif. Aucun PostgreSQL HA ou restauration managée.
- Fiche / preuve
- Vérificateur bijectif, 79 tests statiques et lab PostgreSQL acquis. La preuve finale ajoute deux pannes puis une partition gossip isolée. Les doublons physiques convergent vers un firing et un resolved durables dans le sink. Aucune garantie générale de notification unique; autres partitions, répétitions, production et humain restent hors preuve. L’obligation
operator-primaryn’est pas consommée. Promotion NO-GO.
Continuité réseau du poste opérateurCode
- Rôle / owner
- Bloque les écritures du navigateur quand la session connectée au service n’est plus prouvée. Owner opérations de crise et produit web.
- Interfaces / confiance
- Fetch authentifié
/api/connectivitysans cache toutes les 20 s;navigator.onLinepeut déclarer offline mais ne suffit jamais à déclarer online.
- État / dépendances
- Phases checking, online, offline et unreachable; brouillon borné et snapshot de reprise refusé après 30 minutes. Aucune file d’actions offline.
- HA / panne
- Hors online, l’interface passe en lecture seule et n’effectue aucun rejeu automatique. Le mécanisme ne fournit ni second réseau, ni HA du service.
- Sécurité / preuve / source
- Session expirée, réseau captif, multi-onglets, stockage client, longue coupure et exercice poste réel restent NO-GO. Sources:
lib/network-continuity.ts,components/NetworkContinuity.tsx, tests UI/E2E.