Output:
# Backupstrategie Draft — K3s DMZ + Synology NAS

## Ausgangslage

- K3s Cluster steht in der DMZ.
- Synology NAS steht im Intranet.
- Neuer Hilfs-Backup-Server in der DMZ: `dmz-backup` (`192.168.20.90`).
- NAS kann aktiv auf Rechner in der DMZ zugreifen.
- diskstation-bot ist zuständig für Synology/NAS.
- kube-bot ist zuständig für K3s/DMZ/Cluster.
- Ziel: belastbare Backupstrategie vor Longhorn-Reparatur/Replica-Umstellung.

## Grundprinzip

Backups sollten bevorzugt vom Intranet/NAS aus *pull-basiert* aus der DMZ geholt werden, statt der DMZ Schreibzugriff ins Intranet zu geben.

Konkret neu:
- Cluster pusht Backup-Dateien nach `dmz-backup` (`192.168.20.90`).
- Synology pullt von `dmz-backup`.
- `dmz-backup` ist Staging/Puffer in der DMZ, Synology bleibt Backup-Master.

Vorteile:
- DMZ bekommt keine breiten Credentials ins Intranet.
- NAS kontrolliert Zeitplan, Retention und Zielpfade.
- Kompromittierter DMZ-Service kann Backups nicht ohne Weiteres löschen.

## Backup-Ebenen

## Ordnerstruktur auf dmz-backup / Synology

Empfehlung: Struktur nach Platform/Tenants uebernehmen, aber Kubernetes-Namespace nur als Metadatum fuehren.

Grund:
- Fachliche Restore-Entscheidungen laufen nach Platform/Tenant/App.
- Einige Live-Namespaces sind historisch gewachsen (`hf-*`, `pidoka-hf-*`, `homarr`, `zammad`).
- Synology-Retention und Restore-Tests lassen sich pro Tenant/App sauberer steuern.

Staging-Root auf `dmz-backup`:

```text
/srv/dmz-backup/k3s-dmz/
```

Synology-Pull-Ziel sinngemaess:

```text
K3S_DMZ_Backups/
```

Kurzschema:

```text
k3s-dmz/
  platform/
    argocd/prod/
    infisical/prod/
    external-secrets/prod/
    longhorn/prod/
    nginx-proxy-manager/prod/
    cluster/prod/
  tenants/
    pidoka/prod/<app>/
    cattaro/stage/<app>/
    cattaro/prod/<app>/
  legacy/
    <legacy-service>/prod/
  _indexes/
  _restore-tests/
```

Detailentwurf:
- `/home/node/.openclaw/workspace/inventory/backup-folder-structure-dmz-backup-20260619.md`

### Ebene 1 — Konfiguration / Wiederaufbau

Zu sichern:
- Nginx Proxy Manager Datenbank und LetsEncrypt-Verzeichnis vom Raspberry Pi
  - Container: `ngm2-app-1`
  - Daten: `/data/compose/2/data`
  - Zertifikate: `/data/compose/2/letsencrypt`
- Kubernetes Inventar/Manifeste ohne Secrets
- ArgoCD Git Repo / Application Struktur
- ggf. OPNsense Export separat über zuständigen Admin

Ziel:
- Schnelle Rekonstruktion von Proxy, Routing und GitOps-Zustand.

### Ebene 2 — Applikationsdaten / Datenbanken

Priorität:
1. `hf-espocrm` MariaDB
2. `hf-suitecrm` MariaDB
3. `hf-mautic` MariaDB + Redis falls relevant
4. `hf-n8n` Daten/DB
5. `hf-matomo` DB + App-Daten

Empfehlung:
- Logische Dumps pro DB, weil sie einfacher testbar und portabel sind.
- Dumps temporär auf Cluster/Node erzeugen oder direkt per Stream ans NAS ziehen.
- Secrets nicht in Slack teilen; Zugang über Kubernetes Secrets nur gezielt und lokal auslesen, falls Mislav OK gibt.

### Ebene 3 — Volume Backups / Longhorn

Aktueller Longhorn-Status:
- 12 Volumes sichtbar
- 11 `attached/degraded`
- 1 `detached/unknown`
- `default-replica-count=3`, aber nur 2 Nodes
- Longhorn Backup Target aktuell leer/nicht verfügbar

Optionen:

A) Synology als NFS Backup Target für Longhorn
- NAS stellt NFS Share bereit.
- K3s Nodes mounten bzw. Longhorn nutzt NFS Backup Target.
- Einfach, lokal schnell.
- Risiko: DMZ braucht Netzwerkzugriff zum NAS-Share.

B) Synology als S3-kompatibles Ziel via MinIO auf NAS
- MinIO läuft auf Synology oder Umgebung im Intranet.
- Longhorn nutzt S3 Backup Target.
- Bessere Credential-/Bucket-Trennung und Lifecycle möglich.
- Etwas mehr Setup-Aufwand.

C) NAS pullt Dateisystem-/DB-Backups aus DMZ
- Für DB-Dumps und Proxy-Konfig sehr gut.
- Für Longhorn-native Backups weniger passend.

Empfehlung:
- Kurzfristig: NAS pullt NPM-Konfig + DB-Dumps.
- Für Longhorn nicht direkt auf DiskStation-NFS/S3 setzen, wenn DMZ -> NAS bewusst gesperrt ist. Longhorn braucht ein vom Cluster erreichbares Backup Target.
- Angepasste Phase 1: DMZ-lokales Longhorn Backup Target bereitstellen (NFS oder MinIO/S3), Longhorn schreibt dorthin, Synology pullt anschließend per SSH/rsync in ein dediziertes Share `Backup_K3s_Longhorn`.
- Direkter NAS-NFS-Export nur weiterverfolgen, wenn Mislav die Firewall-Regel DMZ -> NAS explizit erlauben will; aktuell nicht empfohlen.

## Retention-Vorschlag

Für produktive Business-Services:
- Täglich: 14 Tage
- Wöchentlich: 8 Wochen
- Monatlich: 6–12 Monate
- Vor Wartung/Longhorn-Änderungen: manuelles Pre-Change Backup

## Security-Vorschlag

- Dedizierter NAS-Backup-User/Key für Pull-Zugriff.
- Nur read-only/pull wo möglich.
- Für Backup-Ziel getrennte Credentials, keine Admin-Credentials.
- Backups möglichst versioniert/immutable oder mit Snapshot-Schutz auf Synology.
- Restore-Test einplanen, nicht nur Backup-Erfolg prüfen.

## Offene Fragen an diskstation-bot

1. Welche Synology Backup-Technologien sind verfügbar/eingerichtet?
   - Hyper Backup?
   - Active Backup?
   - Snapshot Replication?
   - NFS Shares?
   - Docker/Container Manager für MinIO?
2. Gibt es bereits ein dediziertes Backup-Volume/Share?
3. Kann das NAS aus dem Intranet per SSH/NFS/S3 auf DMZ-Ziele zugreifen?
4. Soll Longhorn über NFS oder S3/MinIO angebunden werden?
5. Welche Retention/Quota ist realistisch?
6. Können Synology Snapshots/Immutability für Backup-Schutz genutzt werden?

## Nächste Schritte

1. diskstation-bot prüft NAS-Fähigkeiten und schlägt Zielpfad/Zieltechnologie vor.
2. kube-bot liefert Liste der zu sichernden DMZ-Quellen und Kubernetes-PVCs.
3. Mislav entscheidet: NFS vs. S3/MinIO für Longhorn.
4. Erst danach Longhorn Backup Target einrichten.
5. Danach DB-Dumps/Proxy-Backups automatisieren.
6. Erst nach validiertem Backup: Longhorn Replica-Count/StorageClass korrigieren.

## K3s-Anforderungen an neue DMZ-Backup-Strecke (2026-06-20)

Abgleich mit diskstation-bot-Konzept:

