132 lines
5.8 KiB
Markdown
132 lines
5.8 KiB
Markdown
# H:/ Nearline Pull
|
|
|
|
Status: **produktiv** (2026-05-28). Erster echter Lauf 2026-05-27 20:45 erfolgreich. Windows Scheduled Task `KalliLab H Drive Nearline Pull` taeglich 05:30 ist seit 2026-05-28 aktiv.
|
|
|
|
## 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:/.
|
|
|
|
## Befund 2026-06-01
|
|
|
|
- Der Scheduled Task um 05:30 kopierte die aktuellen Dumps, brach aber mit Robocopy Exit-Code 8 ab, weil im Dump-Root alte `*-pre-*` Dateien und Migration-/Cutover-Verzeichnisse mit restriktiven Rechten lagen.
|
|
- Fix: `ops/h-drive-nearline/pull-critical-backups.ps1` kopiert fuer `borg-dumps-latest` nur noch die kuratierte Pflichtdatei-Liste und schliesst Migration-/Cutover-Verzeichnisse aus.
|
|
- Manueller Kontrolllauf 2026-06-01 08:25 erfolgreich: `borg-dumps-latest` Exit-Code 0, `gitea-bundles` Exit-Code 1 (Robocopy-Erfolg mit Kopien), Report `H:\kallilab-nearline-backups\_reports\nearline-pull-2026-06-01-082553.md`.
|
|
|
|
## 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 kuratierte Dumps ohne 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.
|
|
|
|
Der Borg-Dumps-Job ist eine Whitelist der aktuellen Nearline-Pflichtartefakte. Einmalige Migrations-Sicherungen, Pre-Major-Snapshots und Redis-Cutover-Verzeichnisse bleiben ueber Borg/Hetzner abgedeckt, sind aber kein H:/-Nearline-Pflichtbestand.
|
|
|
|
## 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.
|
|
|
|
Aktiv seit 2026-05-28. Tatsaechlicher Register-Befehl (RunLevel-Enum-Wert ist `Limited`, nicht `LeastPrivilege`):
|
|
|
|
```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
|
|
|
|
$Settings = New-ScheduledTaskSettingsSet `
|
|
-AllowStartIfOnBatteries `
|
|
-DontStopIfGoingOnBatteries `
|
|
-StartWhenAvailable `
|
|
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
|
|
|
|
Register-ScheduledTask `
|
|
-TaskName "KalliLab H Drive Nearline Pull" `
|
|
-Action $Action `
|
|
-Trigger $Trigger `
|
|
-Settings $Settings `
|
|
-Description "Copies critical KalliLab restore artifacts from Unraid SMB backup share to H:/ nearline disk." `
|
|
-RunLevel Limited
|
|
```
|
|
|
|
Status pruefen:
|
|
|
|
```powershell
|
|
Get-ScheduledTask -TaskName "KalliLab H Drive Nearline Pull" | Format-List TaskName, State
|
|
Get-ScheduledTaskInfo -TaskName "KalliLab H Drive Nearline Pull" | Format-List LastRunTime, LastTaskResult, NextRunTime, NumberOfMissedRuns
|
|
```
|
|
|
|
Manueller Trigger zum Testen:
|
|
|
|
```powershell
|
|
Start-ScheduledTask -TaskName "KalliLab H Drive Nearline Pull"
|
|
```
|
|
|
|
Verhalten:
|
|
|
|
- Laeuft als angemeldeter User (`RunLevel Limited`); wenn der PC abgemeldet ist, wartet der Task bis zur naechsten Anmeldung (`StartWhenAvailable`).
|
|
- Akku-Modus blockiert nicht (`AllowStartIfOnBatteries`).
|
|
- Maximale Laufzeit 2 h, danach wird der Task abgebrochen.
|
|
|
|
## 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.
|