Back openDesk Edu for a sovereign, open-source education â every vote counts.
Vote nowSave products you love by clicking the heart icon.
The hands-on Nix path: install, nix-shell, flakes, packaging, dockerTools images, NixOS â plus caches, secrets, disko, and tests.
Nix wird oft als radikaler Bruch dargestellt: ein komplett neues Betriebssystem, eine neue Art, Software zu bauen, ein neues mentales Modell fĂŒr alles. Diese Darstellung schreckt Teams ab, denn âalles auf NixOS umstellenâ klingt nach einer Migration ĂŒber mehrere Quartale ohne Zwischenstopps.
Die RealitĂ€t sieht anders aus. Nix ist eine Leiter â man kann Sprosse fĂŒr Sprosse aufsteigen, und jede Sprosse rentiert sich, bevor man entscheidet, ob man weiter klettert. Der âNix-Spiritâ ist kein spezifisches Tool; es ist eine Reihe von Eigenschaften, die man inkrementell ĂŒbernehmen kann:
Dieser Artikel definiert sechs Stufen der Ăbernahme dieses Spirits, von âfixierten Tools in einer Shellâ bis hin zu âimmutablen, selbstheilenden Appliancesâ, und begrĂŒndet jede Stufe anhand realer Deployments: ein neun-Knoten-K3s-Cluster, provisioniert mit OpenTofu und Ansible, ein air-gapped drei-Knoten-K3s-Cluster mit Ceph-Storage und ein Groupware-Stack (SOGo, OpenLDAP, Stalwart), dessen Container-Images mit Nix gebaut werden.
Die Leiter ist kein Befehl, die Spitze erreichen zu mĂŒssen. Jede Sprosse rentiert sich, bevor man entscheidet, ob man weiter klettert â die gĂŒnstigste (eine fixierte devShell) ist gleichzeitig diejenige, die die hĂ€ufigsten tĂ€glichen Probleme löst.
Die Baseline, von der die meisten Infrastrukturen starten: Per SSH auf einen Host einloggen, Dinge apt install, Konfigurationsdateien manuell bearbeiten und hoffen, dass das Backup der Konfigurationsdatei aktuell ist. Der Zustand lebt auf der Maschine, nicht im Code.
Das Versagensmuster ist der Drift. Die Person, die den Host provisioniert hat, ist ausgeschieden; die Wiki-Seite, die den speziellen Cronjob erklĂ€rt, ist weg; der Monitoring-Alarm fĂŒr den Dienst, von dem âniemand weiĂ, wer ihn eingerichtet hatâ, wird stummgeschaltet. Audits werden zur ArchĂ€ologie.
Sie wissen, dass Sie bereit fĂŒr Level 1 sind, wenn einer der folgenden Punkte zutrifft:
Die erste Sprosse ist die gĂŒnstigste und am unmittelbarsten nĂŒtzlichste: Nutzen Sie Nix, um zu definieren, welche Tools in Ihrer Shell existieren. Eine flake.nix mit einer devShell ersetzt den Abschnitt âInstallieren Sie diese 12 Toolsâ in Ihrem README durch einen einzigen Befehl â nix develop â, der jedem Contributor die exakt gleiche Toolchain auf jeder Linux- oder macOS-Maschine zur VerfĂŒgung stellt.
Ein reales Beispiel aus einem Kubernetes-Operations-Repo:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system};
in {
devShells.default = pkgs.mkShell {
packages = [
pkgs.kubectl
pkgs.kubernetes-helm
pkgs.helmfile
pkgs.ansible
pkgs.yq-go
];
};
});
}
Dies ist kein Spielzeugbeispiel â es ist das Muster, das verwendet wird, um die exakte Admin-Toolchain (kubectl 1.32.3, helm 3.15.3, helmfile 0.150.0, ansible 2.16.0, yq) fĂŒr ein Multi-Cluster-Deployment zu fixieren. Die Vorteile in der Praxis:
flake.lock. Niemand schleicht eine Ănderung einer Minor-Version des CLI ein, die sich in der Produktion anders verhĂ€lt.nix develop funktioniert auf einem Laptop, einem Jump-Host hinter einem HTTP-Proxy und einem CI-Runner. In einer air-gapped Umgebung wird die Closure entweder vorab abgerufen oder aus einem lokalen Cache bereitgestellt â keine curl | sh aus dem Internet.Was es kostet: Das Erlernen der Flake-Syntax und einiger Nix-Idiome. Das ist ein Wochenende, kein Quartal. Wann man hier aufhört: Wenn Ihr Problem ausschlieĂlich darin besteht, dass âdie Tools zwischen den Maschinen variierenâ, löst dieses Level das bereits.
Die zweite Sprosse: Nutzen Sie Nix, um die Artefakte zu bauen, die Ihr Deployment konsumiert â am hĂ€ufigsten OCI-Container-Images. dockerTools.buildImage und buildLayeredImage erzeugen Images, die reproduzierbar sind, ĂŒber den Store-Pfad Layer-gecached werden und frei von der Unsicherheit âletzten Dienstag von Docker Hub gezogenâ sind.
Das Muster, das sich in der Praxis bewÀhrt hat, ist ein Flake pro Service, wobei das Image als Package-Output dient und derselbe Ausdruck als CI-Check wiederverwendet wird:
{
description = "Nix flake for OpenLDAP container images";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/release-24.05";
};
outputs = { self, nixpkgs, ... }@inputs:
let
supportedSystems = [ "x86_64-linux" "aarch64-linux" ];
mkImage = system:
import ./images/openldap.nix {
inherit system;
pkgs = nixpkgs.legacyPackages.${system};
};
in {
packages = nixpkgs.lib.genAttrs supportedSystems (system: {
openldap = mkImage system;
default = mkImage system;
});
checks = nixpkgs.lib.genAttrs supportedSystems (system: {
default = mkImage system;
});
};
}
Drei Eigenschaften dieses Flakes sind es wert, kopiert zu werden:
genAttrs ĂŒber supportedSystems leitet x86_64- und aarch64-Images aus einem einzigen Ausdruck ab â keine separaten Dockerfiles, die auseinanderdriften. Derselbe Trick, via extendModules, leitet Umgebungsvarianten aus einer einzigen Basis-Konfiguration ab.checks bedeutet, dass nix flake check in der CI sie auswertet und baut. Wenn der Ausdruck bricht, bricht die CI â bevor irgendetwas in eine Registry gepusht wird.sed-Befehlen in einem Dockerfile. Ein Groupware-Frontend, das Accessibility-Fixes benötigte (ein z-index-Bug bei einem Dialog, ein Kontrastproblem bei einem Platzhalter, ein Theme-Mismatch), wird als Patch ausgeliefert, der wĂ€hrend des Builds angewendet wird â der exakte Satz an Ănderungen ist in der Versionsverwaltung sichtbar und fĂŒr immer reproduzierbar.In einem air-gapped Cluster rentiert sich diese Sprosse sofort: Images werden einmal gebaut, in eine lokale Registry geladen, und die Nodes benötigen ĂŒberhaupt keinen Zugriff auf Docker Hub. nix build + docker load + docker tag + push ist die gesamte Publish-Pipeline.
Was es kostet: eine dockerTools Lernkurve und anfangs langsamere Iterationen als bei einem Dockerfile. Wann man hier aufhört: wenn Ihr Team eine Handvoll Images verwaltet und der Schmerzpunkt darin liegt: âWas genau ist in diesem Image und wer hat es wann gebautâ.
Die dritte Stufe befasst sich mit dem Ăkosystem rund um die Builds: Nix wird zum gemeinsamen Substrat dafĂŒr, wie Code im Team formatiert, geprĂŒft und verteilt wird.
treefmt mit nixfmt (Formatter), statix (Linter mit Autofix) und deadnix (Entfernung von totem Code) wird zur einzigen Quelle der Wahrheit (âSingle Source of Truthâ) dafĂŒr, was âformatiertes Nixâ bedeutet. Ein nix fmt pro Repo, erzwungen in der CI.nix flake check als CI-Gate. Eval-only-Checks, Image-Builds und sogar vollstĂ€ndige NixOS-Integrationstests (testers.runNixOSTest, die eine VM booten und das Service-to-Service-Verhalten prĂŒfen) laufen, bevor etwas gemergt wird.nix-serve, Attic oder harmonia mit signierten Store-Pfaden ermöglichen es jedem Node und jedem CI-Runner, vorab gebaute Artefakte zu ziehen, anstatt sie lokal zu bauen. Ein post-build-hook lĂ€dt jeden neuen Pfad automatisch hoch. In einem Air-Gapped-Netzwerk ist dies der Unterschied zwischen âder Cluster baut in Minuten neuâ und âder Cluster baut einen Tag lang neuâ.nix.buildMachines und nix.distributedBuilds zur Build-Farm der Flotte.Ein subtiles, aber mĂ€chtiges Muster auf dieser Ebene: Nix als Konfigurationsgenerator. Anstatt Kubernetes-Manifeste hĂ€ndisch zu schreiben, generiert das Deployment diese aus Nix â eine Library mit einer k8s Funktion wandelt typisierte Nix-Werte in YAML um. Alle 57 Services eines Deployments (von ArgoCD und Monitoring bis hin zum Mail-Stack) werden aus einem einzigen Expression-Tree abgeleitet. Die Manifeste sind im Cluster weiterhin YAML, aber es ist generiertes YAML mit einem einzigen Ursprung, und die Neugenerierung ist ein Build-Schritt, keine manuelle Bearbeitungssitzung.
Was es kostet: Infrastruktur (ein Cache-Server, eine Build-Maschine) und CI-Plumbing. Wann man hier aufhört: wenn Ihre Images mit Nix gebaut werden, Ihre Nodes und Maschinen aber immer noch imperativ verwaltet werden â Level 4 ist ein anderes Projekt.
Die vierte Stufe ist diejenige, die sich die meisten Menschen vorstellen, wenn sie âNixâ hören: das OS selbst wird in einem Flake deklariert. /etc wird aus der Konfiguration generiert; ein Rollback ist ein Eintrag im Boot-MenĂŒ; Secrets sind im Repo verschlĂŒsselt und nicht ĂŒber Hosts verteilt.
Die modernen Muster, die alle im Ăkosystem praxiserprobt sind:
disko deklariert Partitionen, Dateisysteme und LUKS-VerschlĂŒsselung im selben Flake; nixos-anywhere installiert eine Remote-Maschine aus dieser Deklaration ĂŒber SSH, ohne dass man eine ISO-Installation begleiten muss.impermanence oder systemd StateDirectory=) ĂŒberlebt. Eine kompromittierte oder korrupte Maschine kehrt durch einen Neustart in ihren deklarierten Zustand zurĂŒck.agenix und ININ21 verschlĂŒsseln Secrets im Repo; systemd LoadCredential= ĂŒbergibt sie den Services zur Laufzeit.nixos-rebuild pro Host bleibt fĂŒr den Single-Machine-Fall.Wo lĂ€sst das einen Cluster, der bereits Kubernetes ist, stehen? Die ehrliche Antwort aus Erfahrung: NixOS-Nodes und K8s-Workloads ergĂ€nzen einander. Die Nodes des Clusters werden reproduzierbar, selbstheilend und synchron gepatcht (ein Flake = ein bekannt-gut funktionierendes Node-Image), wĂ€hrend die Workloads weiterhin in Containern mit ihrem eigenen Lebenszyklus laufen. Ansible hat immer noch eine Rolle beim Bootstrap und fĂŒr Dinge, die Nix nicht gut modelliert â aber die driftanfĂ€llige Zwischenschicht (hĂ€ndisch editierte /etc, Ad-hoc-Pakete, manuelle sysctls) verschwindet.
Was es kostet: die steilste Lernkurve bisher; NixOS hat seine eigene Art, Networking, Benutzer und Services zu handhaben. Wann man hier aufhört: wenn Ihre Flotte klein ist und Ihre Nodes bereits âPetsâ sind, die Sie selten anfassen, ist der ROI möglicherweise noch nicht gegeben.
Die oberste Stufe: Die Maschine hört auf, eine Maschine zu sein, und wird zu einem Appliance. Alles Vorherige gilt, plus:
systemd-sysupdate (oder das nixos-appliance-ota-update Muster) hĂ€lt zwei Slots bereit; ein fehlgeschlagener Boot fĂŒhrt automatisch zum vorherigen Slot zurĂŒck.lanzaboote signiert Unified Kernel Images; TPM-basierte FestplattenverschlĂŒsselung bindet die Disk an die Hardware.Auf dieser Ebene ist das âUpdaten eines Serversâ nicht mehr von einem âDeployment neuer Firmwareâ zu unterscheiden. Dies ist das Muster fĂŒr Edge-Devices, Kiosks und Remote-Standorte, an denen niemand per SSH einbauen kann, um ein fehlgeschlagenes Upgrade zu reparieren â aber es ist auch ein legitimes Endziel fĂŒr Core-Infrastruktur-Nodes.
Um ehrlich zu bleiben, hier ist die Position der Deployments hinter den Beispielen dieses Artikels auf der Leiter:
| Layer | Level heute | Notizen |
|---|---|---|
| Admin-Tooling (kubectl, helm, helmfile, ansible) | 1 â gepinnte devShell | Ein Flake, genutzt von Laptops und Jump-Hosts |
| Mail/Groupware-Images (SOGo, OpenLDAP 2.6.7, Stalwart) | 2 â Nix-gebaute Container | Multi-Arch-Flakes, Checks in CI, lokale Registry |
| K8s-Manifest-Generierung | 3 â Nix-generiertes YAML | ~57 Services, abgeleitet aus einem Expression-Tree |
CI-Gates (treefmt, nix flake check) | 3 â partiell | Formatter und Linting eingefĂŒhrt; vollstĂ€ndiges Check-Gate in Arbeit |
| Binary Cache fĂŒr den Air-Gapped-Cluster | 3 â geplant | Attic/nix-serve + post-build-hook, signierte Store-Pfade |
| Cluster-Nodes (K3s auf Bare Metal / Proxmox) | 0â1 â OpenTofu + Ansible | VollstĂ€ndig parametrisiert, aber imperativer State auf den Nodes |
| Node-OS | 4â5 â Roadmap | disko, impermanence, A/B OTA als Zielzustand |
Der Migrationspfad, sortiert nach Wert pro Aufwandseinheit:
Die Leiter ist kein Befehl, die Spitze erreichen zu mĂŒssen. Das richtige Level hĂ€ngt von drei Fragen ab:
Beginnen Sie diese Woche mit Level 1 â pinnen Sie Ihre Toolchain in einem devShell, committen Sie die flake.lock und machen Sie âworks on my machineâ zu einer historischen Phrase. Alles darĂŒber hinaus ist eine Serie von kleinen, einzeln sinnvollen Wetten, keine Revolution.
Click a rung to see what it gives you, what it costs, and when to stop climbing.
Cost: A weekend of flake syntax and Nix idioms.
Stop here if: When your pain is only 'tools differ between machines', this level already fixes it.
Answer honestly about today â the assessment tells you where you stand and which rung to climb next.
Reproduzierbarkeit summiert sich. Die devShell, die Sie diese Woche pinnen, ist derselbe Expression-Tree, der eines Tages Ihre Appliances bauen wird â jede Stufe, die Sie erklimmen, macht die nĂ€chste gĂŒnstiger.