- Zielstrecke ist aus Cluster-Sicht stimmig: K3s/DMZ pusht nach `dmz-backup` (`192.168.20.90`), Synology pullt von dort und bleibt Langzeit-Backup-Master.
- `dmz-backup` ist nur Staging/Puffer, nicht finales Backup.
- Keine direkten Schreibrechte aus DMZ/K3s auf die Synology.
- Initial keine destruktive Retention und kein `--delete`; Pruning erst nach Restore-Test und expliziter Freigabe.
- Backups mit Secret-, Credential-, Datenbank- oder personenbezogenem Inhalt werden vor Ablage auf `dmz-backup` clientseitig verschlüsselt. `dmz-backup` darf keine dauerhaften Passphrases oder Private Keys halten. Keine Secretwerte in Metadaten, Logs oder Slack.

Prioritäten:

1. Zustandsbehaftete Workloads/PVCs und Datenbanken.
2. Plattform-Komponenten und Cluster-/GitOps-Konfiguration.
3. Stateless Workloads, soweit sie nicht vollständig aus GitOps rekonstruierbar sind.

Gewünschte Artefakte je Backup-Satz:

- `metadata.json`
- `manifest.sha256`
- `status.json`
- `restore-notes.md`
- optional `k8s-resources.yaml` ohne Klartext-Secrets
- optional `volume-backup-ref.txt` für Longhorn-native Backup-Referenzen
- optional `app-dump/` für applikationsspezifische Dumps, z. B. Datenbank-Dumps

Minimale k3s-Metadaten:

- Cluster, Namespace, Tenant/Platform, App/Release und Environment.
- PVC/PV, StorageClass, Longhorn Volume-Name und Backup-/Snapshot-Zeitpunkt.
- Image-/Chart-/Git-Revision, soweit vorhanden.
- Backup-Art, Restore-Ziel, Prüfschritte und Restore-Test-Status.
- Verschlüsselungsstatus, Key-/Secret-Referenz und Fingerprint nur ohne Secretwerte.

Longhorn-Anforderungen:

- Klare Zuordnung `PVC -> Longhorn Volume -> Backup-Artefakt`.
- Restore immer zuerst in neue Test-PVCs, nie über produktive PVCs.
- Retention/Delete erst nach mindestens einem erfolgreichen Restore-Test je Backup-Klasse.
- Zielarchitektur soll auf `dmz-backup` umgestellt werden; bisherige Staging-Altlast `192.168.20.40` bleibt als technische Schuld markiert.

Restore-Test aus Cluster-Sicht:

1. Synology stellt eine Kopie in Restore-Staging bereit.
2. Kube-Seite nutzt nur freigegebene Artefakte/Referenzen; keine produktiven Secrets im Klartext.
3. Restore in separaten Namespace, z. B. `restore-test-*`, mit neuen PVCs.
4. App startet isoliert ohne produktiven Ingress/Traffic.
5. Prüfung: Pods ready, Daten sichtbar/konsistent, Logs ohne kritische Fehler, Checksummen/Manifest passen.
6. Ergebnis wird in `_restore-tests/` und in kube-bot-Doku protokolliert.

Empfehlung:

- Pilot mit unkritischem, aber zustandsbehaftetem Workload mit kleinem PVC starten.
- Erst danach Datenbanken oder tenant-kritische Volumes einbeziehen.
- Für echte Backup-Jobs, Longhorn-Zielkonfiguration, Credential-Anlage oder Restore-Ausführung ist explizites OK von Mislav erforderlich.

## Pilot-Scope `platform/cluster/prod` — Control-Plane-Konfiguration (2026-06-20)

Mislav moechte den ersten Pilot im Bereich "cluster control-plane" ansetzen. Kube-bot-Einordnung:

- Als erster Pilot akzeptabel, wenn es ein Backup-Strecken-Pilot fuer rekonstruierbare Plattform-/Cluster-Konfiguration bleibt.
- Kein produktiver Control-Plane-Restore, kein etcd-Restore, keine Longhorn-Setting-Aenderungen und kein Ueberschreiben produktiver PVCs.
- Ablauf: read-only Export, clientseitige Verschluesselung vor `dmz-backup`, Synology Pull ohne `--delete`, Restore-Pruefung nur in Staging/Parser/Doku.
- Zielpfad: `k3s-dmz/platform/cluster/prod/`.
- Restore-Test-Ebene: Artefakt-, Manifest- und Checksum-Pruefung aus Synology-Staging; kein Restore in die produktive Control Plane.

In Scope:

- Namespace-/Node-/StorageClass-/PVC-/PV-Inventar.
- ArgoCD Applications/AppProjects/Cluster-Zielmetadaten ohne Secretwerte.
- Longhorn Volume-/BackupTarget-/Storage-Metadaten ohne Secretwerte.
- Relevante CRD-/Controller-Uebersichten, z. B. External Secrets, Longhorn und Ingress.
- Events/Status-Snapshots als Diagnosekontext.
- Restore-Runbook und Pruefliste.

Out of Scope fuer diesen Pilot:

- Produktiver Control-Plane-Restore.
- etcd-Restore.
- Secrets im Klartext.
- PVC-Ueberschreiben.
- Neue Restore-Ressourcen im produktiven Cluster.
- Retention/Delete/Pruning.

## DMZ-Staging Host Kandidaten (read-only geprüft)

- `192.168.20.40` / `mbrkanov-Mini-IT13`: Ubuntu 22.04, ca. 1.3T frei auf `/`, `rsync` und `nfs-common` vorhanden, SSH offen. Kein `nfs-kernel-server` sichtbar. Beste Kapazität, aber Control-Plane/Master.


bash

/bin/bash -lc 'command -v age || true; command -v gpg || true; command -v openssl || true; command -v sops || true; command -v kubectl || true; command -v jq || true; command -v ssh || true; command -v rsync || true'


Output:
/usr/bin/openssl
/usr/bin/ssh


Output:
total 24
drwx------ 2 node node 4096 Jun 15 15:30 .
drwxr-xr-x 1 node node 4096 Jun 16 19:49 ..
-rw------- 1 node node 4007 Jun 16 17:02 known_hosts
-rw------- 1 node node 3029 Jun 15 15:13 known_hosts.old
-rw------- 1 node node  432 Jun 14 11:07 kube-bot-it15-ed25519
-rw-r--r-- 1 node node  113 Jun 14 11:07 kube-bot-it15-ed25519.pub


/bin/bash -lc "sed -n '120,230p' INFRASTRUCTURE.md"


Output:
### DMZ Backup Staging — dmz-backup

- Hostname/Rolle: `dmz-backup`, Hilfs-Backup-Server in der DMZ.
- IP: `192.168.20.90`.
- Zielbild:
  - K3s/DMZ-Cluster pusht Backup-Dateien nach `dmz-backup`.
  - Synology/DiskStation pullt von `dmz-backup` und bleibt Backup-Master.
  - Direkte Schreibrechte aus der DMZ auf Synology werden vermieden.
- Vorgeschlagener Staging-Root: `/srv/dmz-backup/k3s-dmz/`.
- Ordnerstruktur-Entwurf: `/home/node/.openclaw/workspace/inventory/backup-folder-structure-dmz-backup-20260619.md`.
- Änderungen an Backup-Konfigurationen nur nach explizitem OK von Mislav.

### Synology DiskStation

- Rolle: Backup-Ziel / Backup-System.
- kube-bot ist dazu im Austausch mit `diskstation-bot`.
- Zielrolle: Backup-Master, der Backups von `dmz-backup` (`192.168.20.90`) pullt.
- Konkrete Synology Shares, Pull-Jobs, Retention, Snapshots/Immutability und Restore-Tests sind mit `diskstation-bot` abzugleichen.
- Änderungen an Backup-Konfigurationen nur nach explizitem OK von Mislav.

### SSH-Zugangsmerker — kube-bot/OpenClaw Runtime

Stand: 2026-06-15 13:00 UTC. Diese Merker dienen dazu, eingerichtete Diagnosezugänge nicht zu vergessen. Keine Private-Key-Inhalte dokumentieren.

