Publication du wiki depuis le depot (source: d76ce57)

Daniel Allaire 2026-09-14 14:12:19 -04:00
parent 6808e65473
commit 5f82a40669
74 changed files with 2315 additions and 7 deletions

@ -27,6 +27,7 @@ des **méthodes 100 % génériques**.
| **Opérations (runbooks)** | Les procédures ne vivent **pas** ici : elles sont dans le dépôt, `docs/runbooks-exploitation.md`. Le wiki y pointe (même règle que la référence technique, ci-dessous). |
| **[Glossaire](Glossaire)** | Les concepts-clés en une phrase (seed, bindings, le plancher, hôte fantôme, voûte…). |
| **Référence technique** | Le *détail du « comment »* vit **dans le dépôt** (`docs/`, README des rôles) — ce wiki y **pointe**, ne le **recopie pas** (pour éviter la dérive). |
| **[Les rôles, un par un](Rôles)** | La seule exception à la règle ci-dessus, et elle la confirme : ces 68 fiches sont **générées** depuis les `meta/` de chaque rôle (`make fiches`). Le motif de la règle est la *dérive* ; une page qui relit sa source à chaque génération ne peut pas dériver. Corriger une fiche veut dire corriger la **déclaration**, jamais la page. |
## Le moule d'une unité d'apprentissage
Chaque unité suit **quatre temps** :

@ -84,7 +84,7 @@ Change les produits, le **schéma reste**. C'est ça, un savoir générique.
> Prérequis : accès au lab (VPN), `/etc/hosts` pointant les services sur l'edge.
1. **Vis le SSO.** Ouvre `https://grafana.chezlepro.internal` → « *Se connecter avec
1. **Vis le SSO.** Ouvre `https://observatoire.chezlepro.internal` → « *Se connecter avec
Chezlepro* » → `testmail`. Puis ouvre Forgejo, puis Icinga : **tu n'es reconnecté nulle part**.
2. **Observe le flux.** Rouvre Grafana en navigation privée, ouvre les outils dév (F12 → Réseau) :
repère la **redirection vers Keycloak**, puis le **retour avec un `code=`**. C'est ① en action.

@ -65,7 +65,7 @@ Tu as appris **métriques vs logs, pull vs push, le motif agent** — pas « Pro
```
2. **Vois les journaux** : `curl -s http://localhost:3100/loki/api/v1/label/host/values` → les nœuds
qui expédient leurs logs.
3. **Ouvre Grafana** (`https://grafana.chezlepro.internal`) — métriques *et* logs au même endroit.
3. **Ouvre Grafana** (`https://observatoire.chezlepro.internal`) — métriques *et* logs au même endroit.
4. **Casse & répare.** Arrête `prometheus-node-exporter` sur un nœud : dans Prometheus, sa cible passe
**`up=0`** (DOWN). Redémarre : elle repasse UP. Tu *sens* que c'est **l'agent** qui nourrit le
serveur (modèle pull).

