SITE-TechnoLibre/plan/applications.yml
Daniel Allaire 1fc0b44b6d site : toutes les valeurs decidables sont posees, restent les faits du materiel
Terrain vierge, factory settings : ce qui relevait d une DECISION a ete tranche.
Il reste treize valeurs, et ce sont des faits que seul le materiel peut dire.

Decisions :
- noeud `atelier`, frontiere `portail`, domaine du site `socle.internal` (distinct
  de technolibre.internal, qui appartient au locataire)
- pont unique vmbr0 VLAN-aware : sans seconde carte, d autres ponts ne separeraient
  rien
- gabarit 99998, le meme dans toute la flotte ; stockage local-lvm, le seul present
  sur un noeud unique
- rebond ansible@10.31.0.1, noeud 10.31.0.41

routage_tenants: sdn — et c est le point qui demandait un arbitrage. Sans
commutateur de niveau 3, le mode `switch` ferait porter les SVI a la frontiere :
six interfaces VLAN de locataire EN PLUS de ses six pattes de site, et les ACL
entre elles a verifier a la main. En EVPN, le routage et le filtrage inter-zone du
locataire vivent sur le noeud, la frontiere ne voit que le transit, et le moteur
sait deja poser tout ca. L objection « EVPN sur un seul noeud, c est un maillage
sans pair » se retourne : un VTEP unique n a aucune session a etablir.

CONSEQUENCE MESUREE AVANT LA VISITE, PAS PENDANT. En mode sdn, devis_opnsense
derive le prochain saut des routes de la frontiere depuis
proxmox_sdn.sortie_primaire — qui vit dans proxmox-hebergeur.yml, absent de ce
depot. La derivation rendait une chaine VIDE : le devis se tait au lieu d ecrire
faux, mais la frontiere restait sans route de retour vers le locataire. Le fichier
est cree ; la derivation rend maintenant 10.0.4.41.

ASN 65031 et controleur EVPN0031, derives de l index du site plutot que repris de
Chezlepro (65000) : les deux sites ont vocation a etre relies, et deux clusters qui
echangent des routes avec le meme numero d AS produisent une panne dont le message
ne parle pas d AS.

COLLECTE.md ne demande plus que ce qui se releve : le nom de la carte reseau, les
deux adresses de la frontiere, les neuf noms d interfaces optN. Plus un chiffre a
mesurer avant de materialiser — quinze clones complets font environ 600 Go sur
local-lvm.

Federation : 5 instances, aucun index en collision (13, 17, 23, 29, 31, 37).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-13 14:16:37 -04:00

173 lines
8.1 KiB
YAML

