# đŸ—ïž **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) │ │ ├── hyperv1/ # Hyperviseur 1 │ │ │ └── configuration.nix │ │ ├── hyperv2/ # Hyperviseur 2 │ │ │ └── configuration.nix │ │ ├── dns01/ # Conteneur LXC pour DNS │ │ │ └── configuration.nix │ │ ├── gitea01/ # Conteneur LXC pour Gitea │ │ │ └── configuration.nix │ │ └── bitwarden/ # Conteneur LXC pour Bitwarden │ │ └── configuration.nix │ │ │ └── workstations/ # Stations de travail │ ├── dev-xavier/ # Station de Xavier │ │ └── configuration.nix │ ├── mao-julien/ # Station MAO │ │ └── configuration.nix │ └── bureautique/ # Station bureautique │ └── 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 │ │ ├── bitwarden/ │ │ │ └── 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 │ ├── admin/ │ │ └── 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 | DĂ©veloppement, | | | | | | Bureautique, | | | | | | MAO, | | | | | | Administration | | | | marley | Station de travail | Bureautique | | | --- ### **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) --- **Prochaine Ă©tape** : Ce canvas peut ĂȘtre placĂ© Ă  la racine de votre dĂ©pĂŽt sous le nom `README.md` ou dans un dossier `docs/`. Souhaitez-vous que j'ajoute ou modifie des sections spĂ©cifiques (ex: dĂ©tails sur un service, un exemple de module, ou un guide de dĂ©ploiement pas Ă  pas) ?