--- # LA SOURCE D'ARTEFACTS DE L'ÉCOSYSTÈME — apt-cacher-ng. # # Un écosystème qui prétend se reproduire depuis son propre génome allait chercher, pour # poser une seule machine, les binaires de **six serveurs étrangers** : deb.debian.org, # security.debian.org, packages.smallstep.com, apt.grafana.com, packages.icinga.com, # codeberg.org. La forge héberge le CODE ; il manquait qui héberge les BINAIRES. # # CE N'EST PAS THÉORIQUE. Deux cicatrices dans ce dépôt : # - `packages.smallstep.com` est intermittent — la même URL pend au premier essai et # répond en 0,48 s au second. Ça a fait échouer un déploiement de quarante minutes # sur la PREMIÈRE machine (2026-08-23) ; # - `galaxy.ansible.com` est carrément injoignable depuis l'overlay, et c'est très bien # ainsi — on l'a réglé par le cache du contrôleur, pas en ouvrant la frontière. # # CE RÔLE COUVRE LES DÉPÔTS APT. Les téléchargements DIRECTS (binaire Forgejo, Keycloak, # Nextcloud, oauth2-proxy, collections Ansible) sont déjà couverts, autrement : le # contrôleur télécharge une fois dans son cache et pousse par SSH. Deux mécanismes, # parce que ce sont deux problèmes — on ne sert pas un dépôt apt par `scp`. serveur_artefacts_paquets: - apt-cacher-ng serveur_artefacts_service: "apt-cacher-ng" serveur_artefacts_port: 3142 # L'écoute est large : les clients sont sur d'autres hôtes de la flotte. C'est le pare-feu # est-ouest, dérivé de meta/flux.yml, qui restreint QUI peut s'y adresser — pas l'adresse # d'écoute, qui ne saurait distinguer un voisin légitime d'un autre. serveur_artefacts_ecoute: "0.0.0.0" serveur_artefacts_cache: "/var/cache/apt-cacher-ng" # Combien de temps un paquet reste en cache sans être redemandé. 30 jours : assez pour # qu'une reconstruction complète retrouve tout ce que la précédente a téléchargé. serveur_artefacts_expiration_jours: 30 # --- LE MODE HORS LIGNE, QUI EST AUSSI L'ÉPREUVE ----------------------------- # # `true` : le cache ne va PLUS rien chercher en amont — il sert ce qu'il détient, et # refuse le reste. C'est le mode d'un écosystème coupé du monde, et c'est surtout le seul # moyen de PROUVER que le cache sert vraiment : tant qu'internet répond, un `apt update` # qui réussit ne dit pas d'où vient l'octet. # # Laisser à `false` en exploitation normale. serveur_artefacts_hors_ligne: false # Journalisation : apt-cacher-ng tient un journal des requêtes servies. C'est lui qui # permet de répondre à « ce paquet, l'avons-nous servi ou est-il venu du dehors ? ». serveur_artefacts_journal: "/var/log/apt-cacher-ng" # --- LE CHAINAGE DES CACHES (2026-08-24) -------------------------------------- # # Chaque écosystème garde SON cache, et celui-ci prend le cache de l'hébergeur comme # amont. Debian n'est alors téléchargé qu'UNE FOIS pour tout le site : # # VM du tenant -> cache du tenant -> cache du SITE -> Debian # # POURQUOI PAS UN CACHE UNIQUE OÙ TOUTES LES VM TAPENT. Il aurait fallu ouvrir un flux de # chaque machine de chaque tenant vers un hôte d'un autre tenant — N×M chemins à travers # le default-deny. Avec le chaînage il n'y en a qu'UN par écosystème, entre deux caches. # # Et l'étanchéité y gagne : le cache du site ne voit que des requêtes AGRÉGÉES, jamais # quelle machine installe quoi. # # Vide = ce cache va directement à l'amont Debian. C'est le cas du cache du SITE lui-même, # et de tout écosystème qui s'est émancipé (docs/filiation-emancipation.md). serveur_artefacts_amont: "" # --- Sonde de supervision ----------------------------------------------------------- # La cible et les seuils sont des VARIABLES pour que la sonde puisse etre mise en defaut # sans casser le service (docs/supervision-conception.md). serveur_artefacts_sonde_port: "{{ serveur_artefacts_port }}" serveur_artefacts_sonde_repertoire: /var/cache/apt-cacher-ng # Un cache plein ne se plaint pas : il cesse simplement de servir ce qu'il n'a pas pu # ecrire. On prend de l'avance. serveur_artefacts_sonde_pct_avert: 85 serveur_artefacts_sonde_pct_crit: 93 # --- LE RELAIS DES DEPOTS TIERS (2026-09-10) ----------------------------------------- # # Set-OPS tire ses paquets applicatifs de trois fournisseurs qui ne servent QU'EN HTTPS : # Grafana (grafana, loki, alloy), Icinga (icinga2, icingadb), Smallstep (step-ca). Le # cache ne relaie pas le HTTPS — il faudrait rompre le TLS de bout en bout — si bien que # CHAQUE machine allait les chercher elle-meme sur Internet. Mesure du 2026-09-10 : 58 # references de depot sur la flotte, quatorze machines sortant chacune de son cote. # # LE REMAP EST LA VOIE PROPRE, et le role `client_artefacts` la nommait deja : le client # demande `http://apt.grafana.com/...` au cache, le cache va chercher en `https://` chez # le fournisseur. Le TLS n'est rompu nulle part — il est simplement TERMINE au cache, qui # est notre machine. Et l'integrite ne depend pas du transport : elle vient des signatures # du depot, qu'apt verifie de toute facon. C'est exactement le raisonnement deja tenu pour # `deb.debian.org`, applique aux memes conditions. # # `hote` sans schema : le gabarit fabrique la paire `http://` -> `https:///`. serveur_artefacts_remaps: - { nom: grafana, hote: "apt.grafana.com" } - { nom: icinga, hote: "packages.icinga.com" } - { nom: smallstep, hote: "packages.smallstep.com" } # Collabora — trouve APRES coup, et c'est la lecon : la liste ne se devine pas. # L'audit des sources apt de la flotte l'a rendu visible quand les trois autres # etaient deja passes au cache. Une machine sur quatorze le portait. - { nom: collabora, hote: "www.collaboraoffice.com" } # LES CLES DE SIGNATURE PASSENT AUSSI, et il a fallu le demander (mesure du 2026-09-10). # # apt-cacher-ng ne relaie que les chemins qu'il RECONNAIT comme fichiers de depot. Une # cle en `.gpg` passait, la meme en `.key` rendait 403 : # # packages.smallstep.com/keys/apt/repo-signing-key.gpg 200 # apt.grafana.com/gpg-full.key 403 # # `PfilePatternEx` ETEND le motif par defaut au lieu de le remplacer — remplacer ferait # tomber tout le reste. Sans cette ligne, le remap serait vrai a moitie : les paquets # passeraient par le cache, et chaque machine sortirait quand meme chercher sa cle. serveur_artefacts_motif_fichiers_sup: '.*\.(key|asc)$' # --- LE DEPOT DES BINAIRES DIRECTS (2026-09-12) -------------------------------------- # # LE CACHE APT NE COUVRAIT QUE apt. Quatre artefacts arrivent autrement — Forgejo, # Keycloak, Nextcloud, oauth2-proxy — parce qu'ils ne vivent dans aucun depot apt : ce # sont des archives de publication, tirees par le CONTROLEUR (`delegate_to: localhost`) # puis poussees par SSH. Le role le disait deja : « deux mecanismes, parce que ce sont # deux problemes ». Ce qui manquait, c'est que le second n'avait pas de source locale. # # CE QUE CA COUTAIT, MESURE LE 2026-09-12 : `/opt/setops/.cache/setops` est ABSENT sur le # runner du site. Un second locataire monte depuis ce runner sortait donc chercher 570 Mo # sur codeberg.org, github.com (deux fois) et download.nextcloud.com — alors que le meme # ecosysteme ne demandait plus un seul paquet a Debian. # # POURQUOI PAS UN RELAIS TRANSPARENT, comme les `Remap-*` ci-dessus. Mesure des quatre # amonts le 2026-09-12 : # # codeberg.org 200, 0 redirection -> relayable # download.nextcloud.com 200, 0 redirection -> relayable # github.com 302 -> release-assets.githubusercontent.com # avec signature et jeton VALABLES UNE HEURE # # L'URL finale de GitHub change a chaque requete. Un cache qui la prend pour cle ne fait # jamais mouche, et ce qu'il garderait serait perime avant d'etre relu. Le relais # transparent marche pour deux amonts sur quatre : ce n'est pas un mecanisme, c'est une # coincidence. On tient donc un VRAI depot de fichiers, rempli une fois, servi toujours. # # ET IL N'A DEMANDE NI SERVICE NI PORT NI CERTIFICAT NI FLUX. `LocalDirs` d'apt-cacher-ng # publie un repertoire du disque sous un prefixe — eprouve sur site-cache-01 avant # d'ecrire ce rôle : 200, 90 158 octets, identiques a l'octet. L'`ingress 3142 pair: # flotte` deja declare couvre exactement ce chemin. serveur_artefacts_directs_actif: true serveur_artefacts_directs_dir: "/var/lib/setops/artefacts-directs" serveur_artefacts_directs_prefixe: "setops-binaires" # LES ROLES DONT ON LIT LES DEFAUTS POUR SAVOIR QUOI TENIR. # # La version et l'URL amont sont declarees UNE SEULE FOIS, dans le role qui consomme # l'artefact. Les redeclarer ici ferait exactement ce que ce depot combat partout # ailleurs : deux sources du meme fait, qui divergent en silence — et la divergence se # lirait « le depot sert un fichier », pas « il sert le mauvais ». serveur_artefacts_directs_roles: - serveur_forgejo - serveur_keycloak - serveur_nextcloud - serveur_oauth2_proxy # LES NOMS SONT CEUX QUE LE CACHE DU CONTROLEUR PORTE — pas des noms choisis ici. # Un nom different obligerait chaque role a traduire, et la traduction serait le # troisieme endroit ou la version pourrait se perimer. serveur_artefacts_directs: - nom: "forgejo-{{ serveur_forgejo_version }}" url: "{{ serveur_forgejo_url }}" - nom: "forgejo-{{ serveur_forgejo_version }}.asc" url: "{{ serveur_forgejo_signature_url }}" - nom: "keycloak-{{ serveur_keycloak_version }}.tar.gz" url: "{{ serveur_keycloak_url }}" - nom: "keycloak-{{ serveur_keycloak_version }}.tar.gz.asc" url: "{{ serveur_keycloak_signature_url }}" - nom: "nextcloud-{{ serveur_nextcloud_version }}.tar.bz2" url: "{{ serveur_nextcloud_url }}" - nom: "oauth2-proxy-{{ serveur_oauth2_proxy_version }}.tar.gz" url: "{{ serveur_oauth2_proxy_url }}"