---
# Les services du SITE et leur placement — même forme que chez un tenant.
#
# `groupe` est le rôle Ansible, `hote` la machine de `plan/serveurs.yml` qui le porte.
# C'est de ce registre que l'inventaire tire ses groupes : une application déclarée ici
# range son hôte dans le groupe correspondant, et `playbooks/groupes/<rôle>.yml` le
# trouve sans qu'on câble quoi que ce soit.
#
# `expose:` NOMME LE SERVICE, indépendamment de la machine qui le rend.
#
# C'est la pièce qui manquait, et son absence s'est vue au pire endroit : le certificat
# de la forge portait `forge.socle.internal` dans ses SAN, mais **aucune zone ne
# résolvait ce nom**. On avait donc du TLS correct sur un nom que personne ne pouvait
# appeler — et l'usage retombait sur `site-forge-01`, c'est-à-dire sur la machine.
#
# Un nom de service survit au déménagement du service ; un nom de machine, non.
applications:
# LE RUNNER DU SITE — DEUX RÔLES, ET DANS CET ORDRE.
#
# `serveur_ops` INSTALLE : ansible, le cache de collections, les dépôts du génome clonés
# depuis la forge du site, les symlinks du moteur. `serveur_ops_site` n'installe rien —
# il dépose la voûte de l'underlay (chiffrée) et ajoute le pouvoir de MATÉRIALISER.
#
# C'est le même patron que `serveur_artefacts` + `serveur_cache_site` : un installateur
# et un marqueur. J'avais déclaré le marqueur seul, et son assertion l'a dit sans
# détour : « exige `serveur_ops_site_depot`, cloné par `serveur_ops` ».
ops:
groupe: serveur_ops
hote: site-ops-01
ops_site:
groupe: serveur_ops_site
hote: site-ops-01
# LA SOURCE D'ARTEFACTS, et son marquage comme racine de chaîne. Les deux vont
# ensemble : `serveur_artefacts` INSTALLE apt-cacher-ng, `serveur_cache_site` MARQUE ce
# cache comme racine et vérifie qu'il n'a pas d'amont — il n'installe rien.
artefacts:
groupe: serveur_artefacts
hote: site-cache-01
cache_site:
groupe: serveur_cache_site
hote: site-cache-01
# LA FORGE DU GÉNOME. `expose` porte son nom de service : c'est lui que le certificat
# doit couvrir, et lui que la zone souveraine doit résoudre.
forgejo:
groupe: serveur_forgejo
hote: site-forge-01
# 443, ET NON 3000. Le `3000` est le port que Forgejo ecoute DERRIERE un edge, en
# clair. Ici il sert lui-meme son TLS : garder 3000 aurait grave `:3000` dans
# `ROOT_URL`, donc dans l'`origin` de chaque ecosysteme descendant, pour toujours.
port: 443
expose:
- forge.socle.internal
# LE MARQUEUR DE LA FORGE DU GÉNOME — même patron que `artefacts` + `cache_site`.
#
# Le site rend deux services à ses locataires pendant leur jeunesse : les PAQUETS et le
# GÉNOME. Le premier était déclaré, le second ne l'était pas — alors que D-81 fait de
# cette forge l'autorité dont tout écosystème se reproduit.
#
# Mesuré le 2026-08-28 sur `ops-01`, première machine de la reconstruction de
# Chezlepro : le cache du site répondait, la forge non, et le clonage du génome
# attendait sans fin. Le tenant déclarait pourtant lire son génome à cette adresse.
forge_site:
groupe: serveur_forge_site
hote: site-forge-01
# L'AUTORITÉ. Elle sert le 443 à ses voisins du même segment, en L2 — rien ne traverse
# la frontière, donc aucune règle ne l'accompagne au devis. `expose` lui donne quand
# même son nom de service : les clients s'y enrôlent par un nom, jamais par une adresse.
step_ca:
groupe: serveur_step_ca
hote: site-pki-01
expose:
- pki.socle.internal
# LE DNS — autoritatif et résolveur sur la même machine, à dessein.
powerdns:
groupe: serveur_powerdns
hote: site-dns-01
resolveur:
groupe: serveur_resolveur
hote: site-dns-01
expose:
- dns.socle.internal
# LE MARQUEUR DU RÉSOLVEUR DU SITE — troisième service prêté aux locataires, après les
# paquets (`cache_site`) et le génome (`forge_site`). Même patron : un installateur, un
# marqueur.
#
# Un écosystème neuf n'a ni cache, ni forge, ni résolveur — et c'est lui qui doit les
# construire. Sans celui-ci, ses machines sortent en 443 par adresse et restent
# AVEUGLES AUX NOMS : `apt` s'en sort par le mandataire du cache, qui résout à sa place,
# mais un `get_url` ou un dépôt tiers en HTTPS échoue. Mesuré le 2026-08-30 sur
# `infra-pki-01`, première machine à porter l'autorité de Chezlepro.
#
# `client_resolveur` bascule chaque tenant chez lui dès que son propre résolveur existe.
# Retirer cet emprunt ce jour-là est une émancipation — un geste, pas un effet.
resolveur_site:
groupe: serveur_resolveur_site
hote: site-dns-01
# LE SERVEUR DE SAUVEGARDE, ET SON MARQUEUR — meme patron que les trois autres
# services pretes : `serveur_backup` INSTALLE le depot, `serveur_backup_site` dit qu'il
# sert les locataires et declare le flux qui le permet.
backup:
groupe: serveur_backup
hote: site-backup-01
backup_site:
groupe: serveur_backup_site
hote: site-backup-01
# LE NOM QUE LES LOCATAIRES ÉCRIVENT DANS LEUR CONFIGURATION.
#
# Un locataire grave l'adresse de son dépôt dans `client_backup_repo`, donc dans le
# chemin de CHACUN de ses instantanés. Y graver `10.0.35.11` rendrait le dépôt
# indéplaçable : le jour où il change de machine, tous les locataires cessent de
# déposer, et chacun doit être modifié un par un — pendant que plus rien n'est
# sauvegardé.
#
# `sauvegarde`, pas `site-backup-01` : c'est le SERVICE qu'on nomme. La machine qui
# le rend a le droit de changer sans que personne ne réécrive quoi que ce soit.
expose:
- sauvegarde.socle.internal
# LA SUPERVISION DU SITE. `serveur_backup` rapporte PASSIVEMENT ici, avec un `ttl` :
# c'est l'expiration de ce `ttl` qui fait qu'un SILENCE alerte. Une sauvegarde qui
# cesse ne produit aucune erreur, seulement une absence — sans destinataire pour ce
# rapport, il n'y a pas de supervision, il y a un script qui tourne.
postgresql:
groupe: serveur_postgresql
hote: site-mon-01
icinga:
groupe: serveur_icinga
hote: site-mon-01
# L'OBSERVABILITE DU SITE — LA SIENNE, ET RIEN QUE LA SIENNE (D-87, 2026-09-10).
#
# Elle manquait, et son absence etait le REVERS de la frontiere : en refusant de voir
# les journaux de ses locataires — parce qu'ils contiennent du CONTENU, et qu'un
# hebergeur qui les lit en sait plus que s'il detenait leur annuaire — le site s'etait
# prive des siens. Ses sept machines n'expediaient rien nulle part.
#
# Le remede n'est pas d'assouplir la regle : c'est de lui donner SA pile. Aucun lien
# avec celle d'un tenant, dans aucun sens. Un locataire n'y envoie rien, et le site n'y
# lit que ses propres machines.
#
# POSEE SUR `site-mon-01`, la zone de supervision : c'est deja la qu'Icinga juge l'etat
# du site, et le zonage veut qu'une preoccupation vive dans une seule zone. La machine a
# la place (3,3 Go disponibles, charge 0,10 au moment du choix).
prometheus:
groupe: serveur_prometheus
hote: site-mon-01
loki:
groupe: serveur_loki
hote: site-mon-01
# GRAFANA SANS SSO, ET C'EST VOULU. Chez un tenant il vit derriere `oauth2_proxy`, donc
# derriere Keycloak. Le site n'a pas d'annuaire — et ne doit pas en avoir un pour ca.
# Faire monter l'identite pour offrir un tableau de bord serait payer tres cher une
# commodite : l'acces se fait depuis le plan d'administration, qui est deja la barriere.
#
# LE NOM DIT LA FONCTION, PAS LE PRODUIT (2026-09-10). C'etait `tableaux.socle.internal`,
# un mot que rien d'autre n'employait. `observatoire` est le meme nom que chez le locataire
# (`observatoire.chezlepro.internal`) : un seul vocabulaire des deux cotes, et un nom qui
# ne ment pas le jour ou Grafana est remplace.
grafana:
groupe: serveur_grafana
hote: site-mon-01
expose:
- observatoire.socle.internal
# LE RELAIS DE COURRIEL DU SITE — souverain, et c'est tout l'interet : emprunter le MTA
# d'un locataire ferait dependre le site d'un ecosysteme qu'il peut outvivre.
postfix:
groupe: serveur_postfix
hote: site-mon-01