Zum Inhalt

Prüfbericht D1-Entscheidungsstand (Advisor-Review, 28.10.2026)

Arbeitsstand der Recherche

Dieser Bericht ist eine Belegsammlung aus der D1-Session (27./28.10.2026). Er enthält Einschätzungen, die später anders entschieden wurden. Verbindlich ist das D1-Design.

Geprüft: d1-entscheidungen.md Teile 1–7 gegen Belege (Inventar, drei Recherchen), Rahmen (Zielbild v3/v4, Projektgedächtnis, ADR-001/-006/-011, Skill homelab-infra), Fabrik-Konzept (Infrastruktur, C2, Teil F), Epic-Issues

179–#193, #216, #225, #270, external#34 — und am Live-System (NUC ssh nuc-root, aiserver, VPS, VictoriaMetrics).

Nur lesend; Configs gefiltert. Web-Verifikation mit Quelle + Datum.

Kennzeichnung: [B] belegt (Befehl/Quelle), [E] Einschätzung. Robin? = Robin muss entscheiden.


1. Kurzurteil

Die Richtung ist tragfähig: Hybrid mit klarer Fehlerdomänen-Trennung, VPS behalten, Neuinstallation statt Doppel-Upgrade, HA per mTLS statt VPN-Disziplin — alles sauber hergeleitet und überwiegend durch Primärquellen gedeckt. Drei Punkte tragen so nicht: (1) Die USV ist nicht die im Dokument genannte PR1500, sondern ein OR650ERM1U mit 360 W Nennleistung bei heute 150 W Last — der aiserver (bis 137 W allein für die APU gemessen) passt da nicht mehr drauf. (2) Die heutige docker.service-Drop-in auf dem NUC verlangt (Requires=) alle NFS-Mounts und den rclone-Mount der Storage Box — damit hängen DNS und Home Assistant beim Kaltstart an UNAS und Internet, das Ausfall-Ziel „NUC-Kern überlebt UNAS-Ausfall“ ist heute nicht erfüllt. (3) Cluster-Stufe 1b (*arr/sabnzbd, Spitzen ~15 GB) und 2–3 Fabrik-Worker (12–18 GB) passen zusammen nicht in die 18–24 GB Nutzkapazität — bei „Vorrang Heimdienste“ wäre der Hardware-Trigger „Fabrik-Jobs verdrängt“ ab Tag 1 erfüllt.

Dazu kommt ein Zeitproblem: D1 lädt sechs Epics mit Zusatzscope auf (E1, E2a, E2b, E3, E8, E9) und macht E10 zu einem Neubau (VPS-Tür, PKI, zwei Wochen mTLS-Test). Das Jahresend-Ziel „iCloud kündigen“ ist damit faktisch 2027 — das sollte Robin bewusst entscheiden, nicht am Checkpoint „passieren“. Q1 2027 hat vier Bau-Themen parallel (Cluster, 1b, NUC-Neuinstallation, E10-Rest) gegen die Leitplanke „max. 1 Bau-Epic“.

Die Dokumente sind in den Zahlen überwiegend konsistent (RAM-Spitzen, UNAS, Storage-Box-Füllstand, USV-Laufzeit stimmen mit VM überein). Falsch oder unbelegt: USV-Modell, Storage-Box-Wachstum (+35 G/Monat → real ~15–20 GB), aiserver-Leistungsaufnahme (gar nicht gemessen), und der NUC-Hardware-Trigger „Swap > 50 %“ (Swap ist seit Wochen 100 % voll bei Memory-PSI = 0).


2. Funde nach Schwere

BLOCKER

B1 · USV-Modell falsch, Kapazität reicht nicht für den aiserver (Teil 7)

  • Beleg [B]: docker exec nut-upsd upsc serverups: device.model: OR650ERM1U, ups.power.nominal: 650 (VA), ups.realpower.nominal: 360 (W), ups.load: 41, ups.realpower: 150, battery.runtime: 1350 (22,5 min), battery.runtime.low: 300, battery.charge.low: 10. VM: min_over_time(nuc_ups_battery_runtime_seconds[30d]) = 825 s, max_over_time(nuc_ups_load_percent[30d]) = 51 %, avg 39,7 %. Die Zahlen „144 W Mittel / 185 W Spitze“ sind korrekt (39,7 % bzw. 51 % × 360 W), nur das Modell im Dokument („CyberPower PR1500“) ist falsch.
  • aiserver-Last [B]: aiserver_gpu_watts (amdgpu power1_average = Socket-Power der APU) 30 d: Median 6 W, Mittel 10 W, Max 137 W. Dazu Netzteilverlust, 128 GB RAM, NVMe, Lüfter: Systemleerlauf [E] ~30–45 W, Inferenz [E] ~160–180 W. Nächtlicher Paperless-Index (03:30) und jede Chat-Anfrage ziehen die Spitze.
  • Auswirkung: Last 150 W + aiserver → Leerlauf ~190 W (53 %), Inferenz ~320 W (~90 % von 360 W). Laufzeit sinkt von 22 min auf [E] 5–8 min unter Last; der ONBATT-Timer (900 s, upssched.conf) wird wirkungslos, LOWBATT (runtime.low 300) ist dann der einzige Schutz — und UNAS-Spin-up-Spitzen plus Inferenz können die 360 W überschreiten (Überlastabschaltung der USV = Stromausfall für alles inkl. NUC und UNAS, genau das Gegenteil des Ziels).
  • Korrektur: aiserver nicht an diese USV. Optionen: (a) aiserver bleibt ohne USV; aiserver#9 (Autostart) ist die eigentliche Härtung — er trägt keine schreibende Zustandsdatenbank, ext4 verträgt den harten Aus, Modelle sind read-only; (b) eigene kleine USV nur für den aiserver (≥ 600 W Nennleistung) mit NUT-Secondary gegen den NUC-NUT-Server; (c) USV-Tausch (≥ 1000 W) — teuerste Variante, erst nach Strommessung in E3. In jedem Fall: Timer auf battery.runtime-Basis statt feste 900 s (AT ONBATT … START-TIMER ersetzen durch Trigger auf runtime < 600).
  • Robin? Ja: a/b/c.

