This repository has been archived on 2026-09-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
nixos-config/docs/pinix-minimalbetrieb.md
pijukka af45c30167 host(pinix): record identity DNS bootstrap for dex and head
Candidate-zone CNAMEs and Unbound local names for dex./head. under
domain2, the public-record helper and Dex LDAP env test, plus the
matching docs. This work predates this session and went live with the
2026-09-14 switch on pinix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JGodmgtRqahbT52gApsM8N
2026-09-14 12:55:11 +02:00

160 lines
6.8 KiB
Markdown

# pinix auf Minimalbetrieb reduziert (12.09.2026)
Für den Aufbau von Traefik als IPv6-Eingang auf pinix
([Intent](intent/pinix-ipv6-traefik-webserver.md)) wurden alle nicht
benötigten Dienste in `hosts/pinix/localServices/default.nix`
auskommentiert. Ziel: kurze Rebuild-/Deploy-Zyklen und freie Ports 80/443.
Zu diesem Zeitpunkt aktiv blieben nur `tailscale.nix` (Fernzugang und
Rückweg), `secrets.nix`, `packages.nix` und `nix-gc.nix`.
Closure: **6,74 GiB → 4,29 GiB**, 282 Store-Einträge entfernt.
Zu diesem Zeitpunkt gestoppt wurden: dashboard, desk, files, finance-agent-worker,
finance-xmpp-listener, forgejo-dump, gotosocial, icecast-radio,
liquidsoap-radio, nginx, phanpy, postgresql, prosody, radicale,
restic-backups-pinixBackup, samba (smbd/nmbd/winbindd), webdav, webhook,
website.
forgejo und prosody laufen ohnehin auf blunix — am 12.09.2026 geprüft:
dort zwei aktive XMPP-Sessions, auf pinix null. Die pinix-Instanzen waren
Altbestand.
## Weiterentwicklung seit dem Minimalbetrieb
Der damalige Minimalzustand war ein Zwischenstand für den IPv6-/Traefik-Test.
Seitdem sind BIND, Unbound, LLDAP und ACME wieder aktiv. Der parallele
Dex-/Headscale-Stack wurde am 13.09.2026 aktiviert; der Stand ist in
[`pinix-identity-stack.md`](pinix-identity-stack.md) dokumentiert. Die
Aussagen oben zu „nur“ aktiven Diensten und der gestoppten Eingangsschicht
sind deshalb als historischer Stand vom 12.09.2026 zu lesen.
## Keine Daten gelöscht
Alles unter `/var/lib` bleibt unberührt. Reaktivierung ist das
Wiedereinkommentieren der jeweiligen Zeile in `default.nix`.
## Fallstrick beim Reaktivieren: UIDs/GIDs
Die Aktivierung entfernt die Dienstnutzer. NixOS vergibt dynamisch
zugeteilte IDs beim Neuanlegen nicht garantiert wieder gleich; die Dateien
in `/var/lib` behalten aber ihre numerischen Eigentümer. Ein
reaktivierter Dienst kann dann seine eigenen Daten nicht mehr lesen.
Betroffen sind die dynamisch vergebenen IDs (900er-Bereich). `postgres`,
`nginx`, `prosody` und `webdav` haben feste NixOS-IDs und sind unkritisch.
Stand vor der Reduktion:
```
# user:uid:gid
postgres 71 71 (fest)
nginx 60 60 (fest)
prosody 149 149 (fest)
webdav 322 322 (fest)
radicale 995 991 dynamisch
forgejo 994 990 dynamisch
gotosocial 992 988 dynamisch
smbwebdav 990 986 dynamisch
icecast-radio 989 985 dynamisch
# gruppen
prosody:149 (Mitglied: nginx) smbwebdav:986 (Mitglied: webdav)
radicale:991 forgejo:990 gotosocial:988 icecast-radio:985
```
Gegenprobe nach dem Reaktivieren: `ls -n /var/lib/<dienst>` und die IDs
mit der Tabelle vergleichen. Bei Abweichung entweder die ID über
`users.users.<name>.uid` festnageln oder den Datenbestand umchownen.
## Secrets
`hosts/pinix/localServices/secrets.nix` verwies auf Nutzer/Gruppen, die es
ohne die Dienste nicht mehr gibt (`prosody`, `icecast-radio`, Gruppe
`radicale`). Diese Einträge sind auskommentiert bzw. auf root gesetzt,
sonst scheitert die Aktivierung beim `chown` — dasselbe Muster, das die
Datei oben schon für `oidcHeadscale` und `traefik` dokumentiert.
## Rückbau
Zeilen in `hosts/pinix/localServices/default.nix` und die zugehörigen
Blöcke in `secrets.nix` wieder einkommentieren, neu bauen, deployen.
## Warum das Reduzieren den Bauweg verkürzt
Der eigentliche Gewinn ist nicht nur die kleinere Closure, sondern dass
pinix jetzt **selbst** bauen kann, schnell genug für echte Iteration. Weil
die Konfiguration deklarativ ist, kostet das Zusammenstreichen nichts:
kein Datenverlust, Rückbau ist ein Wiedereinkommentieren. Damit entfällt
für den Alltag der Umweg über nixbuild.net — eine externe Abhängigkeit
weniger im Arbeitszyklus.
Gemessen am 12.09.2026 auf dem reduzierten System:
| Schritt | Dauer |
| --- | --- |
| `rsync` des Arbeitsbaums nach pinix | 1,5 s |
| `nixos-rebuild switch`, warm | 41 s |
| `nixos-rebuild switch`, kalter Eval-Cache | 2:45 |
```bash
rsync -a --delete --exclude .git ./ pinix:/home/drone/nixos-config-build/
ssh pinix 'cd /home/drone/nixos-config-build && \
sudo nixos-rebuild switch --flake path:.#pinix --no-reexec'
```
`--no-reexec` ist zwingend: sonst versucht `nixos-rebuild`, sich selbst
über `<nixpkgs/nixos>` via `NIX_PATH` neu zu bauen, was auf diesem reinen
Flake-System nicht eingerichtet ist. Kein Commit und kein Push nötig — der
Arbeitsbaum wird direkt übertragen.
## Voraussetzung: DNS64 auf pinix
Der erste lokale `nixos-rebuild` scheiterte daran, dass pinix
`https://github.com/NixOS/nixos-hardware/...` nicht laden konnte
(„Timeout was reached (28) after 15002 milliseconds"). Ursache war nicht
der Build, sondern das Netz: pinix fragte über Tailscale den AdGuard auf
blunix, bekam für den IPv4-only-Host github.com keine synthetische AAAA
und fiel auf die IPv4-Default-Route zurück — die hinter dem Nokia still
verworfen wird.
Behoben in `hosts/pinix/configuration.nix` und
`localServices/tailscale.nix`, gleiches Muster wie auf tnix
(`docs/ipv6-uplink-tnix-mango.md`):
- `--accept-dns=false`, damit der DNS64-Resolver des Mango greift
- `nooption routers` für `end0`, damit die tote IPv4-Default-Route
gar nicht erst gesetzt wird (`wlan0` bleibt unberührt)
- `networking.hosts` aus `config.tailnetIPs` als Ersatz für MagicDNS
Danach: `github.com` → HTTP 200 über `64:ff9b::8c52:7903` in 0,7 s.
SSH von tnix ist davon unabhängig und war nie das Problem — Tailscale
verbindet die beiden im selben LAN direkt (`via 192.168.8.244:41641 in
2 ms`), nicht über ein DERP-Relay.
## Erledigt: pinix kann wieder von Forgejo fetchen
Der Recovery-Checkout `/home/drone/nixos-config` auf pinix hing auf
`248151e` fest, `git fetch` scheiterte mit „Host key verification failed":
Forgejos SSH lauscht auf **Port 2222** und ist ein Go-Server mit eigenem
`ssh-rsa`-Hostkey, in `~drone/.ssh/known_hosts` gab es aber nur Einträge
für Port 22 (`100.64.0.1` und `blunix`, beide ed25519). Der Eintrag
`[100.64.0.1]:2222` fehlte.
Gepinnt wird er seit `355b42e` deklarativ in
`hosts/globalServices/forgejo-known-host.nix` — global, weil es eine
Client- und keine Server-Eigenschaft ist: auf pinix verschwand der alte
Pin zusammen mit dem auskommentierten `localServices/forgejo.nix`.
Der Pin allein reicht aber nicht, denn er ist selbst Teil des Repos:
pinix bräuchte den Commit, um fetchen zu können, und müsste fetchen, um
ihn zu bekommen. Der Ausweg ist der `rsync`-Bauweg von oben, der ohne git
auskommt — Quelle von tnix übertragen, lokal bauen, switchen. Der Build
umfasste am 12.09.2026 vier Derivationen, davon eine echte
(`etc-ssh-ssh_known_hosts`); `diff-closures` gegen die laufende Generation
war leer. Danach `git fetch origin` erfolgreich, Checkout per `--ff-only`
auf `355b42e` nachgezogen.
Nicht mit abgeschaltetem StrictHostKeyChecking umgehen (siehe CLAUDE.md) —
der Fingerprint gehört verifiziert und gepinnt, so wie hier geschehen.