NixOS Configuration
Configuration NixOS modulaire basée sur Flakes pour laptop.
📁 Structure
nixos-config/
├── flake.nix # Point d'entrée principal avec inputs et configurations
├── configuration.nix # Configuration racine importée par le flake
├── hosts/
│ └── laptop/
│ └── configuration.nix # Configuration matérielle spécifique au laptop
│ └── vmgaming/
│ └── configuration.nix # Configuration matérielle VM Proxmox (VMGaming)
└── modules/
├── laptop/ # Modules spécifiques au laptop
│ ├── default.nix # Secrets management (sops-nix) et config de base
│ ├── users.nix # Définition utilisateur et packages
│ ├── gaming.nix # Gaming (Steam, xpadneo) - avec options
│ ├── virtualization.nix # Docker & VirtualBox - avec options
│ ├── printing.nix # Imprimantes - avec options
│ ├── power.nix # Power management - avec options
│ ├── bluetooth.nix # Bluetooth - avec options
│ └── zwift.nix # Zwift cycling simulator - avec options
└── nixos/ # Modules système génériques
├── base.nix # Configuration système de base (Nix, packages, fonts, locale)
├── yubikey.nix # Authentification YubiKey globale (login/sudo)
├── desktop-i3.nix # Window manager i3
├── net.nix # Réseau (DNS chiffré, WiFi settings)
├── wireless-networks.nix # Configuration des réseaux WiFi (SSID, auth)
└── parsec.nix # Parsec Cloud client
⚙️ Configuration Centralisée
Tous les paramètres personnalisables se trouvent dans config.nix :
{
username = "alice"; # Votre username
userEmail = "amaury.joly"; # Email pour réseaux WPA-EAP
configFlakePath = /etc/nixos; # Chemin vers la config flake
timezone = "Europe/Paris"; # Timezone
locale = "fr_FR.UTF-8"; # Locale
hostname = "nixos"; # Hostname du système
}
À adapter lors de la première installation :
- Ouvrir config.nix
- Remplacer les valeurs par vos préférences (username, email, timezone, etc.)
- Ces valeurs sont ensuite utilisées automatiquement dans tous les modules
🎛️ Système d'Options Modulaires
La configuration utilise le système d'options NixOS pour activer/désactiver des fonctionnalités. Toutes les options sont définies dans configuration.nix :
Gaming
custom.gaming.enable = true; # Active Steam et support gaming
custom.gaming.enableXpadneo = true; # Driver pour manettes Xbox
Virtualisation
custom.virtualization.docker.enable = true; # Active Docker
custom.virtualization.docker.dnsServers = [ "172.17.0.1" ]; # DNS pour containers
custom.virtualization.virtualbox.enable = true; # Active VirtualBox
Impression
custom.printing.enable = true;
custom.printing.printers = [ # Liste des imprimantes
{
name = "Mon_Imprimante";
location = "Bureau";
deviceUri = "http://192.168.1.100";
model = "drv:///sample.drv/generic.ppd";
}
];
custom.printing.defaultPrinter = "Mon_Imprimante";
Power Management
custom.power.enable = true;
custom.power.cpuGovernor = "powersave"; # ou "performance", "ondemand"
Bluetooth
custom.bluetooth.enable = true;
custom.bluetooth.powerOnBoot = true; # Activer Bluetooth au démarrage
Zwift
custom.zwift.enable = true; # Zwift cycling simulator
💡 Avantages :
- ✅ Activation conditionnelle : Désactiver une fonctionnalité =
enable = false; - ✅ Documentation intégrée :
nixos-option custom.gaming.enableaffiche la doc - ✅ Pas de code mort : Les modules désactivés ne sont pas évalués
- ✅ Réutilisable : Facile de créer une config pour une autre machine
🚀 Déploiement
Build et test (sans activer)
cd ~/src/nixos-config
nixos-rebuild build --flake .#laptop
Build et test de la VM gaming (Proxmox)
cd ~/src/nixos-config
nixos-rebuild build --flake .#VMGaming
Activer la configuration
sudo nixos-rebuild switch --flake .#laptop
Activer la configuration VM gaming
sudo nixos-rebuild switch --flake .#VMGaming
GPU passthrough pour VMGaming
- La configuration
VMGamingest optimisée pour une VM Proxmox avec GPU passthrough. - Le profil actuel active les drivers NVIDIA dans
configuration-vmgaming.nix. - Si tu passes une carte AMD, remplace
services.xserver.videoDrivers = [ "nvidia" ];parservices.xserver.videoDrivers = [ "amdgpu" ];et retire le blochardware.nvidia.
Mettre à jour les inputs
nix flake update
sudo nixos-rebuild switch --flake .#laptop
Avec nh (helper recommandé)
nh os switch # NH_OS_FLAKE est configuré automatiquement
🔐 Gestion des Secrets (sops-nix)
Cette configuration utilise sops-nix pour gérer les secrets de manière sécurisée.
Configuration initiale
- Générer une clé age (si pas déjà fait) :
mkdir -p ~/.config/sops/age
age-keygen -o ~/.config/sops/age/keys.txt
- Configurer sops pour la clé publique :
# Afficher votre clé publique
age-keygen -y ~/.config/sops/age/keys.txt
# Créer .sops.yaml à la racine si nécessaire
cat > .sops.yaml << EOF
keys:
- &alice YOUR_PUBLIC_KEY_HERE
creation_rules:
- path_regex: secrets/.*\.yaml$
key_groups:
- age:
- *alice
EOF
- Créer et éditer les fichiers secrets :
mkdir -p ~/.config/secrets/
# Pour les credentials WiFi (legacy - optionnel)
sops ~/.config/secrets/wireless.yaml
# Pour la configuration complète des réseaux WiFi (RECOMMANDÉ - tout chiffré)
sops ~/.config/secrets/wifi-networks.yaml
# Pour Zwift
sops ~/.config/secrets/zwift.yaml
📡 Configuration WiFi Sécurisée (Tout Chiffré)
🔒 Nouveauté : La configuration WiFi est maintenant entièrement chiffrée avec sops, incluant :
- ✅ Noms des réseaux (SSID)
- ✅ Identités/usernames
- ✅ Mots de passe
- ✅ Structure complète de configuration
Avantages :
- Aucune information sensible visible dans le code source
- Pas d'exposition des lieux (noms de réseaux maison/travail)
- Configuration complète dans un seul fichier chiffré
Créer la configuration WiFi chiffrée
- Copier l'exemple de configuration :
cp wifi-networks.yaml.example ~/.config/secrets/wifi-networks.yaml
- Éditer avec sops :
sops ~/.config/secrets/wifi-networks.yaml
- Format du fichier (syntaxe wpa_supplicant.conf) :
# Réseau personnel (WPA-PSK)
network={
ssid="Mon_WiFi_Maison"
psk="mon_mot_de_passe_securise"
priority=100
}
# Réseau entreprise (WPA-EAP)
network={
ssid="Work_Network"
key_mgmt=WPA-EAP
eap=TTLS
identity="username@company.com"
password="password_entreprise"
phase2="auth=PAP"
priority=10
}
# Eduroam (université)
network={
ssid="eduroam"
key_mgmt=WPA-EAP
eap=PEAP
identity="etudiant@universite.fr"
password="mot_de_passe_univ"
}
# Réseau caché
network={
ssid="Hidden_Network"
psk="password"
scan_ssid=1
priority=50
}
Ajouter un nouveau réseau WiFi
Tout se fait dans le fichier chiffré !
# Éditer le fichier chiffré
sops ~/.config/secrets/wifi-networks.yaml
# Ajouter un nouveau bloc network={...}
# Sauvegarder et quitter
# Appliquer la configuration
sudo nixos-rebuild switch --flake .#laptop
Exemples de configuration selon le type de réseau :
WiFi personnel (WPA2) :
network={
ssid="MonReseau"
psk="MotDePasse123"
priority=100
}
WiFi entreprise (802.1X) :
network={
ssid="CorpWiFi"
key_mgmt=WPA-EAP
eap=TTLS
identity="user@company.com"
password="my_password"
phase2="auth=PAP"
}
Hotspot mobile :
network={
ssid="iPhone_Alice"
psk="hotspot_pass"
scan_ssid=1
}
Migration depuis l'ancienne configuration
Si vous aviez des réseaux définis en Nix (ancienne méthode), migrez-les vers le fichier chiffré :
- Copier les configs depuis modules/nixos/wireless-networks.nix
- Convertir au format wpa_supplicant.conf
- Ajouter dans
~/.config/secrets/wifi-networks.yaml - Chiffrer avec sops
- Les anciennes définitions seront ignorées
Format du fichier zwift.yaml
# Configuration Zwift ici
📦 Modules et Fonctionnalités
🖥️ Système de Base
Base System (modules/nixos/base.nix)
- Configuration Nix avec flakes et nix-command
- Packages système essentiels (wget, jq, element-desktop, etc.)
- Fonts Nerd Fonts (DejaVu, Droid Sans Mono)
- Locale française (Europe/Paris - configurable)
- Shell Fish par défaut
YubiKey Authentication (modules/nixos/yubikey.nix)
- Active l'authentification YubiKey (U2F) pour
loginetsudo - S'applique à tous les systèmes qui importent ce module
Fingerprint (Laptop) (modules/laptop/fingerprint.nix)
- Active
fprintdsur le laptop - Ajoute l'authentification empreinte pour
loginetsudo - Sur laptop, l'authentification peut se faire avec YubiKey ou empreinte selon la méthode disponible
Networking (modules/nixos/net.nix)
- DNS chiffré : dnscrypt-proxy (primaire + backup dns0-eu)
- WiFi : wpa_supplicant avec multi-réseaux
- Hostname : Configurable via config.nix
Desktop (modules/nixos/desktop-i3.nix)
- Window manager i3
- Terminal : alacritty
- Launcher : rofi
- Panel : tint2
- Notifications : dunst
🎮 Fonctionnalités Optionnelles (avec options)
Gaming (modules/laptop/gaming.nix)
- Steam avec steam-hardware
- Driver xpadneo pour manettes Xbox (optionnel)
- Option :
custom.gaming.enable
Virtualization (modules/laptop/virtualization.nix)
- Docker avec DNS personnalisé
- VirtualBox avec extension pack
- Options :
custom.virtualization.docker.enable,custom.virtualization.virtualbox.enable
Printing (modules/laptop/printing.nix)
- CUPS avec configuration d'imprimantes
- Option :
custom.printing.enable
Power Management (modules/laptop/power.nix)
- CPU frequency governor configurable
- Option :
custom.power.enable
Bluetooth (modules/laptop/bluetooth.nix)
- Bluetooth avec blueman GUI
- Mode dual controller + experimental features
- Option :
custom.bluetooth.enable
Zwift (modules/laptop/zwift.nix)
- Zwift cycling simulator via Docker
- Ports réseau configurés automatiquement
- Option :
custom.zwift.enable
👤 Utilisateur & Applications
User Configuration (modules/laptop/users.nix)
Packages par catégorie :
- Browsers : Firefox
- Office : LibreOffice, OnlyOffice, Obsidian, TickTick, Nextcloud
- Development : VSCode, Git, Neovim, Zotero, tcpdump, Pandoc
- Communication : Slack, Thunderbird, Discord
- Media : VLC, Spotify, Mixxx, Pympress
- Gaming : Prismlauncher (Minecraft), Widelands, Moonlight
- System : Rclone, Fuse3, Pavucontrol
🔧 Flake Inputs
- nixpkgs : nixos-unstable channel
- sops-nix : Secrets management
- parsec-cloud-nix : Parsec Cloud client
- claude-desktop : Claude AI desktop app
- zwift : Zwift cycling simulator
<EFBFBD> Personnalisation
Configuration de base
-
Timezone et Locale : Éditer config.nix
timezone = "Europe/Paris"; locale = "fr_FR.UTF-8"; -
Username et email : Éditer config.nix
username = "alice"; userEmail = "votre.email"; -
Hostname : Éditer config.nix
hostname = "nixos";
Activer/Désactiver des fonctionnalités
Dans configuration.nix, modifier les options custom.* :
# Désactiver le gaming
custom.gaming.enable = false;
# Activer uniquement Docker (pas VirtualBox)
custom.virtualization.docker.enable = true;
custom.virtualization.virtualbox.enable = false;
# Changer le CPU governor
custom.power.cpuGovernor = "performance"; # pour laptop branché
Ajouter des packages utilisateur
Éditer modules/laptop/users.nix et ajouter dans la liste appropriée :
packages = with pkgs; [
# Development
python3
nodejs
# ... vos packages
];
Ajouter une nouvelle fonctionnalité avec options
- Créer
modules/laptop/ma-feature.nix:
{ config, lib, pkgs, ... }:
{
options.custom.maFeature.enable = lib.mkEnableOption "ma fonctionnalité";
config = lib.mkIf config.custom.maFeature.enable {
# votre configuration
};
}
- Importer dans configuration.nix
- Activer :
custom.maFeature.enable = true;
🐛 Dépannage
Lister les options disponibles
# Voir toutes les options custom.*
nixos-option custom
# Voir une option spécifique avec sa documentation
nixos-option custom.gaming.enable
Erreurs de build
# Vérifier la syntaxe Nix
nix flake check
# Build avec logs détaillés
nixos-rebuild build --flake .#laptop --show-trace
Secrets non déchiffrables
Vérifier que :
- La clé age existe :
~/.config/sops/age/keys.txt - Les fichiers secrets existent :
~/.config/secrets/*.yaml - Les permissions sont correctes (0400 recommandé)
Problèmes DNS
# Vérifier dnscrypt-proxy
systemctl status dnscrypt-proxy
systemctl status dnscrypt-proxy-backup
# Tester la résolution
dig @127.0.0.1 example.com
📚 Ressources
- NixOS Manual
- Nix Flakes Guide
- sops-nix Documentation
- Home Manager (à considérer pour config utilisateur)
📝 Notes
- stateVersion : Actuellement
24.05- NE PAS MODIFIER après installation - Auto-upgrade : Désactivé pour éviter les mises à jour imprévues
- Unfree packages : Activé globalement pour Steam, Slack, etc.
🔄 Maintenance
Nettoyage du store Nix
# Via nh (automatique toutes les 4 jours, garde 3 générations)
nh clean all --keep-since 4d --keep 3
# Ou manuellement
nix-collect-garbage -d
sudo nix-collect-garbage -d
Lister les générations
nixos-rebuild list-generations
Rollback
sudo nixos-rebuild switch --rollback
# Ou au boot via GRUB