--- # 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/.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