Votre Serveur Parfait à Chaque Fois : Pourquoi NixOS sur Proxmox est une Révolution

Votre Serveur Parfait à Chaque Fois : Pourquoi NixOS sur Proxmox est une Révolution

Vous en avez marre des serveurs « flocons de neige » ? Ces VMs que vous avez mis des heures à configurer, mais que vous seriez incapable de reproduire à l’identique ? Vous priez à chaque apt upgrade pour que rien ne casse ? Alors laissez-moi vous présenter votre nouveau meilleur ami : NixOS.

NixOS n’est pas juste une autre distribution Linux. C’est une approche radicalement différente de la gestion de système, basée sur trois piliers magiques :

  1. Déclaratif : Vous ne donnez pas d’ordres à votre système. Vous décrivez l’état final que vous souhaitez dans un seul fichier de configuration (configuration.nix), et NixOS se charge de le réaliser. « Je veux Nginx, PostgreSQL et Docker » est tout ce que vous avez à dire.
  2. Reproductible : Ce fichier de configuration est la recette exacte de votre système. Donnez-le à une autre machine NixOS, et vous obtiendrez un clone parfait, au bit près. Fini le « ça marche sur ma machine » !
  3. Atomique : Les mises à jour ne se font jamais en direct. NixOS construit la nouvelle version de votre système à côté de l’ancienne. Si quelque chose se passe mal, vous pouvez redémarrer sur la version précédente instantanément, comme un voyage dans le temps.

Combiné à Proxmox, NixOS devient une arme absolue pour créer des templates de VMs parfaits, robustes et que vous pouvez recréer à l’infini sans jamais dévier. Prêt à construire votre première brique ? C’est parti !

Étape 1 : Récupérer l’ISO NixOS (Proprement !)

Avant toute chose, nous avons besoin de l’installateur de NixOS. On pourrait le télécharger à la main, mais un bon administrateur système automatise, n’est-ce pas ? Voici un petit script qui va s’en charger pour nous.

# ----- Variables -----
destination="/var/lib/vz/template/iso/"
url="https://channels.nixos.org/nixos-25.05/latest-nixos-minimal-x86_64-linux.iso"
nom_fichier=$(basename "$url")

# ----- Logique de téléchargement -----

# On vérifie si le dossier de destination existe, sinon on le crée
if [ ! -d "$destination" ]; then
    echo "Le répertoire n'existe pas. Création de $destination..."
    mkdir -p "$destination"
fi

# On vérifie si on n'a pas déjà l'ISO
if [ -f "$destination/$nom_fichier" ]; then
    echo "Le fichier $nom_fichier existe déjà. Aucun téléchargement effectué."
else
    echo "Téléchargement de $nom_fichier..."
    wget -P "$destination" "$url"
    echo "Téléchargement terminé."
fi

Ce que fait ce script :

  • Il définit où stocker nos ISOs (destination) et l’URL de la dernière version de NixOS.
  • Il vérifie intelligemment si le dossier existe, et le crée si besoin.
  • Plus malin encore, il regarde si le fichier est déjà là pour éviter de le télécharger à nouveau inutilement. C’est propre, c’est efficace, on aime.

Étape 2 : Créer la Machine Virtuelle (avec qm)

Maintenant que nous avons notre carburant (l’ISO), il est temps de construire la fusée (la VM). On va utiliser la puissante commande qm de Proxmox.

# ----- Variables de la VM (à personnaliser si besoin) -----
VM_ID="8000"
VM_STORAGE="local-lvm" # Adaptez à votre stockage

# ----- Création et configuration -----
echo "Création de la VM ${VM_ID}..."
qm create ${VM_ID} --name nixos-25.05-template --memory 2048 --cores 4 --cpu cputype=host

echo "Configuration du matériel..."
qm set ${VM_ID} --agent 1 --machine q35 --ostype l26 --onboot 1 --scsihw virtio-scsi-pci
qm set ${VM_ID} --net0 virtio,bridge=vmbr0 --ipconfig0 ip=dhcp

# L'ISO est montée comme un CD-ROM
qm set ${VM_ID} --scsi0 ${VM_STORAGE}:32 --ide2 local:iso/$nom_fichier,media=cdrom

# Configuration du boot en UEFI
qm set ${VM_ID} --bios ovmf --boot order='scsi0;ide2' --efidisk0 ${VM_STORAGE}:0,pre-enrolled-keys=0,efitype=4m,size=528K

echo "Démarrage de la VM..."
qm start ${VM_ID}

Décryptage de la magie qm :

  • qm create : C’est l’acte de naissance de notre VM. On lui donne un nom, de la RAM, des cœurs.
  • qm set (matériel) : On affine la configuration : activation de l’agent QEMU (très utile !), type de machine q35, configuration réseau…
  • qm set (disques) : C’est le point crucial. On crée un disque dur virtuel (scsi0) de 32Go et on attache notre ISO téléchargée comme un lecteur CD-ROM (ide2). L’option media=cdrom est vitale !
  • qm set (boot) : On configure la VM pour démarrer en mode UEFI (ovmf), et on lui dit de tenter de démarrer sur le disque dur d’abord, puis sur le CD-ROM.
  • qm start : On allume la machine !

Prochaines étapes

Et voilà ! En quelques secondes, vous avez une VM NixOS démarrée sur son installateur, prête à être configurée.