- OpenClaw Runtime läuft nicht direkt auf den Zielsystemen, sondern aktuell als User `node` im Container/Host `0e9d9d0b8619`.
- Lokaler SSH-Key-Pfad in der Runtime: `/home/node/.ssh/kube-bot-it15-ed25519`.
- DMZ K3s Control-Plane:
  - Ziel: `kube-bot@192.168.20.40`
  - Hostnamen: `mbrkanov-Mini-IT13` / `mbrkanov-mini-it13`
  - Status: SSH funktioniert, sudo NOPASSWD funktioniert.
  - Kubernetes read-only Beispiel: `ssh -i ~/.ssh/kube-bot-it15-ed25519 kube-bot@192.168.20.40 'sudo kubectl --kubeconfig=<redacted> get nodes -o wide'`
  - Hinweis: `sudo KUBECONFIG=... kubectl` funktioniert nicht, weil sudo das Setzen der Env-Variable blockiert. Stattdessen `sudo kubectl --kubeconfig=<redacted> ...` verwenden.
- DMZ K3s Worker:
  - Ziel: `kube-bot@192.168.20.45`
  - Hostnamen: `Mini-IT13-02` / `mini-it13-02`
  - Status: als bekanntes Ziel dokumentiert; Zugriff bei Bedarf erneut testen.
- IT15 Management-Node:
  - Ziel laut älteren Notizen: `Misla@192.168.1.121`
  - Status am 2026-06-15 12:56 UTC: SSH von aktueller Runtime blockiert (`Permission denied`).
  - Früherer Zugriff war dokumentiert, aber aktueller nutzbarer Key/User muss neu bestätigt oder eingerichtet werden.
- Betriebsregel bleibt: SSH primär read-only Diagnose; Änderungen nur nach explizitem OK von Mislav.

### IT15 SSH-Korrektur — 2026-06-15 14:15 UTC

- Korrektes SSH-Ziel: `Misla@192.168.1.121` mit Key `/home/node/.ssh/kube-bot-it15-ed25519`.
- IT15 ist Windows; K3s/ArgoCD laufen in WSL `Ubuntu`.
- Für Linux/K3s-Kommandos über SSH verwenden: `wsl.exe -d Ubuntu -e bash -lc '<command>'`.
- Beispiel: `ssh -i /home/node/.ssh/kube-bot-it15-ed25519 Misla@192.168.1.121 "wsl.exe -d Ubuntu -e bash -lc 'kubectl get nodes'"`.

### Infisical Recovery-Ablage — kube-bot SSH Keys — 2026-06-15 14:29 UTC

- Infisical Instanz: `http://192.168.1.121:8088`.
- Projekt: `platform-kubernetes` (`c5e8661f-4b7a-43e1-80b0-8674f30950dc`).
- Environment: `prod`.
- Secret-Pfad: `/bots/kube-bot/ssh`.
- Abgelegte Secret-Namen:
  - `SSH_KEY_IT15_PRIVATE`
  - `SSH_KEY_IT15_PUBLIC`
  - `SSH_KEY_IT15_FINGERPRINT`
  - `SSH_HOST_IT15`
  - `SSH_KEY_IT15_LOCAL_PATH`
  - `SSH_HOST_DMZ_CONTROL_PLANE`
  - `SSH_HOST_DMZ_WORKER`
- Key-Fingerprint: `SHA256:v1vAeRvbpSAkVQe2kTdjZjwNexaFJ59XWt8+QlOXgmE`.
- Recovery-Prinzip: Private Key aus Infisical lesen, nach `/home/node/.ssh/kube-bot-it15-ed25519` schreiben, `chmod 600`, Fingerprint prüfen, SSH-Test ausführen.
- Verifiziert: temporär aus Infisical gelesener Key konnte mit `chmod 600` für SSH auf `Misla@192.168.1.121` genutzt werden. Temporäre Datei wurde gelöscht.
- Keine Secretwerte/Private-Key-Inhalte in Markdown, Slack oder Logs ausgeben.

### Ergänzung Infisical — DMZ SSH Key-Namenssatz — 2026-06-15 14:35 UTC

- Ergänzt im bestehenden Infisical-Pfad `platform-kubernetes/prod:/bots/kube-bot/ssh`:
  - `SSH_KEY_DMZ_PRIVATE`
  - `SSH_KEY_DMZ_PUBLIC`
  - `SSH_KEY_DMZ_FINGERPRINT`
  - `SSH_KEY_DMZ_LOCAL_PATH`
  - `SSH_HOST_DMZ_CONTROL_PLANE`
  - `SSH_HOST_DMZ_WORKER`
- Aktuell ist das DMZ-Keymaterial identisch mit dem lokal vorhandenen OpenClaw/kube-bot Key `/home/node/.ssh/kube-bot-it15-ed25519`; es wird bewusst zusätzlich unter DMZ-spezifischen Namen geführt.
- Verifiziert: Readback von `SSH_KEY_DMZ_PRIVATE` in temporäre Datei, `chmod 600`, Fingerprint geprüft, SSH-Probe auf `kube-bot@192.168.20.40` erfolgreich. Temporäre Datei gelöscht.
- Fingerprint: `SHA256:v1vAeRvbpSAkVQe2kTdjZjwNexaFJ59XWt8+QlOXgmE`.

### SSH Verifikation — DMZ Worker `192.168.20.45` — 2026-06-15 15:03 UTC

- Ziel: `kube-bot@192.168.20.45` (`mini-it13-02`).
- Key: `/home/node/.ssh/kube-bot-it15-ed25519` bzw. Infisical `platform-kubernetes/prod:/bots/kube-bot/ssh/SSH_KEY_DMZ_PRIVATE`.
- Status: SSH funktioniert, sudo NOPASSWD funktioniert.
- Read-only Probe: `hostname`, `whoami`, `sudo -n true`, `uname -a`, `df -h /` erfolgreich.
- Keine Änderungen durch kube-bot ausgeführt.

### SSH Verifikation — Nginx Proxy Host `192.168.20.20` — 2026-06-15 15:14 UTC

- Ziel: `kube-bot@192.168.20.20` (`raspi`, Nginx Proxy Manager / Reverse Proxy Host).
- Key: `/home/node/.ssh/kube-bot-it15-ed25519`; passender Public-Key-Kommentar `kube-bot@openclaw-it15-20260614`.
- Status: SSH funktioniert, sudo NOPASSWD funktioniert.
- Host: Raspberry Pi / Debian Bookworm, Kernel `6.12.62+rpt-rpi-v8`, aarch64.
- Authorized Keys bereinigt: alter Eintrag `kube-bot@openclaw-k3s-diagnostics` entfernt; aktueller Key bleibt erhalten.
- Vor Änderung wurde eine Backup-Datei von `/home/kube-bot/.ssh/authorized_keys` auf dem Zielhost angelegt.

### Ergänzung Infisical — Nginx/Raspi SSH Key-Namenssatz — 2026-06-15 15:16 UTC

- Ergänzt im bestehenden Infisical-Pfad `platform-kubernetes/prod:/bots/kube-bot/ssh`:
  - `SSH_KEY_NGINX_PRIVATE`
  - `SSH_KEY_NGINX_PUBLIC`
  - `SSH_KEY_NGINX_FINGERPRINT`
  - `SSH_KEY_NGINX_LOCAL_PATH`
  - `SSH_HOST_NGINX_PROXY`
- Ziel: `kube-bot@192.168.20.20` (`raspi`, Nginx Proxy Manager / Reverse Proxy Host).
- Aktuell ist das Nginx/Raspi-Keymaterial identisch mit dem lokal vorhandenen OpenClaw/kube-bot Key `/home/node/.ssh/kube-bot-it15-ed25519`; es wird bewusst zusätzlich unter Nginx-spezifischen Namen geführt.
- Verifiziert: Readback von `SSH_KEY_NGINX_PRIVATE` in temporäre Datei, `chmod 600`, Fingerprint geprüft, SSH-Probe auf `kube-bot@192.168.20.20` erfolgreich. Temporäre Datei gelöscht.
- Fingerprint: `SHA256:v1vAeRvbpSAkVQe2kTdjZjwNexaFJ59XWt8+QlOXgmE`.


/bin/bash -lc "rg -n \"dmz-backup|192\\.168\\.20\\.90|homarr|NEXTAUTH_SECRET|Backup/Restore-Abstimmung|Homarr\" SESSION_HANDOFF.md INFRASTRUCTURE.md inventory repos/platform-gitops/tenants/pidoka/prod/homarr repos/platform-gitops/applications/tenants/pidoka/homarr.yaml"


Output:
repos/platform-gitops/applications/tenants/pidoka/homarr.yaml:4:  name: pidoka-hf-homarr
repos/platform-gitops/applications/tenants/pidoka/homarr.yaml:11:    path: tenants/pidoka/prod/homarr
repos/platform-gitops/applications/tenants/pidoka/homarr.yaml:14:    namespace: homarr
INFRASTRUCTURE.md:120:### DMZ Backup Staging — dmz-backup
INFRASTRUCTURE.md:122:- Hostname/Rolle: `dmz-backup`, Hilfs-Backup-Server in der DMZ.
INFRASTRUCTURE.md:123:- IP: `192.168.20.90`.
INFRASTRUCTURE.md:125:  - K3s/DMZ-Cluster pusht Backup-Dateien nach `dmz-backup`.
INFRASTRUCTURE.md:126:  - Synology/DiskStation pullt von `dmz-backup` und bleibt Backup-Master.
INFRASTRUCTURE.md:128:- Vorgeschlagener Staging-Root: `/srv/dmz-backup/k3s-dmz/`.
INFRASTRUCTURE.md:129:- Ordnerstruktur-Entwurf: `/home/node/.openclaw/workspace/inventory/backup-folder-structure-dmz-backup-20260619.md`.
INFRASTRUCTURE.md:136:- Zielrolle: Backup-Master, der Backups von `dmz-backup` (`192.168.20.90`) pullt.
SESSION_HANDOFF.md:5:## Backup/Restore-Abstimmung — dmz-backup (2026-06-20)
SESSION_HANDOFF.md:7:- Neue Zielstrecke mit diskstation-bot/Mislav abgestimmt: K3s/DMZ pusht nach `dmz-backup` (`192.168.20.90`), Synology pullt von dort und bleibt Langzeit-Backup-Master.
SESSION_HANDOFF.md:10:- `dmz-backup` darf keine dauerhaften Passphrases oder Private Keys halten; Metadaten enthalten nur Verschlüsselungsstatus, Key-/Secret-Referenz und Fingerprint ohne Werte.
SESSION_HANDOFF.md:1839:  - `homarr`
SESSION_HANDOFF.md:1847:  1. Homarr Secret spaeter nach Infisical/ESO ueberfuehren.
SESSION_HANDOFF.md:1850:## Homarr Einordnung — 2026-06-19 13:00 UTC
SESSION_HANDOFF.md:1852:- Mislav bestaetigt: Homarr ist Dashboard fuer PIDOKA/HF Anwendungen.
SESSION_HANDOFF.md:1854:  - Homarr ist produktiver Service und kein Cleanup-Kandidat.
SESSION_HANDOFF.md:1855:  - Homarr ist erster sinnvoller GitOps-Adoption-Kandidat unter den noch nicht ArgoCD-managed Dashboard/Admin-Tools.
SESSION_HANDOFF.md:1857:  - Namespace `homarr`, Deployment `my-homarr`, Pod `1/1 Running`, Restarts `0`.
SESSION_HANDOFF.md:1858:  - Service `my-homarr` NodePort `30718`; passt zum dokumentierten NPM-Proxy `dashboard.heckenfels.com`.
SESSION_HANDOFF.md:1859:  - Image gepinnt auf `ghcr.io/ajnart/homarr:0.14.2@sha256:3f2389f69db8b497c32c843d44f26afefb4e47b8e7954d0c43c372713d617ed7`.
SESSION_HANDOFF.md:1861:    - `/app/data/configs` -> `my-homarr-config` Longhorn; enthaelt `default.json`, `Heckenfels.json`.
SESSION_HANDOFF.md:1862:    - `/app/public/icons` -> `my-homarr-icons` Longhorn.
SESSION_HANDOFF.md:1863:    - `/data` -> `my-homarr-data` local-path; enthaelt `db.sqlite`.
SESSION_HANDOFF.md:1864:  - Weitere PVCs `my-homarr-data-new` und `my-homarr-data-mb` wirken wie alte Migrationsreste.
SESSION_HANDOFF.md:1866:  - Homarr GitOps-Adoption vorbereiten: bestehende Deployment/Service/PVC/Secret-Referenzen in Repo modellieren, ohne Secretwert offenzulegen; danach mit OK apply/adopt.
SESSION_HANDOFF.md:1868:## Homarr Rename-Wunsch — 2026-06-19 13:05 UTC
SESSION_HANDOFF.md:1870:- Mislav fragt, ob `my-homarr` direkt in `hf-homarr` umbenannt werden kann.
SESSION_HANDOFF.md:1874:    - `my-homarr-config`
SESSION_HANDOFF.md:1875:    - `my-homarr-icons`
SESSION_HANDOFF.md:1876:    - `my-homarr-data`
SESSION_HANDOFF.md:1877:  - Service-Name `hf-homarr` mit gleichem NodePort `30718` braucht kurzen kontrollierten Cutover, weil `my-homarr` den NodePort aktuell belegt.
SESSION_HANDOFF.md:1879:  - Neue ArgoCD App `pidoka-hf-homarr`.
SESSION_HANDOFF.md:1880:  - Neues Deployment `hf-homarr`.
SESSION_HANDOFF.md:1882:  - Secret zunaechst referenzieren oder spaeter via Infisical/ESO sauber nach `hf-homarr-secret` ueberfuehren.
SESSION_HANDOFF.md:1883:  - Service entweder kontrolliert auf `hf-homarr` cutovern oder `my-homarr` vorerst als Kompatibilitaetsanker behalten.
SESSION_HANDOFF.md:1885:## Homarr GitOps-Adoption abgeschlossen — 2026-06-19 12:50 UTC
SESSION_HANDOFF.md:1890:  - Commit: `59281b7 Adopt Homarr into Pidoka GitOps`
SESSION_HANDOFF.md:1891:  - Neue ArgoCD Application: `pidoka-hf-homarr`
SESSION_HANDOFF.md:1892:  - Neuer GitOps-Pfad: `tenants/pidoka/prod/homarr`
SESSION_HANDOFF.md:1893:  - AppProject `tenant-pidoka` um Namespace `homarr` erweitert.
SESSION_HANDOFF.md:1895:  - Deployment/Service Name: `my-homarr`
SESSION_HANDOFF.md:1898:    - `my-homarr-config`
SESSION_HANDOFF.md:1899:    - `my-homarr-icons`
SESSION_HANDOFF.md:1900:    - `my-homarr-data`
SESSION_HANDOFF.md:1901:  - Bestehendes Secret `my-homarr-homarr-secrets` wird referenziert, aber nicht mit Secretwert ins Repo uebernommen.
SESSION_HANDOFF.md:1904:  - `pidoka-hf-homarr`: `Synced / Healthy`, Revision `59281b7`.
SESSION_HANDOFF.md:1906:    - `Deployment/my-homarr`
SESSION_HANDOFF.md:1907:    - `Service/my-homarr`
SESSION_HANDOFF.md:1908:    - `PersistentVolumeClaim/my-homarr-config`
SESSION_HANDOFF.md:1909:    - `PersistentVolumeClaim/my-homarr-icons`
SESSION_HANDOFF.md:1910:    - `PersistentVolumeClaim/my-homarr-data`
SESSION_HANDOFF.md:1912:  - Pod `my-homarr-698bc75847-nsfph`: `1/1 Running`, Restarts `0`.
SESSION_HANDOFF.md:1915:  - Homarr Secret spaeter nach Infisical/ESO ueberfuehren.
SESSION_HANDOFF.md:1916:  - Alte Homarr PVCs `my-homarr-data-new`, `my-homarr-data-mb` und alte Migration-Jobs nur nach Daten-/Backup-Check und separatem OK bereinigen.
SESSION_HANDOFF.md:1918:## Homarr Secret/PVC Cleanup — 2026-06-19 13:05 UTC
SESSION_HANDOFF.md:1920:- Frage von Mislav: Wofuer wird `my-homarr-homarr-secrets` benoetigt?
SESSION_HANDOFF.md:1922:  - Es enthaelt `NEXTAUTH_SECRET`.
SESSION_HANDOFF.md:1923:  - Homarr nutzt diesen Wert fuer NextAuth-/Session-Signatur.
SESSION_HANDOFF.md:1927:  - `my-homarr-data-new` Longhorn 100Gi.
SESSION_HANDOFF.md:1928:  - `my-homarr-data-mb` Longhorn 10Gi.
SESSION_HANDOFF.md:1929:  - Beide waren nicht von Homarr gemountet.
SESSION_HANDOFF.md:1933:  - PVCs `my-homarr-data-new` und `my-homarr-data-mb` geloescht.
SESSION_HANDOFF.md:1936:  - Homarr aktive PVCs bleiben:
SESSION_HANDOFF.md:1937:    - `my-homarr-data`
SESSION_HANDOFF.md:1938:    - `my-homarr-icons`
SESSION_HANDOFF.md:1939:    - `my-homarr-config`
SESSION_HANDOFF.md:1940:  - Pod `my-homarr-698bc75847-nsfph`: `1/1 Running`, Restarts `0`.
SESSION_HANDOFF.md:1941:  - `pidoka-hf-homarr`: `Synced / Healthy`.
SESSION_HANDOFF.md:1944:  - Alte Homarr Migration-Jobs `volume-migration*` geloescht.
SESSION_HANDOFF.md:1945:  - Altes Helm Release Secret `sh.helm.release.v1.my-homarr.v1` geloescht.
SESSION_HANDOFF.md:1946:  - Aktives Kubernetes Secret `my-homarr-homarr-secrets` bleibt bestehen, weil Homarr daraus `NEXTAUTH_SECRET` nutzt.
SESSION_HANDOFF.md:1948:  - `secret/my-homarr-homarr-secrets` bleibt vorhanden.
SESSION_HANDOFF.md:1949:  - Aktive PVCs `my-homarr-data`, `my-homarr-icons`, `my-homarr-config` bleiben vorhanden.
SESSION_HANDOFF.md:1951:  - `pidoka-hf-homarr`: `Synced / Healthy`.
SESSION_HANDOFF.md:1954:  - Homarr Secret spaeter nach Infisical/ESO ueberfuehren.
SESSION_HANDOFF.md:1974:  - Dashy ist als altes Dashboard entfernt; Homarr bleibt das produktive PIDOKA/HF Dashboard und ist ArgoCD-managed.
SESSION_HANDOFF.md:1997:## Backup-Konzept Ergaenzung — dmz-backup — 2026-06-19 19:26 UTC
SESSION_HANDOFF.md:2000:  - Hilfs-Backup-Server in der DMZ: `dmz-backup`
SESSION_HANDOFF.md:2001:  - IP: `192.168.20.90`
SESSION_HANDOFF.md:2002:  - K3s/DMZ-Cluster pusht Backup-Dateien nach `dmz-backup`.
SESSION_HANDOFF.md:2003:  - Synology/DiskStation pullt von `dmz-backup` und bleibt Backup-Master.
SESSION_HANDOFF.md:2006:  - `dmz-backup` ist Staging/Puffer, nicht alleinige Langzeit-Backup-Quelle.
SESSION_HANDOFF.md:2012:  - `/home/node/.openclaw/workspace/inventory/backup-folder-structure-dmz-backup-20260619.md`
SESSION_HANDOFF.md:2017:  - Staging-Root auf `dmz-backup`: `/srv/dmz-backup/k3s-dmz/`.
SESSION_HANDOFF.md:2117:  - `dashboard.heckenfels.com` -> Homarr, HTTP `307`
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:4:  name: my-homarr-config
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:5:  namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:20:  name: my-homarr-icons
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:21:  namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:36:  name: my-homarr-data
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:37:  namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:40:    meta.helm.sh/release-name: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:41:    meta.helm.sh/release-namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:43:    app: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:44:    app.kubernetes.io/instance: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:46:    app.kubernetes.io/name: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:49:    helm.sh/chart: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:50:    release: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:63:  name: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:64:  namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:66:    app: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:67:    app.kubernetes.io/instance: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:69:    app.kubernetes.io/name: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:72:    helm.sh/chart: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:73:    release: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:76:    meta.helm.sh/release-name: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:77:    meta.helm.sh/release-namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:83:      app.kubernetes.io/instance: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:84:      app.kubernetes.io/name: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:93:        app: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:94:        app.kubernetes.io/instance: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:96:        app.kubernetes.io/name: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:99:        helm.sh/chart: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:101:        release: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:121:        - name: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:122:          image: ghcr.io/ajnart/homarr:0.14.2@sha256:3f2389f69db8b497c32c843d44f26afefb4e47b8e7954d0c43c372713d617ed7
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:133:            - name: NEXTAUTH_SECRET
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:136:                  name: my-homarr-homarr-secrets
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:137:                  key: NEXTAUTH_SECRET
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:207:            claimName: my-homarr-config
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:210:            claimName: my-homarr-data
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:217:            claimName: my-homarr-icons
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:236:  name: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:237:  namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:239:    app: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:240:    app.kubernetes.io/instance: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:242:    app.kubernetes.io/name: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:245:    helm.sh/chart: homarr-8.0.4
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:246:    release: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:250:    meta.helm.sh/release-name: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:251:    meta.helm.sh/release-namespace: homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:263:    app.kubernetes.io/instance: my-homarr
repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml:264:    app.kubernetes.io/name: homarr
inventory/nginx-proxy-abgleich-20260619.md:25:| 5 | `dashboard.heckenfels.com` | `http://192.168.20.40:30718` | OK, Homarr, HTTP `307` nach `/board` |
inventory/longhorn-health-report.md:34:| `homarr` | `my-homarr-config` | 10Gi | attached | degraded | `mbrkanov-mini-it13` | 2 | 1 |
inventory/longhorn-health-report.md:35:| `homarr` | `my-homarr-data-mb` | 10Gi | attached | degraded | `mbrkanov-mini-it13` | 2 | 1 |
inventory/longhorn-health-report.md:36:| `homarr` | `my-homarr-data-new` | 100Gi | detached | unknown | `` | 0 | 2 |
inventory/longhorn-health-report.md:37:| `homarr` | `my-homarr-icons` | 10Gi | attached | degraded | `mbrkanov-mini-it13` | 2 | 1 |
inventory/argocd-mandanten-migrationsmatrix-20260615.md:54:| `homarr` | Homarr | `dashboard.heckenfels.com` zeigt laut NPM auf NodePort `30718` | Vermutlich Pidoka/Heckenfels oder Shared Dashboard; fachlich klären. |
inventory/argocd-mandanten-migrationsmatrix-20260615.md:78:| `dashboard.heckenfels.com` | `http://192.168.20.40:30718` | ja | ja | Homarr NodePort. |
inventory/migration-20260615/raw-inventory.txt:22:homarr                 Active   2y167d
inventory/migration-20260615/raw-inventory.txt:58:homarr                 deployment.apps/my-homarr                          1/1     1            1           2y167d   my-homarr                   ghcr.io/ajnart/homarr:0.14.2@sha256:3f2389f69db8b497c32c843d44f26afefb4e47b8e7954d0c43c372713d617ed7   app.kubernetes.io/instance=my-homarr,app.kubernetes.io/name=homarr,pod.name=main
inventory/migration-20260615/raw-inventory.txt:110:homarr                 service/my-homarr                           NodePort       10.43.177.71    <none>                        10245:30718/TCP                                2y167d   app.kubernetes.io/instance=my-homarr,app.kubernetes.io/name=homarr,pod.name=main
inventory/migration-20260615/raw-inventory.txt:166:homarr        persistentvolumeclaim/my-homarr-data                        Bound    pvc-7be0df84-5f5e-4d9e-9595-b844f177ec54   100Gi      RWO            local-path     2y167d   Filesystem
inventory/migration-20260615/raw-inventory.txt:171:homarr        persistentvolumeclaim/my-homarr-icons                       Bound    pvc-7eaba3dd-5617-46bc-b424-b9343b5037a5   10Gi       RWO            longhorn       2y61d    Filesystem
inventory/migration-20260615/raw-inventory.txt:172:homarr        persistentvolumeclaim/my-homarr-data-mb                     Bound    pvc-c346cdc4-9483-47f4-b90b-ba674c5811d4   10Gi       RWO            longhorn       2y61d    Filesystem
inventory/migration-20260615/raw-inventory.txt:173:homarr        persistentvolumeclaim/my-homarr-data-new                    Bound    pvc-0fb2fdde-4cdc-412c-81c7-768682451e15   100Gi      RWO            longhorn       2y61d    Filesystem
inventory/migration-20260615/raw-inventory.txt:174:homarr        persistentvolumeclaim/my-homarr-config                      Bound    pvc-465c3082-ffe0-4b14-bc80-83fca45ed661   10Gi       RWO            longhorn       2y61d    Filesystem
inventory/priorities-evidence.txt:62:homarr                 my-homarr-698bc75847-nsfph                          1/1     Running            0                   36d      10.42.0.63      mbrkanov-mini-it13   <none>           <none>
inventory/backup-folder-structure-dmz-backup-20260619.md:1:# Backup-Ordnerstruktur — dmz-backup + Synology Pull
inventory/backup-folder-structure-dmz-backup-20260619.md:7:- `dmz-backup` (`192.168.20.90`) ist der DMZ-Staging-Host.
inventory/backup-folder-structure-dmz-backup-20260619.md:8:- K3s/DMZ-Cluster darf Backups nach `dmz-backup` pushen.
inventory/backup-folder-structure-dmz-backup-20260619.md:9:- Synology/DiskStation pullt von `dmz-backup` und bleibt Backup-Master.
inventory/backup-folder-structure-dmz-backup-20260619.md:16:Nicht nur nach Kubernetes-Namespace sortieren, weil aktuelle Namespaces historisch gewachsen sind (`hf-*`, `pidoka-hf-*`, `homarr`, `zammad`). Besser ist:
inventory/backup-folder-structure-dmz-backup-20260619.md:25:Auf `dmz-backup`:
inventory/backup-folder-structure-dmz-backup-20260619.md:28:/srv/dmz-backup/k3s-dmz/
inventory/backup-folder-structure-dmz-backup-20260619.md:115:        homarr/
inventory/backup-folder-structure-dmz-backup-20260619.md:179:  "backup_staging_host": "dmz-backup",
inventory/backup-folder-structure-dmz-backup-20260619.md:180:  "backup_staging_ip": "192.168.20.90",
inventory/backup-folder-structure-dmz-backup-20260619.md:207:- Cluster bekommt nur Schreibrechte auf definierte Zielpfade auf `dmz-backup`.
inventory/backup-folder-structure-dmz-backup-20260619.md:208:- Synology bekommt Pull-Rechte von `dmz-backup`, idealerweise read-only.
inventory/backup-folder-structure-dmz-backup-20260619.md:228:  - `homarr` -> `tenants/pidoka/prod/homarr/`
inventory/backup-folder-structure-dmz-backup-20260619.md:239:4. Quota fuer `dmz-backup` und Synology-Ziel definieren.
inventory/backup-folder-structure-dmz-backup-20260619.md:241:6. Ersten Restore-Testpfad definieren: Synology -> `dmz-backup` -> isolierter Restore im Cluster.
inventory/longhorn-volumes.json:111:                    "namespace": "homarr",
inventory/longhorn-volumes.json:114:                    "pvcName": "my-homarr-data-new",
inventory/longhorn-volumes.json:246:                    "namespace": "homarr",
inventory/longhorn-volumes.json:249:                    "pvcName": "my-homarr-data-mb",
inventory/longhorn-volumes.json:516:                    "namespace": "homarr",
inventory/longhorn-volumes.json:519:                    "pvcName": "my-homarr-icons",
inventory/longhorn-volumes.json:522:                            "podName": "my-homarr-698bc75847-nsfph",
inventory/longhorn-volumes.json:524:                            "workloadName": "my-homarr-698bc75847",
inventory/longhorn-volumes.json:1326:                    "namespace": "homarr",
inventory/longhorn-volumes.json:1329:                    "pvcName": "my-homarr-config",
inventory/longhorn-volumes.json:1332:                            "podName": "my-homarr-698bc75847-nsfph",
inventory/longhorn-volumes.json:1334:                            "workloadName": "my-homarr-698bc75847",
inventory/longhorn-health-raw.txt:170:homarr        my-homarr-data                        Bound    pvc-7be0df84-5f5e-4d9e-9595-b844f177ec54   100Gi      RWO            local-path     2y161d   Filesystem
inventory/longhorn-health-raw.txt:175:homarr        my-homarr-icons                       Bound    pvc-7eaba3dd-5617-46bc-b424-b9343b5037a5   10Gi       RWO            longhorn       2y55d    Filesystem
inventory/longhorn-health-raw.txt:176:homarr        my-homarr-data-mb                     Bound    pvc-c346cdc4-9483-47f4-b90b-ba674c5811d4   10Gi       RWO            longhorn       2y55d    Filesystem
inventory/longhorn-health-raw.txt:177:homarr        my-homarr-data-new                    Bound    pvc-0fb2fdde-4cdc-412c-81c7-768682451e15   100Gi      RWO            longhorn       2y54d    Filesystem
inventory/longhorn-health-raw.txt:178:homarr        my-homarr-config                      Bound    pvc-465c3082-ffe0-4b14-bc80-83fca45ed661   10Gi       RWO            longhorn       2y54d    Filesystem
inventory/k8s-inventory-raw.txt:15:homarr                 Active   2y161d
inventory/k8s-inventory-raw.txt:36:pvc-7be0df84-5f5e-4d9e-9595-b844f177ec54   100Gi      RWO            Delete           Bound    homarr/my-homarr-data                           local-path              2y161d   Filesystem
inventory/k8s-inventory-raw.txt:41:pvc-0fb2fdde-4cdc-412c-81c7-768682451e15   100Gi      RWO            Delete           Bound…


/bin/bash -lc 'set -euo pipefail
TS=$(date -u +%Y%m%dT%H%M%SZ)
BASE="/home/node/.openclaw/workspace/backups/homarr-pilot-$TS"
mkdir -p "$BASE"/{manifests,metadata,checksums,restore-tests}
printf '"'%s' \""'$BASE" > /tmp/kube-bot-homarr-pilot-base
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'hostname; sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> get ns homarr --no-headers; sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> -n homarr get deploy,svc,pod,pvc --no-headers' > \""'$BASE/metadata/live-summary.txt"
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> -n homarr get deploy my-homarr -o yaml' > \""'$BASE/manifests/deployment-my-homarr.yaml"
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> -n homarr get svc my-homarr -o yaml' > \""'$BASE/manifests/service-my-homarr.yaml"
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> -n homarr get pvc my-homarr-config my-homarr-icons my-homarr-data -o yaml' > \""'$BASE/manifests/pvc-active.yaml"
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> -n homarr get secret my-homarr-homarr-secrets -o jsonpath=\"name={.metadata.name}{'\\''\\n'\\''}namespace={.metadata.namespace}{'\\''\\n'\\''}type={.type}{'\\''\\n'\\''}keys={.data}{'\\''\\n'\\''}\"' | sed -E 's/(keys=).*/\\1REDACTED_KEY_SET_PRESENT/' > \""'$BASE/metadata/secret-metadata-redacted.txt"
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> get pv pvc-465c3082-ffe0-4b14-bc80-83fca45ed661 pvc-7eaba3dd-5617-46bc-b424-b9343b5037a5 pvc-7be0df84-5f5e-4d9e-9595-b844f177ec54 -o yaml' > \""'$BASE/metadata/pv-active.yaml"
ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.40 '"'sudo -n /usr/local/bin/kubectl --kubeconfig=<redacted> -n longhorn-system get volumes.longhorn.io -o wide | grep -E \"my-homarr|pvc-465c3082|pvc-7eaba3dd|pvc-7be0df84\" || true' > \""'$BASE/metadata/longhorn-homarr-volumes.txt"
cp repos/platform-gitops/applications/tenants/pidoka/homarr.yaml "$BASE/manifests/argocd-application-pidoka-hf-homarr.yaml"
cp repos/platform-gitops/tenants/pidoka/prod/homarr/app.yaml "$BASE/manifests/gitops-homarr-app.yaml"
find "$BASE" -type f -print0 | sort -z | xargs -0 sha256sum > "$BASE/checksums/manifest.sha256"
printf '"'%s\\n' \""'$BASE"'


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); rg -n "(?i)(password|passwd|secret|token|key|auth|credential|NEXTAUTH|AKIA|PRIVATE|BEGIN|data:)" "$BASE" || true'


Output:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/checksums/manifest.sha256:10:a9565b06bc4db56ea4fd8e71cd497ac7d817b22bd07e846ea019a89bd8c8942a  /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt:1:name=<redacted>
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt:4:keys=<redacted>
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:5:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:10:      volume.kubernetes.io/provisioner-deletion-secret-name: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:11:      volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:50:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:54:      volume.kubernetes.io/provisioner-deletion-secret-name: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:55:      volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:94:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:122:          - key: kubernetes.io/hostname
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:132:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:37:    metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:52:      automountServiceAccountToken: false
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:63:        - name: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:65:            secretKeyRef:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:66:              key: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:67:              name: my-homarr-homarr-secrets
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:169:        topologyKey: truecharts.org/rack
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:179:        topologyKey: kubernetes.io/hostname
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:5:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:34:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:66:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:109:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:19:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:35:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:62:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:89:    metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:103:      automountServiceAccountToken: false
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:133:            - name: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:135:                secretKeyRef:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:136:                  name: my-homarr-homarr-secrets
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:137:                  key: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:235:metadata:


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); find "$BASE" -type f -maxdepth 3 | sort; printf '"'\\n--- live summary ---\\n'; sed -n '1,160p' \""'$BASE/metadata/live-summary.txt"; printf '"'\\n--- redacted secret metadata ---\\n'; sed -n '1,80p' \""'$BASE/metadata/secret-metadata-redacted.txt"; printf '"'\\n--- longhorn ---\\n'; sed -n '1,120p' \""'$BASE/metadata/longhorn-homarr-volumes.txt"'


