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(amdgpupower1_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-TIMERersetzen durch Trigger aufruntime < 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 Requireslistet alle sechs Mount-Units als Requires= (systemd 249;nofailin den NFS-Optionen ändert daran nichts)./mnt/storageboxist 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)“. VPSauthelia/configuration.ymlAccess-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-composemit 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/infisicalist 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/robin4,7 G;/root3,5 G;/var/lib/db-dumps788 M;/var/lib/dockermit 56 GB bewusst behaltenen Images. Keine borg-Keyfiles (/root/.config/borg/keysfehlt → 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, wennbootstrap.shdiese Liste abdeckt oder die Secrets vorher in Infisical liegen. Ohne E2a-Migration der.envstartet 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/scannerauf/mnt/ssdumziehen (ist auf der Systemplatte). Für den Infisical-Agent: Offline-Start prüfen (/root/.infisical/secrets-backupexistiert; 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: nurweb :80/websecure :443, kein PROXY-Protokoll. Traefik-TCP-Router mitHostSNI+passthroughsehen kein HTTP; Traefik hat für TCP nuripAllowList/inFlightConnals 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 unterspeedtest_*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-Plugintlscrlcheckerexistiert; 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 brauchttrusted_proxies— inconfiguration.yamlnicht 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 einpython(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/unassteht in keiner borgmatic-Quelle; dort liegennextcloud-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.dfehlt) ✓ 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/*-archivklassifizieren, 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“ wiefabrik-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_limitfü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/storageboxbelegt (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.shaushomelab-externalvorher 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 → Composegroup_add). - H7 · Host-Resolver [B]:
/etc/resolv.conf:10.10.10.3(Pi-hole-Container), Fallback9.9.9.9→ Host-Dienste (Infisical-Agent, borg→Hetzner, rclone) überleben einen Pi-hole-Ausfall mit Timeout-Verzögerung. Für E9 beibehalten und inbootstrap.shfestschreiben; 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/ssdverlegen (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-0xxoder Amendment-Abschnitt, Memory-Satz anpassen; Skill-Zeile „K8s verworfen“ existiert nicht, aber Identity-Zeile (W1) schon. - H13 · Infisical-Kaltstart [B/E]:
/run/infisicalist tmpfs, Agent authentifiziert mitclient-id/secret(Universal Auth) gegeneu.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 statusbestä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¶
- USV (B1): aiserver ohne USV + Autostart, eigene kleine USV für den aiserver, oder USV-Tausch nach E3-Messung?
- 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?
- 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?
- Identity (W1): Authelia/lldap auf dem VPS lassen (keine Migration) oder heimholen und VPS-UIs vorher auf eigene Logins umstellen?
- DNS (W5.1): VIP mit keepalived oder zwei DNS-Server per DHCP + nebula-sync? Pi 4 jetzt kaufen und vor E9 aufsetzen?
- 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?
- 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?
- 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? - snowflake-proxy (W6): weiter über die Heim-IP (widerspricht „Heim-IP verborgen“), in den Cluster (gleiche IP), oder auf den VPS?
- Jellyfin unterwegs (H14): reicht „nur Robin per VPN“, oder soll Lars Jellyfin außer Haus nutzen (dann VPN auf Lars' Gerät)?
- 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)