Le cache du site couvrait apt ; quatre artefacts arrivaient autrement, parce qu ils ne vivent dans aucun depot apt. Le controleur les tire puis les pousse par SSH. Mesure du 2026-09-12 : le cache du runner du site est ABSENT. Un second locataire monte depuis lui sortait chercher 570 Mo sur codeberg.org, github.com et download.nextcloud.com, alors que le meme ecosysteme ne demandait plus un seul paquet a Debian. Le poste du mainteneur les a depuis toujours : personne ne l avait vu. Pas de relais transparent, et la mesure tranche : github.com redirige vers une URL signee valable une heure, differente a chaque requete. Un cache qui la prend pour cle ne fait jamais mouche. Le relais marcherait pour deux amonts sur quatre. Donc un vrai depot, dans le service qui existe deja. LocalDirs d apt-cacher-ng publie un repertoire du disque sous un prefixe, eprouve AVANT d ecrire le role. Aucun service, aucun port, aucun certificat, aucun flux nouveaux : l ingress 3142 pair flotte couvre exactement ce chemin. Les versions ne sont pas recopiees : le role lit les defauts des quatre consommateurs. Les quatre roles recoivent une tache AJOUTEE, placee avant leur stat de cache — si le depot sert, le stat le voit et la tache amont se saute d elle-meme. Aucune tache existante n a change. P70 exige que tout dest ecrit sous un cache_local figure au depot. Une liste qui suit une autre prend du retard ; celle-ci est nee avec sa garde. Deux marches payees en chemin : - failed_when: false REECRIT le verdict, donc la premiere garde de signature ne gardait rien. Elles mesurent le fichier desormais. - file: state=directory cree les parents en 0750 : apt-cacher-ng, qui ne tourne pas en root, rendait 403 sur chaque fichier. Un chemin se traverse en entier. Verifie sur l infrastructure : 6/6 artefacts servis (200/206) depuis le runner du site ET depuis une machine du locataire a travers la frontiere ; les 6 empreintes SHA-256 sont identiques a celles qui ont construit Chezlepro ; second passage changed=0. make prouver : 69 OK, 0 echec, 1 saute. ansible-lint : 0 failure, profil production. Inclut aussi force: true sur cinq telechargements de cles : une reprise conditionnelle ne reprend rien (304 Not Modified, size 0, attempts 5). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
176 lines
9.6 KiB
YAML
176 lines
9.6 KiB
YAML
---
|
||
# 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://<hote>` -> `https://<hote>/`.
|
||
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 }}"
|