Aller au contenu

Le fichier config.yaml

config.yaml est une configuration simple, haut niveau. Elle est la source de vérité du réseau. Le générateur la lit et produit var/generated/*.nix, consommés par le framework.

Le fichier comporte quatre sections :

SectionRôle
networkParamètres globaux : domaine, locale, coordination VPN.
zonesSous-réseaux : préfixe IP, passerelle, appareils non-NixOS.
usersComptes, communs à toutes les zones.
hostsMachines à déployer.

Cette section optionnelle définit les paramètres globaux de notre réseau.

etc/config.yaml
network:
domain: "domain.tld" # domaine DNS racine (services, VPN, certificats)
default:
locale: "fr_FR.UTF-8" # locale par défaut de chaque hôte
timezone: "Europe/Paris" # fuseau par défaut
coordination:
enable: true # active le maillage VPN (Headscale)
hostname: "hcs" # nom court de l'hôte de coordination
domain: "headscale" # sous-domaine → headscale.domain.tld
CléRôle
domainDomaine DNS de tête (services, Headscale, certificats).
default.localeValeurs par défaut, éventuellement surchargées par zone.
default.timezoneValeurs par défaut, éventuellement surchargées par zone.
coordination.enableActive la coordination VPN. false → zones locales seules.
coordination.hostnameHôte et sous-domaine Headscale.
coordination.domainHôte et sous-domaine Headscale.

Une zone est un sous-réseau (LAN maison, réseau invité, site distant…). Chaque zone porte un préfixe IP en /16, une passerelle et, en option, des appareils non-NixOS.

etc/config.yaml
zones:
main:
description: "Réseau principal"
locale: "fr_FR.UTF-8" # optionnel (défaut : network.default.locale)
timezone: "Europe/Paris" # optionnel
ipPrefix: "10.0" # la zone utilise 10.0.0.0/16
gateway:
wan:
interface: "enp1s0" # interface vers Internet (requis)
lan:
interfaces: ["enp2s0"] # interface(s) interne(s) (requis)
vpn:
ipv4: "10.0.0.1" # IP VPN de la passerelle (après enregistrement)
CléRôle
descriptionLibellé de la zone.
locale / timezoneSurcharges locales (sinon network.default).
ipPrefixDeux premiers octets d’un /16 RFC1918 (ex. 10.0).
gatewayConfiguration de la passerelle (voir ci-dessous).
extraHostsAppareils non-NixOS résolus par nom (voir ci-dessous).
CléRôle
wan.interfaceCarte réseau vers Internet (requis).
lan.interfacesListe des cartes internes (requis), intégrées au pont lan0.
lan.dhcp-rangePlage DHCP (optionnel ; défaut <préfixe>.3.200,<préfixe>.3.249,24h).
vpn.ipv4IP VPN de la passerelle, à renseigner après enregistrement Headscale.

Téléphones, imprimantes, objets connectés : résolus par nom et fixés en DHCP. La clé common est fusionnée dans chaque zone (appareils présents partout).

etc/config.yaml
zones:
main:
# ...
extraHosts:
printer:
ip: "4.1" # suffixe → 10.0.4.1
name: "Imprimante du salon"
mac: "aa:bb:cc:dd:ee:01"
common:
extraHosts: # ajoutés à TOUTES les zones
phone-alice:
ip: "5.1"
name: "Téléphone d'Alice"
mac: "aa:bb:cc:dd:ee:02"

Comptes communs à toutes les zones. Chaque compte reçoit un profil Home Manager et des groupes.

etc/config.yaml
users:
alice:
uid: 1000
name: "Alice Martin"
email: "alice@domain.tld"
profile: "nix-admin"
groups: ["zone-main", "global", "idm-admins"]
bob:
uid: 1001
name: "Bob Durand"
profile: "normal"
groups: ["zone-main"]
CléTypeRôle
(clé)Identifiant (login) du compte ([a-z]…).
uidentierIdentifiant numérique stable (requis).
nametexteNom affiché (requis).
emailtexteAdresse (sert aussi à l’identité SSO), par défaut <login>@<domain.tld>.
profiletexteProfil d’utilisateur (défaut minimal).
groupslisteInstalle l’utilisateur sur les hôtes ayant le même groupe.

hosts est une liste d’entrées (- hostname: …). Une machine peut être déclarée de trois façons selon le besoin.

Une entrée = une machine. La forme la plus simple et la plus courante.

etc/config.yaml
hosts:
- hostname: "gw"
name: "Passerelle principale"
zone: "main:1.1" # IP fixe 10.0.1.1 → passerelle
profile: "gateway"
tags: ["main"]
features: ["monitoring-node"]
services:
adguardhome:
homepage:
- hostname: "server"
name: "Serveur maison"
zone: "main:1.2" # IP fixe 10.0.1.2
profile: "server"
users: ["alice"]
services:
nextcloud:
restic:

Une config commune + une sous-map hosts: : chaque membre (clé) hérite des clés du groupe (profile, groups, features, tags, disko) et précise son nom, sa zone, son adresse MAC. Le %s du hostname/name du groupe est remplacé par la clé du membre (et par son name).

etc/config.yaml
hosts:
- hostname: "%s-laptop" # %s → clé du membre
name: "Portable de %s" # %s → name du membre
profile: "laptop"
groups: ["zone-main"]
hosts:
alice: # → hostname "alice-laptop"
name: "Alice"
zone: "main:2.4"
mac: "aa:bb:cc:dd:ee:10"
bob: # → hostname "bob-laptop"
name: "Bob"
zone: "main:2.5"
mac: "aa:bb:cc:dd:ee:11"

Génère N hôtes identiques numérotés. range: [début, fin] (bornes incluses). Les jetons de gabarit (similaire aux substitutions printf 🡕) sont remplacés par l’indice :

JetonEffetExemple (i=3)
%d ou %sL’indicevm-%dvm-3
%'02sIndice rempli (caractère + largeur)vm-%'02svm-03
etc/config.yaml
hosts:
- hostname: "desktop-%'02s" # desktop-01 … desktop-04
name: "Poste invité n°%'02s"
zone: "main:11.%d" # 10.0.11.1 … 10.0.11.4
profile: "desktop"
range: [1, 4]
groups: ["zone-main"]
features: ["nfs-client"]
mac: # MAC par indice
1: "aa:bb:cc:dd:ee:21"
2: "aa:bb:cc:dd:ee:22"
3: "aa:bb:cc:dd:ee:23"
4: "aa:bb:cc:dd:ee:24"
CléTypeRôle
hostnametexteIdentifiant DNS (requis) ; gabarits %s/%d/%'02s.
nametexteNom lisible (requis).
profiletexteProfil d’hôte (gateway, server, desktop, laptop, hcs…).
zonetexteZone et IP (voir ci-dessous).
ipv4mapHôte externe : external (IP publique) + internal (IP VPN).
userslisteLogins autorisés à ouvrir une session.
groupslisteGroupes d’hôte (ajoutent les membres correspondants).
tagslisteTags colmena (just apply @tag).
featureslisteDrapeaux non-service (voir ci-dessous).
servicesmapServices activés (voir ci-dessous).
mactexte/mapMAC de la carte interne (statique), map par indice (plage).
aliaseslisteNoms DNS supplémentaires.
archtexteArchitecture (défaut x86_64-linux).
diskomapSchéma de disque (voir ci-dessous).
rangeliste[début, fin] pour une plage.
hostsmapMembres (collection) ou surcharges par indice (plage).

La clé zone fixe l’appartenance réseau et l’adresse IP :

FormeEffet
zone: "main:1.2"IP fixe <ipPrefix>.1.2 (ex: 10.1.1.2 dans la zone main en 10.1).
zone: "main:11.%d"IP fixe avec indice de plage (ex: 10.1.11.1, 10.1.11.2…).
zone: "main"Adresse dynamique (DHCP) dans la zone.

Un hôte externe (le HCS) n’a pas de zone mais un bloc ipv4 :

etc/config.yaml
- hostname: "hcs"
name: "Coordination"
profile: "hcs"
ipv4:
external: "203.0.113.26" # IP publique (zone externe)
internal: "10.0.0.2" # IP dans le VPN

La clé features active des comportements ou fonctionnalités spécifiques. Un suffixe :<zone> cible une zone précise (sinon la zone de l’hôte est utilisée). Exemples :

# Machine sous supervision (monitoring-node)
# et client NFS (il faut un serveur dans la zone)
features: ["monitoring-node", "nfs-client"]
# Machine supervisée par la zone "main"
features: ["monitoring-node:main"]

Fonctionnalités disponibles :

  • monitoring-node : l’hôte expose ses métriques (node-exporter) à la supervision de la zone.
  • nfs-client : l’hôte monte les partages du serveur nfs de la zone (un serveur doit y exister).

La clé services contient une collection de services à installer automatiquement sur l’hôte. Les valeurs sont optionnelles, elles permettent une personnalisation du service.

etc/config.yaml
services:
immich:
title: "Photos"
description: "Mes photos & vidéos"
domain: "photos" # sous-domaine
global: true # → https://photos.domain.tld (public)
nextcloud:
domain: "cloud" # → cloud.<zone>.domain.tld (non global)
restic: # valeurs par défaut
ChampRôle
(clé)Service à activer (ex. immich).
titleNom affiché sur le portail.
descriptionSous-titre sur le portail.
domainSous-domaine (défaut : nom du service).
globalExpose publiquement via le HCS : <domain>.domain.tld, sans la zone.
iconIcône du portail.

La clé disko décrit le partitionnement pour l’installation automatique.

  • profile désigne un fichier (usr|dnf)/hosts/disko/<profile>.nix.
  • devices associe les disques nommés du profil à des périphériques réels.
etc/config.yaml
disko:
profile: "btrfs-1-disk"
devices:
main: "/dev/nvme0n1"

Pour le parcours complet d’installation d’une machine, voir Installation initiale.