This commit is contained in:
2026-09-06 17:32:17 +02:00
commit e37e956f95
12 changed files with 956 additions and 0 deletions
+115
View File
@@ -0,0 +1,115 @@
# Pas de shebang ici : ce fichier est injecté comme corps de script par
# pkgs.writeShellScriptBin dans installer-base.nix (qui ajoute déjà
# `#!...` + `set -euo pipefail`).
#
# Installeur unique pour les deux repos :
# - branche "flotte" -> nixos_fleet (public, jamais chiffré)
# - branche "utilisateur nommé" -> nixos_users (privé, chiffrement au choix)
# Ce script ne contient aucun secret : le token du repo privé est saisi en
# direct, jamais stocké dans ce fichier ni dans un repo git.
FLEET_REPO="git+https://gitea.miniclic.net/Damien/Nixos_Fleet.git"
USERS_REPO_HOST="gitea.miniclic.net"
USERS_REPO_PATH="Damien/Nixos_Users.git"
echo "=== Installeur Nixos_Fleet ==="
echo "1) PC de la flotte (générique)"
echo "2) Poste utilisateur nommé"
read -rp "Choix [1/2] : " CHOICE
# --- Détection automatique du disque cible -------------------------------
# On exclut les disques amovibles (la clé USB de boot elle-même) et les
# loop/rom. S'il en reste plusieurs (rare), on prend le plus gros et on le
# signale clairement dans les logs plutôt que de bloquer sur un menu.
echo
echo "Détection du disque cible..."
mapfile -t CANDIDATES < <(
lsblk -dn -b -o NAME,TYPE,RM,SIZE |
awk '$2 == "disk" && $3 == 0 { print $4, $1 }' |
sort -rn
)
if [ "${#CANDIDATES[@]}" -eq 0 ]; then
echo "Aucun disque fixe détecté. Abandon." >&2
exec bash
fi
DEVICE="/dev/$(echo "${CANDIDATES[0]}" | awk '{print $2}')"
if [ "${#CANDIDATES[@]}" -gt 1 ]; then
echo "ATTENTION : plusieurs disques fixes détectés, le plus gros a été retenu : $DEVICE"
printf ' %s\n' "${CANDIDATES[@]}"
else
echo "Disque retenu : $DEVICE"
fi
case "$CHOICE" in
1)
# --- Branche flotte : rien d'autre à saisir -----------------------
echo
echo "Installation du profil générique 'usagers' sur $DEVICE..."
nix run 'github:nix-community/disko#disko-install' -- --write-efi-boot-entries \
--flake "${FLEET_REPO}#usagers" \
--disk main "$DEVICE"
;;
2)
# --- Branche utilisateur nommé -------------------------------------
read -rp "Utilisateur (thomas/clara/jade/oreo) : " USER_PROFILE
USER_PROFILE=$(echo "$USER_PROFILE" | tr '[:upper:]' '[:lower:]' | xargs)
case "$USER_PROFILE" in
thomas|clara|jade|oreo) ;;
*)
echo "Utilisateur inconnu : $USER_PROFILE" >&2
exec bash
;;
esac
read -rp "Chiffrer le disque ? [o/N] : " ENCRYPT
ATTR="$USER_PROFILE"
if [[ "$ENCRYPT" =~ ^[oOyY] ]]; then
ATTR="${USER_PROFILE}-luks"
fi
read -rsp "Token Gitea (repo privé Nixos_Users) : " TOKEN
echo
# Le token n'est utilisé qu'en mémoire/ligne de commande pour ce fetch
# ponctuel : il n'est jamais écrit dans un fichier suivi par git.
AUTHED_URL="git+https://${TOKEN}@${USERS_REPO_HOST}/${USERS_REPO_PATH}"
echo
echo "Installation du profil '$ATTR' sur $DEVICE..."
if [[ "$ATTR" == *-luks ]]; then
echo "Disque chiffré : disko va demander une passphrase LUKS pendant le partitionnement."
fi
nix run 'github:nix-community/disko#disko-install' -- --write-efi-boot-entries \
--flake "${AUTHED_URL}#${ATTR}" \
--disk main "$DEVICE"
# Le système installé doit pouvoir continuer à tirer ses mises à jour
# du repo privé tout seul : on lui laisse un netrc, jamais commité,
# jamais dans le Nix store (nix.settings.netrc-file dans le repo
# nixos_users pointe vers ce même chemin).
#
# ATTENTION : le format exact attendu par Gitea (login=token vs
# login+password séparés) dépend de la version/config du serveur —
# à vérifier sur l'instance réelle avant le déploiement pilote.
mkdir -p /mnt/etc/nix
{
echo "machine ${USERS_REPO_HOST}"
echo "login ${TOKEN}"
echo "password x-oauth-basic"
} > /mnt/etc/nix/netrc
chmod 600 /mnt/etc/nix/netrc
;;
*)
echo "Choix invalide." >&2
exec bash
;;
esac
echo
echo "Installation terminée. Redémarrage dans 10s (Ctrl-C pour annuler et inspecter /mnt)..."
sleep 10
reboot
+48
View File
@@ -0,0 +1,48 @@
# Environnement live commun aux deux formes d'image (PXE netboot / ISO
# USB). Contient juste de quoi partitionner et lancer disko-install ; la
# vraie configuration cible est toujours récupérée depuis git au moment
# de l'install (repo public nixos_fleet ou repo privé nixos_users).
{ pkgs, lib, ... }:
let
installScript = pkgs.writeShellScriptBin "fleet-install" (builtins.readFile ./install.sh);
in
{
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
environment.systemPackages = with pkgs; [
git
parted
gptfdisk
util-linux # lsblk
installScript
];
# disko-install n'est pas préinstallé : install.sh l'invoque via
# `nix run github:nix-community/disko#disko-install`, ce qui évite de
# dépendre d'un nom de paquet nixpkgs précis (pas de package `disko`
# garanti tel quel côté nixpkgs) et reste conforme à l'usage documenté
# du projet.
networking.networkmanager.enable = true;
services.xserver.xkb.layout = "fr";
console.keyMap = "fr";
# Root autologin sur tty1, l'installeur se lance automatiquement au
# login. S'il échoue ou qu'on le quitte, on retombe sur un shell root
# normal pour dépanner à la main — pas de piège sans issue.
services.getty.autologinUser = "root";
users.users.root.password = lib.mkForce "";
environment.etc."profile.d/00-fleet-installer.sh".text = ''
if [ "$(tty)" = "/dev/tty1" ] && [ -z "$FLEET_INSTALLER_RAN" ]; then
export FLEET_INSTALLER_RAN=1
${installScript}/bin/fleet-install
fi
'';
system.stateVersion = "26.05";
}
+9
View File
@@ -0,0 +1,9 @@
# Image ISO bootable sur clé USB, en secours du PXE (même install.sh).
{ modulesPath, ... }:
{
imports = [
(modulesPath + "/installer/cd-dvd/installation-cd-minimal.nix")
./installer-base.nix
];
}
+9
View File
@@ -0,0 +1,9 @@
# Image PXE (kernel + initrd + squashfs), servie par pxe-server/.
{ modulesPath, ... }:
{
imports = [
(modulesPath + "/installer/netboot/netboot-minimal.nix")
./installer-base.nix
];
}