Files
nix-config/README.md
2026-03-10 22:16:46 +01:00

538 lines
15 KiB
Markdown
Raw Blame History

# 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](config.nix) :
```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 :**
1. Ouvrir [config.nix](config.nix)
2. Remplacer les valeurs par vos préférences (username, email, timezone, etc.)
3. 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](configuration.nix) :
### Gaming
```nix
custom.gaming.enable = true; # Active Steam et support gaming
custom.gaming.enableXpadneo = true; # Driver pour manettes Xbox
```
### Virtualisation
```nix
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
```nix
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
```nix
custom.power.enable = true;
custom.power.cpuGovernor = "powersave"; # ou "performance", "ondemand"
```
### Bluetooth
```nix
custom.bluetooth.enable = true;
custom.bluetooth.powerOnBoot = true; # Activer Bluetooth au démarrage
```
### Zwift
```nix
custom.zwift.enable = true; # Zwift cycling simulator
```
**💡 Avantages :**
-**Activation conditionnelle** : Désactiver une fonctionnalité = `enable = false;`
-**Documentation intégrée** : `nixos-option custom.gaming.enable` affiche 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)
```bash
cd ~/src/nixos-config
nixos-rebuild build --flake .#laptop
```
### Build et test de la VM gaming (Proxmox)
```bash
cd ~/src/nixos-config
nixos-rebuild build --flake .#VMGaming
```
### Activer la configuration
```bash
sudo nixos-rebuild switch --flake .#laptop
```
### Activer la configuration VM gaming
```bash
sudo nixos-rebuild switch --flake .#VMGaming
```
### GPU passthrough pour VMGaming
- La configuration `VMGaming` est 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" ];` par `services.xserver.videoDrivers = [ "amdgpu" ];` et retire le bloc `hardware.nvidia`.
### Mettre à jour les inputs
```bash
nix flake update
sudo nixos-rebuild switch --flake .#laptop
```
### Avec nh (helper recommandé)
```bash
nh os switch # NH_OS_FLAKE est configuré automatiquement
```
## 🔐 Gestion des Secrets (sops-nix)
Cette configuration utilise [sops-nix](https://github.com/Mic92/sops-nix) pour gérer les secrets de manière sécurisée.
### Configuration initiale
1. **Générer une clé age** (si pas déjà fait) :
```bash
mkdir -p ~/.config/sops/age
age-keygen -o ~/.config/sops/age/keys.txt
```
2. **Configurer sops pour la clé publique** :
```bash
# 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
```
3. **Créer et éditer les fichiers secrets** :
```bash
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
1. **Copier l'exemple de configuration** :
```bash
cp wifi-networks.yaml.example ~/.config/secrets/wifi-networks.yaml
```
2. **Éditer avec sops** :
```bash
sops ~/.config/secrets/wifi-networks.yaml
```
3. **Format du fichier** (syntaxe wpa_supplicant.conf) :
```yaml
# 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é !**
```bash
# É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é :
1. Copier les configs depuis [modules/nixos/wireless-networks.nix](modules/nixos/wireless-networks.nix)
2. Convertir au format wpa_supplicant.conf
3. Ajouter dans `~/.config/secrets/wifi-networks.yaml`
4. Chiffrer avec sops
5. Les anciennes définitions seront ignorées
### Format du fichier zwift.yaml
```yaml
# Configuration Zwift ici
```
## 📦 Modules et Fonctionnalités
### 🖥️ Système de Base
**Base System** ([modules/nixos/base.nix](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](modules/nixos/yubikey.nix))
- Active l'authentification YubiKey (U2F) pour `login` et `sudo`
- S'applique à tous les systèmes qui importent ce module
**Fingerprint (Laptop)** ([modules/laptop/fingerprint.nix](modules/laptop/fingerprint.nix))
- Active `fprintd` sur le laptop
- Ajoute l'authentification empreinte pour `login` et `sudo`
- Sur laptop, l'authentification peut se faire avec **YubiKey ou empreinte** selon la méthode disponible
**Networking** ([modules/nixos/net.nix](modules/nixos/net.nix))
- **DNS chiffré** : dnscrypt-proxy (primaire + backup dns0-eu)
- **WiFi** : wpa_supplicant avec multi-réseaux
- **Hostname** : Configurable via [config.nix](config.nix)
**Desktop** ([modules/nixos/desktop-i3.nix](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](modules/laptop/gaming.nix))
- Steam avec steam-hardware
- Driver xpadneo pour manettes Xbox (optionnel)
- Option : `custom.gaming.enable`
**Virtualization** ([modules/laptop/virtualization.nix](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](modules/laptop/printing.nix))
- CUPS avec configuration d'imprimantes
- Option : `custom.printing.enable`
**Power Management** ([modules/laptop/power.nix](modules/laptop/power.nix))
- CPU frequency governor configurable
- Option : `custom.power.enable`
**Bluetooth** ([modules/laptop/bluetooth.nix](modules/laptop/bluetooth.nix))
- Bluetooth avec blueman GUI
- Mode dual controller + experimental features
- Option : `custom.bluetooth.enable`
**Zwift** ([modules/laptop/zwift.nix](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](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
## <20> Personnalisation
### Configuration de base
1. **Timezone et Locale** : Éditer [config.nix](config.nix)
```nix
timezone = "Europe/Paris";
locale = "fr_FR.UTF-8";
```
2. **Username et email** : Éditer [config.nix](config.nix)
```nix
username = "alice";
userEmail = "votre.email";
```
3. **Hostname** : Éditer [config.nix](config.nix)
```nix
hostname = "nixos";
```
### Activer/Désactiver des fonctionnalités
Dans [configuration.nix](configuration.nix), modifier les options `custom.*` :
```nix
# 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](modules/laptop/users.nix) et ajouter dans la liste appropriée :
```nix
packages = with pkgs; [
# Development
python3
nodejs
# ... vos packages
];
```
### Ajouter une nouvelle fonctionnalité avec options
1. Créer `modules/laptop/ma-feature.nix` :
```nix
{ config, lib, pkgs, ... }:
{
options.custom.maFeature.enable = lib.mkEnableOption "ma fonctionnalité";
config = lib.mkIf config.custom.maFeature.enable {
# votre configuration
};
}
```
2. Importer dans [configuration.nix](configuration.nix)
3. Activer : `custom.maFeature.enable = true;`
## 🐛 Dépannage
### Lister les options disponibles
```bash
# Voir toutes les options custom.*
nixos-option custom
# Voir une option spécifique avec sa documentation
nixos-option custom.gaming.enable
```
### Erreurs de build
```bash
# 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
```bash
# 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](https://nixos.org/manual/nixos/stable/)
- [Nix Flakes Guide](https://nixos.wiki/wiki/Flakes)
- [sops-nix Documentation](https://github.com/Mic92/sops-nix)
- [Home Manager](https://github.com/nix-community/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
```bash
# 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
```bash
nixos-rebuild list-generations
```
### Rollback
```bash
sudo nixos-rebuild switch --rollback
# Ou au boot via GRUB
```