0044 — Topologie de déploiement du banc atlas (socle consommé, Gitea intra-banc)
Contexte
Section intitulée « Contexte »Le travail se répartit sur deux dépôts : cluster (ce dépôt — le socle
d’infrastructure générique) et atlas (le dépôt applicatif/métier). La
frontière est posée par ADR 0023 (le
métier vit dans atlas), ADR 0022 (Argo CD
déploie l’applicatif via l’AppProject atlas) et formalisée comme interface
machine-lisible par ADR 0043.
Ces ADR décrivent le runtime (où atlas se branche : endpoints,
StorageClasses, secrets) mais pas le mécanisme de déploiement : qui monte le
cluster sur lequel atlas tourne, et par quel canal le code atlas arrive dans
ce cluster. Deux questions restaient implicites :
- Q1 — montage du socle.
atlasdoit pouvoir valider son code sur un banc reproductible : un cluster Kubernetes avec le socle DataOps (Cilium, cert-manager, Rook/Ceph, CNPG, Argo CD, Dagster, Marquez). Or ce socle, et le harnais qui le monte, vivent danscluster. Commentatlasles consomme-t-il sans les redévelopper ni les copier (drift garanti, contraire à ADR 0023) ? - Q2 — entrée GitOps.
L’
AppProjectatlasn’autorise aujourd’hui qu’unsourceRepos : cluster.git. Mais lesApplicationqu’Argo CD réconcilie (code-locations Dagster, appscitation-*) référencent du code qui vit dansatlas. LesourceReposactuel est donc soit incomplet, soit faux — et graveratlas.giten dur dans le manifeste générique violerait ADR 0023 (valeur propre à un déploiement).
Fait cadrant : le banc Lima de cluster monte déjà la seule topologie locale,
multi-node-3 (1 control-plane + 2 workers, quorum mon Ceph + réplication ×3,
ADR 0040), via
bench/lima/run-phases.sh — phases
idempotentes, gates, paramétré par inventaire/group_vars non versionnés
surchargeant des .example. Le banc est prouvable from-scratch
(ADR 0034). atlas n’a donc pas à
inventer un banc : il réutilise celui-ci.
Décision
Section intitulée « Décision »Le banc atlas est le banc multi-node-3 du socle cluster, consommé comme
une release versionnée et paramétré par la config locale d’atlas. L’entrée
GitOps (sourceRepos) devient une valeur surchargeable, défaut générique.
-
Q1 —
clusterest consommé comme release, harnais de banc inclus. Une releasecluster(tag, matrice de versions ADR 0006) expose le harnais de banc complet :bootstrap/(playbooks Ansible),platform/(manifestes figés),bench/lima/(montagemulti-node-3) etcontract/(interface).atlaspinne une version du socle et monte son banc avec ses propresgroup_vars/inventaire (non versionnés, patron.example). Ni sous-module, ni copie : une dépendance versionnée, alignée sur la politique de bump existante. -
Q2 —
sourceReposest un placeholder surchargeable. LesourceReposde l’AppProjectatlasporte un défaut générique (cluster.git, valeur d’exemple) surchargé par le déploiementatlasvers son dépôt réel, via le patron ADR 0023 (lookup('env','X') | default('<exemple>')ou surcharge d’inventaire). Aucune valeur propre à un déploiement (atlas.gitréel) n’est gravée dans le manifeste versionné decluster. -
Source git : Gitea hébergé DANS le banc (air-gapped). Argo CD pull les manifestes depuis un dépôt git hébergé dans le banc par Gitea (et non depuis un remote GitHub public). Ce choix reproduit la contrainte prod — cluster isolé, sans Internet (ADR 0003, ADR 0022, images Argo CD déjà mirrorées dans le registry interne pour la même raison) — donc le banc prouve le flux GitOps tel qu’il tournera en prod, sans dépendre d’un egress vers
github.com. LesourceRepossurchargé (point 2) pointe alors une URL intra-banc servie par Gitea (p. ex.http://gitea-http.gitea.svc/<org>/atlas.git), pasgithub.com.Initialisation post-bootstrap : Gitea est posé par le socle (Ansible, infra — il fait partie de ce qui doit converger avant qu’Argo CD réconcilie). Une fois le bootstrap terminé, une phase d’initialisation du dépôt (idempotente, dans le harnais
bench/lima/) crée l’organisation et le dépôt dans Gitea, puis seed/push le contenuatlas(manifestesApplication, code-locations) — c’est ce que l’AppProjectréconciliera ensuite. Ordre :bootstrap (infra + Gitea) → init dépôt Gitea (seed atlas) → Argo CD sync. Le smoke-test guestbook actuel (repoURL GitHub public) reste un smoke-test zéro-dépendance distinct, hors de ce modèle air-gapped. -
Webhook Gitea → Argo CD (déploiement réactif, pas de polling). Gitea est configuré (à l’init du dépôt) avec un webhook vers
…/api/webhookd’argocd-server: un push déclenche immédiatement la réconciliation au lieu d’attendre le polling par défaut (~3 min,timeout.reconciliation). Le webhook est authentifié par un secret partagé (cléwebhook.gitea.secretdeargocd-secret, même valeur posée côté Gitea), généré à l’init (jamais versionné — patron ADR 0023). Réseau : l’appel est intra-cluster Gitea →argocd-server:8080; l’ingress est déjà ouvert (allow-server-ingress.yaml, source non restreinte côté bordure Cilium) et l’egress repo-server → Gitea l’est aussi (allow-egress.yaml, ports git 80/443/22/9418). Aucune nouvelle NetworkPolicy requise ; reste à poser le secret et enregistrer le webhook côté Gitea. Le portwebhookdu Serviceargocd-serverexiste déjà dans le bundle épinglé. -
multi-node-3, stockagelocal-path. Le bancatlasréutilise le harnais existant (bench/lima/run-phases.sh) tel quel — mêmes phases, mêmes gates, même topologie (ADR 0040) — en profillocal-path(phasestorage-simple, défaut du harnais ; pasWITH_CEPH=1). Justifié :atlasitère sur l’applicatif/métier, pas sur la couche stockage ;local-pathmonte en ~30 s contre ~15 min pour Ceph (ADR 0035). Conséquence d’interface : sur ce profil la SCdefaultestlocal-path(RWO mono-nœud, pas de RWX ni d’erasure-coding) et il n’y a pas de RGW Ceph — le backing S3 (datalake, backups Barman) passe par l’alternative banc-léger (ADR 0036, SeaweedFS) ou est hors périmètre du bancatlas. La seule autre variation est la config locale d’atlas(inventaire,group_vars,sourceRepos, hostnames). Le harnais ne se duplique pas. -
Frontière préservée (anti-bootstrap-circulaire, ADR 0022). Le banc
atlasconverge d’abord par Ansible (infra : kubeadm, Cilium, cert-manager, Rook, CNPG, Argo CD lui-même), puis l’Argo CD ainsi posé réconcilie l’applicatifatlasdepuis lesourceRepossurchargé. cert-manager, Prometheus, Loki restent des opérateurs passifs posés par le socle :atlasles consomme en émettant des CR/annotations (ServiceMonitor, TLS), il ne les « lance » pas. -
Test d’intégration end-to-end (gate de preuve). La chaîne décidée ici est validée par une phase d’intégration du harnais
bench/lima/, qui prouve le flux complet dans l’ordre — chaque étape est un gate (exit ≠ 0 si le critère n’est pas atteint), idempotent et rejouable comme les phases existantes (ADR 0034) :- Créer le dépôt dans Gitea (org + repo) et poser le webhook + le secret partagé — gate : le dépôt répond, le webhook est enregistré.
- Push un commit applicatif (manifeste
Application+ une code-locationatlasd’exemple générique) — gate : la ref est présente côté Gitea. - Argo CD déploie : la réconciliation déclenchée par le webhook amène
l’
ApplicationàSynced/Healthy— gate : statut atteint sous un délai (preuve que le webhook, pas le polling, a déclenché). - DataOps tourne : la code-location déployée exécute un run Dagster qui
réussit et émet du lineage ingéré par Marquez — gate : réutilise
la logique d’assertion existante
(
dataops-assert.sh:classify_dagster_run,classify_marquez_ingest).
La logique de décision est isolée et testée (prédicats purs, couverts hors cluster), le choix de langage suivant la frontière de ADR 0017 (orchestration de CLIs → bash ; logique complexe → Python ; fonctions bash pures → bats) — non figé ici. Le run est consigné comme preuve de banc (ADR 0042, surveillé par le garde-fou de fraîcheur).
Accepted (2026-06-09).
Conséquences
Section intitulée « Conséquences »- Gain :
atlasobtient un banc reproductible sans redévelopper le socle ni le copier — une release pinnée, surchargée localement. Le sens du flux de déploiement (commitatlas→ Argo CD du banc réconcilie) devient explicite et documentable (mise à jour à venir dedocs/guide-dev-data.md, section « déployer depuis atlas »). sourceReposcorrigé sans violer ADR 0023 : la valeur générique reste versionnée, la valeur réelle (atlas.git) vit en config locale. Lève l’ambiguïté de l’AppProjectsans graver une spécificité de déploiement.- Prix à payer :
clusterdoit garantir que le harnais de banc (bootstrap/+platform/+bench/lima/) reste consommable par un tiers — c’est-à-dire que toute spécificité de déploiement passe bien par les.examplesurchargeables, jamais par un défaut versionné. Cette discipline, déjà imposée par ADR 0023, devient un contrat enversatlas. - Couplage de version :
atlaspinne une version du socle ; un bumpcluster(Kubernetes, CRDs, endpoints) peut exiger une mise à jour côtéatlas. Tracé par la matrice de versions (ADR 0006) et le contrat diff-able (ADR 0043). - Hors périmètre : le mécanisme exact de packaging d’une release (archive de
tag, artefact dédié, rôle Ansible publié) n’est pas tranché ici — l’option «
artefact/role séparé partagé par
clusteretatlas» reste une évolution possible, prématurée tant queclusterest l’unique producteur du harnais. - Coût de Gitea intra-banc (air-gapped) : reproduire la contrainte prod «
sans Internet » impose d’héberger Gitea dans le banc (pod + PVC
local-path) et d’initialiser le dépôt post-bootstrap (créer org/dépôt, seed/push du contenuatlas) — une brique + une phase de plus dans le harnais, à outiller et à garder idempotentes. Bénéfice : le banc prouve le flux GitOps tel qu’il tournera en prod isolée (ADR 0003), sans masquer la dépendance derrière un egress GitHub qui n’existera pas en prod. - Frontière infra/app pour Gitea (ADR 0022) : Gitea est de l’infra (il
doit converger avant qu’Argo CD réconcilie → Ansible, pas une
Application, sous peine de bootstrap circulaire). L’init du dépôt (seed atlas) est en revanche une étape de données, post-bootstrap, hors du périmètre Argo CD. - Réactivité : le webhook Gitea → Argo CD ramène la latence de déploiement
de l’ordre de la minute (polling) à la seconde (push) — important pour
une boucle d’itération
atlassur un banc. Le polling reste le filet de sécurité si un webhook est manqué (Argo CD garde sontimeout.reconciliation). - À faire (suite) : (a) rendre
sourceRepossurchargeable dansappproject-atlas.yaml, défaut générique intra-banc ; (b) outiller Gitea (infra) + la phase d’init du dépôt (seed atlas) dans le harnaisbench/lima/; (c) enregistrer le webhook Gitea → Argo CD + poser le secret partagé (webhook.gitea.secret) à l’init ; (d) documenter le flux « déployer depuis atlas » + l’observabilité (ServiceMonitorPrometheus, collecte Loki, annotation cert-manager) dans le guide dev-data ; (e) ajouter Argo CD (et Gitea) au contrat (contract/endpoints.example.yaml) ; (f) phase de test d’intégration end-to-end (créer dépôt Gitea → push → Argo CDSynced/Healthy→ run Dagster + lineage Marquez), logique d’assertion isolée et testée (langage selon ADR 0017), run consigné comme preuve de banc (ADR 0042).