# NixOS Spickzettel

Kurzreferenz für die häufigsten NixOS-Kommandos: System updaten, `nix shell` nutzen,
Pakete einmalig ausführen und nach Paketen suchen.

## System updaten

System-Konfiguration neu bauen und aktivieren (nach Änderungen an `/etc/nixos/configuration.nix`
oder dem Flake):

```bash
sudo nixos-rebuild switch
```

Nur testen (aktiviert erst beim nächsten Boot als Default, aber sofort für die aktuelle Session):

```bash
sudo nixos-rebuild test
```

Wenn mit Flakes gearbeitet wird:

```bash
sudo nixos-rebuild switch --flake /etc/nixos#hostname
```

Channels aktualisieren (klassisches, nicht-Flake-Setup):

```bash
sudo nix-channel --update
```

Alte Generationen aufräumen (Speicherplatz freigeben):

```bash
sudo nix-collect-garbage -d
```

## `nix shell` nutzen

Startet eine temporäre Shell mit den angegebenen Paketen, ohne sie dauerhaft zu installieren:

```bash
nix shell nixpkgs#ripgrep nixpkgs#fd
```

Danach sind `rg` und `fd` in der aktuellen Shell verfügbar, verschwinden aber nach dem Verlassen
der Shell wieder. Für das klassische (nicht-Flake) Äquivalent:

```bash
nix-shell -p ripgrep fd
```

## Ein Paket einmalig ausführen (ohne Config-Eintrag)

Ideal, um ein Tool kurz auszuprobieren, ohne es in `configuration.nix` einzutragen:

```bash
nix run nixpkgs#hello
```

Klassisches Äquivalent:

```bash
nix-shell -p hello --run hello
```

## Nach Paketen suchen

Über die Kommandozeile (Flakes/neues CLI):

```bash
nix search nixpkgs firefox
```

Alternativ über die Weboberfläche: https://search.nixos.org/packages

Nach NixOS-Optionen suchen (z. B. für `configuration.nix`):

```bash
man configuration.nix
```

Weboberfläche für Optionen: https://search.nixos.org/options

## Need to know

- **Deklarativ statt manuell**: Runtime-Änderungen wie `sysctl foo=bar` von Hand oder ein
  manuell installiertes Paket überleben keinen Reboot bzw. werden beim nächsten `switch`
  überschrieben. Alles Dauerhafte gehört in `configuration.nix`/`flake.nix`.
- **`switch` vs. `boot` vs. `test`**: `switch` baut, aktiviert sofort und setzt den Eintrag als
  Boot-Default. `boot` baut und setzt den Boot-Default, aktiviert aber erst beim nächsten Neustart.
  `test` aktiviert sofort, ohne den Boot-Default zu ändern (praktisch zum Ausprobieren, ein Absturz
  wird beim nächsten Reboot automatisch rückgängig gemacht).
- **Flakes sehen nur, was Git kennt**: Neue Dateien müssen mindestens per `git add` getrackt sein
  (nicht zwingend committet), sonst ignoriert der Flake-Build sie stillschweigend, mit teils
  verwirrenden Fehlermeldungen.
- **Home-Manager ist hier als NixOS-Modul eingebunden**, nicht standalone. Ein normaler
  `nixos-rebuild switch` übernimmt daher auch Änderungen an `home.nix`, ein separates
  `home-manager switch` ist nicht nötig.

## Best Practices

- Vor jedem `switch` die Syntax prüfen, ohne gleich zu bauen:
  ```bash
  nix-instantiate --parse configuration.nix
  ```
- Bei riskanteren Änderungen erst nur bauen, ohne zu aktivieren, um Eval-/Build-Fehler ohne
  Downtime abzufangen:
  ```bash
  sudo nixos-rebuild build
  ```
- Config-Repo ist git-versioniert: vor jedem `switch` committen, damit jede funktionierende
  (oder kaputte) Version nachvollziehbar bleibt und sich per `git revert` zurückrollen lässt.
- Keine Secrets direkt in `configuration.nix` ablegen. Der Wert landet im Klartext im Git-Repo
  und im Nix-Store, wo er für alle lokalen Nutzer lesbar ist. Für Passwörter/Tokens eignen sich
  `sops-nix` oder `agenix`.

## Nützliche Hinweise

- **Rollback bei kaputtem Rebuild**: `sudo nixos-rebuild switch --rollback`, oder im
  Boot-Menü eine ältere Generation auswählen.
- **Generationen auflisten**:
  ```bash
  sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
  ```
- **Lokale Options-/Manpage-Doku**, passend zur eigenen installierten Version und offline
  verfügbar: `nixos-help` bzw. `man configuration.nix`.
- **Flake-Inputs aktualisieren**: `nix flake update` aktualisiert alle Inputs in `flake.lock`,
  `nix flake lock --update-input nixpkgs` nur einen einzelnen.
- **Vorsicht mit `nix-collect-garbage -d`**: löscht alte Generationen inklusive der Möglichkeit,
  dorthin zurückzurollen. Vorher sicherstellen, dass die aktuelle Generation stabil läuft.