@ -19,7 +19,7 @@ Un seul endroit gère les certificats → simple et cohérent.
## ② Comment Set-OPS le fait
`serveur_nginx` déployé sur l'**edge** (`infra-edge`) est le reverse-proxy. Le point élégant :
l'**exposition est auto-dérivée**. Déclarer `expose: [icinga.chezlepro.internal]` sur une app
l'**exposition est auto-dérivée**. Déclarer `expose: [vigie.chezlepro.internal]` sur une app
génère **tout** :
```
@ -51,12 +51,12 @@ Tu as appris **le reverse-proxy, le routage par nom, la terminaison TLS** — pa
1. **Route par nom.** Deux noms, un seul edge (`10.17.16.11`) :
```bash
curl -sI --resolve grafana.chezlepro.internal:443:10.17.16.11 \
--cacert /etc/step/certs/root_ca.crt https://grafana.chezlepro.internal/ | head -1
curl -sI --resolve observatoire.chezlepro.internal:443:10.17.16.11 \
--cacert /etc/step/certs/root_ca.crt https://observatoire.chezlepro.internal/ | head -1
```
Change `grafana` en `forge` : même IP, **backend différent**. C'est le routage par SNI.
2. **Vois la terminaison TLS.** Le certificat présenté est celui de l'**edge** (avec les SAN des
exposés) : `openssl s_client -connect 10.17.16.11:443 -servername grafana.chezlepro.internal | openssl x509 -noout -text | grep -A1 'Subject Alternative'`.
exposés) : `openssl s_client -connect 10.17.16.11:443 -servername observatoire.chezlepro.internal | openssl x509 -noout -text | grep -A1 'Subject Alternative'`.
3. **Casse & répare.** Arrête le backend (ex. `systemctl stop grafana-server` sur obs-01) et rouvre
Grafana : l'edge répond **502 Bad Gateway** (le proxy est là, le service non). Redémarre : ça
remarche. Tu distingues **le proxy** de **ce qu'il sert**.

29
Rôle-amorcage_acces.md Normal file

@ -0,0 +1,29 @@
# Rôle `amorcage_acces`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>acces</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-apparmor.md Normal file

@ -0,0 +1,29 @@
# Rôle `apparmor`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>apparmor</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-auditd.md Normal file

@ -0,0 +1,29 @@
# Rôle `auditd`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>auditd</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-chrony.md Normal file

@ -0,0 +1,29 @@
# Rôle `chrony`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>chrony</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-client_artefacts.md Normal file

@ -0,0 +1,29 @@
# Rôle `client_artefacts`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>artefacts</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-client_backup.md Normal file

@ -0,0 +1,29 @@
# Rôle `client_backup`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>backup</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 64 Mo, 2 Go.
- **Authentification** : non déclarée.

35
Rôle-client_journal.md Normal file

@ -0,0 +1,35 @@
# Rôle `client_journal`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>journal</b>"]
E0["localhost"] -->|"12346 · clair"| R
R -.->|"sonde « journaux »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `12346` | `localhost` | clair | Interface de diagnostic locale d'Alloy — port declare pour rendre les collisions visibles. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `journaux` | 5400 s | Les journaux de cette machine partent-ils vraiment vers Loki ? Alloy peut tourner, se declarer pret, et jeter chaque ligne faute de pouvoir joindre le collecteur. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

35
Rôle-client_metrique.md Normal file

@ -0,0 +1,35 @@
# Rôle `client_metrique`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>metrique</b>"]
E0["prometheus"] -->|"9100 · tls"| R
R -.->|"sonde « metriques »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `9100` | `serveur_prometheus` | tls | Scrape des métriques par Prometheus (node_exporter en HTTPS). |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `metriques` | 5400 s | Cette machine offre-t-elle vraiment ses metriques ? Un node_exporter actif mais muet — ou dont un collecteur ATTENDU s'est mis a echouer — laisse Prometheus collecter du vide sans que rien ne le dise. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

32
Rôle-client_pki.md Normal file

@ -0,0 +1,32 @@
# Rôle `client_pki`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>pki</b>"]
R -.->|"sonde « certificat »"| ICINGA[["Icinga"]]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `certificat` | 5400 s | Le certificat d'hote est-il encore valide assez longtemps, et le service qui le consomme sert-il bien CELUI-LA ? Nos certificats vivent 24 h : un renouvellement arrete ne se voit qu'au lendemain, quand tout ce qui parle TLS tombe ensemble. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-client_resolveur.md Normal file

@ -0,0 +1,29 @@
# Rôle `client_resolveur`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>resolveur</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-client_sante.md Normal file

@ -0,0 +1,29 @@
# Rôle `client_sante`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>sante</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-client_smtp.md Normal file

@ -0,0 +1,29 @@
# Rôle `client_smtp`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>smtp</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-cloud_init.md Normal file

@ -0,0 +1,29 @@
# Rôle `cloud_init`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>init</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,29 @@
# Rôle `cloud_init_retrait`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>init_retrait</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-common_packages.md Normal file

@ -0,0 +1,29 @@
# Rôle `common_packages`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>packages</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-core_dumps.md Normal file

@ -0,0 +1,29 @@
# Rôle `core_dumps`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>dumps</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-fail2ban_ssh.md Normal file

@ -0,0 +1,29 @@
# Rôle `fail2ban_ssh`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>ssh</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,29 @@
# Rôle `hardening_packages`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>packages</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-hosts_statiques.md Normal file

@ -0,0 +1,29 @@
# Rôle `hosts_statiques`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>statiques</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-journald.md Normal file

@ -0,0 +1,29 @@
# Rôle `journald`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>journald</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-motd.md Normal file

@ -0,0 +1,29 @@
# Rôle `motd`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>motd</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,29 @@
# Rôle `nftables_baseline`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>baseline</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-paquets_tiers.md Normal file

@ -0,0 +1,29 @@
# Rôle `paquets_tiers`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>tiers</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-qemu_guest_agent.md Normal file

@ -0,0 +1,29 @@
# Rôle `qemu_guest_agent`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>guest_agent</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,29 @@
# Rôle `resoudre_annuaire`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>annuaire</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-resoudre_base.md Normal file

@ -0,0 +1,29 @@
# Rôle `resoudre_base`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>base</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-resoudre_idp.md Normal file

@ -0,0 +1,29 @@
# Rôle `resoudre_idp`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>idp</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,29 @@
# Rôle `resoudre_politique_mdp`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>politique_mdp</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,37 @@
# Rôle `serveur_artefacts`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>artefacts</b>"]
E0["flotte"] -->|"3142 · clair"| R
R -.->|"sonde « cache-apt »"| ICINGA[["Icinga"]]
R -.->|"sonde « cache-apt-volume »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `3142` | `flotte` | clair | Toute la flotte prend ses paquets ici. En clair, et c'est correct : l'intégrité d'un dépôt apt vient de ses signatures, qu'apt vérifie de toute façon — un intermédiaire ne peut pas altérer un paquet sans se faire prendre. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `cache-apt` | 5400 s | Le cache d'artefacts repond-il ? S'il se tait, TOUT apt de l'ecosysteme echoue — on agit dans la minute. |
| `cache-apt-volume` | 5400 s | Reste-t-il de la place au cache ? Un cache plein cesse d'ecrire sans se plaindre, et l'echec apparait chez les clients. Verdict distinct de la disponibilite : il appelle un billet, pas un reveil. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 15 Go.
- **Authentification** : `sans-auth-humaine` — Un cache de paquets ne sert que des machines, jamais des humains : il n'expose aucune interface a federer. Ce qu'il sert est PUBLIC par nature -- les depots Debian le sont -- et son integrite ne repose pas sur qui demande, mais sur les signatures que le client verifie. Restreindre QUI peut l'interroger est le travail du pare-feu est-ouest, pas d'une authentification.

35
Rôle-serveur_backup.md Normal file

@ -0,0 +1,35 @@
# Rôle `serveur_backup`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>backup</b>"]
E0["backup"] -->|"22 · ssh"| R
R -.->|"sonde « depot »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `22` | `client_backup` | ssh | Dépôt restic servi par SSH (utilisateur restreint restic + clé) ; chaque client_backup pousse ses instantanés. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `depot` | 5400 s | Le depot accepte-t-il encore une ecriture ? Il ne juge pas le contenu — chiffre cote client, il ne peut pas l'ouvrir. Il constate que l'endroit prend encore : en lecture seule, plein ou aux droits derives, il refuse tout le monde, et neuf clients rougiront un par un sans designer la cause commune. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 64 Go.
- **Authentification** : `sans-auth-humaine` — Depots restic joints par cle SSH ; aucun humain ne s'y connecte.

@ -0,0 +1,32 @@
# Rôle `serveur_backup_site`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>backup_site</b>"]
E0["site"] -->|"22 · ssh"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `22` | `voisins_site` | ssh | Les écosystèmes de ce site déposent leur état ici tant qu'ils n'ont pas leur propre dépôt. SFTP par un utilisateur restreint, jamais un compte d'administration : le site reçoit des octets chiffrés par restic, il ne peut pas les lire. |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 0 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Les locataires deposent par SFTP, avec une CLE dediee et un utilisateur restreint — jamais un compte d'administration. Et ce qu'ils deposent est chiffre par restic AVANT de partir : le site heberge leur etat sans pouvoir le lire. C'est ce qui rend ce service mutualisable alors que la voute ne l'est jamais.

@ -0,0 +1,32 @@
# Rôle `serveur_cache_site`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>cache_site</b>"]
E0["site"] -->|"3142 · clair"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `3142` | `voisins_site` | clair | Servir les caches des écosystèmes voisins. Debian n'est ainsi téléchargé qu'une fois pour tout le site, et le cache ne voit que des requêtes AGRÉGÉES — jamais quelle machine installe quoi. |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 0 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Un cache de paquets ne sert que des machines. Ce qui le protege n'est pas une authentification mais la LISTE de ses pairs : seuls les tenants de ce site le joignent, et la frontiere le fait respecter. Ce qu'il sert est public par nature.

@ -0,0 +1,37 @@
# Rôle `serveur_collabora`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>collabora</b>"]
E0["edge"] -->|"9980 · clair"| R
E1["localhost"] -->|"9980 · clair"| R
R -.->|"sonde « edition »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `9980` | `edge` | clair | Éditeur servi au navigateur via l'edge (WebSocket WOPI ; TLS terminé à l'edge). |
| `9980` | `localhost` | clair | Vérifications WOPI serveur→Collabora depuis Nextcloud co-localisé. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `edition` | 5400 s | L'edition en ligne repond-elle ? `/hosting/discovery` est l'adresse que Nextcloud interroge lui-meme pour savoir quels documents Collabora sait ouvrir. Sans elle, le bouton « ouvrir » cesse de fonctionner pour tout le monde — et Nextcloud reste vert. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 2 cœur(s), 2048 Mo, 10 Go.
- **Authentification** : `sans-auth-humaine` — Expose, mais aucun compte : l'acces est autorise par un jeton WOPI emis par Nextcloud, qui a deja authentifie l'humain.

42
Rôle-serveur_debian.md Normal file

@ -0,0 +1,42 @@
# Rôle `serveur_debian`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>debian</b>"]
E0["externe"] -->|"22 · ssh"| R
E1["externe"] -->|"frag-needed"| R
E2["flotte"] -->|"22 · ssh"| R
E3["icinga"] -->|"echo-request"| R
R -.->|"sonde « correctifs »"| ICINGA[["Icinga"]]
R -.->|"sonde « horloge »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `22` | `flotte`, `externe` | ssh | Plan de gestion : administration et déploiement Ansible par SSH (inter-nœud ; l'accès depuis l'extérieur est filtré à l'OPNsense). |
| `frag-needed` | `externe` | n-a | ICMP « fragmentation nécessaire » entrant : sans lui, un distant ne peut pas nous demander de réduire nos paquets — les transferts se figent. |
| `echo-request` | `serveur_icinga` | n-a | La supervision verifie que ce noeud repond (hostalive). Sans lui, elle le tient pour mort et supprime ses notifications. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `correctifs` | 5400 s | Des correctifs de securite attendent-ils d'etre appliques, et depuis quand ? Set-OPS desarme les mises a jour automatiques et les applique au deploiement : sans cette mesure, rien ne dit quand le geste est du. |
| `horloge` | 5400 s | L'heure est-elle disciplinee, et par la SOURCE DECLAREE ? Une machine peut etre parfaitement a l'heure en interrogeant quatre serveurs publics — c'est le defaut de Debian, et il a tenu quatorze machines jusqu'au 2026-09-11 sans que rien ne le dise. Mesurer la seule derive laisserait ce retour en arriere invisible. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : `sans-auth-humaine` — Socle du systeme : SSH par cle, aucune interface d'authentification propre.

39
Rôle-serveur_dovecot.md Normal file

@ -0,0 +1,39 @@
# Rôle `serveur_dovecot`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>dovecot</b>"]
E0["externe"] -->|"993 · tls-requis"| R
E1["postfix"] -->|"12345 · tls"| R
E2["postfix"] -->|"24 · tls-requis"| R
R -.->|"sonde « boites »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `24` | `serveur_postfix` | tls-requis | Remise LMTP depuis Postfix (edge-mta -> mailstore), en TLS vérifié (lmtp_tls_security_level=verify). |
| `12345` | `serveur_postfix` | tls | Authentification SASL déléguée : Postfix valide les identifiants de soumission contre Dovecot. |
| `993` | `externe` | tls-requis | Accès courriel des utilisateurs (IMAPS). Frontière publique gérée à l'OPNsense. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `boites` | 5400 s | Dovecot repond-il, et sait-il encore RESOUDRE un utilisateur dans l'annuaire ? Un Dovecot dont le lien LDAP est tombe accepte les connexions et refuse toutes les authentifications : le service a l'air debout et plus personne n'entre. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 5 Go.
- **Authentification** : `ldap-direct` — IMAP ne parle pas OIDC. Authentification LDAP directe : le chemin differe, la source est la meme.

32
Rôle-serveur_durci.md Normal file

@ -0,0 +1,32 @@
# Rôle `serveur_durci`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>durci</b>"]
R -.->|"sonde « audit »"| ICINGA[["Icinga"]]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `audit` | 5400 s | La piste d'audit s'ecrit-elle vraiment ? Des regles armees dans le noyau ne prouvent pas qu'un demon collecte : le 2026-08-30, quinze machines ont eu les deux apparences de la sante sans qu'une seule ligne soit ecrite. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : `sans-auth-humaine` — Role-categorie du durcissement : il ne porte aucune tache et n'expose aucune interface. Le travail est fait par les roles que son playbook applique, chacun avec sa propre declaration.

@ -0,0 +1,32 @@
# Rôle `serveur_forge_site`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>forge_site</b>"]
E0["site"] -->|"443 · tls-requis"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `443` | `voisins_site` | tls-requis | Servir le génome aux écosystèmes de ce site : c'est de cette forge qu'ils clonent leur moteur, leurs modèles et la carte de la fabric (D-81). Sans ce flux, un écosystème neuf ne peut pas se reproduire. |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 0 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Ce marqueur n'expose aucune interface : l'authentification de la forge elle-meme est celle de `serveur_forgejo`. Ce que ce role ajoute est une LISTE de pairs — seuls les tenants de ce site clonent ici, et la frontiere le fait respecter. Les depots servis par ce chemin sont ceux du genome, publics par nature ; les depots prives gardent l'authentification de la forge.

38
Rôle-serveur_forgejo.md Normal file

@ -0,0 +1,38 @@
# Rôle `serveur_forgejo`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>forgejo</b>"]
E0["admin"] -->|"derive · tls"| R
E1["edge"] -->|"3000 · clair"| R
E2["flotte"] -->|"derive · tls"| R
R -.->|"sonde « forge »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `3000` | `edge` | clair | Interface web + Git HTTP derrière un edge : le nginx termine le TLS et parle en clair à la forge. C'est le cas de tout tenant. |
| `derive` | `flotte`, `admin` | tls | Sans edge devant elle — la forge du SITE — elle sert son propre TLS sur le port du schéma (443), avec le certificat de la machine. `derive` parce que le port vient de `serveur_forgejo_http_port` : écrire 3000 en dur ici serait faux pour elle, et rien ne le signalerait puisque ce flux ne traverse pas la frontière. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `forge` | 5400 s | La forge repond-elle a son API, et son depot Git est-il lisible ? Une forge qui sert sa page d'accueil mais ne peut plus lire ses depots est une panne complete pour tout ce qui clone — et elle a l'air en ligne. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 1024 Mo, 20 Go.
- **Authentification** : `web-sso` — Interface humaine exposee ; OAuth2 natif. ENABLE_INTERNAL_SIGNIN ferme aussi l'API en Basic (Forgejo >= 10).

36
Rôle-serveur_grafana.md Normal file

@ -0,0 +1,36 @@
# Rôle `serveur_grafana`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>grafana</b>"]
E0["admin"] -->|"3000 · clair"| R
E1["edge"] -->|"3000 · clair"| R
R -.->|"sonde « tableaux »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `3000` | `edge`, `admin` | clair | Interface web : servie via l'edge la ou il y en a un, joignable depuis le plan d'administration partout — sans quoi un deploiement sans edge n'a plus de console. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `tableaux` | 5400 s | Grafana repond-il, et sa base tient-elle ? Un Grafana dont la base est tombee sert encore sa page de connexion : il a l'air en ligne et ne peut plus rien montrer. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 2 Go.
- **Authentification** : `web-sso` — Interface humaine exposee ; OIDC natif (generic_oauth) vers Keycloak.

40
Rôle-serveur_icinga.md Normal file

@ -0,0 +1,40 @@
# Rôle `serveur_icinga`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>icinga</b>"]
E0["backup"] -->|"5665 · tls-requis"| R
E1["debian"] -->|"5665 · tls-requis"| R
E2["localhost"] -->|"5665 · clair"| R
R -.->|"sonde « moteur »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `5665` | `localhost` | clair | API Icinga 2 consommée en local par Icinga Web 2 co-localisé. |
| `5665` | `client_backup` | tls-requis | Rapport passif de chaque detenteur d'etat sur SON depot distant : le depot du site heberge du chiffre et ne peut pas le juger. |
| `5665` | `serveur_backup` | tls-requis | Le depot de sauvegarde depose ses resultats passifs (portee : process-check-result sur « sauvegarde: * »). |
| `5665` | `serveur_debian` | tls-requis | Rapport passif de sante de chaque noeud (unites systemd en echec). |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `moteur` | 5400 s | L'etat des controles arrive-t-il encore jusqu'a la base ? On ne mesure ni le service ni le port : on mesure la FRAICHEUR de ce que la base contient. Un moteur vert dont la synchronisation est tombee affiche eternellement le dernier etat connu — une supervision figee qui a l'air d'aller bien. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 2 cœur(s), 1024 Mo, 10 Go.
- **Authentification** : `sans-auth-humaine` — Coeur de supervision, sans interface : l'UI est serveur_icingaweb2.

@ -0,0 +1,32 @@
# Rôle `serveur_icingaweb2`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>icingaweb2</b>"]
E0["edge"] -->|"8080 · clair"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `8080` | `edge` | clair | Interface web servie via l'edge (TLS terminé à l'edge ; SSO possible via oauth2-proxy). |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 3 Go.
- **Authentification** : `web-sso` — Pas d'OIDC natif : la passerelle oauth2-proxy porte l'authentification et transmet l'identite en en-tete. L'hote n'est pas expose directement.

35
Rôle-serveur_keycloak.md Normal file

@ -0,0 +1,35 @@
# Rôle `serveur_keycloak`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>keycloak</b>"]
E0["edge"] -->|"8080 · clair"| R
R -.->|"sonde « identite »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `8080` | `edge` | clair | Console et endpoints OIDC servis au navigateur et aux applications via l'edge (TLS terminé à l'edge). |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `identite` | 5400 s | Le realm sert-il encore sa decouverte OIDC ? C'est la porte par laquelle tout le SSO de l'ecosysteme entre. Un Keycloak debout dont le realm n'a pas charge repond sur son port et refuse toute connexion — sans rien dire. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 2 cœur(s), 1536 Mo, 5 Go.
- **Authentification** : `socle-identite` — EST le fournisseur d'identite : il ne peut pas deleguer son authentification a lui-meme. Son administrateur local est, par construction, l'avant-dernier maillon avant sudo.

43
Rôle-serveur_loki.md Normal file

@ -0,0 +1,43 @@
# Rôle `serveur_loki`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>loki</b>"]
E0["fabric"] -->|"1514 · clair"| R
E1["fabric"] -->|"3100 · tls"| R
E2["journal"] -->|"3100 · tls"| R
E3["localhost"] -->|"3100 · clair"| R
R -.->|"sonde « ingestion »"| ICINGA[["Icinga"]]
R -.->|"sonde « journaux-frontiere »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `3100` | `client_journal` | tls | Réception des journaux poussés par Alloy (client_journal) en HTTPS (http_tls_config, cert step-ca). |
| `3100` | `localhost` | clair | Requêtes de Grafana co-localisé (datasource Loki en localhost). |
| `3100` | `fabric` | tls | Journaux des hyperviseurs. La machine qui PORTE les VM ecrivait ses journaux nulle part ailleurs que sur son propre disque — invisibles le jour ou c'est elle qui casse. |
| `1514` | `fabric` | clair | Journaux de la frontiere. Elle n'accueille aucun agent et n'emet que du syslog ; sans ce flux, le seul equipement qui voit passer TOUT le trafic n'ecrit nulle part. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `ingestion` | 5400 s | Loki est-il PRET a ingerer ? Un Loki qui ecoute mais dont l'ingesteur n'est pas pret accepte les connexions et perd les journaux — la panne se voit des semaines plus tard, quand on cherche une trace qui n'a jamais ete ecrite. |
| `journaux-frontiere` | 5400 s | La frontiere journalise-t-elle encore ? Sa destination syslog a deja pointe une VM rasee : toute la journalisation d'OPNsense s'est arretee dix jours sans que rien ne le signale. Un equipement muet ne se plaint pas — on demande donc a Loki ce qu'il a RECU, pas a la frontiere ce qu'elle croit avoir envoye. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 1024 Mo, 20 Go.
- **Authentification** : `interne-sans-auth` — API HTTP sans authentification, joignable DANS le tenant. Non exposee au plan. Consommee par Grafana, pas par un humain — mais rien ne l'empeche.

@ -0,0 +1,35 @@
# Rôle `serveur_nextcloud`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>nextcloud</b>"]
E0["edge"] -->|"80 · clair"| R
R -.->|"sonde « collaboration »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `80` | `edge` | clair | Interface web servie via l'edge (TLS terminé à l'edge). |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `collaboration` | 5400 s | Nextcloud est-il installe, hors maintenance et sans migration en attente ? Ces trois etats se lisent d'un coup dans `status.php`, et chacun rend le service inutilisable sans que la page d'accueil cesse de repondre. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 2 cœur(s), 2048 Mo, 20 Go.
- **Authentification** : `web-sso` — Interface humaine exposee ; app user_oidc. `hide_login_form` MASQUE seulement : `?direct=1` reste le chemin de secours documente par l'amont.

41
Rôle-serveur_nginx.md Normal file

@ -0,0 +1,41 @@
# Rôle `serveur_nginx`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>nginx</b>"]
E0["admin"] -->|"443 · tls-requis"| R
E1["externe"] -->|"443 · tls-requis"| R
E2["externe"] -->|"80 · clair"| R
E3["flotte"] -->|"443 · tls-requis"| R
R -.->|"sonde « edge »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `80` | `externe` | clair | HTTP entrant — redirection permanente vers HTTPS. |
| `443` | `externe` | tls-requis | HTTPS entrant — services exposés (terminaison TLS à l'edge). |
| `443` | `flotte` | tls-requis | HTTPS depuis le tenant : les FQDN publiés vivent à l'edge (découverte OIDC, appels inter-services par nom). |
| `443` | `admin` | tls-requis | HTTPS depuis le reseau d'administration : l'exploitant administre les services par leur interface web, servie par l'edge. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `edge` | 5400 s | L'edge ecoute-t-il, et sa configuration est-elle encore valide ? Un nginx dont la configuration est cassee continue de servir l'ANCIENNE tant qu'on ne le recharge pas : il fonctionne, et le prochain redemarrage le tuera. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 3 Go.
- **Authentification** : `sans-auth-humaine` — Frontal HTTP : il sert et relaie, il n'authentifie pas d'humain.

@ -0,0 +1,35 @@
# Rôle `serveur_oauth2_proxy`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>oauth2_proxy</b>"]
E0["edge"] -->|"4180 · clair"| R
R -.->|"sonde « passerelle »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `4180` | `edge` | clair | Point d'entrée SSO servi via l'edge (TLS terminé à l'edge) devant l'application protégée. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `passerelle` | 5400 s | La passerelle d'authentification repond-elle ? Elle porte l'acces aux applications sans SSO natif — la supervision la premiere. Quand elle meurt, les services derriere restent debout et deviennent injoignables : on cherche la panne du mauvais cote. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 128 Mo, 1 Go.
- **Authentification** : `web-sso` — C'EST la passerelle SSO generique. Elle n'a pas de compte propre : sans elle, l'amont n'est joignable qu'en local.

40
Rôle-serveur_openldap.md Normal file

@ -0,0 +1,40 @@
# Rôle `serveur_openldap`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>openldap</b>"]
E0["dovecot"] -->|"636 · tls-requis"| R
E1["flotte"] -->|"389 · starttls"| R
E2["icingaweb2"] -->|"636 · tls-requis"| R
E3["keycloak"] -->|"636 · tls-requis"| R
E4["postfix"] -->|"636 · tls-requis"| R
R -.->|"sonde « annuaire »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `636` | `serveur_keycloak`, `serveur_dovecot`, `serveur_icingaweb2`, `serveur_postfix` | tls-requis | LDAPS : fédération (Keycloak), userdb courriel (Dovecot), auth web (Icinga Web 2), tables virtuelles (Postfix). |
| `389` | `flotte` | starttls | LDAP + STARTTLS pour les clients internes qui préfèrent la mise à niveau TLS sur 389. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `annuaire` | 5400 s | L'annuaire repond-il, et contient-il encore ses entrees ? Un annuaire vide repond parfaitement a toutes les requetes — et plus personne ne s'authentifie nulle part. C'est le meme mensonge qu'une sauvegarde vide. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 3 Go.
- **Authentification** : `socle-identite` — EST la source de verite des comptes. Son cn=admin est la racine de la chaine de secours : si LDAP tombe, plus rien n'authentifie.

32
Rôle-serveur_ops.md Normal file

@ -0,0 +1,32 @@
# Rôle `serveur_ops`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>ops</b>"]
R -.->|"sonde « runner »"| ICINGA[["Icinga"]]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `runner` | 5400 s | Le poste d'exploitation peut-il encore agir ? Deux choses : ses depots sont-ils PROPRES et sur leur branche (une modification locale fait diverger le runner du depot que tout le monde lit), et Ansible repond-il dans son venv. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 2 cœur(s), 2048 Mo, 20 Go.
- **Authentification** : `sans-auth-humaine` — Le poste d'exploitation n'expose aucune interface : il n'est ni serveur web ni service reseau, et rien ne s'y connecte. On y entre par SSH sur l'hote, comme sur n'importe quelle machine de la flotte, puis l'on devient l'utilisateur d'exploitation. Il n'y a donc rien a federer, et rien a fermer.

29
Rôle-serveur_ops_site.md Normal file

@ -0,0 +1,29 @@
# Rôle `serveur_ops_site`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>ops_site</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 0 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Ce role n'expose aucune interface : il DETIENT un pouvoir au lieu d'en offrir un. Ce qui le protege n'est pas une authentification mais le fait que la voute deposee reste CHIFFREE et que son mot de passe soit tape a l'execution, jamais stocke.

@ -0,0 +1,35 @@
# Rôle `serveur_ops_tenant`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>ops_tenant</b>"]
E0["site"] -->|"22 · ssh"| R
R -.->|"sonde « voute »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `22` | `runner_site` | ssh | Insémination : le runner du SITE amorce ce runner-ci — socle, moteur, plan, plancher de résolution — jusqu'à ce qu'un humain lui remette sa voûte. Vers cette machine seule, jamais vers le reste de l'écosystème. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `voute` | 5400 s | La voute de l'ecosysteme est-elle presente ET CHIFFREE la ou le runner la lit ? Une voute en clair sur un runner est la fuite la plus discrete qui soit : rien ne casse, tout continue de fonctionner, et les secrets sont lisibles par quiconque accede a la machine. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 0 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Ce role n'expose aucune interface : il DETIENT un pouvoir au lieu d'en offrir un. Ce qui le protege n'est pas une authentification mais le fait que la voute deposee reste CHIFFREE et que son mot de passe soit tape a l'execution, jamais stocke.

38
Rôle-serveur_postfix.md Normal file

@ -0,0 +1,38 @@
# Rôle `serveur_postfix`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>postfix</b>"]
E0["externe"] -->|"25 · starttls"| R
E1["flotte"] -->|"587 · starttls"| R
E2["smtp"] -->|"25 · starttls"| R
R -.->|"sonde « file-courriel »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `25` | `externe`, `client_smtp` | starttls | SMTP entrant : courrier externe (MX) et notifications internes (client_smtp). |
| `587` | `flotte` | starttls | Soumission authentifiée (submission) pour les agents internes qui envoient du courrier. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `file-courriel` | 5400 s | Combien de courriels attendent dans la file ? Une file qui monte est le premier signe d'une remise qui ne se fait plus — et c'est un signe qu'on voit AVANT que quiconque se plaigne de ne rien recevoir. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 3 Go.
- **Authentification** : `ldap-direct` — SMTP ne parle pas OIDC. Consultation LDAP pour les identites et la remise.

@ -0,0 +1,48 @@
# Rôle `serveur_postgresql`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>postgresql</b>"]
E0["forgejo"] -->|"5432 · tls-requis"| R
E1["icinga"] -->|"5432 · tls-requis"| R
E2["keycloak"] -->|"5432 · tls-requis"| R
E3["nextcloud"] -->|"5432 · tls-requis"| R
E4["prometheus"] -->|"9187 · clair"| R
R -.->|"sonde « base »"| ICINGA[["Icinga"]]
R -.->|"9187 · postgresql"| PROM[["Prometheus"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `5432` | `serveur_keycloak`, `serveur_forgejo`, `serveur_icinga`, `serveur_nextcloud` | tls-requis | Connexions applicatives à PostgreSQL (verify-full ; pg_hba hostssl). |
| `9187` | `serveur_prometheus` | clair | Metriques PostgreSQL lues par l'observatoire. Series, pas verdicts : ce qui derive lentement — cache qui decroche, connexions qui montent, bases qui grossissent — n'a que le graphe pour se faire voir. En clair pour l'instant, contrairement a `client_metrique` : dette inscrite, a fermer par `--web.config.file` + `client_pki`. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `base` | 5400 s | La base repond-elle a une VRAIE requete, et lui reste-t-il des connexions ? Un PostgreSQL a court de connexions accepte encore le port et refuse tout le monde : chaque application tombe en meme temps sans que la base ait l'air morte. |
## Ce qu'il expose en séries
Exportateur `prometheus-postgres-exporter` — port **9187**, job `postgresql`.
| panneau | unité | pourquoi on le regarde |
|---|---|---|
| Connexions utilisées | connexions | La sonde Icinga crie a 70 % et a 90 %. Ce panneau dit ce qu'elle ne peut pas dire : depuis QUAND ca monte. Une base qui passe de 20 a 60 connexions en trois semaines n'a rien casse — elle annonce la date ou elle cassera. |
| Taux de succès du cache | ratio | CELUI-LA N'AURA JAMAIS DE VERDICT, et c'est pourquoi il compte. Quand les donnees depassent `shared_buffers`, la base va chercher sur disque de plus en plus souvent. Rien ne casse, rien n'alerte : tout devient lent. C'est exactement la panne qu'un graphe voit et qu'une sonde ne verra jamais. |
| Taille des bases | octets | La croissance est la seule chose qu'on ne peut pas mesurer apres coup. Savoir qu'une base a double en deux mois se decide deux mois plus tot — ou jamais. |
| Transactions par seconde | tps | Le contexte des trois autres. Des connexions qui montent a charge CONSTANTE ne disent pas la meme chose que des connexions qui montent parce que le travail a double — et le geste qui suit n'est pas le meme non plus. |
## Ce qu'il coûte, et qui entre
- **Empreinte** : 2 cœur(s), 2048 Mo, 20 Go.
- **Authentification** : `sans-auth-humaine` — Comptes de service, secrets en voute ; pas d'humain.

36
Rôle-serveur_powerdns.md Normal file

@ -0,0 +1,36 @@
# Rôle `serveur_powerdns`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>powerdns</b>"]
E0["flotte"] -->|"derive · clair"| R
R -.->|"sonde « zones »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `derive` | `flotte` | clair | Zone souveraine. 53 seul sur son hôte, 5300 sur la loopback derrière le résolveur. |
| `derive` | `flotte` | clair | Idem en TCP (réponses volumineuses, AXFR restreint par allow_axfr_ips). |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `zones` | 5400 s | L'autoritatif repond-il, et sert-il encore ses zones ? Un PowerDNS qui a perdu ses zones repond NXDOMAIN a tout : la resolution interne s'effondre pendant que le service a l'air parfaitement vivant. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 2 Go.
- **Authentification** : `sans-auth-humaine` — DNS autoritatif ; l'API est joignable en local avec une cle, pas par un humain.

@ -0,0 +1,35 @@
# Rôle `serveur_prometheus`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>prometheus</b>"]
E0["localhost"] -->|"9090 · clair"| R
R -.->|"sonde « collecte »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `9090` | `localhost` | clair | Console Prometheus consommée en local par Grafana co-localisé (pas d'exposition inter-nœud). |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `collecte` | 5400 s | Toutes les cibles declarees sont-elles reellement collectees ? C'est la seule sonde qui voit le cas SILENCIEUX : un noeud qui a cesse d'etre scrape ne peut pas s'en plaindre lui-meme, par definition. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 1024 Mo, 20 Go.
- **Authentification** : `interne-sans-auth` — Interface web sans authentification, joignable DANS le tenant. Non exposee au plan (aucun `expose`). Lacune connue : oauth2-proxy s'appliquerait, comme devant Icinga Web 2.

35
Rôle-serveur_redis.md Normal file

@ -0,0 +1,35 @@
# Rôle `serveur_redis`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>redis</b>"]
E0["localhost"] -->|"6379 · clair"| R
R -.->|"sonde « cache »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `6379` | `localhost` | clair | Cache/verrous consommés uniquement par l'application co-localisée (ex. Nextcloud). Aucune exposition inter-nœud. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `cache` | 5400 s | Le cache repond-il, et sert-il encore ? Un Redis borne ne tombe pas quand il est plein — il evicte. Les sessions se perdent une a une, les gens sont deconnectes au hasard, et le service reste vert : la panne se presente comme un defaut d'application. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 2 Go.
- **Authentification** : `sans-auth-humaine` — Cache local, secret en voute ; pas d'humain.

@ -0,0 +1,36 @@
# Rôle `serveur_resolveur`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>resolveur</b>"]
E0["flotte"] -->|"53 · clair"| R
R -.->|"sonde « resolution »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `53` | `flotte` | clair | Toute la flotte du tenant résout ici — et nulle part ailleurs. |
| `53` | `flotte` | clair | Réponses longues et bascule TCP, obligatoires en DNS. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `resolution` | 5400 s | Le resolveur repond-il POUR LA ZONE INTERNE ET pour un nom de l'Internet ? Les deux voies sont distinctes : la zone interne vient de l'autoritatif local, le reste de la recursion. Une seule qui tombe casse la moitie de l'ecosysteme, et l'autre moitie continue de dire que tout va bien. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 64 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Un resolveur DNS ne sert que des machines et n'expose aucune interface humaine. Ce qui le protege n'est pas une authentification mais sa LISTE D'ACCES : il ne repond qu'au supernet du tenant. Un resolveur ouvert au monde serait un relais d'amplification, pas un service mal authentifie.

@ -0,0 +1,33 @@
# Rôle `serveur_resolveur_site`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>resolveur_site</b>"]
E0["site"] -->|"53 · clair"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `53` | `voisins_site` | clair | Les écosystèmes de ce site résolvent ici tant qu'ils n'ont pas leur propre résolveur. `client_resolveur` les bascule chez eux dès qu'il existe ; retirer cet emprunt est alors une émancipation. |
| `53` | `voisins_site` | clair | Réponses longues et bascule TCP, obligatoires en DNS. |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 0 cœur(s), 0 Mo, 0 Go.
- **Authentification** : `sans-auth-humaine` — Un resolveur ne sert que des machines. Ce qui le protege n'est pas une authentification mais sa LISTE D'AUTORISATION : seuls les supernets des tenants de ce site l'interrogent, et la frontiere le fait respecter. Un resolveur ouvert au monde serait un relais d'amplification — c'est ce risque-la que l'ACL couvre, pas un secret.

37
Rôle-serveur_rspamd.md Normal file

@ -0,0 +1,37 @@
# Rôle `serveur_rspamd`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>rspamd</b>"]
E0["localhost"] -->|"11332 · clair"| R
E1["localhost"] -->|"11334 · clair"| R
R -.->|"sonde « filtrage »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `11332` | `localhost` | clair | Protocole milter consommé par Postfix co-localisé (analyse + signature DKIM). Local uniquement. |
| `11334` | `localhost` | clair | Interface de contrôle rspamd (statistiques, apprentissage) en local. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `filtrage` | 5400 s | Le filtrage du courrier repond-il ? Un filtre muet ne bloque pas le courrier, il le laisse passer : Postfix sans verdict delivre sans filtrer ou differe, et le service de courriel a l'air sain pendant que le pourriel entre. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 1024 Mo, 4 Go.
- **Authentification** : `sans-auth-humaine` — Filtrage courriel ; l'IHM de contrôle n'est pas activee.

35
Rôle-serveur_step_ca.md Normal file

@ -0,0 +1,35 @@
# Rôle `serveur_step_ca`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>step_ca</b>"]
E0["flotte"] -->|"8443 · tls-requis"| R
R -.->|"sonde « autorite »"| ICINGA[["Icinga"]]
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `8443` | `flotte` | tls-requis | ACME + API step-ca : chaque nœud (client_pki) émet/renouvelle ses certificats et récupère la racine. |
## Ce qu'il rend à la supervision
| sonde | TTL | ce qu'elle voit |
|---|---|---|
| `autorite` | 5400 s | L'autorite de certification repond-elle ? C'est la sonde la plus urgente de l'ecosysteme : nos certificats vivent 24 h. Une AC muette ne casse rien aujourd'hui — elle casse TOUT demain, d'un coup, sur les vingt-et-une machines a la fois. |
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 256 Mo, 2 Go.
- **Authentification** : `sans-auth-humaine` — AC interne : les hotes s'enrolent par jeton de provisionneur, pas par compte.

@ -0,0 +1,32 @@
# Rôle `serveur_web_dorsal`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>web_dorsal</b>"]
E0["edge"] -->|"80 · clair"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `80` | `edge` | clair | Front nginx local des webapps, proxie par l'edge (TLS termine a l'edge). |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 1024 Mo, 10 Go.
- **Authentification** : `sans-auth-humaine` — Execute l'application du tenant ; l'authentification appartient a cette application.

@ -0,0 +1,32 @@
# Rôle `serveur_web_frontal`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>web_frontal</b>"]
E0["edge"] -->|"80 · clair"| R
```
## Qui lui parle
| port | depuis | chiffrement | pourquoi |
|---|---|---|---|
| `80` | `edge` | clair | Contenu statique servi au navigateur via l'edge (TLS termine a l'edge). |
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : 1 cœur(s), 512 Mo, 10 Go.
- **Authentification** : `sans-auth-humaine` — Sert des fichiers statiques.