B2 · Kaltstart: Docker auf dem NUC hängt heute an UNAS und Internet (Teil 7, Ausfall-Ziele)

  • Beleg [B]: /etc/systemd/system/docker.service.d/*.conf: RequiresMountsFor=/mnt/ssd /mnt/unas /mnt/pictures /mnt/monitoring /mnt/paperless /mnt/storagebox. systemctl show docker.service -p Requires listet alle sechs Mount-Units als Requires= (systemd 249; nofail in den NFS-Optionen ändert daran nichts). /mnt/storagebox ist der rclone-Mount zur Hetzner Storage Box.
  • Auswirkung: Ist die UNAS beim Boot nicht da (Defekt, langsamer Start) oder der Internetzugang weg (UDM bootet später, Leitung tot), startet Docker nicht → Pi-hole (DNS für 65 Clients), Home Assistant, Z2M, Traefik, NUT-Server — alles bleibt aus. Das widerspricht direkt den bestätigten Ausfall-Zielen („NUC aus → DNS über VIP weiter“ hilft hier nicht: der NUC ist an, nur Docker nicht) und dem Kaltstart-Plan (UDM → UNAS → NUC: Reihenfolge ist nicht erzwingbar, also muss jede Schicht das verspätete Eintreffen der anderen tolerieren). #270 zeigt zusätzlich: Docker gibt nach einem gescheiterten Mount-Neustart einzelner Container dauerhaft auf.
  • Korrektur: Drop-in auf After= + Wants= für die NFS-/rclone-Mounts umstellen (hart nur /mnt/ssd), NFS-abhängige Stacks per Compose-Healthcheck/restart-Watchdog oder systemd-Pfad-Unit an den Mount koppeln (Lösung für #270 gleich mit). Abnahme als Test: UNAS aus + NUC-Reboot → DNS und HA laufen; Internet weg + Reboot → dito. Gehört als Kaltstart-Drill in E3 (#270) und in das Rebuild-Runbook (E1).
  • Robin? Nein (Defekt). NUC-Write → Runbook für Robin.

B3 · Cluster-Kapazität: Stufe 1b und Fabrik passen nicht gleichzeitig (Teil 1/2)

  • Beleg [B]: Recherche §5: 4–7 GB Plattform je Node → 18–24 GB Nutzkapazität bei N-1. Fabrik-Konzept: 2–3 Worker à ~6 GB = 12–18 GB, zusätzlich Beads, Qdrant, Registry, Paket-Proxy, Steuer-Runner. Inventar/VM (max_over_time(container_memory_working_set_bytes[30d])): sabnzbd 9 948 MiB, sonarr 3 097, radarr 1 590, gluetun 538, prowlarr 165, umlautadaptarr 207 → *arr-Spitzen ~15,5 GB. Stufe 1a (pkv-app, speedtest, snowflake, Cluster-Monitoring) ~1,5–2 GB.
  • Auswirkung: 1a + 1b + 2 Worker ≈ 30 GB Spitze > 24 GB. Mit „Vorrang Heimdienste“ (PriorityClass) werden Fabrik-Jobs bei jedem sabnzbd-Entpackvorgang verdrängt → der Trigger „Heimdienst-Pods ≥ 1×/Woche verdrängt oder Fabrik-Jobs Ø > 30 min Wartezeit“ feuert sofort; die Messphase misst dann nur das Vorhersehbare. Zudem widersprechen sich die Dokumente: Fabrik-Konzept „3–4 GB Grundlast je Node“ vs. Recherche „4–7 GB“.
  • Korrektur: Entweder (a) Stufe 1b erst nach dem Review April 2027 und nur mit RAM-Ausbau (2 × 32 GB je Node ist die billigste Stellschraube, Recherche §5) oder (b) 1b ohne sabnzbd (bleibt auf dem NUC, hat dort 86 GB lokale Downloads) — dann ~5,6 GB statt 15,5. In der ADR eine Kapazitätstabelle mit Requests/Limits je Dienst führen, nicht nur Trigger.
  • Robin? Ja: a oder b; und ob RAM-Ausbau vor 1b akzeptabel ist („so spät wie möglich“ kollidiert hier mit „1b Feb/März“).

WICHTIG

W1 · Identity ins Heimnetz widerspricht dem Entscheid vom 29.06. und bricht die Wächter-UIs auf dem VPS (Teil 4, E8)

  • Beleg [B]: Skill homelab-infra: „Identity (genehmigt 2026-06-29): Authelia + lldap auf Hetzner (nicht NUC — muss immer online sein)“. VPS authelia/configuration.yml Access-Rules: auth., hc. (Healthchecks), uptime. (Kuma), headscale. (Headplane), ldap., homelab-external. — Authelia schützt heute die Admin-UIs der Wächter. Headscale hat keine OIDC-Konfiguration (grep leer) ✓.
  • Auswirkung: Zieht der IdP nach Hause, läuft Forward-Auth für Kuma/Healthchecks/Headplane über den Tunnel — fällt das Heimnetz aus (der Fall, für den die Wächter da sind), liefert Traefik 5xx, die UIs sind unerreichbar (Alarme gehen weiter, Quittieren/Nachsehen nicht). Zweiter IdP auf dem VPS = zwei Pflegeobjekte, widerspricht „EIN Konto“.
  • Korrektur [E]: Einfachere, gleich gute Variante: Authelia + lldap bleiben auf dem VPS; E8 fügt nur OIDC-Clients hinzu (über den Tunnel), Heimdienste behalten lokale Break-Glass-Konten (E1). Die Cloud-vs-lokal-Begründung trägt hier schwach: lldap hält zwei Passwort-Hashes, der VPS hält ohnehin Headscale-Schlüssel. Wenn Robin dennoch heimholt: VPS-UIs vorher auf eigene Logins (Kuma/Healthchecks haben welche) umstellen und das in E8 als ersten Schritt einplanen. In jedem Fall: Skill-Eintrag und Zielbild-Leitplanke explizit supersedieren, nicht still überschreiben.
  • Robin? Ja.

W2 · Zeitplan: E10 ist jetzt ein Neubau, Jahresend-Ziel „iCloud kündigen“ faktisch 2027; Q1 2027 vierfach belegt (Teil 5/6)

  • Beleg [B]: Roadmap v4 KW52 = „E10: Immich public + Kündigungs-Gates“, KW53 Puffer. D1 Teil 6 macht daraus: VPS-Tür (Traefik-TCP-Router, neuer PROXY-Protokoll-Entrypoint am NUC, Tunnel, DNS-Umzug, CrowdSec-Umbau, Geo-Block), eigene PKI, mTLS-Rollout auf zwei iPhones, zwei Wochen Standort-Test, dann erst IPP. Velocity laut v4: ein Epic je 2–3 Wochen. Q1 2027: Cluster-Aufbau + Stufe 1a (Jan), Fabrik-MVP „2–3 Wochenenden“, Stufe 1b (Feb/März), NUC-Neuinstallation (Feb/März, Supportende 22.04 April/Mai 2027), E10-Rest, Identity-Umzug, NetBird-Prüfung.
  • Auswirkung: Ventil v4 Nr. 3 („E10 + iCloud nach 2027“) tritt nicht am 22.11. ein, sondern ist durch D1 bereits beschlossen — ohne dass es so im Dokument steht. In Q1 2027 konkurrieren vier Bauthemen; die NUC-Neuinstallation ist die einzige mit hartem Termin.
  • Korrektur: (1) In der ADR ausdrücklich: iCloud-Kündigung → 2027, iCloud bleibt Sharing-Kanal. (2) Reihenfolge Q1: Jan Cluster + 1a → Feb NUC-Neuinstallation (Voraussetzungen: E2a-Migration der 17 untracked .env, E2b-bootstrap mit Probelauf, siehe W5) → März E10-Rest → 1b erst nach Review. (3) mTLS-Test vom VPS-Tür-Bau entkoppeln: zwei Wochen per temporärem UDM-443-Forward testen (Memory: 443 ist heute zu), danach entscheiden, dann die Tür bauen. (4) NetBird-Prüfung streichen, solange Headscale gepflegt wird (E, siehe W11).
  • Robin? Ja (Jahresend-Ziel; Q1-Reihenfolge).

W3 · NUC-Neuinstallation: „nur Compose-Dateien“ stimmt nicht — ~20 Zustände liegen auf der System-NVMe (Teil 5)

  • Beleg [B]: lsblk: / = Samsung 980 1 TB (LVM, 156 G belegt), /mnt/ssd = Crucial MX500 SATA. Auf /: /opt/rpi-docker-compose mit 17 untracked/ignored Secret-Dateien (git status --ignored: traefik/.env, ts3/.env, immich/.env, media-stack/.env, monitoring-stack/secrets/*, homepage/secrets.env, …; nur ollama, paperless-ngx, speedtest-tracker werden von Infisical gerendert, /run/infisical ist tmpfs); /etc/borgmatic.d/{local,hetzner}.yaml
  • credentials/*.pass + immich_db_password; /etc/infisical/{agent.yaml,client-id,client-secret}; /root/.infisical/; /root/.ssh/{hetzner-borg,ha-config-journal,nut_shutdown}; /root/.config/rclone/rclone.conf; /etc/mdadm/mdadm.conf; /etc/netplan/* (2 Dateien); /etc/samba/smb.conf; /etc/nut/{upsmon,upssched}.conf (mit Zugangsdaten); /etc/cron.d/{btrfs-scrub,ha-config-journal}; systemd: 5 NFS/rclone-.mount, infisical-agent.service, paperless-*.timer, ups-textfile-collector.timer, zomboid.service, docker.service.d; /mnt/scanner (113 M, auf /); /home/robin 4,7 G; /root 3,5 G; /var/lib/db-dumps 788 M; /var/lib/docker mit 56 GB bewusst behaltenen Images. Keine borg-Keyfiles (/root/.config/borg/keys fehlt → repokey-Modus ✓). 6 Docker-Named-Volumes (160 K, nur bonus-tracker/influx-config/parakeet) — unkritisch.
  • Auswirkung: Alles davon ist in den borgmatic-Quellen (/etc, /opt, /root, /home, /var) — also wiederherstellbar, aber „Dienste starten mit denselben Compose-Dateien wieder“ gilt erst, wenn bootstrap.sh diese Liste abdeckt oder die Secrets vorher in Infisical liegen. Ohne E2a-Migration der .env startet nach der Neuinstallation kein Stack.
  • Korrektur: Die Liste oben wörtlich in die E2b-Übergabe (bootstrap.sh-Scope) und ins Rebuild-Runbook (E1); Reihenfolge fest: E2a (alle .env → Infisical) vor E2b-Probelauf vor Neuinstallation. Vollimage der NVMe als Rückweg bleibt richtig. /mnt/scanner auf /mnt/ssd umziehen (ist auf der Systemplatte). Für den Infisical-Agent: Offline-Start prüfen (/root/.infisical/secrets-backup existiert; ob der Agent daraus rendert, ist ungetestet) — Kaltstart ohne Internet darf nach E2a keinen Stack blockieren.
  • Robin? Nein (Übergabe).

W4 · CNPG-„Backup auf die UNAS“ hat keinen Träger: UNAS Pro bietet keinen S3-Server (Teil 1/3)

  • Beleg [B]: Ubiquiti Tech Specs UNAS Pro: Backup zu Amazon S3/B2/Wasabi, kein eigener Objektspeicher; Community-Request „Native S3-compatible object storage server on UNAS“ (18.09.2026) offen; keine Container/Apps auf UNAS. CNPG sichert per Barman-Cloud-Plugin nur in Object Stores oder per CSI-VolumeSnapshot (local-path kann keine Snapshots).
  • Auswirkung: Der Satz „DBs per CloudNativePG mit eigener Replikation + Backup auf UNAS“ ist so nicht umsetzbar.
  • Korrektur [E]: Für Stufe 1 (pkv-app, 8 MB DB) reicht ein pg_dump-CronJob → NFS-Share → borgmatic (dasselbe Muster wie heute). Wenn später ein Object Store nötig ist: Garage/MinIO als Compose auf dem NUC mit Daten auf /mnt/ssd (nie NFS, woitzik.dev 10.09.2026: Garage-Metadaten durch NFS korrumpiert) oder Hetzner Object Storage (6,49 €/Monat, gleich offsite). OpenEBS-LVM statt local-path würde CSI-Snapshots liefern, aber nur node-lokal.
  • Robin? Nein (ADR-Formulierung), außer Objektspeicher-Standort.

W5 · Vier neue Pflegeobjekte gegen „weniger Pflege“ — wo Einfacheres gleich gut ist (Prüffrage E)

  • Hinzu kommen: Talos-Plattform (10–20 Komponenten mit eigenem Update-Strom, Recherche §6), Raspberry Pi 4 (fünftes Gerät, arm64), keepalived + nebula-sync, eigene PKI (CA, .p12 je Gerät, Erneuerung, Revocation), VPS-TCP-Tür + CrowdSec-Umbau, Identity-Umzug, NetBird-Prüfung, CNPG, Zweitanbieter-Bewertung Offsite, TS3→VPS→TS6. Weg: bonus-tracker, navidrome, NUC-Voice, nativer unbound, NUC-ollama, vscode-server, Prometheus+InfluxDB, evtl. homepage.
  • Netto [E]: Die Plattformzahl steigt (Compose ×3 Hosts + Talos + Pi). Das ist vertretbar, wenn der Cluster wirklich Lab + Fabrik ist — aber jedes „gleich gut“-Einfachere sollte die ADR nennen:
  • DNS: zwei Pi-hole-Instanzen per DHCP (primär/sekundär) + nebula-sync statt keepalived-VIP. Die bestätigte Ursache früherer Secondary-Probleme war Config-Drift, nicht die Zwei-Server-Mechanik; der Sync löst das in beiden Varianten. VIP ist nur dann besser, wenn das sekundenlange Client-Timeout beim Failover stört. keepalived braucht nach E9 ein gemeinsames L2-Segment für NUC und Pi und Health-Tracking auf den Pi-hole-Container (VRRP unicast).
  • Identity: bleibt auf dem VPS (W1).
  • HA-Zugang: mTLS ist die stärkste Variante, aber eine PKI. Nabu Casa (75 €/Jahr, E2E über SniTun, kein Klartext beim Anbieter) ist mit der Cloud-vs-lokal-Grenze vereinbar und hat null Pflege. mTLS bleibt vertretbar, wenn das Rezept im Repo liegt (CA 10 J., Client-Zertifikate 2 J., Kalender-Issue, Revocation = CA-Rotation, siehe W7).
  • NetBird: streichen, solange Headscale den Tailworm-Fix liefert (W11) — es löst Robins Problem (Geräte nicht im VPN) nicht, wie die Recherche selbst sagt.
  • Robin? Ja (1 und 3).

W6 · VPS als einzige Tür: CrowdSec/Geo-Block landen nicht dort, wo das Dokument sie verortet (Teil 6)

  • Beleg [B]: VPS-Traefik traefik.yml: nur web :80 / websecure :443, kein PROXY-Protokoll. Traefik-TCP-Router mit HostSNI + passthrough sehen kein HTTP; Traefik hat für TCP nur ipAllowList/inFlightConn als Middleware — der CrowdSec-Bouncer-Plugin ist HTTP-only. Tunnel NUC↔VPS ist heute direkt (tailscale status: direct 49.13.70.218:53737), nicht über DERP ✓. NUC-Traefik: traefik:v3.7 (Regression #12055 bei 3.5.2 ist durch).
  • Auswirkung: „CrowdSec + Geo-Block am VPS“ geht nur als IP-Entscheidung: CrowdSec-Agent + LAPI zu Hause (parst NUC-Traefik-Logs mit echter Client-IP aus PROXY v2), Bouncer als Traefik-Plugin am NUC; auf dem VPS allenfalls der Firewall-Bouncer (nftables), der Entscheidungen von der Heim-LAPI zieht — also wieder eine Abhängigkeit VPS→Heim. Geo-Block: nftables/GeoIP am VPS oder Traefik-Plugin am NUC; die Hetzner-Cloud-Firewall kann kein Geo.
  • Weitere Lücken: (a) ddns./udm.robinwerner.net (cloudflare-ddns, aktiv) veröffentlichen die Heim-IP weiter — „Heim-IP verborgen“ gilt erst nach Entfernen dieser Records; (b) snowflake-proxy (Host-Netz) stellt die Heim-IP ohnehin Tor-Clients als WebRTC-Peer zur Verfügung; (c) PROXY-Protokoll am NUC auf einen eigenen Entrypoint (z. B. :8443, nur Tunnel-IP), damit LAN-Clients auf :443 unverändert bleiben; (d) Upload-Bandbreite zu Hause: speedtest-Metriken sind in VM nicht unter speedtest_* vorhanden — Zahl fehlt, für Jellyfin-Remote und Immich-Video relevant.
  • Korrektur: Design-Skizze für E10 mit: Entrypoint-Plan NUC, CrowdSec-Topologie (LAPI zu Hause, Bouncer NUC + optional VPS), DNS-Umzug inkl. DDNS-Records, Headscale-Memory-Limit (W11). Phasen: zuerst nur HA + IPP durch die Tür; TS/Jellyfin später.
  • Robin? Nein (Design), außer snowflake (bleibt/geht).

W7 · mTLS: Primärquellen bestätigen die Machbarkeit, aber drei Betriebsfragen fehlen (Teil 6)

  • Beleg [B]: frenck, 09.10.2026 (Discussion #1078): „no longer experimental as of app version 2026.8“; Release 2026.8.0 (26.08.2026): „Widgets and Assist audio now work on servers using mTLS client certificates“; docs/mTLS.md (Repo-Stand 28.10.2026) trägt weiter das Label „EXPERIMENTAL“, nennt Webhook-Hintergrund-Uploads als abgedeckt (WebhookManager), Grenzen: watchOS nein, Local Push „may not work“, Siri/Shortcuts eingeschränkt. Traefik: CRL-Support 2021 abgelehnt (PR #7614, „use short-lived certificates“), Community-Plugin tlscrlchecker existiert; Forum-Anfrage 14.07.2025 unbeantwortet. Immich-App: v2.6.0 (19.03.2026) native Clients inkl. Hintergrund-Upload (PR #26911, 14.03.2026 — Autor nennt die iOS-Umsetzung „hacky“).
  • Fehlend im Entscheid: (1) Revocation: verlorenes iPhone = CA rotieren und beide Geräte neu bestücken (oder Plugin); (2) LAN-Pfad: die Companion-App braucht weiter eine interne URL ohne mTLS (http://10.10.10.3:8123, SSID-gebunden), sonst zwingt man Wand-iPad und HomeKit-Pfade durch TLS; HA braucht trusted_proxies — in configuration.yaml nicht gefunden (ggf. Package), vor E10 prüfen; (3) Lars' Gerät: .p12-Verteilung, Erneuerung, und ob Lars Local Push/Watch nutzt.
  • Korrektur: PKI-Rezept als Datei im Repo (openssl oder step-ca), Laufzeiten + Kalender-Issue, Test-Checkliste (Standortverlauf, Widgets, Benachrichtigungen, Immich-Hintergrund-Upload mit mTLS auf iOS 26).
  • Robin? Ja (Watch/Local-Push-Bedarf; Nabu Casa als Primär- oder Notweg).

W8 · Hardware-Trigger NUC ist falsch kalibriert: Swap voll, aber kein Speicherdruck (Teil 7)

  • Beleg [B]: free -h: Swap 4,0/4,0 G; /proc/pressure/memory: some avg10=0.00 avg60=0.00 avg300=0.00, full total=465 s über 51 Tage Uptime (= 8 min Stall in 7 Wochen); swappiness=10; größter Swap-Nutzer ein python (1,8 GB, idle Seiten). VM: min_over_time(node_memory_MemAvailable_bytes[30d]) = 4,17 GiB, Swap max 4,0 GiB.
  • Auswirkung: „Swap > 50 % über 30 d“ ist seit Wochen erfüllt, obwohl der NUC keinen Druck hat → der Trigger würde einen Kauf auslösen, den die Daten nicht stützen. „< 4 GiB frei“ ist mit 4,17 GiB Minimum ein Randtreffer.
  • Korrektur: Trigger auf PSI umstellen (rate(node_pressure_memory_stalled_seconds_total[1h]) > 0,05 über 7 d) plus MemAvailable-Minimum; Swap aus dem Trigger streichen. Das Aufräumen (pz-server on demand, NUC-ollama weg, sabnzbd-Reste 79 GB) vorher, wie im Dokument.
  • Robin? Nein.

W9 · Backup-Topologie: Grundregel und Ausnahmen widersprechen sich; /mnt/unas trägt Nicht-Medien (Teil 3)

  • Beleg [B]: Teil 3 „Backup immer auf anderem Gerät + Offsite-Kopie“ vs. Teil 4 „Medien: kein Offsite-Backup (#227 bleibt zu)“. Memory #227: /mnt/unas steht in keiner borgmatic-Quelle; dort liegen nextcloud-archiv-2026-09-15 (37 GB), immich-nicht-importiert-2026-09-16 (57 GB inkl. 9 GB Kindheits-DVDs), wallos-export, stack-archiv. VPS: kein borgmatic (/etc/borgmatic.d fehlt) ✓ bestätigt. aiserver-Repo nur auf dem NUC-RAID (D1 will das RAID als Ziel aufgeben).
  • Auswirkung: Wird das USB-RAID aus der Kette genommen, ohne das aiserver-Repo und die UNAS-Archivordner neu einzuordnen, entstehen zwei neue Lücken.
  • Korrektur: Datenklassen-Tabelle in der ADR (Medien = wiederbeschaffbar → kein Offsite; Archive/Originale = ★★★ → offsite); E1-Übergabe: aiserver-Repo-Ziel nach RAID-Abschaffung, /mnt/unas/*-archiv klassifizieren, UNAS-Snapshots neu bewerten.
  • Robin? Ja (Archivordner: behalten/offsite/löschen).

W10 · Stufe 1b technisch: Pod an Node gebunden, privilegierter Namespace, kein Backup-Plan (Teil 1/2)

  • Beleg [B]: local-path-PVs sind node-affin; Talos-Upgrades drainen Node für Node (Fabrik-Konzept); gluetun braucht NET_ADMIN + /dev/net/tun (Inventar) → Pod-Security „privileged“ im *arr-Namespace, nicht „restricted“ wie fabrik-worker. SQLite-Configs (sonarr 226 MB, radarr 418 MB, jellyfin-ähnlich) liegen dann auf einer Node-NVMe.
  • Auswirkung: Kein Mehrwert gegenüber Compose bei Node-Ausfall/-Wartung (Dienst steht, bis der Node zurück ist), aber neue Pflicht: Volume-Backup (VolSync/Kopia → NFS/borg) je Node. Das Dokument nennt „lokal je Node“, aber keinen Backup-Weg.
  • Korrektur: In der ADR: *arr = Single-Replica, node-gebunden, Backup per VolSync→UNAS→borg; Namespace-Trennung (privileged) dokumentieren; Hardlink-Thema Downloads↔Medien bleibt wie heute (SSD→NFS = Kopie).
  • Robin? Nein.

W11 · Headscale 0.28.0 auf dem VPS, Tailworm-Fix für Headscale noch offen; mit „VPS = einzige Tür“ wird das zum Konzentrationsrisiko (Teil 6, #34)

  • Beleg [B]: VPS headscale version v0.28.0 (Build 04.02.2026); Tailscale-Client VPS 1.94.2, NUC 1.98.8. headscale v0.29.6 (24.10.2026) nennt im Changelog nur Go/x/net-Fixes; tailworm.com (Stand 27.10.2026): „client fix shipped; headscale pending“, headscale-PR #3586 (Registrierungs-Cache) offen; Tailscale 1.104.4 (27.10.) fixt die Client-Seite. VPS: 3,7 GiB RAM, 2,0 GiB verfügbar. ufw: 22/80/443/3478 offen.
  • Auswirkung: Ein Speicher-DoS gegen Headscale auf demselben 4-GB-Host kann Traefik mitreißen → HA-Tracking, IPP, TS, Alarmweg (ntfy!) gleichzeitig weg. #225 (VPS weg = Alarm still) bleibt, bis E3 den zweiten Weg liefert.
  • Korrektur: mem_limit für den headscale-Container (z. B. 512 M) + Traefik-Rate-Limit vor /ts2021 (#34 nennt es); Tailscale-Clients auf ≥ 1.104.4 (beide stark veraltet — Renovate-Stau); Headscale-Update sobald der Fix released ist. In der ADR: „VPS = einzige Tür“ erst, wenn #225 (zweiter Alarmweg) und #34 abgearbeitet sind.
  • Robin? Nein.

W12 · E9 bekommt durch D1 ein zweites Bauthema (DNS-Zweitinstanz) auf ein Wochenende (Teil 2/7)

  • Beleg [B]: Roadmap v4: E9 = Umbau-Wochenende 19./20.12. mit Eingangskriterium UDM-Backup; Fabrik-Weiche: VLAN 80, AMT-Netz. D1 ergänzt: Pi 4 beschaffen/aufsetzen, zweite Pi-hole/unbound, VIP oder DHCP-Umstellung, nebula-sync, aiserver-NUT-Client, dazu Cluster-DNS-Regel (Talos-Nodes nicht auf Pi-hole als einzigen Resolver, Recherche §2).
  • Korrektur: DNS-Zweitinstanz vor E9 im flachen Netz aufbauen (Pi hängt heute am selben L2; läuft dann durch den VLAN-Umbau durch) — das entkoppelt die beiden Bauthemen und macht die Zweitinstanz zum Sicherheitsnetz für das Umbau-Wochenende. NUC-Neuinstallation nicht hart an die VIP binden: für das Fenster reicht ein temporärer DHCP-DNS (UDM → 9.9.9.9), siehe W2.
  • Robin? Ja (Pi-Kauf jetzt; Reihenfolge).

HINWEIS

  • H1 · Storage-Box-Wachstum falsch beziffert [B]. VM /mnt/storagebox belegt (GiB): 49 d 913 → 42 d 594 (Compaction 12.09.) → 35 d 608 → 28 d 614 → 21 d 616 → 14 d 619 → 7 d 620 → heute 620. Das sind ~19 GiB in 42 Tagen, zuletzt flach, nicht „+35 G/Monat“. Die BX11 reicht bei 620/931 GiB eher 12–16 Monate; der echte Treiber ist der E5-Import (< 300 GB) und E1-Snapshots. Fazit „80 % / vor Importen“ bleibt richtig, die Begründung nicht.
  • H2 · UNAS-Wachstum [B]: belegt (GiB) 120 d 21 075 → 90 d 21 489 → 60 d 22 270 → 30 d 23 585 → 24 767: +1,2–1,3 TB/Monat und beschleunigend (Dokument: +1,5 T). Reserve ~4 Jahre, Trigger 75 % passt. /mnt/ssd +82 GiB in 30 d (= sabnzbd-Reste).
  • H3 · Container-Spitzen bestätigt [B]: sabnzbd 9 948, paperless 6 128, prometheus 3 751, immich-ML 3 246, sonarr 3 097, HA 2 750 MiB. Nicht reproduzierbar: pz-server (Inventar 8 688 MiB, VM name="pz-server" liefert 46 MiB) — Label prüfen.
  • H4 · TS3-Sunset bestätigt [B]: TeamSpeak AGB §12 (gültig seit 22.06.2026, Community-Post 24.06.2026): End-of-Life „targeted for completion by December 31, 2027“ — ausdrücklich Zieltermin, keine harte Abschaltung; Sicherheitsupdates „as TeamSpeak considers appropriate“. Dazu: TS3 hat seit 13.09. null Client-Verbindungen (Inventar). Umzug auf den VPS = Arbeit für einen Dienst ohne Nutzungsbeleg, den man 2027 nochmal anfasst (TS6 ohne Migrationspfad).
  • H5 · Hetzner-Rebuild bestätigt [B]: docs.hetzner.com/cloud/billing/faq: „No price adjustment occurs for: Transferring a server to another project with the same currency; Rebuilding a server“; Anpassung bei Rescale (auch runter), Währungswechsel, Wiederherstellen eines gelöschten Servers → nie löschen+neu anlegen. VPS läuft heute Ubuntu 24.04.4 (nicht 22.04) → Rebuild auf 26.04 ist ein Sprung; bootstrap.sh aus homelab-external vorher auf 26.04-Fallen (apt-key, sysctl.d, dracut) prüfen.
  • H6 · Ubuntu 26.04 + NUC11 bestätigt [B/E]: lscpu: i5-1135G7 (Tiger Lake, i915 Mainline, Jellyfin-Doku: TGL voll unterstützt); Docker CE unterstützt 26.04 (Recherche §8). Risiko gering; nach Install /dev/dri/renderD128-Gruppen-ID prüfen (render-GID kann sich ändern → Compose group_add).
  • H7 · Host-Resolver [B]: /etc/resolv.conf: 10.10.10.3 (Pi-hole-Container), Fallback 9.9.9.9 → Host-Dienste (Infisical-Agent, borg→Hetzner, rclone) überleben einen Pi-hole-Ausfall mit Timeout-Verzögerung. Für E9 beibehalten und in bootstrap.sh festschreiben; Fallback muss aus dem Server-VLAN erreichbar bleiben.
  • H8 · UDM ist der ungenannte SPOF. Keine Ersatz-Hardware, UDM-Config-Backup erst E1; Cluster-BGP (FRR-Upload) und Zone-Based-Firewall erhöhen die Komplexität auf dem Gerät, das alles trägt. In den Ausfall-Szenarien ergänzen (Ziel: Config-Backup + dokumentierter Minimal-Wiederaufbau, kein Spare).
  • H9 · Monitoring auf NFS widerspricht der eigenen Speicherregel. VictoriaMetrics (32 GB) und VictoriaLogs (7,5 GB) liegen auf /mnt/monitoring (NFS), #270 ist die Folge. D1 sagt „DBs → lokale SSD“, nennt VM/VL aber nicht → E3-Übergabe: auf /mnt/ssd verlegen (650 G frei).
  • H10 · E5/E1 setzen weiter auf Tailnet für Immich-Upload („Lars ins Tailnet, 1 Woche unfallfreier Auto-Upload“), während D1 „alles ohne VPN, Immich-App per mTLS“ will. Übergang festlegen: Tailnet bleibt Interim bis Immich-mTLS steht; Abnahme E5 entsprechend formulieren (sonst misst E5 die VPN-Disziplin, die nachweislich nicht hält).
  • H11 · Fabrik-Konzept muss nachziehen [B]: Konzept (27.10.) sagt Longhorn + Argo CD + „Longhorn-Backups auf UNAS“ + „3–4 GB Grundlast“; D1 sagt kein Longhorn, Argo/Flux offen, 4–7 GB. Beads/Qdrant-StatefulSets brauchen damit einen Storage-/Backup-Satz (local-path + VolSync oder NFS für Qdrant-Snapshots).
  • H12 · ADR-001 und Zielbild-Leitplanke („K8s bewusst verworfen“, Memory „Kern-Entscheidungen: Compose bleibt (kein K8s)“) werden durch Teil 1 amended, nicht aufgehoben — in ADR-001 Status superseded by ADR-0xx oder Amendment-Abschnitt, Memory-Satz anpassen; Skill-Zeile „K8s verworfen“ existiert nicht, aber Identity-Zeile (W1) schon.
  • H13 · Infisical-Kaltstart [B/E]: /run/infisical ist tmpfs, Agent authentifiziert mit client-id/secret (Universal Auth) gegen eu.infisical.com; nach E2a hängt jeder Stack daran. Internet-Ausfall + Stromausfall = kein Stack startet, bis der Agent rendert. Test und Offline-Pfad (Agent-Backup oder persistentes Render-Ziel 0600) gehören in E2a, und Infisical gehört in die Kaltstart-Tabelle (Teil 7) als externe Abhängigkeit neben Cloudflare (DNS-01, unkritisch bei 90-Tage-Zertifikaten).
  • H14 · Jellyfin „nur per VPN“ setzt voraus, dass Lars VPN nutzt — Lars' Geräte sind nicht im Tailnet (tailscale status: nur robin-*). Ehrlich: Jellyfin unterwegs = Robin-only, bis Lars VPN hat oder Jellyfin doch durch die Tür geht.
  • H15 · Omni/Argo/Flux-Call: Recherche empfiehlt Flux (RAM, Upgrade-Pfad) und warnt, cluster-template gegen Argo zu verbiegen; Fabrik-Konzept hat Argo gesetzt. Der „Builder-Entscheid Jan 2027“ sollte die Kapazitätsfrage (B3) mitdenken: Flux spart ~0,5 GB Cluster-RAM.

3. Bestätigte Annahmen (kurz)

  • Zahlen im Dokument, die stimmen [B]: NUC RAM-Spitze 26,6 GiB / Swap 4 GiB voll; Container-Spitzen (H3); UNAS 26,6/91 TB; Storage Box 666 GB (= 620 GiB); NUC-SSD 285 GB (= 266 GiB); USV-Laufzeit-Tief 13,75 min, Last 144/185 W (nur Modellname falsch); Cluster-NVMe 512 GB; VPS 2 vCPU / 3,7 GiB; VPS ohne Backup; aiserver 124 GiB, Spitze 99,8 GiB (30-d-Minimum MemAvailable 24,5 GiB).
  • HA-Tracking-Befund (person.* „home“, iPhone 22 d nicht im Tailnet) — tailscale status bestätigt „last seen 22 days ago“.
  • Tunnel NUC↔VPS läuft direkt (kein DERP-Relay) → SNI-Passthrough über Tailnet ist bandbreitenseitig realistisch.
  • HA-iOS-mTLS nicht mehr experimentell (frenck 09.10.2026); Immich-App mTLS inkl. Hintergrund (v2.6.0, 19.03.2026); IPP v4.1.2 (23.10.2026) read-only ohne API-Key.
  • TS3-EOL-Ziel 31.12.2027 (AGB §12, Primärquelle); Hetzner-Rebuild behält Legacy-Preis (Billing-FAQ); Rescale/Restore nicht.
  • Hybrid-Muster und DNS-außerhalb-des-Clusters sind in der home-ops-Szene etabliert (Recherche §2) — Teil 1/2 folgt dem.
  • Headscale ohne OIDC ✓ (E8-Reihenfolge bleibt frei); borg-Repos im repokey-Modus (keine verlierbaren Keyfiles auf /).
  • Neuinstallation statt zweifachem In-place-Upgrade ist durch die 26.04-Fallen (sysctl.conf-Löschung, dracut, apt-key) gut begründet.

4. Fragen, die nur Robin beantworten kann

  1. USV (B1): aiserver ohne USV + Autostart, eigene kleine USV für den aiserver, oder USV-Tausch nach E3-Messung?
  2. Cluster-Stufe 1b (B3): erst nach dem Review und mit RAM-Ausbau — oder 1b ohne sabnzbd? Ist RAM-Ausbau 2027 akzeptabel, obwohl „so spät wie möglich“ gilt?
  3. Jahresend-Ziel (W2): iCloud-Kündigung ausdrücklich nach 2027 verschieben (iCloud bleibt Sharing-Kanal)? Q1-Reihenfolge Cluster → NUC-Neuinstallation → E10-Rest → 1b so in Ordnung?
  4. Identity (W1): Authelia/lldap auf dem VPS lassen (keine Migration) oder heimholen und VPS-UIs vorher auf eigene Logins umstellen?
  5. DNS (W5.1): VIP mit keepalived oder zwei DNS-Server per DHCP + nebula-sync? Pi 4 jetzt kaufen und vor E9 aufsetzen?
  6. HA-Zugang (W5.3/W7): mTLS mit eigener PKI (Rezept, Erneuerung, Revocation = CA-Rotation) oder Nabu Casa 75 €/Jahr als Primärweg? Nutzt jemand Apple Watch oder Local Push mit HA? Bekommt Lars das Zertifikat von dir aufs Gerät?
  7. TeamSpeak (H4): Wird TS überhaupt noch gebraucht (0 Verbindungen seit 13.09.)? Wenn ja: TS3 jetzt auf den VPS und 2027 nochmal TS6, oder gleich TS6-Beta auf dem VPS testen?
  8. UNAS-Archivordner (W9): nextcloud-archiv, immich-nicht-importiert (Kindheits-DVDs), wallos-export, stack-archiv — offsite sichern, auf /mnt/pictures/Paperless überführen, oder bewusst ungesichert lassen?
  9. snowflake-proxy (W6): weiter über die Heim-IP (widerspricht „Heim-IP verborgen“), in den Cluster (gleiche IP), oder auf den VPS?
  10. Jellyfin unterwegs (H14): reicht „nur Robin per VPN“, oder soll Lars Jellyfin außer Haus nutzen (dann VPN auf Lars' Gerät)?
  11. NetBird-Prüfung (W5.4): streichen?

5. Übergaben, die zwingend in die Dokumente gehören (Prüffrage G)

Epic Übergabe aus D1
E1 (#179/#216) USB-RAID raus aus der Kette → neues Ziel für aiserver-Repo; UNAS-Originale + Archivordner klassifizieren (W9); UNAS-Snapshots neu bewerten; VPS-Backup (kein borgmatic auf dem VPS — bestätigt); Rebuild-Runbook NUC mit der Zustandsliste aus W3; Kaltstart-Drill (B2) als Abnahme; Storage-Box-Trigger 80 % / vor Importen (Wachstum real ~15–20 GB/Monat, H1)
E2a (#181) 17 untracked .env/Secret-Dateien in /opt/rpi-docker-compose → Infisical vor der Neuinstallation; Offline-Kaltstart des Agents testen (H13); Infisical-Identitäten zählen (Free: 5, Fabrik braucht 2)
E2b (#182) bootstrap.sh NUC mit Scope aus W3 (inkl. borgmatic-Configs, NFS-Mounts, samba, nut, cron, mdadm, netplan, rclone, SSH-Keys-Restore aus borg); docker-Drop-in auf Wants=/After= (B2); /mnt/scanner → /mnt/ssd; ADR-006 um NUC erweitern; Probelauf = Pflicht-Abnahme; VPS-Rebuild 26.04 (bootstrap.sh auf 26.04-Fallen prüfen, nie löschen+neu, H5)
E3 (#186/#225/#270) VM/VL auf SSD (H9); Prometheus+InfluxDB → VM inkl. Bestandsdaten; zweiter Alarmweg + healthchecks.io vor „VPS = einzige Tür“ (W11); #270-Wiederanlauf = Teil von B2; Strommessung aiserver/NUC/UNAS (Steckdose) als Datenbasis für B1; PSI-Trigger NUC (W8); pz-server-Metrik-Label (H3); generische TargetDown + Kaltstart-Drill-Alarme
E6/E4 pz-server on demand (HA-Schalter, Auto-Stopp); HA-Voice → aiserver oder Pipeline entfernen; NUC-Voice/ollama/esphome-Entscheid umsetzen
E8 (#191) Identity-Standort (W1) vor OIDC-Clients; Headscale-OIDC ohnehin Ventil Nr. 1; NetBird-Prüfung streichen oder begründen
E9 (#192) DNS-Zweitinstanz vor dem Umbau im flachen Netz (W12); L2-Anforderung bei VIP; Cluster-Nodes mit UDM/Public-Resolver, nicht Pi-hole; VLAN 80 + AMT; aiserver-NUT-Client nur, wenn B1 (b) gewählt; Host-Resolver-Fallback erreichbar halten (H7)
E10 (#193) Reihenfolge HA → IPP → (TS) → Jellyfin-Entscheid; mTLS-Test zuerst per temporärem UDM-443-Forward (W2); Tür-Design: NUC-Entrypoint PROXY v2 :8443, CrowdSec-LAPI zu Hause + Bouncer NUC (+ Firewall-Bouncer VPS), Geo-Block-Ort, DDNS-Records entfernen (W6); PKI-Rezept + Kalender (W7); HA trusted_proxies prüfen; Headscale mem_limit + Rate-Limit (W11); iCloud-Kündigung → 2027
E5 (#188) Tailnet bleibt Interim für Immich-Upload bis Immich-mTLS (H10); Immich-iOS-mTLS mit Hintergrund-Upload auf iOS 26 testen, bevor E5-Abnahme darauf umgestellt wird
Fabrik 2027 Konzept auf D1-Stand bringen (kein Longhorn, Storage/Backup für Beads/Qdrant, Grundlast 4–7 GB, Argo/Flux offen, H11); Kapazitätstabelle (B3) ist Eingang für „2 oder 3 Worker“; Paket-Proxy-Standort Cluster (NUC hat 10 GiB frei) bleibt plausibel; Modell-Proxy vor llama-swap; Webhook-Empfänger auf dem VPS möglich (VPS bleibt)
ADRs/Doku ADR-001 amendieren (H12); neue ADR „Rolle von Kubernetes“ mit Kapazitätstabelle, Fehlerdomänen-Tabelle (welcher Dienst darf vom Cluster/VPS/Internet abhängen) und Review-Kriterien; Identity-Entscheid 29.06. explizit supersedieren oder bestätigen (W1); Skill homelab-infra nachziehen (USV-Modell, Identity, Tür); Teil 7 um Infisical/Cloudflare/UDM als Abhängigkeiten ergänzen (H8, H13)

Anhang: Belegbefehle (Auswahl, alle lesend)

# NUC
ssh nuc-root 'cat /etc/systemd/system/docker.service.d/*.conf; systemctl show docker.service -p Requires'
ssh nuc-root 'docker exec nut-upsd upsc serverups | grep -E "model|nominal|load|realpower|runtime|charge"'
ssh nuc-root 'free -h; cat /proc/pressure/memory; lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL'
ssh nuc-root 'cd /opt/rpi-docker-compose && git status --porcelain --ignored'   # nur Dateinamen
ssh nuc-root 'ls /etc/borgmatic.d /etc/infisical /root/.ssh /etc/mdadm /etc/netplan; findmnt -T /run/infisical'
ssh nuc-root 'docker exec tailscale tailscale status; findmnt -t nfs -no TARGET,OPTIONS'
# VictoriaMetrics (vom NUC)
curl -s --data-urlencode 'query=min_over_time(nuc_ups_battery_runtime_seconds[30d])' http://172.25.0.4:8428/api/v1/query
curl -s --data-urlencode 'query=max_over_time(aiserver_gpu_watts[30d])' http://172.25.0.4:8428/api/v1/query
curl -s --data-urlencode 'query=(node_filesystem_size_bytes{mountpoint="/mnt/storagebox"}-node_filesystem_avail_bytes{mountpoint="/mnt/storagebox"}) offset 42d' …
curl -s --data-urlencode 'query=min_over_time(node_memory_MemAvailable_bytes[30d])' …
# aiserver
ssh aiserver 'cat /sys/class/hwmon/hwmon*/power1_average'
# VPS
ssh -i ~/.ssh/homelab-external_private root@49.13.70.218 'lsb_release -ds; docker ps --format "{{.Names}}\t{{.Image}}"; ls /etc/borgmatic.d; grep -E "^\s*- domain" …/authelia/configuration.yml'
# Web (28.10.2026)
docs.hetzner.com/cloud/billing/faq (Rebuild = kein Preiswechsel) · teamspeak.com/en/terms-and-conditions §12 ·
github.com/orgs/home-assistant/discussions/1078 (frenck 09.10.2026) · github.com/home-assistant/iOS/blob/main/docs/mTLS.md ·
github.com/traefik/traefik/pull/7614 (CRL abgelehnt) · techspecs.ui.com/unifi/integrations/unas-pro (kein S3-Server) ·
immich.app/blog/v2.6.0-release + PR #26911 · tailworm.com (headscale pending) · github.com/juanfont/headscale/releases (0.29.6)