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 :
| Section | Rôle |
|---|---|
network | Paramètres globaux : domaine, locale, coordination VPN. |
zones | Sous-réseaux : préfixe IP, passerelle, appareils non-NixOS. |
users | Comptes, communs à toutes les zones. |
hosts | Machines à déployer. |
Section “network”
Section intitulée « Section “network” »Cette section optionnelle définit les paramètres globaux de notre réseau.
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 |
|---|---|
domain | Domaine DNS de tête (services, Headscale, certificats). |
default.locale | Valeurs par défaut, éventuellement surchargées par zone. |
default.timezone | Valeurs par défaut, éventuellement surchargées par zone. |
coordination.enable | Active la coordination VPN. false → zones locales seules. |
coordination.hostname | Hôte et sous-domaine Headscale. |
coordination.domain | Hôte et sous-domaine Headscale. |
Section “zones”
Section intitulée « Section “zones” »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.
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 |
|---|---|
description | Libellé de la zone. |
locale / timezone | Surcharges locales (sinon network.default). |
ipPrefix | Deux premiers octets d’un /16 RFC1918 (ex. 10.0). |
gateway | Configuration de la passerelle (voir ci-dessous). |
extraHosts | Appareils non-NixOS résolus par nom (voir ci-dessous). |
La passerelle (gateway)
Section intitulée « La passerelle (gateway) »| Clé | Rôle |
|---|---|
wan.interface | Carte réseau vers Internet (requis). |
lan.interfaces | Liste des cartes internes (requis), intégrées au pont lan0. |
lan.dhcp-range | Plage DHCP (optionnel ; défaut <préfixe>.3.200,<préfixe>.3.249,24h). |
vpn.ipv4 | IP VPN de la passerelle, à renseigner après enregistrement Headscale. |
Appareils non-NixOS (extraHosts)
Section intitulée « Appareils non-NixOS (extraHosts) »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).
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"Section “users”
Section intitulée « Section “users” »Comptes communs à toutes les zones. Chaque compte reçoit un profil Home Manager et des groupes.
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é | Type | Rôle |
|---|---|---|
| (clé) | Identifiant (login) du compte ([a-z]…). | |
uid | entier | Identifiant numérique stable (requis). |
name | texte | Nom affiché (requis). |
email | texte | Adresse (sert aussi à l’identité SSO), par défaut <login>@<domain.tld>. |
profile | texte | Profil d’utilisateur (défaut minimal). |
groups | liste | Installe l’utilisateur sur les hôtes ayant le même groupe. |
Section “hosts”
Section intitulée « Section “hosts” »hosts est une liste d’entrées (- hostname: …). Une machine peut être
déclarée de trois façons selon le besoin.
Type statique : un hôte par entrée
Section intitulée « Type statique : un hôte par entrée »Une entrée = une machine. La forme la plus simple et la plus courante.
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:Type collection : machines similaires
Section intitulée « Type collection : machines similaires »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).
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"Type plage : machines identiques
Section intitulée « Type plage : machines identiques »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 :
| Jeton | Effet | Exemple (i=3) |
|---|---|---|
%d ou %s | L’indice | vm-%d → vm-3 |
%'02s | Indice rempli (caractère + largeur) | vm-%'02s → vm-03 |
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"Liste des clés
Section intitulée « Liste des clés »| Clé | Type | Rôle |
|---|---|---|
hostname | texte | Identifiant DNS (requis) ; gabarits %s/%d/%'02s. |
name | texte | Nom lisible (requis). |
profile | texte | Profil d’hôte (gateway, server, desktop, laptop, hcs…). |
zone | texte | Zone et IP (voir ci-dessous). |
ipv4 | map | Hôte externe : external (IP publique) + internal (IP VPN). |
users | liste | Logins autorisés à ouvrir une session. |
groups | liste | Groupes d’hôte (ajoutent les membres correspondants). |
tags | liste | Tags colmena (just apply @tag). |
features | liste | Drapeaux non-service (voir ci-dessous). |
services | map | Services activés (voir ci-dessous). |
mac | texte/map | MAC de la carte interne (statique), map par indice (plage). |
aliases | liste | Noms DNS supplémentaires. |
arch | texte | Architecture (défaut x86_64-linux). |
disko | map | Schéma de disque (voir ci-dessous). |
range | liste | [début, fin] pour une plage. |
hosts | map | Membres (collection) ou surcharges par indice (plage). |
Attribuer une zone
Section intitulée « Attribuer une zone »La clé zone fixe l’appartenance réseau et l’adresse IP :
| Forme | Effet |
|---|---|
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 :
- hostname: "hcs" name: "Coordination" profile: "hcs" ipv4: external: "203.0.113.26" # IP publique (zone externe) internal: "10.0.0.2" # IP dans le VPNAttribuer des fonctionnalités
Section intitulée « Attribuer des fonctionnalités »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 serveurnfsde la zone (un serveur doit y exister).
Déclarer des services
Section intitulée « Déclarer des services »La clé services contient une collection de services à installer automatiquement sur
l’hôte. Les valeurs sont optionnelles, elles permettent une personnalisation du service.
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| Champ | Rôle |
|---|---|
| (clé) | Service à activer (ex. immich). |
title | Nom affiché sur le portail. |
description | Sous-titre sur le portail. |
domain | Sous-domaine (défaut : nom du service). |
global | Expose publiquement via le HCS : <domain>.domain.tld, sans la zone. |
icon | Icône du portail. |
Déclarer le partitionnement
Section intitulée « Déclarer le partitionnement »La clé disko décrit le partitionnement pour l’installation automatique.
profiledésigne un fichier(usr|dnf)/hosts/disko/<profile>.nix.devicesassocie les disques nommés du profil à des périphériques réels.
disko: profile: "btrfs-1-disk" devices: main: "/dev/nvme0n1"Liens utiles
Section intitulée « Liens utiles »Pour le parcours complet d’installation d’une machine, voir Installation initiale.