init
This commit is contained in:
519
README.md
Normal file
519
README.md
Normal file
@@ -0,0 +1,519 @@
|
||||
# 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
|
||||
└── 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
|
||||
```
|
||||
|
||||
### Activer la configuration
|
||||
```bash
|
||||
sudo nixos-rebuild switch --flake .#laptop
|
||||
```
|
||||
|
||||
### 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
|
||||
```
|
||||
Reference in New Issue
Block a user