Some checks failed
verifier / verifier (push) Has been cancelled
La revision a commence par un balayage par motifs — chemins morts, cibles make absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque tout le reste : un motif ne voit que ce qui s exprime en motif. make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus haut. Il fallait lire pour la voir. 74 documents lus un par un. 66 corriges, 8 exacts. CE QUI ETAIT FRANCHEMENT FAUX AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre des VM reelles. Elle a ete rasee et remontee depuis zero trois fois. ecosysteme-chezlepro.md, le document montre a un client, portait la meme phrase : il se sous-vendait gravement. courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n est construit alors qu il rapporte des mesures datees du role en fonctionnement. hebergeur-exploitation.md disait rien n est fait d un depot qui existe. filiation-emancipation.md se contredisait a deux ecrans de distance. DES MODELES DECRITS D APRES UN MONDE ANTERIEUR Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le donnaient en exemple d integration FACULTATIVE — il est universel depuis le 2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki qui avait raison. CE QUI CASSE AU PREMIER ESSAI Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le FABRIQUE et le critere R2 de l epreuve d operateur independant. preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait detruite : raser derive du plan, il ne la detruira jamais — le risque est l inverse. Un mot de passe d essai en clair dans un depot public. DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux declarations reelles : 12 annonces, 21 reels. Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une erreur ajoute l assurance a l erreur. CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il nomme existe. P29 tient les positions d authentification, personne ne tient les habilitations. make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
245 lines
13 KiB
Markdown
245 lines
13 KiB
Markdown
# Préparer un site hébergeur
|
|
|
|
> **Pour qui :** l'**hébergeur** qui met son matériel à disposition — il n'a pas besoin de
|
|
> connaître Set-OPS. L'exploitant du tenant lui transmet ce document, puis relit §7 pour
|
|
> savoir ce qu'il doit recevoir en retour.
|
|
|
|
Set-OPS déploie un écosystème complet (annuaire, SSO, courriel, forge, nuage
|
|
collaboratif, supervision, sauvegardes) à partir d'un plan. Tout cet adressage se
|
|
**dérive** d'un seul chiffre — l'`index` du tenant.
|
|
|
|
Ce que la machine ne peut pas deviner, c'est le **matériel** : le câblage, le nom des
|
|
stockages, le chemin de sortie vers Internet. C'est l'objet de ce document, et c'est tout
|
|
ce qui est demandé à l'hébergeur.
|
|
|
|
## 1. Le partage des rôles
|
|
|
|
| | Décide quoi | Où ça vit |
|
|
|---|---|---|
|
|
| **Hébergeur** | réseau physique, pare-feu de bordure, stockage, hyperviseur | `underlay.yml` et `proxmox-hebergeur.yml`, dans **son** dépôt |
|
|
| **Tenant** | quels services, sur quel nœud/stockage/pont les poser | `inventories/*/group_vars/`, dans le dépôt du tenant |
|
|
|
|
Cette séparation n'est pas cosmétique. Tant que ces valeurs étaient recopiées chez chaque
|
|
tenant, elles ont **divergé** : deux inventaires contradictoires du même cluster, avec des
|
|
listes de stockages et de ponts différentes. Un hébergeur décrit son matériel **une fois**.
|
|
|
|
## 2. Le plan d'adressage — la seule chose à respecter à la lettre
|
|
|
|
**Un site dérive du même `index` que son tenant.** Il n'y a pas de second registre à
|
|
tenir : le seul seed de tout l'adressage reste l'`index`, et l'underlay occupe la **bande
|
|
basse** du supernet — celle que la dérivation des tenants n'alloue jamais.
|
|
|
|
| Rôle | VLAN | Sous-réseau | MTU | Nature |
|
|
|---|---|---|---|---|
|
|
| **Gestion** | 10 *(ou aucun — voir ci-dessous)* | `10.<index>.0.0/24` | 1500 | **destination** — unique par site |
|
|
| Sortie des tenants | 40 | `192.168.40.0/24` | 1500 | chemin — identique partout |
|
|
| Transport VXLAN | 50 | `192.168.50.0/24` | 1500 | chemin — identique partout |
|
|
| Stockage iSCSI | 20 | `192.168.20.0/24` | 9000 | chemin — identique partout |
|
|
| Ceph public | 30 | `192.168.30.0/24` | 9000 | chemin — identique partout |
|
|
| Ceph cluster | 31 | `192.168.31.0/24` | 9000 | chemin — identique partout |
|
|
|
|
Index 17 → gestion en `10.17.0.0/24` ; index 11 → `10.11.0.0/24`. Deux sites ne peuvent
|
|
donc **pas** se chevaucher, sans qu'on ait rien de plus à décider.
|
|
|
|
> **Le VLAN de gestion peut n'exister pas du tout.** Chez l'hébergeur de référence, ce plan
|
|
> est un **segment physique** — une patte dédiée sur la frontière, aucune étiquette, et
|
|
> **aucun pont d'hyperviseur ne le touche**. Conséquence recherchée : *aucune VM ne peut y
|
|
> naître*, et le validateur refuse qu'on y déclare une machine. Un port d'accès étiqueté 10
|
|
> convient aussi ; ce qui compte est que rien du monde virtuel n'y ait de patte.
|
|
|
|
**Les VLAN ne changent jamais** d'un site à l'autre : ils sont locaux, ils ne traversent
|
|
aucun lien inter-sites. Un seul modèle mental, et l'adresse de stockage porte son propre
|
|
numéro de VLAN — `192.168.20.x` est sur le VLAN 20.
|
|
|
|
> **Pourquoi la bande basse est sûre, et non pas seulement libre aujourd'hui.** Les zones
|
|
> d'un tenant sont dérivées en `10.<index>.(15+categorie).0/24` : leur troisième octet
|
|
> vaut donc **16 au minimum**, et croît avec le nombre de zones. Les octets `0` à `15`
|
|
> ne sont **jamais** alloués — c'est une propriété de la règle, pas une place restée
|
|
> vide. L'underlay y tient largement.
|
|
|
|
> **Un seul réseau doit être unique, et c'est la gestion.** Le critère n'est pas « y a-t-il
|
|
> des machines dedans » — le VLAN de gestion n'en a pas plus qu'un autre — c'est : **ce
|
|
> réseau est-il jamais une destination, ou seulement un chemin ?**
|
|
>
|
|
> La gestion est une destination : le poste de l'exploitant, un VPN, demain un lien
|
|
> inter-sites doivent l'**atteindre**. Les autres ne sont que traversés — le transit ne
|
|
> porte que des prochains sauts entre deux voisins directs, le VXLAN va d'un hyperviseur
|
|
> à l'autre, le stockage de la baie aux hyperviseurs. Aucun n'est jamais joint depuis
|
|
> l'extérieur de son propre lien.
|
|
>
|
|
> D'où `192.168.<vlan>.0/24`, **identique chez tous les hébergeurs** : l'adresse dit son
|
|
> VLAN, et cinq réseaux sur six cessent d'exiger la moindre coordination. Contrepartie
|
|
> assumée : ils ne pourront jamais franchir un lien inter-sites. Sans conséquence — ce qui
|
|
> voyage entre deux sites, c'est l'**état** (par le dépôt de sauvegarde), pas la plomberie.
|
|
|
|
Un hébergeur qui n'exploite lui-même **aucun** tenant prend quand même un `index` : c'est
|
|
le seed de son site. Une seule règle, aucun cas particulier.
|
|
|
|
### Le MTU n'est pas un détail
|
|
|
|
Le trafic des VM voyage encapsulé en VXLAN, ce qui coûte **50 octets**. Avec un transport
|
|
à 1500, les VM tournent à **1450** — automatiquement, mais à condition que 1500 passe
|
|
réellement de bout en bout sur les VLAN de transport et de transit — **50** et **40** (le tableau ci-dessus fait foi ; ce paragraphe disait « 11 et 40 », le numéro d'avant). Un MTU rogné en chemin donne le pire des
|
|
symptômes : les petites requêtes passent, les grosses meurent, et rien n'est signalé.
|
|
|
|
Le jumbo (9000) sur le stockage est facultatif. **À moitié configuré, il ne fonctionne
|
|
pas du tout** — mieux vaut rester à 1500 que le poser sur un seul des trois maillons.
|
|
|
|
## 3. La frontière (pare-feu de bordure)
|
|
|
|
C'est le seul équipement qui route, et l'unique point de passage entre l'extérieur et
|
|
l'intérieur. Set-OPS **pilote ses règles par API** : le boîtier reste à l'hébergeur, rien
|
|
n'y est installé.
|
|
|
|
**Interfaces :** le WAN (noter l'IP publique) ; la gestion en `10.<index>.0.1/24` ; le
|
|
transit en `192.168.40.1/24`, par où sortent les machines du tenant.
|
|
|
|
> **Un point de routage porte le même dernier octet partout** : `.1`, quel que soit
|
|
> l'équipement qui l'assure. Invariant porté par la preuve `P23`.
|
|
|
|
**Un compte pour l'exploitant :** un utilisateur `ansible` avec sa clé publique.
|
|
**Aucun `sudo` n'est nécessaire** — l'outil lit et appelle l'API. Un compte qui ne peut
|
|
pas devenir root ne peut pas casser le pare-feu par accident.
|
|
|
|
**Une clé d'API :** sur OPNsense, *System → Access → Users → `ansible` → API keys → « + »*.
|
|
Le **secret n'est affiché qu'une seule fois**.
|
|
|
|
## 4. Le stockage
|
|
|
|
Rien de spécifique à Set-OPS : il faut que l'hyperviseur puisse y poser des disques de VM
|
|
(NFS ou iSCSI). Seuls comptent les stockages qui acceptent le contenu **`images`**.
|
|
|
|
**Dimensionnement**, mesuré sur un écosystème complet de quatorze machines :
|
|
|
|
| | Mesuré | À prévoir |
|
|
|---|---|---|
|
|
| Disques provisionnés | ~460 Go | 600 Go |
|
|
| RAM allouée | ~37 Go | 48 Go (32 à la rigueur, en démarrant par vagues) |
|
|
|
|
## 5. L'hyperviseur (Proxmox VE)
|
|
|
|
**À noter et transmettre :** le **nom exact du nœud** tel qu'il apparaît dans l'interface,
|
|
les **noms exacts** des stockages, et les **ponts** (`vmbrN`). Pas les descriptions : les
|
|
noms, tels qu'ils seront lus par l'API.
|
|
|
|
Sur un cluster de plusieurs nœuds, un pont doit exister **sur tous** — un pont partiel est
|
|
un piège : la VM ne démarre que sur certains nœuds, et l'erreur ne le dit pas.
|
|
|
|
**Le SDN n'est pas à configurer par l'hébergeur.** Set-OPS crée le contrôleur EVPN, la
|
|
zone (un VRF par tenant) et les réseaux. Il faut seulement que le SDN soit disponible et
|
|
le VLAN de transport en place.
|
|
|
|
### Le compte d'API
|
|
|
|
```
|
|
pveum user add ansible@pve
|
|
pveum aclmod / -user ansible@pve -role Administrator
|
|
pveum user token add ansible@pve set-ops --privsep 0
|
|
```
|
|
|
|
Le **Token ID** et le **secret** sont à noter — le secret n'est affiché qu'une fois.
|
|
|
|
> **Sur `Administrator`, autant le dire franchement.** Le minimum documenté est
|
|
> `VM.Allocate`, `VM.Clone`, `VM.Config.*`, `Datastore.AllocateSpace` et les droits SDN.
|
|
> Mais l'outil crée aussi des objets réseau et détruit des VM : partir large le premier
|
|
> jour évite de courir après des `403` pendant le déploiement. **Le resserrer ensuite est
|
|
> un rôle sur mesure, dix minutes** — et c'est un geste à faire, pas une intention.
|
|
|
|
## 6. Le gabarit — et le piège qu'il porte
|
|
|
|
Toutes les VM sont clonées depuis un même modèle Debian, nommé **`modeleSetOPS`** : c'est
|
|
un artefact du **moteur**, pas d'un tenant. Une VM Debian minimale avec
|
|
`qemu-guest-agent` et `cloud-init`, convertie en template, suffit.
|
|
|
|
> **Ne pas le personnaliser.** Un gabarit qui porte une clé privée d'hôte SSH, un
|
|
> `/etc/resolv.conf` figé ou un compte nominatif recopie tout cela dans **chaque** clone.
|
|
> C'est arrivé, et il a fallu recapturer le gabarit puis reconstruire pour s'en défaire.
|
|
|
|
En cas de doute, laisser l'exploitant le fabriquer : c'est une demi-heure, et la procédure
|
|
est écrite (`docs/procedure-template-debian13-proxmox.md`).
|
|
|
|
## 7. Ce que l'exploitant doit recevoir
|
|
|
|
| Élément | Exemple |
|
|
|---|---|
|
|
| IP publique (WAN) | `203.0.113.10` |
|
|
| Nom du nœud hyperviseur | `asgard` |
|
|
| Stockages (noms exacts) | `TrueNAS`, `local-lvm` |
|
|
| Ponts | `vmbr0`, `vmbr3` |
|
|
| RAM et disque disponibles | 64 Go / 2 To |
|
|
| Modèle du commutateur | dicte le dialecte de CLI (`cisco` \| `binardat`) |
|
|
| Domaine public prévu | `exemple.ca` |
|
|
| Gabarit | fait, ou à faire |
|
|
| `index` du site | le même que son tenant — voir §2, à fixer **avant** de câbler |
|
|
| Accès de l'exploitant | sur place, ou lien vers le VLAN de gestion (voir §8) |
|
|
|
|
**Et deux paires de secrets**, par un canal chiffré et séparément du reste : le Token ID +
|
|
secret de l'hyperviseur, la clé + secret de l'API de la frontière. Ils n'entrent **jamais**
|
|
dans un dépôt git : leur place est la voûte chiffrée de l'instance.
|
|
|
|
### Les accès réseau nécessaires
|
|
|
|
| Cible | Port | Pour quoi |
|
|
|---|---|---|
|
|
| Hyperviseur | 8006 | créer et détruire les VM |
|
|
| Frontière | 443 | poser les règles par API |
|
|
| Frontière | 22 | SSH, compte `ansible` |
|
|
| Réseau du tenant | 22 | SSH vers les VM une fois créées |
|
|
|
|
Les VM ont besoin de sortir sur Internet pour leurs paquets système. Le reste — les
|
|
artefacts applicatifs — est **poussé depuis le poste de l'exploitant**, pas téléchargé par
|
|
les machines.
|
|
|
|
## 8. Relier deux sites (exploitation à distance, reprise après sinistre)
|
|
|
|
Deux besoins bien distincts, qu'il ne faut pas confondre :
|
|
|
|
**Les services publiés n'ont besoin de rien.** Nuage, forge, courriel, SSO sortent par la
|
|
frontière en TLS, derrière l'authentification unique. Aucun tunnel n'est requis pour les
|
|
utiliser, et en ajouter un n'apporterait rien.
|
|
|
|
**Le plan de contrôle, si.** L'inventaire adresse les machines par leurs IP privées
|
|
**dérivées** ; il n'existe aucun chemin publié vers elles, et il ne peut pas y en avoir
|
|
sans casser la dérivation. Les API de l'hyperviseur et de la frontière, elles, tournent
|
|
avec la **vérification du certificat désactivée** — les exposer publiquement reviendrait à
|
|
publier les deux surfaces les plus privilégiées sans savoir à qui l'on parle.
|
|
|
|
| Besoin | Forme adaptée |
|
|
|---|---|
|
|
| Déployer et exploiter à distance, ponctuellement | accès **nomade** (poste → site) : une clé, révocable, aucun couplage entre sites |
|
|
| **Réplication de sauvegardes, reprise mutuelle** | lien **site-à-site** : il doit tenir sans qu'aucun poste soit allumé |
|
|
|
|
Dans les deux cas, la politique doit être explicite : un lien qui joint simplement deux
|
|
réseaux **défait en silence l'isolation inter-tenant**. WireGuard s'y prête bien — ses
|
|
`allowed-ips` *sont* la politique : ce qui n'y figure pas ne traverse pas.
|
|
|
|
> **Ce que la reprise mutuelle exige en plus** : des plages de gestion distinctes (§2), de
|
|
> la capacité chez le survivant pour faire tourner **les deux** écosystèmes, un gabarit
|
|
> présent **des deux côtés**, et la voûte de chaque instance conservée hors de son propre
|
|
> site. Les sauvegardes, elles, sont chiffrées **côté client** : le site d'accueil héberge
|
|
> du chiffré qu'il ne peut pas lire. La confiance demandée porte sur la **disponibilité**,
|
|
> pas sur la confidentialité.
|
|
|
|
## 9. Ce qu'il ne faut pas faire
|
|
|
|
- **Ne pas créer de VM à la main** pour le tenant. Elles sont toutes dérivées du plan ; une
|
|
VM créée à côté est **invisible pour l'outil** — et le risque n'est pas celui qu'on croit.
|
|
`make raser` dérive sa liste du plan : il ne la détruira **jamais**. Elle survit donc à
|
|
tout, sans DNS, sans certificat, sans sauvegarde, sans politique de pare-feu, et **son
|
|
VMID n'est gardé par aucune preuve contre une collision**. Un VMID oublié squatte le
|
|
cluster sans que rien ne le signale. *(Cette ligne annonçait l'inverse — « l'outil la
|
|
détruira sans le savoir » — jusqu'au 2026-09-06.)* Pour une machine d'épreuve jetable, il
|
|
existe une voie prévue et documentée : `make cloner-vm`, hors plan, **à détruire à la
|
|
main** (cf. `vm-lifecycle.md` §4bis).
|
|
- **Ne pas configurer le SDN** : l'outil le fait entièrement.
|
|
- **Ne pas écrire les secrets** dans un fichier partagé ni dans un dépôt git.
|
|
- **Ne pas contourner un blocage en silence.** Un point resté ouvert et *signalé* se règle
|
|
en dix minutes ; un contournement non dit se paie en heures, parce que la panne sera
|
|
cherchée au mauvais endroit.
|
|
|
|
## Voir aussi
|
|
|
|
- [`sdn-evpn.md`](sdn-evpn.md) — pourquoi une zone EVPN par tenant.
|
|
- [`config-proxmox.md`](config-proxmox.md) — les intrants côté hyperviseur, et le token.
|
|
- [`frontiere-opnsense.md`](frontiere-opnsense.md) — la frontière, hors flotte Ansible.
|
|
- [`procedure-template-debian13-proxmox.md`](procedure-template-debian13-proxmox.md) — fabriquer `modeleSetOPS`.
|