La prochaine étape est la plus intéressante : se connecter à la console de la VM via Proxmox et commencer l’installation en écrivant notre fameux configuration.nix. Mais ça, c’est une aventure pour le prochain article !

Vous venez de poser la première pierre d’une infrastructure propre, reproductible et incroyablement résiliente. Bienvenue dans le futur de l’administration système !

10 Comments

  1. jellium

    Merci pour votre article.
    J’avais tenté l’expérience NixOS sur un vaillant ancien ordinateur portable (en remplacement de Debian) et avais été séduit. Puis je m’étais un peu perdu dans les « flakes » et autres fonctionnalités « expérimentales » mais relativement hégémoniques, ce qui m’avait refroidi (j’ai réinstallé Debian).
    Parallèlement à cela j’ai tenté l’expérience Proxmox en lieu et place de LXD (puis Incus) sur Debian, et j’en suis enchanté.
    L’intersection de ces deux mondes (Proxmox et NixOS) me donnera sans doute un regard frais et bienvenu sur NixOS !
    Hâte d’en lire davantage.

  2. Hugo

    Au lieu de lancer un installateur, Nixos-generators permet de créer directement une image VMA pour Promox depuis une configuration Nix, automatisant toute la configuration.

    https://github.com/nix-community/nixos-generators

    • cedg

      Merci pour le com.
      Oui, je connais cette méthode aussi et j’en parlerais dans de futurs tutos, mais je commence par simple.

  3. Priareos

    Salut,

    Je débute avec Proxmox en ligne de commande. Pour le premier script j’ai dû supprimer tout ce qui est entre crochets mais c’était assez facile à corriger mê si je ne sais pas pourquoi il fallait corriger.
    Par contre le 2e, bien plus intéressant, ne déploie rien du tout, la VM cherche à booter en PXE. Voici l’output:

    Création de la VM 200…
    Configuration du matériel…
    update VM 200: -agent 1 -machine q35 -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
    update VM 200: -ipconfig0 ip=dhcp -net0 virtio,bridge=vmbr0
    unable to parse directory volume name ‘iso/’
    update VM 200: -scsi0 local-lvm:32,format=qcow2
    unsupported format ‘qcow2’ at /usr/share/perl5/PVE/Storage/LvmThinPlugin.pm line 101.
    update VM 200: -bios ovmf -boot order=scsi0;ide2 -efidisk0 local-lvm:0,pre-enrolled-keys=0,efitype=4m,size=528K
    invalid bootorder: device ‘scsi0′ does not exist’
    Démarrage de la VM…
    WARN: no efidisk configured! Using temporary efivars disk.
    Task finished with 1 warning(s)!
    root@pve2:/# nano nixos_deploy.sh
    root@pve2:/# chmod +x nixos_deploy.sh
    root@pve2:/# ./nixos_deploy.sh
    Création de la VM 200…
    Configuration du matériel…
    update VM 200: -agent 1 -machine q35 -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
    update VM 200: -ipconfig0 ip=dhcp -net0 virtio,bridge=vmbr0
    unable to parse directory volume name ‘iso/’
    update VM 200: -bios ovmf -boot order=scsi0;ide2 -efidisk0 local-lvm:0,pre-enrolled-keys=0,efitype=4m,size=528K
    Rounding up size to full physical extent 4.00 MiB
    WARNING: You have not turned on protection against thin pools running out of space.
    WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
    Logical volume « vm-200-disk-0 » created.
    WARNING: Sum of all thin volume sizes (<502.01 GiB) exceeds the size of thin pool pve/data and the size of whole volume group (237.97 GiB).
    Logical volume pve/vm-200-disk-0 changed.
    transferred 0.0 B of 528.0 KiB (0.00%)
    transferred 528.0 KiB of 528.0 KiB (100.00%)
    transferred 528.0 KiB of 528.0 KiB (100.00%)
    efidisk0: successfully created disk 'local-lvm:vm-200-disk-0,efitype=4m,pre-enrolled-keys=0,size=4M'
    invalid bootorder: device 'scsi0' does not exist'
    Démarrage de la VM…

  4. Priareos

    Problème résolu, il suffisait d’ajouter le chemin pour l’iso mais encore une fois, pourquoi le script n’est-il pas complet?

    • cedg

      Bonsoir, je pense surtout que vous n’avez pas compris que c’est UN seul script…
      Le nom de l’iso est là : local:iso/$nom_fichier et il est défini par : nom_fichier=$(basename « $url »)
      Cdt.

  5. Priareos

    Bonjour, j’ai effectivement procédé par étape, la première partie posant déjà problème en ne téléchargeant pas l’iso. Quoiqu’il en soit ça fonctionne parfaitement maintenant alors j’attends avec impatience la suite.

    • cedg

      C’est corrigé pour l’url. Un copié/collé trop rapide à partir de mon wiki… J’expliquerai d’ailleurs aussi comment héberger son propre wiki.

  6. Priareos

    Merci pour votre réactivité.

  7. xataz

    Merci pour cette article, j’ai justement réinstaller mon laptop hier sur NixOS, et franchement c’est plutôt cool
    Juste une petite remarque, en configuration standard, c’est pas totalement reproductible, il peut y avoir des différences, souvent légère, sauf si on utilise les flakes, ce qui complexifie les choses.
    Par contre je me posais une question, jusqu’à quel point c’est transportable ? Car il y a quand même le hardware-configuration.nix qui peux être propre a chaque machine, puisque auto générer, comment ça se passe ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *