eth0 DNS server 2 = 192.168.178.1 (FRITZ!Box) is set as failover behind
AdGuard. Mark the komodo-bulk-deploy-dns runbook immediate measure as
implemented. Closes the AdGuard SPOF for Docker image pulls.
Ref: docs/homelab-optimierung.md recommendation 3a.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Daily snapshots at 05:30 UTC (after the 04:30 local Borg run), 7 days
retention, snapshot directory visible for single-file restore via
.zfs/snapshot/. Closes the ransomware/misuse gap left open by the
explicit decision against Borg append-only (2026-06-01).
Ref: docs/homelab-optimierung.md recommendation 2.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Digests unchanged (verified against GHCR manifest API: release ==
v2.7.5 for both images). Renovate now produces visible version PRs
instead of silent digest bumps that hide major version jumps.
Ref: docs/homelab-optimierung.md recommendation 1.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Codex CLI auto-reads AGENTS.md; file only points to AI_CONTEXT,
architecture master, workflow and the binding doc rules - no duplicated
content (one fact, one home).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- REPO_MAP.md: replace Arbeitsregel with 8 binding documentation rules
(one fact one home, done leaves the working copy, file types, header
convention, quarterly gardening)
- WORKFLOW.md Dokumentationspflicht and CLAUDE.md aligned to the rules
- docs/README.md index rebuilt for the consolidated state
- H drive docs merged into ops/h-drive-nearline/README.md (scheduled
task + no-MIR rule added); docs/H_DRIVE_NEARLINE_PULL.md removed
- implemented proposal archived to docs/archive/2026/
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- merge RESTORE_HANDBOOK.md into ops/restore-tests/README.md (single
operations doc; restore status lives only in RESTORE_MATRIX maturity
table)
- RESTORE_MATRIX.md: extract embedded runbook drafts (261 -> 141 lines);
unraid-flash and tailscale stubs become ops/restore-tests runbooks,
adguard/redis checklists superseded by validated scripts
- delete six historical pre-first-run *-plan.md files (runbook + script
are the source of truth since the validated first runs)
- SERVICES_RECOVERY: drop completed task table; DISASTER_RECOVERY:
point related docs and section 11 to MASTER_TODO/schedule
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- MASTER_TODO.md is now the only status list: parked decisions point to
DECISIONS.md, done log capped at 5 condensed entries
- delete AUDIT_2026-05-25_TODO.md (open items and parked decisions fully
covered by MASTER_TODO/DECISIONS)
- AI_CONTEXT.md: drop duplicated status block, keep rules and pointers
- EXTERNAL_DEPENDENCIES.md: condense review log to recent entries
- fix references in DR_WORKSTATION_SETUP, EXTERNAL_OPERATOR_RUNBOOK,
STORAGE_LAYOUT, REPO_MAP, docs/README
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der komodo-Stack wird in Komodo inline (file_contents) verwaltet, nicht aus dem Repo deployed. Renovate-PRs darauf wirken zur Laufzeit nicht und erzeugen Git-Komodo-Scheinsicherheit. Daher: ops/komodo/** in ignorePaths, mongo-Digest auf den real laufenden Stand zurueckgesetzt, Inline-Ausnahme in docs/RENOVATE.md und im Compose-Header dokumentiert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bulk-Renovate-Merge loest parallele Komodo-Deploys aus; Image-Pulls scheitern mit DNS connection refused, weil AdGuard (einziger Host-Resolver) im selben Batch recreated wird. Runbook haelt Symptom, Ursache, Sofortmassnahme (Unraid DNS2) und Betriebsregel fest. Verweis in REPO_MAP ergaenzt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Traefik (Public-Entrypoint), Unbound (DNS), n8n und Nextcloud bekommen eigene PRs statt im gruppierten minor-and-patch-updates-PR zu landen. Erzwingt kontrollierten, einzeln reviewbaren Merge pro kritischem Dienst (WORKFLOW.md: keine mehreren kritischen Dienste gleichzeitig migrieren).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bekannte Noise-Patterns, die strukturell sehr laut sind (Unraid-mdadm-Spam
~5760/Tag, Fritz!Box-SOA ~1170/Tag), hielten den Report-Status dauerhaft
auf >= WARNUNG ueber noise_threshold_exceeded und entwerteten damit die
Ampel - das System konnte nie OK erreichen, egal wie gesund.
Neue Datei noise-escalation-exempt.patterns listet solche Patterns. Sie
zaehlen weiterhin als Noise und erscheinen in der Breakdown-Tabelle (jetzt
mit Hinweis-Spalte "eskalations-befreit"), zaehlen aber nicht mehr zu
noise_threshold_exceeded. Neue/unerwartete laute Patterns eskalieren
weiterhin zur WARNUNG. Jede Befreiung traegt Begruendung + Recheck.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ersetzt den wirkungslosen LD_PRELOAD-Versuch durch den dokumentierten
Root-Cause-Fix. immich_machine_learning blieb dauerhaft unhealthy: der
gunicorn-Worker haengt nach "Control socket listening" in futex und
erreicht nie "Application startup complete" (/ping -> Timeout). Ursache ist
der in gunicorn 25.1.0 neu eingefuehrte, fehlerhafte Control-Socket
(bestaetigt: gunicorn#3510, immich#27228, Regression seit Immich 2.6).
GUNICORN_CMD_ARGS=--no-control-socket deaktiviert das Feature. immich-ml
startet gunicorn als Subprozess (python -m gunicorn), der GUNICORN_CMD_ARGS
aus der Env liest und anhaengt; das Flag --no-control-socket
(config: control_socket_disable) ist in diesem gunicorn-Build als gueltig
verifiziert. Reversibel; bei gefixter Immich-Release wieder entfernen.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Zwei Verbesserungen am Daily Operations Report, ausgeloest durch den
versteckten immich_machine_learning-Ausfall (lief 2,3 Tage unhealthy,
weil der Report nur "unhealthy=1" zaehlte, ohne Name/Grund):
1. collect_container_state: neue Sektion "Unhealthy Container" listet jeden
unhealthy Container mit FailingStreak und letztem Healthcheck-Output.
So ist sofort sichtbar WELCHER Container und WARUM.
2. collect_image_freshness: neue Image-Age-Allowlist
(image-age-allow.patterns). Bewusst gepinnte, aber aktuelle/empfohlene
Images (immich_postgres = exakt Immichs Pin; blackbox-exporter v0.28.0 =
latest) werden mit Recheck-Datum von der Ueberalterungs-Warnung
ausgenommen. Nach Ablauf des Recheck-Datums greift die Ausnahme nicht
mehr -> erzwingt Neubewertung statt stillen Alterns. Top-10-Tabelle hat
jetzt eine Hinweis-Spalte (ueberaltert / bewusst gepinnt).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
immich_machine_learning haengt seit dem 7.6. unhealthy: der gunicorn-Worker
bleibt nach "Control socket listening" in futex_do_wait stehen und erreicht
nie "Application startup complete" (/ping -> ConnectTimeout/ReadTimeout).
Kein OOM (22 GB frei), kein Disk-I/O-Wait, laeuft als root, Socket wird
erstellt - klassischer Fork-Deadlock von mimalloc (LD_PRELOAD) im geforkten
Worker unter gunicorn 25.1.0.
mimalloc per LD_PRELOAD="" deaktiviert. Reine Allocator-Optimierung,
funktional unkritisch, reversibel. Bekannte Upstream-Regression seit
Immich 2.6 (immich#27228, #22317) ohne offiziellen Fix; Restart und
force-recreate sind dort als wirkungslos dokumentiert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Behebt drei Befunde aus dem Operations-Report 2026-06-10:
- daily-status-report.sh: Zertifikate werden vor der Auswertung pro
Domain-Set dedupliziert; nur das laengstlaufende Cert zaehlt. Traefik
haelt waehrend der Erneuerung altes + neues Cert in acme.json, was
bisher eine falsche KRITISCH-Warnung (traefik.kaleschke.info 5 Tage)
ausloeste, obwohl das neue Cert 65 Tage Restlaufzeit hat.
- monitoring/blackbox-exporter: DNS von 1.1.1.1/8.8.8.8 auf AdGuard
(172.23.0.3 via dns_net) umgestellt. Externe Resolver lieferten die
WAN-IP, was Hairpin-NAT-Timeouts (9,5s) bei Probes von cloud/glances
verursachte (662 Fehler/Tag).
- log-noise.patterns: Fritz!Box-SOA-Fehler (AdGuard, RFC-1035-Verstoss)
und fehlendes grafana-amazonprometheus-datasource-Plugin als bekanntes
Rauschen klassifiziert (~1800 Zeilen/Tag).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Host gehaertet 2026-06-07: PermitRootLogin prohibit-password,
PasswordAuthentication no, KbdInteractiveAuthentication no; PubkeyAuthentication yes.
Persistenz upgrade-sicher via idempotentem /boot/config/ssh-harden.sh aus
/boot/config/go (sshd -t vor HUP-Reload, Syslog-Selbst-Verifikation).
Manueller Post-Upgrade-Check und Rollback dokumentiert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Verhindert Dauer-ntfy-Alarm fuer den entfernten userspace-Docker-Tailscale. Natives Tailscale-Plugin ist kein Container und wird hier bewusst nicht geprueft.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mealie-Container konnte auth.kaleschke.info nicht aufloesen/erreichen (httpx.ConnectTimeout beim OIDC-Discovery). extra_hosts-Muster wie Komodo.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
OIDC_AUTH_ENABLED + Authelia-Provider, Secret via ${MEALIE_OIDC_CLIENT_SECRET} (Stack-ENV). Kein Auto-Redirect, Self-Signup an. Authelia-Client mealie (one_factor) host-seitig angelegt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>