3c71a66c55
- AUDIT_2026-05-25_TODO: Borg-Stale, Cert-Expiry, Container-Down Alerts auf "erledigt" (Cron */5 textfile exporter live, Prometheus reload mit 14 Regeln); Gitea-Bundle-Cron auf "erledigt" (User-Script gitea-bundle-mirror-6h aktiv, Bundles 644); H:/ Nearline-Pull auf "erledigt (Pull live, Scheduled Task offen)" mit Zaehlerstaenden 19 Borg-Dumps + 10 Bundle-Files. - MIGRATION_LOG: neuer Eintrag fasst die drei zusammenhaengenden Live-Aktivierungen zusammen, inkl. Befund-Ursprung (Permission- Drift), Reparaturen und expliziter Ausklammerung der nicht angefassten Themen (Auth, Hermes, USV, FRITZ!Box, Plex). - H_DRIVE_NEARLINE_PULL: Erstlauf-Befund mit Permission-Issues und nachgezogenem Stand; Erwartungs-Liste auf real geliefertes Set angepasst; Flash-Config explizit Out-of-Scope. - pull-critical-backups.ps1: Live-Robocopy-Output an Out-Null, damit der Markdown-Report nicht von Robocopy-Strings zerlegt wird (PowerShell-Pipeline-Quirk im foreach). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
98 lines
4.0 KiB
Markdown
98 lines
4.0 KiB
Markdown
# H:/ Nearline Pull
|
|
|
|
Status: **erster echter Lauf erfolgreich** (2026-05-27 20:45). Scheduled Task **noch nicht** aktiv — wird erst nach Operator-Bestaetigung angelegt.
|
|
|
|
## Erstlauf-Befund 2026-05-27
|
|
|
|
- Erster `-WhatIf`-loser Lauf: 18 Borg-Dump-Files erfolgreich gepullt, 4 unraid-flash-config-Files und 10 Gitea-Bundle-Files blockiert (`Zugriff verweigert`).
|
|
- Ursache: Bundles wurden mit `chmod 600` geschrieben, Flash-Config bewusst `0600 root:root`, Filebrowser-Dump erbte 0640. Der SMB-Read-Share auf dem Operator-PC liest mit unprivilegierten Rechten, kein root.
|
|
- Fixes im selben Sprint:
|
|
- `ops/borg-ui/scripts/gitea-bundle-mirror.sh` schreibt Bundles und Sidecars jetzt 0644 (Bundle-Inhalt = Git-Historie, ohne Secrets durch `.gitignore`).
|
|
- `ops/borg-ui/scripts/pre-backup-dumps.sh` setzt alle Dumps via `atomic_write` per Default auf 0644; `unraid-flash-config.*` bleibt explizit 0600.
|
|
- `ops/h-drive-nearline/pull-critical-backups.ps1` excluded die `unraid-flash-config.*`-Familie ueber `/XF`, damit Flash-Config bewusst nicht in den Nearline-Scope kommt.
|
|
- Zweiter Lauf (nach Fixes): beide Robocopy-Jobs Exit-Code 1, **19 Borg-Dumps + 10 Gitea-Bundle-Files** auf H:/.
|
|
|
|
## Zweck
|
|
|
|
`H:/` ist eine zweite lokale Nearline-Kopie fuer die wichtigsten Restore-Artefakte. Es ersetzt weder Hetzner/Borg noch ein echtes Off-site-/Airgap-Ziel, reduziert aber das Risiko, dass ein lokaler Restore nur vom Unraid-Array abhaengt.
|
|
|
|
## Quelle und Ziel
|
|
|
|
| Zweck | Quelle | Ziel |
|
|
|---|---|---|
|
|
| Aktuelle Dumps inklusive Flash-Backup | `\\192.168.178.58\backups\borg\dumps\latest` | `H:\kallilab-nearline-backups\borg-dumps\latest` |
|
|
| Gitea-Bundles | `\\192.168.178.58\backups\git-bundles\gitea` | `H:\kallilab-nearline-backups\git-bundles\gitea` |
|
|
|
|
Das Skript kopiert bewusst **nicht** mit `/MIR` und loescht keine Dateien auf `H:/`. Alte Artefakte duerfen dort erst nach manueller Sichtpruefung geloescht werden.
|
|
|
|
## Skript
|
|
|
|
```powershell
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File G:\Gitea_Clone\homelab-infra\ops\h-drive-nearline\pull-critical-backups.ps1 -WhatIf
|
|
```
|
|
|
|
Echter Lauf:
|
|
|
|
```powershell
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File G:\Gitea_Clone\homelab-infra\ops\h-drive-nearline\pull-critical-backups.ps1
|
|
```
|
|
|
|
Reports landen unter:
|
|
|
|
```text
|
|
H:\kallilab-nearline-backups\_reports
|
|
```
|
|
|
|
Robocopy-Logs landen unter:
|
|
|
|
```text
|
|
H:\kallilab-nearline-backups\_logs
|
|
```
|
|
|
|
## Geplanter Schedule
|
|
|
|
Empfohlen: taeglich 05:30 Uhr, nach dem Borg-Dump-Fenster um ca. 04:00 Uhr.
|
|
|
|
Der Task wird erst nach Operator-Sichtpruefung angelegt. Vorschlag:
|
|
|
|
```powershell
|
|
$Action = New-ScheduledTaskAction `
|
|
-Execute "powershell.exe" `
|
|
-Argument "-NoProfile -ExecutionPolicy Bypass -File G:\Gitea_Clone\homelab-infra\ops\h-drive-nearline\pull-critical-backups.ps1"
|
|
|
|
$Trigger = New-ScheduledTaskTrigger -Daily -At 05:30
|
|
|
|
Register-ScheduledTask `
|
|
-TaskName "KalliLab H Drive Nearline Pull" `
|
|
-Action $Action `
|
|
-Trigger $Trigger `
|
|
-Description "Copies critical KalliLab restore artifacts from Unraid SMB backup share to H:/ nearline disk." `
|
|
-RunLevel LeastPrivilege
|
|
```
|
|
|
|
## Erfolgscheck
|
|
|
|
Nach einem echten Lauf muessen mindestens diese Artefakte unter `H:\kallilab-nearline-backups` liegen:
|
|
|
|
- `borg-dumps\latest\immich.dump`
|
|
- `borg-dumps\latest\komodo-mongo.archive.gz`
|
|
- `borg-dumps\latest\postgresql17-paperless.dump`
|
|
- `borg-dumps\latest\postgresql17-mailarchiver.dump`
|
|
- `borg-dumps\latest\nextcloud.dump`
|
|
- `borg-dumps\latest\mealie.dump`
|
|
- `borg-dumps\latest\gitea.sqlite.dump`
|
|
- `borg-dumps\latest\vaultwarden.sqlite.dump`
|
|
- `git-bundles\gitea\latest-report.md`
|
|
- `git-bundles\gitea\micha\*.bundle`
|
|
|
|
Bewusst **nicht** im Nearline-Scope:
|
|
|
|
- `unraid-flash-config.tar.gz` (hostseitig 0600 root:root; Restore-Quelle bleibt das Hetzner-Borg-Repo, siehe `docs/RESTORE_MATRIX.md` Tier 1 Unraid OS Flash).
|
|
|
|
## Schutzregeln
|
|
|
|
- Kein CIFS-/SMB-Hard-Mount von `H:/` auf Unraid.
|
|
- Kein Borg-Repo direkt auf `H:/` ueber SMB.
|
|
- Kein `/MIR` und kein automatisches Loeschen auf `H:/`.
|
|
- Flash-Backup wie Secret behandeln; `H:/` bleibt lokaler Operator-Datentraeger.
|