« Ce serait du confort si il était possible de ne pas avoir le middleware Traefik de basic auth quand on utilise le wifi du même réseau partagé avec le homelab. »
C'est faisable, mais pas dans Traefik — et la solution qui vient spontanément à l'esprit est un contournement d'authentification. Cette PR écrit la mesure pour qu'on ne re-découvre ni l'une ni l'autre, pose les garde-fous là où le piège se poserait, et écrit mot pour mot l'action à faire.
Ce qui a été mesuré (2026-07-28, homelab)
kadans.arcodange.fr sort de la maison même depuis le salon. Le nom résout vers Cloudflare, redescend par le tunnel cloudflared. L'adresse de socket que Traefik accepte est donc toujours celle d'un pod, en 10.42.x.x.
Traefik SAIT pourtant qui est le vrai client — l'entrypoint web fait confiance aux en-têtes venant de 10.42.0.0/16. Journal d'accès sur une requête émise d'ici :
Au passage : la maison sort en IPv6. Le 86.238.234.54/32 qu'ipify injecte dans localIp n'est qu'une des deux adresses publiques du foyer, et pas celle qu'un navigateur utilise en priorité.
Mais le matcher de routeur ClientIP() juge la SOCKET, pas cette résolution. Mesuré, pas supposé — trois routeurs temporaires posés sur kadans.arcodange.fr vers un Service sans endpoint (donc 503 si la règle matche, repli 401 sinon) :
sonde
règle ajoutée à Host(kadans.arcodange.fr)
mesuré
T (témoin, aucune contrainte)
—
503
A
ClientIP("2a01:cb04:dff:cf00::/64")
401
B
ClientIP("10.42.0.0/16")
503
Le témoin valide le montage ; A échoue, B réussit. Sondes supprimées après mesure (contrôle : 401 revenu).
Les deux pièges, et pourquoi ils sont écrits dans le code
localIp@file ne doit jamais toucher un routeur .fr.10.42.0.0/16 est dans son sourceRange et ipAllowList juge lui aussi la socket → le middleware « IP locale seulement » laisserait entrer Internet entier. ✅ Vérifié : aucun routeur .fr ne le porte aujourd'hui, le piège est latent. Les cinq endroits d'où on pourrait le recopier (2 gabarits .fr, 3 values .lab) portent désormais l'avertissement à la ligne près.
Se fier à CF-Connecting-IP ou à un en-tête maison est un contournement d'auth. Cloudflare ne retire pas les en-têtes inconnus, et Traefik reste joignable en direct sur 192.168.1.201:80. Voie écartée, explicitement.
Et pourquoi ce n'est pas réparable dans Traefik : les middlewares s'enchaînent inconditionnellement (pas de « basic auth sauf si… »), le seul moyen de sauter un middleware est de faire matcher un autre routeur, et le seul discriminant d'IP au niveau routeur est ClientIP() — qui ne voit que le tunnel.
La voie retenue, et le prix des autres
Faire pointer le LAN vers Traefik (DNS double horizon, ou « DNS only » chez Cloudflare) rendrait ClientIP(192.168.1.0/24) honnête, mais coûterait en plus du DNS : un certificat publiquement valide pour kadans.arcodange.fr (Traefik sert aujourd'hui la CA interne CN=arcodange.lab — un curl --resolve direct échoue au TLS, code 000), donc un certResolver DNS-01 Cloudflare et son jeton, plus un routeur websecure pour un hôte qui vit en web clair. Beaucoup, pour du confort. Et « DNS only » retirerait le bouclier Cloudflare de cet hôte.
Retenu : la décision se prend au bord, chez Cloudflare, là où ip.src est native et non falsifiable. Une règle de transformation y pré-remplit l'en-tête Authorization pour les IP du foyer.
Traefik ne change pas, aucun certificat, aucun changement DNS.
Surface d'attaque ajoutée : aucune.kadans:kkadans est déjà en clair dans chart/values.yaml de kadans, assumé comme garde-fou et non comme secret. Cloudflare ne fait que le taper à notre place — un attaquant qui forge l'en-tête obtient exactement ce que curl -u kadans:kkadans lui donne déjà. C'est la différence de fond avec le piège n°2 : on n'ouvre pas d'exemption, on automatise une saisie.
Quand l'IP du foyer dérive (elle est dynamique), la règle cesse simplement de matcher : le navigateur redemande le mot de passe. Dégradation douce, jamais de panne.
(http.host eq "kadans.arcodange.fr" and ip.src in {86.238.234.54 2a01:cb04:dff:cf00::/64})
Then → Set static : header Authorization, valeur Basic a2FkYW5zOmtrYWRhbnM=
L'équivalent Terraform pour cms/cloudflare est dans le doc, ainsi que les deux curl qui vérifient (200 sans -u depuis la maison, 401 depuis le partage de connexion du téléphone).
⚠ Point non vérifié en vrai, écrit comme tel : que Cloudflare accepte Authorization en en-tête de requête modifiable. Si l'éditeur refuse, le repli documenté est Cloudflare Access (politique Bypass sur ces IP, Allow par e-mail ailleurs, et le basic auth Traefik retiré) — pas un en-tête secret.
Le doc nomme aussi la version encore plus simple, sans la trancher : le mot de passe étant public, ce qu'il achète réellement c'est « pas indexé, pas tombé dessus par hasard » — un robots.txt + X-Robots-Tag: noindex fait ce travail sans mot de passe. C'est une décision produit, elle n'est pas prise ici.
Une hypothèse infirmée (et donc pas de fausse alerte)
Je soupçonnais le bouncer CrowdSec d'être neutralisé sur .fr (son clientTrustedIPs contient 10.42.0.0/16, ce qui aurait « fait confiance » à tout le tunnel). Faux — le plugin résout la vraie IP, journal à l'appui :
La convention .fr tient donc ce qu'elle promet. C'est écrit dans le doc pour que personne ne « corrige » cette ligne en croyant y reproduire le piège n°1.
⚠ Sur le périmètre de cette PR
Aucun des réglages en cause ne vit dans ce dépôt (vérifié) :
tools reçoit la mesure et les garde-fous parce que c'est lui qui héberge les gabarits .fr (grafana, minio) et les consommateurs de localIp@file. Si le doc doit rejoindre les ADR (qui vivent dans factory/doc/adr/), c'est un déplacement d'un fichier — dis-le et je le fais.
Contenu
doc/ce-que-traefik-voit.md (nouveau) — la mesure, les pièges, la voie retenue, l'action Cloudflare mot pour mot, la vérification, ce qu'il faudra surveiller.
Avertissements ciblés : grafana/templates/ingress-public.yaml, minio/templates/ingress-public.yaml (les deux gabarits .fr) et grafana/values.yaml, hashicorp-vault/values.yaml, plausible/plausibleValues.yaml (les trois .lab d'où on recopierait).
Lien depuis README.md.
Documentation et commentaires uniquement — aucun manifeste rendu ne change. Rien n'est mergé.
## La demande
> « Ce serait du confort si il était possible de ne pas avoir le middleware Traefik de basic auth quand on utilise le wifi du même réseau partagé avec le homelab. »
C'est faisable, mais **pas dans Traefik** — et la solution qui vient spontanément à l'esprit est un contournement d'authentification. Cette PR écrit la mesure pour qu'on ne re-découvre ni l'une ni l'autre, pose les garde-fous là où le piège se poserait, et écrit mot pour mot l'action à faire.
## Ce qui a été mesuré (2026-07-28, homelab)
1. **`kadans.arcodange.fr` sort de la maison même depuis le salon.** Le nom résout vers Cloudflare, redescend par le tunnel `cloudflared`. L'adresse de socket que Traefik accepte est donc **toujours** celle d'un pod, en `10.42.x.x`.
2. **Traefik SAIT pourtant qui est le vrai client** — l'entrypoint `web` fait confiance aux en-têtes venant de `10.42.0.0/16`. Journal d'accès sur une requête émise d'ici :
```
2a01:cb04:dff:cf00:f9d7:4026:9ffc:b042 - kadans [28/Jul/2026:14:22:49 +0200] "GET /?sonde=… " 200
```
Au passage : **la maison sort en IPv6**. Le `86.238.234.54/32` qu'`ipify` injecte dans `localIp` n'est qu'une des deux adresses publiques du foyer, et pas celle qu'un navigateur utilise en priorité.
3. **Mais le matcher de routeur `ClientIP()` juge la SOCKET, pas cette résolution.** Mesuré, pas supposé — trois routeurs temporaires posés sur `kadans.arcodange.fr` vers un Service *sans endpoint* (donc `503` si la règle matche, repli `401` sinon) :
| sonde | règle ajoutée à `Host(kadans.arcodange.fr)` | mesuré |
|---|---|---|
| T (témoin, aucune contrainte) | — | **503** |
| A | `ClientIP("2a01:cb04:dff:cf00::/64")` | **401** |
| B | `ClientIP("10.42.0.0/16")` | **503** |
Le témoin valide le montage ; A échoue, B réussit. Sondes supprimées après mesure (contrôle : `401` revenu).
## Les deux pièges, et pourquoi ils sont écrits dans le code
- **`localIp@file` ne doit jamais toucher un routeur `.fr`.** `10.42.0.0/16` est dans son `sourceRange` et `ipAllowList` juge lui aussi la socket → le middleware « IP locale seulement » laisserait entrer **Internet entier**. ✅ Vérifié : **aucun routeur `.fr` ne le porte aujourd'hui**, le piège est *latent*. Les cinq endroits d'où on pourrait le recopier (2 gabarits `.fr`, 3 values `.lab`) portent désormais l'avertissement à la ligne près.
- **Se fier à `CF-Connecting-IP` ou à un en-tête maison est un contournement d'auth.** Cloudflare ne retire pas les en-têtes inconnus, et Traefik reste joignable en direct sur `192.168.1.201:80`. Voie écartée, explicitement.
Et pourquoi ce n'est **pas** réparable dans Traefik : les middlewares s'enchaînent inconditionnellement (pas de « basic auth sauf si… »), le seul moyen de sauter un middleware est de faire matcher un autre routeur, et le seul discriminant d'IP au niveau routeur est `ClientIP()` — qui ne voit que le tunnel.
## La voie retenue, et le prix des autres
Faire pointer le LAN vers Traefik (DNS double horizon, ou « DNS only » chez Cloudflare) rendrait `ClientIP(192.168.1.0/24)` honnête, mais coûterait **en plus du DNS** : un certificat publiquement valide pour `kadans.arcodange.fr` (Traefik sert aujourd'hui la CA interne `CN=arcodange.lab` — un `curl --resolve` direct échoue au TLS, code `000`), donc un `certResolver` DNS-01 Cloudflare et son jeton, plus un routeur `websecure` pour un hôte qui vit en `web` clair. Beaucoup, pour du confort. Et « DNS only » retirerait le bouclier Cloudflare de cet hôte.
**Retenu : la décision se prend au bord, chez Cloudflare, là où `ip.src` est native et non falsifiable.** Une règle de transformation y **pré-remplit l'en-tête `Authorization`** pour les IP du foyer.
- Traefik ne change pas, aucun certificat, aucun changement DNS.
- **Surface d'attaque ajoutée : aucune.** `kadans:kkadans` est déjà en clair dans `chart/values.yaml` de kadans, assumé comme garde-fou et non comme secret. Cloudflare ne fait que **le taper à notre place** — un attaquant qui forge l'en-tête obtient exactement ce que `curl -u kadans:kkadans` lui donne déjà. C'est la différence de fond avec le piège n°2 : on n'ouvre pas d'exemption, on automatise une saisie.
- Quand l'IP du foyer dérive (elle est dynamique), la règle cesse simplement de matcher : **le navigateur redemande le mot de passe**. Dégradation douce, jamais de panne.
### 👉 Action manuelle du fondateur (une fois)
Cloudflare → zone `arcodange.fr` → **Rules → Transform Rules → Modify Request Header** → *Create rule* :
- **When incoming requests match** :
```
(http.host eq "kadans.arcodange.fr" and ip.src in {86.238.234.54 2a01:cb04:dff:cf00::/64})
```
- **Then → Set static** : header `Authorization`, valeur `Basic a2FkYW5zOmtrYWRhbnM=`
L'équivalent Terraform pour `cms/cloudflare` est dans le doc, ainsi que les deux `curl` qui vérifient (200 sans `-u` depuis la maison, 401 depuis le partage de connexion du téléphone).
⚠ **Point non vérifié en vrai, écrit comme tel** : que Cloudflare accepte `Authorization` en en-tête de requête modifiable. Si l'éditeur refuse, le repli documenté est **Cloudflare Access** (politique *Bypass* sur ces IP, *Allow* par e-mail ailleurs, et le basic auth Traefik retiré) — **pas** un en-tête secret.
Le doc nomme aussi la version *encore* plus simple, sans la trancher : le mot de passe étant public, ce qu'il achète réellement c'est « pas indexé, pas tombé dessus par hasard » — un `robots.txt` + `X-Robots-Tag: noindex` fait ce travail sans mot de passe. C'est une décision produit, elle n'est pas prise ici.
## Une hypothèse infirmée (et donc pas de fausse alerte)
Je soupçonnais le bouncer CrowdSec d'être neutralisé sur `.fr` (son `clientTrustedIPs` contient `10.42.0.0/16`, ce qui aurait « fait confiance » à tout le tunnel). **Faux** — le plugin résout la vraie IP, journal à l'appui :
```
CrowdsecBouncerTraefikPlugin: ServeHTTP ip:2a01:cb04:dff:cf00:f9d7:4026:9ffc:b042 isTrusted:false
CrowdsecBouncerTraefikPlugin: ServeHTTP ip:144.24.58.222 isTrusted:false
```
La convention `.fr` tient donc ce qu'elle promet. C'est écrit dans le doc pour que personne ne « corrige » cette ligne en croyant y reproduire le piège n°1.
## ⚠ Sur le périmètre de cette PR
**Aucun des réglages en cause ne vit dans ce dépôt** (vérifié) :
| réglage | dépôt |
|---|---|
| valeurs Helm Traefik, `dynamic.yaml`, `localIp` | `factory` — `ansible/.../playbooks/system/k3s_config.yml` |
| Middleware `crowdsec@kube-system` | `factory` — `.../roles/crowdsec/tasks/main.yml` |
| tunnel + DNS `*.arcodange.fr` | `cms` — `cloudflare/iac.tf` |
| basic auth `.fr` de kadans | `kadans` — `chart/values.yaml` |
`tools` reçoit la mesure et les garde-fous parce que c'est lui qui héberge les **gabarits `.fr`** (`grafana`, `minio`) et les **consommateurs de `localIp@file`**. Si le doc doit rejoindre les ADR (qui vivent dans `factory/doc/adr/`), c'est un déplacement d'un fichier — dis-le et je le fais.
## Contenu
- `doc/ce-que-traefik-voit.md` (nouveau) — la mesure, les pièges, la voie retenue, l'action Cloudflare mot pour mot, la vérification, ce qu'il faudra surveiller.
- Avertissements ciblés : `grafana/templates/ingress-public.yaml`, `minio/templates/ingress-public.yaml` (les deux gabarits `.fr`) et `grafana/values.yaml`, `hashicorp-vault/values.yaml`, `plausible/plausibleValues.yaml` (les trois `.lab` d'où on recopierait).
- Lien depuis `README.md`.
Documentation et commentaires uniquement — **aucun manifeste rendu ne change**. Rien n'est mergé.
Demande : « ne pas avoir le basic auth Traefik quand on est sur le Wi-Fi partagé
avec le homelab ». La réponse intuitive — une règle `ClientIP(192.168.1.0/24)` —
ne peut pas marcher, et la variante « je regarde CF-Connecting-IP » est un
contournement d'authentification. Ce commit écrit la mesure pour qu'on ne
re-découvre ni l'une ni l'autre.
Mesuré (2026-07-28, homelab) :
- `kadans.arcodange.fr` résout vers Cloudflare MÊME depuis le LAN, et redescend
par le tunnel cloudflared. L'adresse de socket vue par Traefik est donc
toujours celle d'un pod, en 10.42.x.x.
- Traefik SAIT qui est le vrai client (journal d'accès : l'IPv6 de la maison,
`2a01:cb04:dff:cf00::/64` — pas l'IPv4 qu'`ipify` injecte dans `localIp`), car
l'entrypoint `web` fait confiance aux en-têtes venant de 10.42.0.0/16.
- Mais le matcher de routeur `ClientIP()`, lui, juge la SOCKET. Prouvé par trois
routeurs temporaires vers un Service sans endpoint (503 = règle matchée,
401 = repli sur le routeur normal) : témoin 503, `ClientIP(<IPv6 maison>)` 401,
`ClientIP(10.42.0.0/16)` 503. Sondes retirées après mesure.
D'où deux pièges, écrits là où on les rencontrerait :
- `localIp@file` sur un routeur `.fr` laisserait entrer Internet entier, parce
que `10.42.0.0/16` est dans son `sourceRange` et qu'`ipAllowList` juge lui
aussi la socket. Vérifié : aucun routeur `.fr` ne le porte aujourd'hui — le
piège est latent, et les cinq endroits d'où on pourrait le recopier
(2 gabarits `.fr`, 3 values `.lab`) portent désormais l'avertissement.
- Un en-tête posé par le client ne peut pas piloter une exemption d'auth :
Cloudflare ne retire pas les en-têtes inconnus, et Traefik reste joignable en
direct sur 192.168.1.201.
Voie retenue, et pourquoi celle-là : la décision « suis-je à la maison ? » doit
être prise là où la vraie IP est native et non falsifiable, donc au bord, chez
Cloudflare. Une règle de transformation y pré-remplit l'en-tête `Authorization`
pour les IP du foyer. Traefik ne bouge pas, aucun certificat public à produire,
aucun changement DNS. Surface d'attaque ajoutée : AUCUNE — `kadans:kkadans` est
déjà en clair dans le chart de kadans, Cloudflare ne fait que le taper à notre
place. Et quand l'IP du foyer dérive, la règle cesse de matcher : le navigateur
redemande le mot de passe. Dégradation douce, pas de panne.
Le doc écrit l'action Cloudflare mot pour mot (expression, en-tête, valeur, et
l'équivalent Terraform pour `cms/cloudflare`) plutôt que de la supposer faite,
avec les deux commandes qui la vérifient — et nomme le repli si Cloudflare
refuse de modifier `Authorization` : Cloudflare Access avec une politique de
bypass, PAS un en-tête secret.
Enfin, un contre-exemple utile : le bouncer CrowdSec, lui, juge la VRAIE IP
(journal à l'appui). Son `clientTrustedIPs` contient `10.42.0.0/16` sans que ce
soit un trou — noté pour que personne ne « corrige » cette ligne en croyant y
reproduire le piège.
⚠ Aucun des réglages en cause ne vit dans ce dépôt : les valeurs Helm de
Traefik, `dynamic.yaml`/`localIp` et le Middleware crowdsec sont dans `factory`
(ansible), le tunnel et le DNS dans `cms`. Ce dépôt reçoit la mesure et les
garde-fous parce que c'est lui qui héberge les gabarits `.fr` et les
consommateurs de `localIp@file`.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GdUCA5Uz8QyMwa2P4Pg2hK
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
La demande
C'est faisable, mais pas dans Traefik — et la solution qui vient spontanément à l'esprit est un contournement d'authentification. Cette PR écrit la mesure pour qu'on ne re-découvre ni l'une ni l'autre, pose les garde-fous là où le piège se poserait, et écrit mot pour mot l'action à faire.
Ce qui a été mesuré (2026-07-28, homelab)
kadans.arcodange.frsort de la maison même depuis le salon. Le nom résout vers Cloudflare, redescend par le tunnelcloudflared. L'adresse de socket que Traefik accepte est donc toujours celle d'un pod, en10.42.x.x.Traefik SAIT pourtant qui est le vrai client — l'entrypoint
webfait confiance aux en-têtes venant de10.42.0.0/16. Journal d'accès sur une requête émise d'ici :Au passage : la maison sort en IPv6. Le
86.238.234.54/32qu'ipifyinjecte danslocalIpn'est qu'une des deux adresses publiques du foyer, et pas celle qu'un navigateur utilise en priorité.Mais le matcher de routeur
ClientIP()juge la SOCKET, pas cette résolution. Mesuré, pas supposé — trois routeurs temporaires posés surkadans.arcodange.frvers un Service sans endpoint (donc503si la règle matche, repli401sinon) :Host(kadans.arcodange.fr)ClientIP("2a01:cb04:dff:cf00::/64")ClientIP("10.42.0.0/16")Le témoin valide le montage ; A échoue, B réussit. Sondes supprimées après mesure (contrôle :
401revenu).Les deux pièges, et pourquoi ils sont écrits dans le code
localIp@filene doit jamais toucher un routeur.fr.10.42.0.0/16est dans sonsourceRangeetipAllowListjuge lui aussi la socket → le middleware « IP locale seulement » laisserait entrer Internet entier. ✅ Vérifié : aucun routeur.frne le porte aujourd'hui, le piège est latent. Les cinq endroits d'où on pourrait le recopier (2 gabarits.fr, 3 values.lab) portent désormais l'avertissement à la ligne près.CF-Connecting-IPou à un en-tête maison est un contournement d'auth. Cloudflare ne retire pas les en-têtes inconnus, et Traefik reste joignable en direct sur192.168.1.201:80. Voie écartée, explicitement.Et pourquoi ce n'est pas réparable dans Traefik : les middlewares s'enchaînent inconditionnellement (pas de « basic auth sauf si… »), le seul moyen de sauter un middleware est de faire matcher un autre routeur, et le seul discriminant d'IP au niveau routeur est
ClientIP()— qui ne voit que le tunnel.La voie retenue, et le prix des autres
Faire pointer le LAN vers Traefik (DNS double horizon, ou « DNS only » chez Cloudflare) rendrait
ClientIP(192.168.1.0/24)honnête, mais coûterait en plus du DNS : un certificat publiquement valide pourkadans.arcodange.fr(Traefik sert aujourd'hui la CA interneCN=arcodange.lab— uncurl --resolvedirect échoue au TLS, code000), donc uncertResolverDNS-01 Cloudflare et son jeton, plus un routeurwebsecurepour un hôte qui vit enwebclair. Beaucoup, pour du confort. Et « DNS only » retirerait le bouclier Cloudflare de cet hôte.Retenu : la décision se prend au bord, chez Cloudflare, là où
ip.srcest native et non falsifiable. Une règle de transformation y pré-remplit l'en-têteAuthorizationpour les IP du foyer.kadans:kkadansest déjà en clair danschart/values.yamlde kadans, assumé comme garde-fou et non comme secret. Cloudflare ne fait que le taper à notre place — un attaquant qui forge l'en-tête obtient exactement ce quecurl -u kadans:kkadanslui donne déjà. C'est la différence de fond avec le piège n°2 : on n'ouvre pas d'exemption, on automatise une saisie.👉 Action manuelle du fondateur (une fois)
Cloudflare → zone
arcodange.fr→ Rules → Transform Rules → Modify Request Header → Create rule :Authorization, valeurBasic a2FkYW5zOmtrYWRhbnM=L'équivalent Terraform pour
cms/cloudflareest dans le doc, ainsi que les deuxcurlqui vérifient (200 sans-udepuis la maison, 401 depuis le partage de connexion du téléphone).⚠ Point non vérifié en vrai, écrit comme tel : que Cloudflare accepte
Authorizationen en-tête de requête modifiable. Si l'éditeur refuse, le repli documenté est Cloudflare Access (politique Bypass sur ces IP, Allow par e-mail ailleurs, et le basic auth Traefik retiré) — pas un en-tête secret.Le doc nomme aussi la version encore plus simple, sans la trancher : le mot de passe étant public, ce qu'il achète réellement c'est « pas indexé, pas tombé dessus par hasard » — un
robots.txt+X-Robots-Tag: noindexfait ce travail sans mot de passe. C'est une décision produit, elle n'est pas prise ici.Une hypothèse infirmée (et donc pas de fausse alerte)
Je soupçonnais le bouncer CrowdSec d'être neutralisé sur
.fr(sonclientTrustedIPscontient10.42.0.0/16, ce qui aurait « fait confiance » à tout le tunnel). Faux — le plugin résout la vraie IP, journal à l'appui :La convention
.frtient donc ce qu'elle promet. C'est écrit dans le doc pour que personne ne « corrige » cette ligne en croyant y reproduire le piège n°1.⚠ Sur le périmètre de cette PR
Aucun des réglages en cause ne vit dans ce dépôt (vérifié) :
dynamic.yaml,localIpfactory—ansible/.../playbooks/system/k3s_config.ymlcrowdsec@kube-systemfactory—.../roles/crowdsec/tasks/main.yml*.arcodange.frcms—cloudflare/iac.tf.frde kadanskadans—chart/values.yamltoolsreçoit la mesure et les garde-fous parce que c'est lui qui héberge les gabarits.fr(grafana,minio) et les consommateurs delocalIp@file. Si le doc doit rejoindre les ADR (qui vivent dansfactory/doc/adr/), c'est un déplacement d'un fichier — dis-le et je le fais.Contenu
doc/ce-que-traefik-voit.md(nouveau) — la mesure, les pièges, la voie retenue, l'action Cloudflare mot pour mot, la vérification, ce qu'il faudra surveiller.grafana/templates/ingress-public.yaml,minio/templates/ingress-public.yaml(les deux gabarits.fr) etgrafana/values.yaml,hashicorp-vault/values.yaml,plausible/plausibleValues.yaml(les trois.labd'où on recopierait).README.md.Documentation et commentaires uniquement — aucun manifeste rendu ne change. Rien n'est mergé.