29
Rôle-ssh_baseline.md Normal file

@ -0,0 +1,29 @@
# Rôle `ssh_baseline`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>baseline</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-ssh_hardening.md Normal file

@ -0,0 +1,29 @@
# Rôle `ssh_hardening`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>hardening</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-sudo_ansible.md Normal file

@ -0,0 +1,29 @@
# Rôle `sudo_ansible`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>ansible</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-sysctl_hardening.md Normal file

@ -0,0 +1,29 @@
# Rôle `sysctl_hardening`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>hardening</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-systemd_ssh_auto.md Normal file

@ -0,0 +1,29 @@
# Rôle `systemd_ssh_auto`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>ssh_auto</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

29
Rôle-template_cleanup.md Normal file

@ -0,0 +1,29 @@
# Rôle `template_cleanup`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>cleanup</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

@ -0,0 +1,29 @@
# Rôle `unattended_upgrades`
> **Généré** par `scripts/fiche_role.py` depuis les `meta/` de ce rôle.
> Ne pas éditer à la main : corriger la déclaration, puis régénérer.
> **Pour qui :** celui qui doit agir sur ce rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend, et ce qu'il coûte.
```mermaid
graph LR
R["<b>upgrades</b>"]
```
## Qui lui parle
*Aucun flux entrant déclaré — `meta/flux.yml` absent ou sans `ingress`.*
## Ce qu'il rend à la supervision
*Aucune sonde déclarée. Un service qui porte de l'état et n'en déclare aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
## Ce qu'il coûte, et qui entre
- **Empreinte** : non déclarée.
- **Authentification** : non déclarée.

