diff --git a/.ai-rules.md b/.ai-rules.md new file mode 100644 index 0000000..2eff652 --- /dev/null +++ b/.ai-rules.md @@ -0,0 +1,66 @@ +# Règles du Projet : nixos-infra + +## Contexte Technique +**Stack :** NixOS 25.11, agenix, bash, SSH, Proxmox VE, LXC, KVM, IPv4, IPv6 +**Environnement :** VSCodium (VSCode) sur Debian 13 + extension Continue poru l'IA, bash, SSH, Gitea, IPv4, IPv6 +**Package Manager :** Nix +**Style :** Privilégier la modularité, dans la philosophie Unix. Utilisation de bash pour les tâches d'exploitation, avec un fallback sur python si bash devient impossible à maintenir. +**Tests :** Test Driven Development dans la mesure du possible. +**Matériels :** ordinateurs de bureau X86-64, un vieux Dell T62°, un vieux Dell T330, un Rpi 3B + +## Conventions de Code +**Nommage :** camelCase pour les variables, PascalCase pour les composants et types. Majuscules et "_" pour les variables d'environnement shell. +**Types :** N/A +**Imports :** N/A +**Formatage :** +- Utiliser exclusivement `alejandra` ou `nixfmt-rfc-style`. Ne jamais laisser de trailing whitespaces. +- Préférer `inherit` pour les variables de même nom. +- Utiliser `with lib;` ou `with builtins;` avec parcimonie à l'intérieur des fonctions, mais préférer les chemins explicites pour la clarté. +- Toujours déclarer les arguments en début de fichier : `{ config, pkgs, lib, ... }:`. +**Modularité :** Chaque service doit être encapsulé dans un module avec une option `enable` (ex: `services.mon-service.enable = true;`). + +## Architecture & Dossiers +**Architecture :** +Le but est de permettre le déploiement et la maintenance de services d'infrastructure réseau et applicatifs +(DNS, serveur de dépôts git, gestionnaire de mots de passe, file server, backup server, reverse proxy, +workstations, etc.). Le dépôt git contient l'ensemble des fichiers permettant de configurer et installer +n'importe quelle machine du parc (images d'OS, fichiers de configuration et scripts de déploiemente et maintenance). +En cible, reconstruire l'ensemble du parc doit être possible depuis une workstation Linux (pas forcément NixOS) sur lequel ce dépôt aura été cloné. + +**Dossiers :** +- `/nixos-infra/hosts/servers` : Configurations spécifiques de chaque serveur (.nix, lxc.config). +- `/nixos-infra/hosts/workstations` : Configurations spécifiques de chaque station de travail (.nix, lxc.config). +- `/nixos-infra/modules/machine-types` : Modules Nix standardisant les différents types d'hotes (hyperviseur, VM, LXC, stations, etc.). +- `/nixos-infra/modules/services` : Modules Nix standardisant les différents services d'infrastructure réseau (DNS, etc.). +- `/nixos-infra/modules/user-profiles` : Modules Nix standardisant les différents profils d'utilisateurs (admin, dev, burautique, etc.). +- `/nixos-infra/overlays` : Overlays Nix (dernier recours). +- `/nixos-infra/pkgs` : Paquets personnalisés non présents dans Nixpkgs. +- `/nixos-infra/lib` : Fonctions utilitaires Nix. +- `/nixos-infra/scripts` : Scripts d'exploitation et de helpers. + +Le point d'entrée pour chaque machine est hosts//\/configuration.nix. + +## Gestion des Secrets +**Interdiction Formelle :** Ne JAMAIS écrire de mot de passe, clé d'API ou token en clair dans les fichiers `.nix`. +**Outil :** Utiliser **agenix**. + +## Instructions NixOS +1. Ne pas utiliser les flakes Nix. +2. Toujours vérifier si une option (https://search.nixos.org/options), un paquetage (https://search.nixos.org/packages) ou une fonction (https://noogle.dev/) avant de l'inventer. +3. Ne pas supposer que la workstation utilisée est elle-même sous NixOS. L'environnement de développement est sous Debian Trixie jusqu'à ce que le projet soit complètement auto-porteur. Néanmoins, le paquetage "nix-bin" est installé pour disposer des binaires de Nix. +4. Utiliser nix-isntantiate pour vérifier la syntaxe et l'évaluation des fichiers Nix: +``` +nix-instantiate --parse chemin/vers/fichier.nix # Vérifie la syntaxe +nix-instantiate --eval -E 'import ./hosts/machine/configuration.nix {}' # Vérifie l'évaluation +``` + +## Instructions Spécifiques (Guidelines) +1. Ne **jamais** exposer de mot de passe, de clef API ou tout secret en clair. Utiliser les mécanismes de gestion/protection de secrets appropriés au contexte. +2. Privilégier les clefs SSH pour l'authentification aux systèmes. +3. Signaler les éventuelles incohérences de pratiques au sein du projet ou avec les bonnes pratiques. + +## Préférences de Réponses +- Langue : Français. Le code reste en Anglais. +- Style : Technique, concis, orienté "Infrastructure as Code". +- Toujours expliquer brièvement *pourquoi* une option NixOS spécifique a été choisie (référence aux options officielles). +- Me signaler si et quand il aura été difficile ou impossible de respecter les instructions fournies dans .ai-rules.md . diff --git a/nixos-infra/pkgs/default.nix b/nixos-infra/pkgs/default.nix new file mode 100644 index 0000000..435849e --- /dev/null +++ b/nixos-infra/pkgs/default.nix @@ -0,0 +1,7 @@ +let + spec = builtins.fromJSON (builtins.readFile ./nixpkgs.json); +in +import (builtins.fetchTarball { + url = "https://github.com/NixOS/nixpkgs/archive/${spec.rev}.tar.gz"; + sha256 = spec.sha256; +}) \ No newline at end of file diff --git a/nixos-infra/pkgs/nixpkgs.json b/nixos-infra/pkgs/nixpkgs.json new file mode 100644 index 0000000..2e98baa --- /dev/null +++ b/nixos-infra/pkgs/nixpkgs.json @@ -0,0 +1,5 @@ +{ + "url": "https://github.com/NixOS/nixpkgs/archive/755f5aa91337890c432639c60b6064bb7fe67769.tar.gz", + "rev": "755f5aa91337890c432639c60b6064bb7fe67769", + "sha256": "1lmn8dicfwmsfdaiw18xjjys78bal6yjy3a41j02my7kw0wlb76a" +} diff --git a/nixos-infra/scripts/update-nixpkgs.sh b/nixos-infra/scripts/update-nixpkgs.sh new file mode 100755 index 0000000..e0c6081 --- /dev/null +++ b/nixos-infra/scripts/update-nixpkgs.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Met à jour le commit de référence pour Nixpkgs + +BRANCH="nixos-25.11" +REPO="https://github.com/NixOS/nixpkgs" +JSON_FILE="$(dirname "$0")/../pkgs/nixpkgs.json" + +echo "Récupération du dernier commit sur $BRANCH..." +REV=$(git ls-remote $REPO refs/heads/$BRANCH | cut -f1) + +if [ -z "$REV" ]; then + echo "Erreur : Impossible de récupérer le commit." + exit 1 +fi + +echo "Calcul du hash (cela peut prendre un moment)..." +SHA256=$(nix-prefetch-url --unpack "https://github.com/NixOS/nixpkgs/archive/$REV.tar.gz") + +cat < "$JSON_FILE" +{ + "url": "https://github.com/NixOS/nixpkgs/archive/$REV.tar.gz", + "rev": "$REV", + "sha256": "$SHA256" +} +EOF + +echo "Succès ! Nixpkgs est maintenant épinglé au commit : $REV" \ No newline at end of file diff --git a/scripts/create-lxc.sh b/scripts/create-lxc.sh new file mode 100644 index 0000000..46401dc --- /dev/null +++ b/scripts/create-lxc.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# Usage: create-lxc.sh --proxmox-server SERVER --user= --identity FIEL [--config-file LXC_CONFIG_FILE] + +# Parse command line arguments using docopts + +# Connect to Proxmox VE server using provided credentials + +# Create LXC container with provided configuration + +# Configuration can be provided via stdin or a file + +# Fail if both stdin and file are provided + +# Example usage: +# cat lxc-config.conf | ./create-lxc.sh --proxmox-server=192.168.1.1 --username=admin --password=password +# or +# ./create-lxc.sh --proxmox-server=192.168.1.1 --username=admin --password=password --config-file=lxc-config.conf + +# Example lxc-config.conf: +# lxc.network.type: veth +# lxc.network.link: eth0 +# lxc.network.flags: up +# lxc.network.hwaddr: 00:16:3e:xx:xx:xx +# lxc.network.ipv4: 192.168.1.100/24 +# lxc.network.ipv4.gateway: 192.168.1.1 +# lxc.network.ipv6: 2001:db8::100/64 +# lxc.network.ipv6.gateway: 2001:db8::1 + +# Parse command line arguments using docopts + +# Connect to Proxmox VE server using provided credentials + +# Create LXC container with provided configuration + +# Configuration can be provided via stdin or a file + +# Fail if both stdin and file are provided + +# Example usage: +# cat lxc-config.conf | ./create-lxc.sh --proxmox-server=192.168.1.1 --username=admin --password=password +# or +# ./create-lxc.sh --proxmox-server=192.168.1.1 --username=admin --password=password --config-file=lxc-config.conf + +# Example lxc-config.conf: +# lxc.network.type: veth +# lxc.network.link: eth0 +# lxc.network.flags: up +# lxc.network.hwaddr: 00:16:3e:xx:xx:xx +# lxc.network.ipv4: 192.168.1.100/24 +# lxc.network.ipv4.gateway: 192.168.1.1 +# lxc.network.ipv6: 2001:db8::100/64 +# lxc.network.ipv6.gateway: 2001:db8::1