Output:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/checksums/manifest.sha256
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/live-summary.txt
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/longhorn-homarr-volumes.txt
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt

--- live summary ---
mbrkanov-Mini-IT13
homarr   Active   2y172d
deployment.apps/my-homarr   1/1   1     1     2y172d
service/my-homarr   NodePort   10.43.177.71   <none>   10245:30718/TCP   2y172d
pod/my-homarr-698bc75847-nsfph   1/1   Running   0     47d
persistentvolumeclaim/my-homarr-data     Bound   pvc-7be0df84-5f5e-4d9e-9595-b844f177ec54   100Gi   RWO   local-path   2y172d
persistentvolumeclaim/my-homarr-icons    Bound   pvc-7eaba3dd-5617-46bc-b424-b9343b5037a5   10Gi    RWO   longhorn     2y66d
persistentvolumeclaim/my-homarr-config   Bound   pvc-465c3082-ffe0-4b14-bc80-83fca45ed661   10Gi    RWO   longhorn     2y66d

--- redacted secret metadata ---
name=<redacted>
namespace=homarr
type=Opaque
keys=<redacted>

--- longhorn ---
pvc-7eaba3dd-5617-46bc-b424-b9343b5037a5   v1            attached   healthy                  10737418240   mbrkanov-mini-it13   2y66d
pvc-465c3082-ffe0-4b14-bc80-83fca45ed661   v1            attached   healthy                  10737418240   mbrkanov-mini-it13   2y66d


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); wc -c "$BASE"/*/* "$BASE"/* 2>/dev/null | sort -n | tail -20'


Output:
0 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/checksums
      0 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests
      0 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata
      0 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-tests
     89 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt
    268 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/longhorn-homarr-volumes.txt
    439 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml
    612 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/live-summary.txt
   1155 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml
   1680 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/checksums/manifest.sha256
   3272 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml
   4041 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml
   6392 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml
   6934 /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml
  24882 total


/bin/bash -lc 'set -euo pipefail
BASE=$(cat /tmp/kube-bot-homarr-pilot-base)
TS=$(basename "$BASE" | sed '"'s/"'^homarr-pilot-//'"')
ARCHIVE=\"/home/node/.openclaw/workspace/backups/"'${TS}__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz"
cat > "$BASE/metadata.json" <<EOF
{
  "created_at_utc": "${TS}",
  "cluster": "dmz-k3s",
  "source_host": "192.168.20.40",
  "backup_staging_host": "dmz-backup",
  "backup_staging_ip": "192.168.20.90",
  "target_path": "k3s-dmz/tenants/pidoka/prod/homarr/",
  "category": "tenant",
  "tenant": "pidoka",
  "environment": "prod",
  "app": "homarr",
  "namespace": "homarr",
  "kind": "metadata-pilot",
  "contains_secret_values": false,
  "contains_pvc_data": false,
  "encryption": "pending: no approved recipient key/passphrase path available in kube-bot context",
  "secret_references": ["Kubernetes secret homarr/my-homarr-homarr-secrets key NEXTAUTH_SECRET"],
  "retention_class": "restore-test-artifacts",
  "restore_test_required": true,
  "restore_test_scope": "artifact-manifest-checksum only; no production restore"
}
EOF
cat > "$BASE/status.json" <<EOF
{
  "status": "prepared-local-only",
  "pushed_to_dmz_backup": false,
  "blocked_reason": "client-side encryption recipient/key path is not finalized; no unencrypted push performed",
  "cluster_changes": false,
  "secret_values_exported": false,
  "pvc_data_exported": false
}
EOF
cat > "$BASE/restore-notes.md" <<'"'EOF'
# Homarr Backup Pilot Restore Notes

Scope: first Homarr backup-strecken pilot for metadata/manifests only.

Included:
- Live Kubernetes summary for namespace "'`homarr`.
- Deployment, Service, active PVC manifests.
- PV metadata for active PVCs.
- Longhorn volume status for Homarr Longhorn PVCs.
- GitOps source manifests for `pidoka-hf-homarr`.
- Redacted secret metadata only.

Not included:
- No Kubernetes Secret values.
- No PVC file contents or database files.
- No Longhorn snapshots/backups created.
- No restore resources created in the cluster.

Restore check for this pilot:
1. Validate `checksums/manifest.sha256`.
2. Confirm manifests parse and contain expected namespace/app/PVC references.
3. Confirm secret references exist only as references, not values.
4. Document result under `_restore-tests`, but do not restore into production.

Next gated phase:
- Choose encryption tool and recipient/key path.
- Then repeat as encrypted package and push to `dmz-backup` target path.
EOF
find "$BASE" -type f -print0 | sort -z | xargs -0 sha256sum > "$BASE/checksums/manifest.sha256"
tar -C "$(dirname "$BASE")" -czf "$ARCHIVE" "$(basename "$BASE")"
sha256sum "$ARCHIVE" > "$ARCHIVE.sha256"
printf '"'BASE=%s\\nARCHIVE=%s\\n' \""'$BASE" "$ARCHIVE"'


Output:
BASE=<redacted>
ARCHIVE=<redacted>


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); ARCHIVE=/home/node/.openclaw/workspace/backups/$(basename "$BASE" | sed '"'s/"'^homarr-pilot-//'"')__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz; tar -tzf \""'$ARCHIVE" | sed -n '"'1,80p'; printf '\\n--- archive sha ---\\n'; cat \""'$ARCHIVE.sha256"'


Output:
homarr-pilot-20260620T073545Z/
homarr-pilot-20260620T073545Z/restore-notes.md
homarr-pilot-20260620T073545Z/checksums/
homarr-pilot-20260620T073545Z/checksums/manifest.sha256
homarr-pilot-20260620T073545Z/metadata/
homarr-pilot-20260620T073545Z/metadata/live-summary.txt
homarr-pilot-20260620T073545Z/metadata/pv-active.yaml
homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt
homarr-pilot-20260620T073545Z/metadata/longhorn-homarr-volumes.txt
homarr-pilot-20260620T073545Z/manifests/
homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml
homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml
homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml
homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml
homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml
homarr-pilot-20260620T073545Z/restore-tests/
homarr-pilot-20260620T073545Z/status.json
homarr-pilot-20260620T073545Z/metadata.json

--- archive sha ---
38f06fd3f05f9ad1005f43d593ff33b20b592884320aa774ef1c824d386270bf  /home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); rg -n "(?i)(password|passwd|secret|token|key|auth|credential|NEXTAUTH|PRIVATE|BEGIN|data:)" "$BASE" || true'


Output:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata.json:14:  "contains_secret_values": false,
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata.json:16:  "encryption": "pending: no approved recipient key/passphrase path available in kube-bot context",
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata.json:17:  "secret_references": ["Kubernetes secret homarr/my-homarr-homarr-secrets key NEXTAUTH_SECRET"],
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/status.json:4:  "blocked_reason": "client-side encryption recipient/key path is not finalized; no unencrypted push performed",
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/status.json:6:  "secret_values_exported": false,
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md:11:- Redacted secret metadata only.
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md:14:- No Kubernetes Secret values.
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md:22:3. Confirm secret references exist only as references, not values.
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md:26:- Choose encryption tool and recipient/key path.
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:19:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:35:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:62:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:89:    metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:103:      automountServiceAccountToken: false
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:133:            - name: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:135:                secretKeyRef:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:136:                  name: my-homarr-homarr-secrets
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:137:                  key: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml:235:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt:1:name=<redacted>
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt:4:keys=<redacted>
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:5:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:34:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:66:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml:109:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:3:metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:37:    metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:52:      automountServiceAccountToken: false
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:63:        - name: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:65:            secretKeyRef:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:66:              key: NEXTAUTH_SECRET
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:67:              name: my-homarr-homarr-secrets
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:169:        topologyKey: truecharts.org/rack
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml:179:        topologyKey: kubernetes.io/hostname
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/checksums/manifest.sha256:11:a9565b06bc4db56ea4fd8e71cd497ac7d817b22bd07e846ea019a89bd8c8942a  /home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:5:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:10:      volume.kubernetes.io/provisioner-deletion-secret-name: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:11:      volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:50:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:54:      volume.kubernetes.io/provisioner-deletion-secret-name: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:55:      volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:94:  metadata:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:122:          - key: kubernetes.io/hostname
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml:132:metadata:


/bin/bash -lc "ssh -i /home/node/.ssh/kube-bot-it15-ed25519 -o BatchMode=yes -o ConnectTimeout=8 kube-bot@192.168.20.90 'hostname; whoami; pwd'"


Output: Host key verification failed.


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); sha256sum -c /home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz.sha256'


Output: /home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz: OK


/bin/bash -lc 'rg -n "Homarr App-Pilot|homarr-pilot-20260620T073545Z|38f06fd3|Blocker" inventory/backup-strategy-draft.md SESSION_HANDOFF.md'


Output:
SESSION_HANDOFF.md:15:  - Arbeitsverzeichnis: `/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z`.
SESSION_HANDOFF.md:17:  - SHA256: `38f06fd3f05f9ad1005f43d593ff33b20b592884320aa774ef1c824d386270bf`.
SESSION_HANDOFF.md:21:  - Blocker: Verschluesselungswerkzeug + Empfaenger-Key/Infisical-Pfad finalisieren; `dmz-backup` SSH Host-Key/technischen User verifizieren.
SESSION_HANDOFF.md:586:- Offener Blocker beim Abbruch:
SESSION_HANDOFF.md:629:### Aktueller Blocker
SESSION_HANDOFF.md:860:- Offener Blocker vor echtem ESO-Sync:
inventory/backup-strategy-draft.md:258:## Homarr App-Pilot — Phase 1 vorbereitet (2026-06-20)
inventory/backup-strategy-draft.md:269:- Arbeitsverzeichnis: `/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z`.
inventory/backup-strategy-draft.md:271:- SHA256: `38f06fd3f05f9ad1005f43d593ff33b20b592884320aa774ef1c824d386270bf`.
inventory/backup-strategy-draft.md:302:Blocker vor Push:


/bin/bash -lc 'BASE=$(cat /tmp/kube-bot-homarr-pilot-base); sha256sum -c "$BASE/checksums/manifest.sha256" | tail -20'


Output:
sha256sum: WARNING: 1 computed checksum did NOT match
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/checksums/manifest.sha256: FAILED
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata.json: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/live-summary.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/longhorn-homarr-volumes.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/status.json: OK


/bin/bash -lc 'set -euo pipefail
BASE=$(cat /tmp/kube-bot-homarr-pilot-base)
TS=$(basename "$BASE" | sed '"'s/"'^homarr-pilot-//'"')
ARCHIVE=\"/home/node/.openclaw/workspace/backups/"'${TS}__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz"
find "$BASE" -type f ! -path "$BASE/checksums/manifest.sha256" -print0 | sort -z | xargs -0 sha256sum > "$BASE/checksums/manifest.sha256"
sha256sum -c "$BASE/checksums/manifest.sha256" >/tmp/homarr-manifest-check.txt
rm -f "$ARCHIVE" "$ARCHIVE.sha256"
tar -C "$(dirname "$BASE")" -czf "$ARCHIVE" "$(basename "$BASE")"
sha256sum "$ARCHIVE" > "$ARCHIVE.sha256"
cat "$ARCHIVE.sha256"
sed -n '"'1,20p' /tmp/homarr-manifest-check.txt"


Output:
b698c3b0456c36950338838a7b98bb83d63290852a75feab44b9e803e7dc9793  /home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata.json: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/live-summary.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/longhorn-homarr-volumes.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/status.json: OK


/bin/bash -lc 'sha256sum -c /home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz.sha256'


Output: /home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz: OK


Output:
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/argocd-application-pidoka-hf-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/deployment-my-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/gitops-homarr-app.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/pvc-active.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/manifests/service-my-homarr.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata.json: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/live-summary.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/longhorn-homarr-volumes.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/pv-active.yaml: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/metadata/secret-metadata-redacted.txt: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/restore-notes.md: OK
/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z/status.json: OK


/bin/bash -lc 'rg -n "b698c3b0|38f06fd3|Homarr App-Pilot|homarr-pilot-20260620T073545Z" inventory/backup-strategy-draft.md SESSION_HANDOFF.md'


Output:
SESSION_HANDOFF.md:15:  - Arbeitsverzeichnis: `/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z`.
SESSION_HANDOFF.md:17:  - SHA256: `b698c3b0456c36950338838a7b98bb83d63290852a75feab44b9e803e7dc9793`.
inventory/backup-strategy-draft.md:258:## Homarr App-Pilot — Phase 1 vorbereitet (2026-06-20)
inventory/backup-strategy-draft.md:269:- Arbeitsverzeichnis: `/home/node/.openclaw/workspace/backups/homarr-pilot-20260620T073545Z`.
inventory/backup-strategy-draft.md:271:- SHA256: `b698c3b0456c36950338838a7b98bb83d63290852a75feab44b9e803e7dc9793`.


message

*State:* Homarr-Pilot Phase 1 ist lokal vorbereitet. Keine Cluster-Änderung, kein Push nach `dmz-backup`.

*Findings:*
• Homarr live: Deployment `my-homarr` `1/1`, Pod `Running`, Restarts `0`.
• Aktive PVCs: `my-homarr-data` `local-path` 100Gi, `my-homarr-icons` Longhorn 10Gi, `my-homarr-config` Longhorn 10Gi.
• Longhorn-Volumes für `icons` und `config` sind aktuell `healthy`.
• Secret `my-homarr-homarr-secrets` wurde nur als Referenz dokumentiert, kein Secretwert exportiert.

*Erzeugt lokal:*
`/home/node/.openclaw/workspace/backups/20260620T073545Z__dmz-k3s__pidoka__homarr__metadata__pilot.tar.gz`
SHA256: `b698c3b0456c36950338838a7b98bb83d63290852a75feab44b9e803e7dc9793`

*Stop vor Push:* Ich habe nicht nach `dmz-backup` übertragen, weil zwei Punkte sauber geklärt werden müssen: Verschlüsselungswerkzeug/Empfänger-Key bzw. Infisical-Pfad und verifizierter SSH Host-Key/technischer User für `dmz-backup`.

*Recommendation:* Als nächstes Verschlüsselung + `dmz-backup` SSH-Verifikation festlegen. Danach kann ich das Paket clientseitig verschlüsseln und erst dann auf `k3s-dmz/tenants/pidoka/prod/homarr/` pushen.