91
Rôles.md Normal file

@ -0,0 +1,91 @@
# Les rôles, un par un
> **Généré** par `make fiches`. Ne pas éditer à la main : corriger la déclaration du rôle, puis régénérer.
> **Pour qui :** celui qui doit agir sur un rôle et veut savoir, avant de toucher quoi que ce soit, qui lui parle, ce qu'il rend et ce qu'il coûte.
Chaque fiche est construite depuis ce que le rôle **déclare lui-même** — `meta/flux.yml`, `meta/supervision.yml`, `meta/metriques.yml`, `meta/empreinte.yml`, `meta/authentification.yml`. Aucune n'est écrite à la main : soixante-huit pages rédigées seraient périmées avant la fin du mois.
**Une colonne vide est une information**, pas un trou dans la fiche. C'est la carte de ce qui reste à déclarer, tenue à jour toute seule.
| rôle | flux entrants | sonde | métriques |
|---|---|---|---|
| [`amorcage_acces`](Rôle-amorcage_acces) | — | — | — |
| [`apparmor`](Rôle-apparmor) | — | — | — |
| [`auditd`](Rôle-auditd) | — | — | — |
| [`chrony`](Rôle-chrony) | — | — | — |
| [`client_artefacts`](Rôle-client_artefacts) | — | — | — |
| [`client_backup`](Rôle-client_backup) | — | — | — |
| [`client_journal`](Rôle-client_journal) | 1 | 1 | — |
| [`client_metrique`](Rôle-client_metrique) | 1 | 1 | — |
| [`client_pki`](Rôle-client_pki) | — | 1 | — |
| [`client_resolveur`](Rôle-client_resolveur) | — | — | — |
| [`client_sante`](Rôle-client_sante) | — | — | — |
| [`client_smtp`](Rôle-client_smtp) | — | — | — |
| [`cloud_init`](Rôle-cloud_init) | — | — | — |
| [`cloud_init_retrait`](Rôle-cloud_init_retrait) | — | — | — |
| [`common_packages`](Rôle-common_packages) | — | — | — |
| [`core_dumps`](Rôle-core_dumps) | — | — | — |
| [`fail2ban_ssh`](Rôle-fail2ban_ssh) | — | — | — |
| [`hardening_packages`](Rôle-hardening_packages) | — | — | — |
| [`hosts_statiques`](Rôle-hosts_statiques) | — | — | — |
| [`journald`](Rôle-journald) | — | — | — |
| [`motd`](Rôle-motd) | — | — | — |
| [`nftables_baseline`](Rôle-nftables_baseline) | — | — | — |
| [`paquets_tiers`](Rôle-paquets_tiers) | — | — | — |
| [`qemu_guest_agent`](Rôle-qemu_guest_agent) | — | — | — |
| [`resoudre_annuaire`](Rôle-resoudre_annuaire) | — | — | — |
| [`resoudre_base`](Rôle-resoudre_base) | — | — | — |
| [`resoudre_idp`](Rôle-resoudre_idp) | — | — | — |
| [`resoudre_politique_mdp`](Rôle-resoudre_politique_mdp) | — | — | — |
| [`serveur_artefacts`](Rôle-serveur_artefacts) | 1 | 2 | — |
| [`serveur_backup`](Rôle-serveur_backup) | 1 | 1 | — |
| [`serveur_backup_site`](Rôle-serveur_backup_site) | 1 | — | — |
| [`serveur_cache_site`](Rôle-serveur_cache_site) | 1 | — | — |
| [`serveur_collabora`](Rôle-serveur_collabora) | 2 | 1 | — |
| [`serveur_debian`](Rôle-serveur_debian) | 3 | 2 | — |
| [`serveur_dovecot`](Rôle-serveur_dovecot) | 3 | 1 | — |
| [`serveur_durci`](Rôle-serveur_durci) | — | 1 | — |
| [`serveur_forge_site`](Rôle-serveur_forge_site) | 1 | — | — |
| [`serveur_forgejo`](Rôle-serveur_forgejo) | 2 | 1 | — |
| [`serveur_grafana`](Rôle-serveur_grafana) | 1 | 1 | — |
| [`serveur_icinga`](Rôle-serveur_icinga) | 4 | 1 | — |
| [`serveur_icingaweb2`](Rôle-serveur_icingaweb2) | 1 | — | — |
| [`serveur_keycloak`](Rôle-serveur_keycloak) | 1 | 1 | — |
| [`serveur_loki`](Rôle-serveur_loki) | 4 | 2 | — |
| [`serveur_nextcloud`](Rôle-serveur_nextcloud) | 1 | 1 | — |
| [`serveur_nginx`](Rôle-serveur_nginx) | 4 | 1 | — |
| [`serveur_oauth2_proxy`](Rôle-serveur_oauth2_proxy) | 1 | 1 | — |
| [`serveur_openldap`](Rôle-serveur_openldap) | 2 | 1 | — |
| [`serveur_ops`](Rôle-serveur_ops) | — | 1 | — |
| [`serveur_ops_site`](Rôle-serveur_ops_site) | — | — | — |
| [`serveur_ops_tenant`](Rôle-serveur_ops_tenant) | 1 | 1 | — |
| [`serveur_postfix`](Rôle-serveur_postfix) | 2 | 1 | — |
| [`serveur_postgresql`](Rôle-serveur_postgresql) | 2 | 1 | oui |
| [`serveur_powerdns`](Rôle-serveur_powerdns) | 2 | 1 | — |
| [`serveur_prometheus`](Rôle-serveur_prometheus) | 1 | 1 | — |
| [`serveur_redis`](Rôle-serveur_redis) | 1 | 1 | — |
| [`serveur_resolveur`](Rôle-serveur_resolveur) | 2 | 1 | — |
| [`serveur_resolveur_site`](Rôle-serveur_resolveur_site) | 2 | — | — |
| [`serveur_rspamd`](Rôle-serveur_rspamd) | 2 | 1 | — |
| [`serveur_step_ca`](Rôle-serveur_step_ca) | 1 | 1 | — |
| [`serveur_web_dorsal`](Rôle-serveur_web_dorsal) | 1 | — | — |
| [`serveur_web_frontal`](Rôle-serveur_web_frontal) | 1 | — | — |
| [`ssh_baseline`](Rôle-ssh_baseline) | — | — | — |
| [`ssh_hardening`](Rôle-ssh_hardening) | — | — | — |
| [`sudo_ansible`](Rôle-sudo_ansible) | — | — | — |
| [`sysctl_hardening`](Rôle-sysctl_hardening) | — | — | — |
| [`systemd_ssh_auto`](Rôle-systemd_ssh_auto) | — | — | — |
| [`template_cleanup`](Rôle-template_cleanup) | — | — | — |
| [`unattended_upgrades`](Rôle-unattended_upgrades) | — | — | — |
## Ce qui reste à déclarer
Sur **68** rôles :
- **36** ne déclarent aucun flux entrant
- **40** ne déclarent aucune sonde
- **67** ne déclarent aucune métrique
Ces nombres ne sont pas tous des dettes : un rôle de durcissement n'a rien à exposer, et beaucoup de `client_*` n'ont aucun verdict à rendre. Mais un service qui porte de l'état et ne déclare rien mérite qu'on se demande pourquoi.

@ -49,7 +49,7 @@ Tu as appris **supervision active vs observabilité passive, l'état, l'alerting
## ④ À toi de jouer
1. **Ouvre Icinga Web 2** (`https://icinga.chezlepro.internal`, via le SSO) : la liste des hôtes
1. **Ouvre Icinga Web 2** (`https://vigie.chezlepro.internal`, via le SSO) : la liste des hôtes
et services **supervisés**, avec leur **état** (vert/jaune/rouge).
2. **Vois l'impact.** Menu *Business Processes* → « **Supervision Chezlepro** » : un processus qui
**agrège** des checks (load, procs, ping…) en un état roulé. C'est l'impact, pas une case.