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.py et labs.

Ouvrir la fiche composant

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 Draining ou 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.

Ouvrir la fiche composant

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=2 couvre 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=2 et totalRuntimePasses=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/resolved des 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 firing actif 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-a et navy-phone-edge-health-bridge-b ont exactement 31 caractères et sont résolus après useradd par pwd.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 provisioning systemd-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 3a4d23bd20c1db25149babbe555f04baf959a4304cc4d200cc81df71cc671eb8 ajoutent 3/3, 81/81, 1 425/846/579 et 31 scénarios. passes=2 couvre les pannes; totalRuntimePasses=3 ajoute une partition gossip isolée. Les doublons physiques convergent vers un firing et un resolved durables. Production et humain restent absents. Promotion NO-GO.

Ouvrir la fiche composant

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_owner est NOLOGIN, NOSUPERUSER et distinct de l’owner métier cible SRE opérations et plateforme données.
Interfaces / confiance
PostgreSQL 18.6 avec pgcrypto; rôles NOLOGIN ingest/dispatch/operator/recovery et fonctions bornées dont le search_path place pg_temp en 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.sql v2 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 produit started puis result dans la même table; répéter started avec le même lease est idempotent. Le sink consulte d’abord l’issue terminale de l’idempotency key, puis la lifecycle_revision: une clé déjà appliquée reste accepted sans rejouer l’effet; une clé déjà supprimée reste suppressed. La completion inscrit un outcome distinct suppressed pour un effet réellement écarté. Le payload révisé et les tombstones resolved/acknowledged gouvernent les autres effets obsolètes.
HA / panne
Le lab exerce les deux permutations firing/resolved et escalation/acknowledged avec perte de completion DB, retry de lease et redémarrage réel: deux requêtes, un seul effet et aucun faux audit suppressed. 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é de generation_id; la série propre 5/5 confirme 22 contrôles par passage, cleanup vrai et aucune nouvelle unique_violation. Le lab ciblé séparé prouve la persistance du sink synthétique et pg_dump/pg_restore pré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 avec duplicate_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=2 et totalRuntimePasses=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.

Ouvrir la fiche composant

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-primary n’est pas consommée. Promotion NO-GO.

Ouvrir la fiche composant

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/connectivity sans cache toutes les 20 s; navigator.onLine peut 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.

Ouvrir la fiche composant