# 🏗️ **NixOS Infrastructure Project Canvas** *Projet de gestion centralisée des configurations NixOS pour l'infrastructure de Xavier Lagraula* --- ## **📌 Contexte et Objectifs** ### **Contexte** - **Portée** : Gestion centralisée des configurations **NixOS** pour une infrastructure complète (hyperviseurs, stations de travail, conteneurs LXC, services). - **Environnement** : - Un hyperviseur **Proxmox** actuellement, un deuxième à venir. - Plusieurs **stations de travail** (ex: `dev-xavier`, `mao-julien`, `bureautique`). - **Conteneurs LXC** (sur Proxmox) pour les services d'infrastructure (DNS, Gitea, Bitwarden, etc.) et applicatifs. - **2 utilisateurs principaux** (Xavier, Frida) + utilisateurs système (`root`, `admin`, `guest`). - **Matériel** : ThinkCentre m710q (16 Go RAM, i3) avec **KDE 6.3**. ### **Objectifs** | Objectif | Description | Priorité | | ------------------------------ | ------------------------------------------------------------------------------------ | -------- | | Centraliser les configurations | Un dépôt Git unique pour toutes les machines. | ⭐⭐⭐ | | Modularité | Modules réutilisables pour les services, types de machines, et profils utilisateurs. | ⭐⭐⭐ | | Automatisation | Scripts pour déployer les configurations sur les machines et conteneurs. | ⭐⭐⭐ | | Sécurité | Gestion des secrets avec `sops-nix`. | ⭐⭐ | | Portabilité | Modules autonomes via `callPackage`. | ⭐⭐ | | Maintenance | Documentation claire et processus de mise à jour simplifiés. | ⭐ | --- --- ## **🔍 Décisions Clés** | Décision | Justification | Impact | | ----------------------------------------------------------| -----------------------------------------------------------------------------------------| ------------------------------------------------------------------| | **Pas de flakes** | Simplifier la prise en main et éviter une courbe d'apprentissage abrupte. | Configuration via `configuration.nix` + `callPackage`. | | **Structure modulaire** | Séparer les configurations par type de machine et service. | Arborescence claire et maintenable. | | `**callPackage` pour les modules** | Rendre les modules autonomes, portables et réutilisables. | Chaque module est un paquetage Nix indépendant. | | **Séparation `user-profiles/` et `users/**` | Distinguer les rôles génériques (ex: `admin`) des utilisateurs concrets (ex: `xavier`). | Flexibilité pour appliquer des profils à plusieurs utilisateurs. | | **Script `deploy.sh**` | Automatiser le déploiement sur les machines existantes. | Clone/mise à jour du dépôt + `nixos-rebuild switch`. | | **Script `create-lxc-nixos.sh**` | Automatiser la création de conteneurs LXC sous Proxmox. | Conteneur prêt à l'emploi avec configuration initiale. | | **Configuration initiale (`initial-configuration.nix`)** | Préparer un conteneur LXC pour qu'il puisse se mettre à jour via Git. | Conteneurs auto-suffisants. | | **Gestion des secrets avec `agenix**` | Chiffrer les secrets (mots de passe, clés) pour un stockage sécurisé. | Sécurité renforcée pour les données sensibles. | | **Conteneurs LXC non privilégés (`--unprivileged 0`)** | NixOS a besoin de privilèges pour fonctionner correctement. | Conteneurs fonctionnels avec NixOS. | | **Support IPv4, IPv6, VLANs** | La cible finale est IPv6 first, voire IPv6 only. | Gestion du plan IP à concevoir. | --- --- ## **📂 Arborescences de Fichiers** ### **Structure du dépôt Git** ```bash nixos-infra/ ├── configuration.nix # Point d'entrée principal ├── README.md │ ├── hosts/ # Configurations par machine │ ├── servers/ # Serveurs (hyperviseurs, VMs, LXCs) │ │ ├── pve01/ # Hyperviseur 1 │ │ │ └── configuration.nix │ │ ├── pve02/ # Hyperviseur 2 │ │ │ └── configuration.nix │ │ ├── dns01/ # Conteneur LXC pour DNS (master) │ │ │ └── configuration.nix │ │ ├── dns02/ # Conteneur LXC pour DNS (slave) │ │ │ └── configuration.nix │ │ ├── gitea01/ # Conteneur LXC pour Gitea │ │ │ └── configuration.nix │ │ └── vaultwarden/ # Conteneur LXC pour Vaultwarden │ │ └── configuration.nix │ │ └── rp01/ # Conteneur LXC reverse proxy │ │ └── configuration.nix │ │ │ └── workstations/ # Stations de travail │ ├── sting/ # Station de Xavier (admin, dev, mao) │ │ └── configuration.nix │ ├── PC-FRIDA/ # Station de Frida (bureautique) │ │ └── configuration.nix │ └── gaia/ # Portable de Xavier (MAO) │ └── configuration.nix │ ├── modules/ # Modules autonomes │ ├── machine-types/ # Types de machines │ │ ├── hypervisor.nix # Module pour hyperviseurs │ │ ├── vm.nix # Module pour VMs │ │ ├── lxc.nix # Module pour conteneurs LXC │ │ └── workstation.nix # Module pour stations de travail │ │ │ ├── services/ # Services │ │ ├── dns/ │ │ │ ├── default.nix # Implémentation │ │ │ └── options.nix # Options exposées │ │ ├── gitea/ │ │ │ └── default.nix │ │ ├── password-manager/ │ │ │ └── default.nix │ │ ├── reverse-proxy/ │ │ │ └── default.nix │ │ └── ... │ │ │ └── user-profiles/ # Profils utilisateurs (rôles) │ ├── admin.nix # Profil administrateur │ ├── dev.nix # Profil développeur │ ├── mao.nix # Profil MAO │ └── standard.nix # Profil standard │ ├── users/ # Utilisateurs concrets │ ├── root/ │ │ └── configuration.nix │ ├── xavier/ │ │ └── configuration.nix │ ├── frida/ │ │ └── configuration.nix │ └── guest/ │ └── configuration.nix │ ├── scripts/ # Scripts utilitaires │ ├── deploy.sh # Déploiement pour machines existantes │ ├── create-lxc-nixos.sh # Création de conteneurs LXC sous Proxmox │ └── initial-configuration.nix # Configuration initiale pour nouveaux conteneurs │ ├── secrets/ # Secrets (exclus de Git) │ └── .gitignore │ └── overlays/ # Overlays pour paquets personnalisés └── custom-pkgs.nix ``` --- --- ## **🖥️ Profils de Machines et Services** ### **Profils de Machines** | Profil | Description | Fichier | Utilisation | | ---------------| ---------------------------------------------------------------| -----------------------------------------| ----------------------------------------------| | `hypervisor` | Configuration commune aux hyperviseurs (KVM, libvirtd, etc.). | `modules/machine-types/hypervisor.nix` | Hyperviseurs Proxmox. | | `vm` | Configuration commune aux machines virtuelles. | `modules/machine-types/vm.nix` | VMs sous Proxmox. | | `lxc` | Configuration commune aux conteneurs LXC. | `modules/machine-types/lxc.nix` | Conteneurs LXC sous Proxmox. | | `workstation` | Configuration commune aux stations de travail. | `modules/machine-types/workstation.nix` | Stations de développement, MAO, bureautique. | --- ### **Profils Utilisateurs** | Profil | Description | Fichier | | ------------| --------------------------------------------------------| --------------------------------------| | `admin` | Accès administrateur (sudo, gestion des services). | `modules/user-profiles/admin.nix` | | `dev` | Environnement de développement (outils, permissions). | `modules/user-profiles/dev.nix` | | `mao` | Configuration pour la musique assistée par ordinateur. | `modules/user-profiles/mao.nix` | | `standard` | Profil utilisateur standard (accès basique). | `modules/user-profiles/standard.nix` | --- ## **📋 Tableaux de Référence** ### **1. Liste des Machines** | Nom | Type de Machine | Services | IPv4 | Token IPv6 | | ---------| --------------------| -------------| ------| ------------| | pve01 | Hyperviseur | Proxmox | | | | pve02 | Hyperviseur | Proxmox | | | | dns01 | Conteneur LXC | DNS | | | | gitea01 | Conteneur LXC | Gitea | | | | vault01 | Conteneur LXC | Vaultwarden | | | | sting | Station de travail | | | | | | | | | | | | | | | | | | | | | | | marley | Station de travail | | | | --- ### **2. Liste des profils utilisateurs** | Nom | Rôle | | ---------- | ----------------- | | `admin` | Superutilisateur | | `dev` | Développeur | | `standard` | Web & bureautique | | `guest` | Invité | --- ### **3. Liste des Utilisateurs** | Nom | Rôle | Accès SSH | | --------| -----------------------| -----------| | root | Superutilisateur | ❌ | | xavier | Utilisateur principal | ✅ | | frida | Utilisateur | ✅ | | guest | Invité | ❌ | --- ### **3. Liaisons Utilisateur/Machine/Profil** | Utilisateur | Machine | Profils Appliqués | Rôle | | -------------| ---------| -------------------| --------------------------------| | root | Toutes | - | Superutilisateur | | xavier | Toutes | `admin` | Développement + administration | | xavier | sting | `admin`, `dev` | Gestion des hyperviseurs | | frida | marley | `standard` | Développement | | guest | aucune | `guest` | Utilisateur invité | --- --- ## **🔄 Workflow de Déploiement** ### **Pour les conteneurs LXC (Proxmox)** 1. **Créer le conteneur** : - Utiliser `create-lxc-nixos.sh` pour créer un conteneur à partir du template NixOS. - Le script installe la configuration initiale (`initial-configuration.nix`). 2. **Déployer la configuration finale** : - Le script `deploy.sh` est exécuté automatiquement pour appliquer la configuration spécifique au conteneur (ex: `hosts/servers/dns01/configuration.nix`). 3. **Mettre à jour** : - `git pull` dans `/etc/nixos-infra` + `nixos-rebuild switch`. ### **Pour les stations de travail et hyperviseurs** 1. **Cloner le dépôt** : ```bash git clone https://github.com/xlagraula/nixos-infra.git /etc/nixos-infra ``` 2. **Lier la configuration** : ```bash ln -s /etc/nixos-infra/hosts/workstations/dev-xavier/configuration.nix /etc/nixos/configuration.nix ``` 3. **Appliquer la configuration** : ```bash sudo nixos-rebuild switch ``` --- --- ## **🔐 Gestion des Secrets** - **Outil** : `agenix` (recommandé) ou `sops-nix`. - **Processus** : 1. Chiffrer les secrets avec `age` : ```bash echo "mon-secret" | age -r age1... -o secrets/bitwarden/password.age ``` 2. Intégrer dans la configuration : ```nix age.secrets.bitwarden-password = { path = ./secrets/bitwarden/password.age; mode = "600"; }; ``` 3. **Ne jamais commiter les secrets en clair** (ajouter `secrets/` à `.gitignore`). --- --- ## **📅 Feuille de Route** | Étape | Description | Statut | Priorité | | ------------------------------- | ------------------------------------------------- | ------ | -------- | | Tester le template LXC NixOS | Vérifier que le template fonctionne sous Proxmox. | ⬜ | ⭐⭐⭐ | | Finaliser `create-lxc-nixos.sh` | Tester la création d'un conteneur LXC. | ⬜ | ⭐⭐⭐ | | Écrire le module DNS | Module pour le service DNS (Bind). | ⬜ | ⭐⭐⭐ | | Configurer `agenix` | Chiffrer les premiers secrets. | ⬜ | ⭐⭐ | | Documenter le processus | `README.md` pour expliquer le déploiement. | ⬜ | ⭐⭐ | | Automatiser avec Ansible | Playbook pour créer plusieurs conteneurs. | ⬜ | ⭐ | | Intégrer un CI/CD | Tester les configurations avant déploiement. | ⬜ | ⭐ | --- --- ## **💡 Notes et Bonnes Pratiques** - **Nommage** : - Utilisez des noms explicites pour les machines (ex: `dns01`, `gitea01`). - Pour les conteneurs LXC, préférez des noms courts et descriptifs. - **Sécurité** : - Désactivez l'accès root en SSH une fois le déploiement terminé. - Utilisez des clés SSH pour l'authentification. - **Maintenance** : - Mettez à jour régulièrement `nixpkgs` (`nix-channel --update`). - Documentez les changements dans le `CHANGELOG.md`. - **Sauvegardes** : - Sauvegardez les configurations (`/etc/nixos-infra`) et les secrets (`secrets/`). - Pour les conteneurs LXC sous Proxmox, utilisez les sauvegardes Proxmox. --- --- ## **📚 Ressources Utiles** - [NixOS Manual](https://nixos.org/manual/) - [Nix Flakes (pour référence future)](https://nixos.wiki/wiki/Flakes) - [Agenix pour les secrets](https://github.com/ryantm/agenix) - [Proxmox + LXC Documentation](https://pve.proxmox.com/wiki/Linear_Container) - [Exemple de dépôt NixOS Infrastructure](https://github.com/NixOS/nixos-infrastructure) ---