Un seul noeud Proxmox en version 9, une frontiere OPNsense. Trois consequences ecrites dans le README : le SPOF est total, les clones sont complets (un clone lie n achete rien sans second noeud), et rien n a jamais tourne contre un PVE 9. Le chiffre a verifier avant de cabler : 57 Go de RAM pour le site et son locataire sur la meme machine. La RAM est la contrainte dure. Adressage au statu quo : gestion en 10.23.0.0/24, zones du site en 10.0.31-36 comme chez Chezlepro. Consequence connue et ecrite : les deux sites ne pourront pas etre relies tant qu aucun n est renumerote. COLLECTE.md liste dans l ordre ce qui doit etre releve sur place, dont la question de forme : ce qu il y a entre le noeud et l OPNsense decide du mode de routage. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
205 lines
10 KiB
YAML
205 lines
10 KiB
YAML
---
|
|
# Les machines du SITE — l'équivalent de `plan/serveurs.yml` chez un tenant.
|
|
#
|
|
# UNE SEULE DIFFÉRENCE AVEC CELUI D'UN TENANT, mais elle est structurante : ici
|
|
# l'adressage est **déclaré**, là-bas il est **dérivé**. Un tenant écrit `fonction:` et
|
|
# tout descend de son `index` ; un site écrit `ip`, `vmid`, `noeud`, parce qu'il n'y a
|
|
# aucun seed dont les faire descendre — le site *est* le terrain.
|
|
#
|
|
# `reseau:` nomme un réseau de `underlay.yml`, qui fournit le pont, l'étiquette VLAN, le
|
|
# masque et la passerelle. La fabric reste la source de ces valeurs-là : on la nomme, on
|
|
# ne la recopie pas.
|
|
#
|
|
# UNE ZONE PAR NATURE D'AUTORITÉ (2026-08-25). Ces machines ont vécu quelques heures dans
|
|
# un `/24` plat — la plus autoritaire du système avec moins d'isolation que n'importe
|
|
# quelle machine de tenant. Chacune vit désormais dans la zone de ce qu'elle détient, et
|
|
# tout ce qui va d'une zone à l'autre est routé, donc policé par la frontière.
|
|
|
|
serveurs:
|
|
# LE RUNNER DU SITE. Il MATÉRIALISE : VNets, VM, routes, flux — il prépare le terrain
|
|
# qu'un runner de tenant occupera ensuite. Il détient la voûte de l'underlay, jamais
|
|
# celle d'un tenant. Voir roles/serveur_ops_site/README.md pour la ligne de partage.
|
|
site-ops-01:
|
|
etat: actif
|
|
reseau: site-pilotage
|
|
ip: 10.0.31.11
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 4096, disque: 40G }
|
|
vmid: 9001
|
|
variables:
|
|
# CE QUE LE RUNNER DU SITE DOIT DÉTENIR POUR TRAVAILLER.
|
|
#
|
|
# Le moteur, la carte de l'hébergeur, les modèles — et les PLANS qu'il matérialise.
|
|
# `tenant` et non `instance` : il ne PILOTE pas ces écosystèmes, il leur prépare le
|
|
# terrain. Configurer leurs services exige leurs voûtes, qu'il n'aura jamais.
|
|
serveur_ops_depots:
|
|
- { depot: "set-ops-public", dest: "Set-OPS-public", role: "moteur" }
|
|
- { depot: "site-technolibre", dest: "SITE-Technolibre", role: "hebergeur" }
|
|
- { depot: "set-ops-modeles", dest: "Set-OPS-Modeles", role: "modeles", branche: "master" }
|
|
- { depot: "ops-technolibre", dest: "OPS-Technolibre", role: "tenant", branche: "master" }
|
|
# AUCUNE INSTANCE ACTIVE : un SITE n'est pas un tenant, il n'a pas de plan monté par
|
|
# le symlink `instance`. Son propre inventaire est dynamique (`site_inventaire.py`).
|
|
serveur_ops_instance: ""
|
|
serveur_ops_underlay: "SITE-Technolibre"
|
|
# Le dépôt que `serveur_ops_site` habille de la voûte, une fois cloné ci-dessus.
|
|
serveur_ops_site_depot: "SITE-Technolibre"
|
|
serveur_ops_site_voute_source: >-
|
|
{{ (playbook_dir ~ '/../../underlay.yml') | realpath | dirname }}/underlay.vault.yml
|
|
# ARMER CE RUNNER — il est maître de sa voûte et en détient la clé (2026-08-28).
|
|
#
|
|
# Sans elle, il porte le chiffré et ne peut rien en faire : il calcule son
|
|
# inventaire, et chaque geste qui demande un secret échoue sur une valeur vide.
|
|
#
|
|
# LA CLÉ DE CE SITE, ET ELLE SEULE. Depuis la séparation des voûtes, le mot de passe
|
|
# de l'underlay n'ouvre plus aucun tenant : ce runner ne peut donc ouvrir que la
|
|
# fabric, ce qui est exactement son pouvoir. C'était faux jusqu'au 2026-08-28, où
|
|
# un mot de passe unique ouvrait les six voûtes de la flotte.
|
|
#
|
|
# Le chemin est un POINTEUR — le fichier vit sur le poste de l'exploitant et
|
|
# n'entre dans aucun dépôt.
|
|
serveur_ops_site_cle_deposer: true
|
|
serveur_ops_site_cle_source: "~/.config/setops-vault-site-technolibre"
|
|
|
|
# LA RACINE DE LA CHAÎNE DE CACHES :
|
|
# VM du tenant -> cache du tenant -> cache du SITE -> Debian
|
|
# Debian n'est ainsi téléchargé qu'une fois pour tout le site, et ce cache ne voit que
|
|
# des requêtes agrégées — jamais quelle machine de quel tenant installe quoi.
|
|
site-cache-01:
|
|
etat: actif
|
|
reseau: site-genome
|
|
ip: 10.0.33.21
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 2048, disque: 120G }
|
|
vmid: 9002
|
|
|
|
# LA FORGE DU GÉNOME. Elle vivait chez patient 0 — c'est-à-dire chez un écosystème —
|
|
# et tout l'univers en dépendait pour se reproduire.
|
|
site-forge-01:
|
|
etat: actif
|
|
reseau: site-genome
|
|
ip: 10.0.33.11
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 4096, disque: 80G }
|
|
vmid: 9003
|
|
# CETTE MACHINE DÉTIENT DE L'ÉTAT — elle dépose donc sur le dépôt du site.
|
|
#
|
|
# `client_backup` est une intégration FACULTATIVE : elle se déclare là où il y a
|
|
# quelque chose à perdre, pas partout. Ici, le génome — les quatre dépôts dont tout descend. Ils vivent
|
|
# aussi sur les postes et les runners, mais la forge est le seul endroit où ils se
|
|
# rejoignent.
|
|
integrations: [client_backup]
|
|
variables:
|
|
# Elle tourne seule : ni PostgreSQL ni Keycloak sur le site. C'est délibéré —
|
|
# cette forge sert LE GÉNOME, pas une équipe. SQLite est un choix de conception,
|
|
# pas un repli : la base tient dans un fichier, que la sauvegarde emporte déjà.
|
|
serveur_forgejo_bd: sqlite
|
|
# Elle sert son propre TLS : il n'y a pas d'edge devant elle sur le site.
|
|
serveur_forgejo_tls: true
|
|
# Le port du schema, pas celui d'un service derriere un edge. Forgejo tournant en
|
|
# `git`, l'unite lui accorde CAP_NET_BIND_SERVICE pour s'y lier.
|
|
serveur_forgejo_http_port: 443
|
|
# Forgejo tourne en `git` dès le départ, contrairement à nginx ou Postfix qui
|
|
# lisent la clé en root avant de déprivilégier. Accès GROUPE à la clé privée —
|
|
# pas un élargissement général.
|
|
client_pki_cle_groupe: git
|
|
client_pki_cle_mode: "0640"
|
|
# Un cert renouvelé sur disque reste servi périmé tant que le consommateur n'est
|
|
# pas rechargé. La cicatrice est déjà dans le dépôt ; on ne la refait pas.
|
|
client_pki_reload_services:
|
|
- forgejo
|
|
|
|
# L'AUTORITÉ DE CERTIFICATION DU SITE. Sans elle, la forge servait le génome en clair
|
|
# et aucune machine n'avait de certificat — donc aucun chiffrement est-ouest.
|
|
site-pki-01:
|
|
etat: actif
|
|
reseau: site-autorite
|
|
ip: 10.0.32.11
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 2048, disque: 32G }
|
|
vmid: 9004
|
|
# CETTE MACHINE DÉTIENT DE L'ÉTAT — elle dépose donc sur le dépôt du site.
|
|
#
|
|
# `client_backup` est une intégration FACULTATIVE : elle se déclare là où il y a
|
|
# quelque chose à perdre, pas partout. Ici, la racine de l'autorité de certification. Compromise, elle forge
|
|
# tout nom ; perdue, il faut redistribuer la confiance à chaque machine de chaque
|
|
# écosystème.
|
|
integrations: [client_backup]
|
|
|
|
# LE DNS DU SITE — autoritatif ET résolveur, colocalisés.
|
|
#
|
|
# Ils partagent la zone souveraine, et le repli de port de PowerDNS (53 -> 5300) DÉRIVE
|
|
# de cette colocalisation : le résolveur prend le 53, l'autoritatif se range derrière.
|
|
# Les séparer casserait cette dérivation.
|
|
site-dns-01:
|
|
etat: actif
|
|
reseau: site-service
|
|
ip: 10.0.34.11
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 2048, disque: 40G }
|
|
vmid: 9005
|
|
variables:
|
|
# CORRIGÉ LE 2026-08-25 — c'était `false`, avec pour motif « le site n'a pas d'edge,
|
|
# aucun FQDN public à faire pointer quelque part ». Le raisonnement confondait
|
|
# PUBLIC et EXPOSÉ.
|
|
#
|
|
# Le site n'a effectivement aucun domaine public. Mais `plan/applications.yml`
|
|
# déclare bien trois expositions — `forge.genese.internal`, `pki.genese.internal`,
|
|
# `dns.genese.internal` — et ce sont des noms de SERVICE, que les certificats
|
|
# portent et que les clients appellent. Ils n'avaient aucun enregistrement dans la
|
|
# zone : seul le plancher `/etc/hosts` savait les résoudre.
|
|
#
|
|
# Un service ne doit pas dépendre d'un plancher pour être joignable. Le plancher est
|
|
# un filet — il rattrape le DNS éteint — pas le sol.
|
|
serveur_powerdns_publier_expositions: true
|
|
# LE DEPOT DE SAUVEGARDE DU SITE — le quatrieme service prete aux locataires.
|
|
#
|
|
# Apres les paquets, le genome et les noms : l'ETAT. Un ecosysteme neuf n'a pas de
|
|
# depot ou sauvegarder, et c'est justement quand il commence a detenir quelque chose
|
|
# d'irremplacable qu'il en a besoin.
|
|
#
|
|
# CE QUE CA CORRIGE, ET QUI ETAIT DANGEREUX (mesure le 2026-09-01). Chezlepro
|
|
# sauvegardait sur `backup-01`, UNE VM DE SA PROPRE FLOTTE. Raser l'ecosysteme aurait
|
|
# detruit les donnees ET leur seul filet dans le meme geste. La doctrine affirmait
|
|
# pourtant que `client_backup_cible` « pointe deja hors de l'ecosysteme » — vrai pour
|
|
# patient 0, qui sauvegarde chez eregion ; faux pour Chezlepro. Un document qui decrit
|
|
# une propriete que le reel n'a pas est exactement ce que ce depot traque.
|
|
#
|
|
# SA ZONE EST A LUI SEUL. Il detient l'etat de CHAQUE tenant : cles d'autorite,
|
|
# annuaires, bases, courriel. C'est la machine dont la compromission coute le plus cher
|
|
# du site — plus que la forge, dont le contenu est du code, et plus que l'AC, qui forge
|
|
# des noms sans detenir de donnees.
|
|
#
|
|
# SON DISQUE EST LE PLUS GROS DU SITE : il accueille l'etat de tous les locataires, et
|
|
# restic garde des instantanes. On le dimensionne large plutot que de decouvrir la
|
|
# limite le jour ou une sauvegarde echoue en silence.
|
|
site-backup-01:
|
|
etat: actif
|
|
reseau: site-sauvegarde
|
|
ip: 10.0.35.11
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 2048, disque: 400G }
|
|
vmid: 9010
|
|
|
|
# LE TEMOIN DU SITE — celui qui sait quand les autres se taisent.
|
|
#
|
|
# Il porte SA propre base : chez un locataire, PostgreSQL vit sur une machine dediee
|
|
# parce que plusieurs services la partagent. Ici un seul en a besoin, et une seconde VM
|
|
# ne ferait qu'ajouter une machine a surveiller a celle qui surveille.
|
|
#
|
|
# Il porte aussi un relais de courriel. Sans lui, la seule facon d'alerter serait
|
|
# d'emprunter le MTA d'un locataire — le site dependrait alors d'un ecosysteme qu'il
|
|
# peut outvivre, et une emancipation emporterait son alerte avec elle.
|
|
site-mon-01:
|
|
etat: actif
|
|
reseau: site-supervision
|
|
ip: 10.0.36.11
|
|
noeud: <<NOEUD>>
|
|
gabarit: { vcpu: 2, memoire: 4096, disque: 64G }
|
|
vmid: 9011
|
|
# ELLE PORTE UNE BASE, DONC DE L'ETAT — P36 l'a exige des la declaration.
|
|
#
|
|
# L'historique d'Icinga n'est pas irremplacable ; la base l'est par nature, et le
|
|
# catalogue ne connait pas la nuance. C'est tant mieux : une exception ici serait
|
|
# exactement ce que cette preuve existe pour empecher. Le dump coute quelques
|
|
# megaoctets et vit deja sur le depot du site.
|
|
integrations: [client_backup]
|