Le parc se déploie avec colmena 🡕 : une
commande construit et applique la configuration sur un ou plusieurs hôtes, à
distance, depuis le poste admin.
just apply <cible> [action] # alias : a
cible = nom d’hôte, motif ('*'), liste (a,b) ou tag colmena (@server).
action = switch (défaut), boot, test ou build.
Commande Pour quoi just apply <cible>Construire + activer sur la (les) cible(s) just apply-localAppliquer sur la machine courante (alias al) just apply-verbose <cible>Idem apply en mode trace (alias av)
Monter en confiance par l’action : chaque étape est moins risquée que la
suivante.
just apply <hôte> build # télécharge + compile : 100 % sûr, rien n'est activé
just apply <hôte> test # active sans switcher : ni génération, ni boot
just apply <hôte> # switch : active et crée une nouvelle génération
Progresser du cœur vers la périphérie : déployez les nœuds dans cet ordre,
pour ne jamais vous couper l’accès à un nœud par celui qui le précède.
Le système est figé par les flakes . Mettre à jour = rafraîchir les entrées,
puis redéployer.
just update-flake # met à jour dnf/ + racine, commit les locks
just apply ' * ' # déploie la mise à jour
Deux services se combinent pour éviter de recompiler ou de retélécharger les
dérivations à chaque déploiement.
Service Rôle harmoniaSert le /nix/store local, signé, directement aux hôtes (LAN, ou VPN s’il est global). nix-cacheProxy nginx par zone qui met en cache le cache public cache.nixos.org sur la passerelle.
Un hôte interroge ces sources dans l’ordre de priorité suivant. La première
récupération depuis Internet est ainsi mutualisée pour toute la zone.
Priorité Source Portée 20 harmonia de la zoneLAN, ce que la zone a compilé 35 proxy nix-cache de la zone LAN, miroir mutualisé du cache public 40 cache.nixos.org en directfilet de sécurité si la passerelle est HS 45 harmonia globaldernier recours, par le VPN
Comment l’ordre est garanti
Nix ne suit pas l’ordre de la liste substituters, il trie les caches selon la
priorité que chacun annonce dans son nix-cache-info. Or ces valeurs annoncées
sont à égalité : toutes les harmonia déclarent 30, et le proxy relayant
cache.nixos.org tel quel déclare 40, comme l’accès direct au cache public.
DNF fixe donc la priorité dans l’URL du substituter (?priority=35), ce qui
écrase la valeur annoncée et rend l’ordre du tableau explicite.
Deux conséquences voulues. Le proxy de zone passe devant l’accès direct au
cache public, sans quoi la mutualisation de zone ne se ferait jamais. Et une
harmonia global passe derrière ce cache public : harmonia sert un
/nix/store entier, sans pouvoir distinguer ce qu’elle a compilé du reste, donc
un hôte bien garni capterait tout le trafic que le cache public doit servir. En
dernier recours, elle n’est consultée que pour ce que cache.nixos.org n’a pas,
c’est-à-dire ses propres constructions.
Un hôte ne se sert pas de sa propre harmonia
Ce service sert son propre /nix/store, il ne peut donc fournir que des chemins
déjà présents localement. Sur cet hôte, tout ce qui manque vient forcément d’une
autre source : c’est normal, sa harmonia ne profite qu’aux autres
machines de la zone.
Hôte nomade (portable multi-zones)
Un portable qui change de zone ne doit pas garder des substituters figés sur sa
zone déclarée : injoignables ailleurs, ils coûtent des timeouts à chaque
requête. Activez le mode roaming :
# usr/machines/<hôte>/default.nix
darkone . service . nix-cache . roaming = true ;
Ses substituters deviennent des noms neutres (harmonia.dnf.internal,
nix-cache.dnf.internal) que le DNS de chaque zone résout vers ses propres
caches → le cache suit la machine. Hors de toute zone, réponse NXDOMAIN
immédiate → repli direct sur cache.nixos.org, sans délai. Les clés de
signature étant communes à tout le réseau, rien d’autre à configurer.
Pourquoi un proxy à upstream unique
nix-cache ne relaie qu’un seul upstream (cache.nixos.org) : il met
en cache narinfo et nar tels quels, signatures intactes. Pas de réécriture
d’URL ni de base de données, donc pas l’erreur HTTP 500 « invalid nar hash » de
l’ancien relais ncps.
Récupérer un paquet et le construire sont deux besoins distincts. Le cache
binaire ci-dessus couvre le premier. Pour le second, un hôte puissant du réseau
peut prendre à sa charge les compilations longues d’un hôte d’administration.
Déclarez-le par la fonctionnalité build-farm :
Chaque hôte d’administration l’ajoute alors à ses nix.buildMachines, joint en
SSH par le compte de déploiement nix. Rien d’autre à configurer : la clé
et l’autorisation sont déjà en place sur tout le parc.
Seules les compilations longues partent
La délégation est volontairement étroite : la ferme ne se voit proposer que
les dérivations déclarant requiredSystemFeatures = [ "big-parallel" ], soit le
noyau, les navigateurs, llvm, rustc… Tout le reste est construit sur place.
C’est décisif quand la ferme est derrière une liaison lente, puisque seul le
résultat demandé fait le trajet retour.
Ajustez avec darkone.admin.nix.remoteBuilders : maxJobs, speedFactor,
et mandatoryFeatures (liste vide = tout part à la ferme).
Une ferme n’est pas un cache prioritaire
Ne promouvez pas une ferme distante en harmonia global prioritaire pour
partager ses résultats : harmonia sert le /nix/store entier et
capturerait le trafic que le cache public doit servir, à travers la liaison la
plus lente du réseau. C’est le rôle du niveau 45 du tableau plus haut :
dernier recours, jamais source principale.
Repli si la ferme est injoignable
L’hôte d’administration conserve big-parallel dans ses propres
system-features. Quand la ferme ne répond pas, Nix reprend simplement la
compilation en local au lieu d’échouer. Ne retirez pas cette fonctionnalité pour
forcer la délégation.