Ga naar inhoud

❄️ NixOS: Declaratieve Infrastructuur in het Lab

NixOS is een unieke, Linux-distributie die volledig declaratief is opgebouwd. In tegenstelling tot traditionele Linux-systemen (zoals Debian of Ubuntu) waar je handmatig configuraties aanpast en pakketten installeert, wordt een NixOS VM volledig gedefinieerd vanuit één enkel tekstbestand: configuration.nix. Dit sluit perfect aan bij de geavanceerde GitOps-filosofie van mijn homelab.

πŸ›‘οΈ Waarom NixOS Cruciaal is

Logo / App Feature Functie binnen het Netwerk
πŸ“œ Declaratief Beheer De complete staat van de OS en alle apps staat beschreven in één config-bestand
πŸ”„ Atomic Rollbacks Updates mislukt? Bij het opstarten kies je simpelweg de vorige werkende generatie
πŸ§ͺ Reproduceerbaar Kopieer de configuratie naar een nieuwe VM, en je hebt exact hetzelfde systeem binnen 1 minuut
🧼 Geen Systeemvervuiling Pakketten worden geïsoleerd opgeslagen; geen rondslingerende configuratierommel

βš™οΈ Inrichting & GitOps (Workflow)

NixOS draait als een lichtgewicht VM binnen Proxmox en wordt beheerd via Git-repositories.

  • Configuration.nix: Dit centrale bestand definieert de netwerkinstellingen, gebruikers, SSH-sleutels en actieve services.
  • Nix-Channel: Gekoppeld aan de stabiele of onstabiele NixOS-pakketbronnen voor de allernieuwste software.
  • Git Integratie: De OS-configuratie wordt beheerd in een Gitea repository, vergelijkbaar met onze MkDocs website.
  • Generaties: Elke systeemwijziging bouwt een nieuwe 'generatie'. Oude generaties blijven bewaard in het boot-menu.

❄️ NixOS Basisconfiguratie

Hierbij eenonderstaande, geoptimaliseerde configuration.nix voor de uitrol van je NixOS VM binnen je Proxmox-cluster. Deze configuratie bevat de Proxmox QEMU-guest-agent, Docker-ondersteuning en configureert de hoofdgebruiker spruitmans. uiteraard is dit aan te passen natuurlijk

# /etc/nixos/configuration.nix
{ config, pkgs, ... }:

{
  imports = [
    ./hardware-configuration.nix
  ];

  # --- Bootloader & Systeem ---
  boot.loader.grub.enable = true;
  boot.loader.grub.device = "/dev/sda"; # Pas aan naar jouw juiste disk (bijv. /dev/vda voor VirtIO)

  networking.hostName = "nixos-homelab";
  networking.networkmanager.enable = true;

  # Tijdzone en Lokalisatie
  time.timeZone = "Europe/Amsterdam";
  i18n.defaultLocale = "nl_NL.UTF-8";

  # --- Virtuele Omgeving (Proxmox KVM) ---
  services.qemuGuest.enable = true; # Activeert de nodige Proxmox agent

  # --- Gebruikersbeheer (`spruitmans`) ---
  users.users.spruitmans = {
    isNormalUser = true;
    description = "spruitmans";
    extraGroups = [ "networkmanager" "wheel" "docker" ]; # wheel geeft sudo-rechten
    shell = pkgs.zsh; # Moderne ZSH shell (optioneel, anders weglaten)
    # Vervang onderstaande string met je eigen publieke SSH-key voor wachtwoordloze login
    openssh.authorizedKeys.keys = [
      "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD..." 
    ];
  };

  # --- Systeempakketten ---
  environment.systemPackages = with pkgs; [
    vim
    wget
    curl
    git
    htop
    tmux
    unzip
  ];

  # Activeer benodigde programma's / shells
  programs.zsh.enable = true;

  # --- Systeemdiensten (Services) ---

  # SSH Toegang (Beveiligd)
  services.openssh = {
    enable = true;
    ports = [ 22 ];
    settings = {
      PasswordAuthentication = false; # Alleen SSH-keys toestaan voor maximale homelab veiligheid
      PermitRootLogin = "no";
    };
  };

  # Docker Virtualisatie Containerization
  virtualisation.docker.enable = true;

  # --- Nix Pakketbeheer Instellingen ---
  nix.settings.experimental-features = [ "nix-command" "flakes" ]; # Bereid de overstap naar Flakes voor
  nixpkgs.config.allowUnfree = true; # Staat non-FOSS software toe indien nodig

  # --- Firewall ---
  networking.firewall.enable = true;
  networking.firewall.allowedTCPPorts = [ 22 ];
  # networking.firewall.allowedUDPPorts = [ ... ];

  # Dit mag je NOOIT zomaar veranderen na installatie!
  system.stateVersion = "24.11"; 
}

πŸ› οΈ Dagelijks Beheer & Onderhoud

  • Nix-Env Garbage: Draai periodiek de garbage collector om oude, ongebruikte systeemgeneraties fysiek op te ruimen.
  • Systeem Herbouwen: Voer wijzigingen uitsluitend door via nixos-rebuild switch na het aanpassen van de config.
  • Channel Updates: Update de Nix-pakketbronnen om de VM te voorzien van de nieuwste beveiligingspatches.