Files
homelab-infra/docs/H_DRIVE_NEARLINE_PULL.md
T
Micha 2b60a58753 Activate H drive nearline pull as daily scheduled task
Windows Scheduled Task "KalliLab H Drive Nearline Pull" auf dem
Operator-Windows-PC registriert: taeglich 05:30 nach dem Borg-
Dump-Fenster. RunLevel Limited, StartWhenAvailable, Akku-OK,
Execution-Time-Limit 2h. Naechster Lauf 2026-05-29 05:30.

Repo-Snippet in H_DRIVE_NEARLINE_PULL.md korrigiert: PowerShell-
Enum-Wert ist Limited, nicht LeastPrivilege (alter Snippet haette
beim ersten Register-ScheduledTask einen Parameter-Binding-Fehler
geworfen). Status auf "produktiv" gesetzt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 20:25:26 +02:00

4.9 KiB

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:/.

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.exe -NoProfile -ExecutionPolicy Bypass -File G:\Gitea_Clone\homelab-infra\ops\h-drive-nearline\pull-critical-backups.ps1 -WhatIf

Echter Lauf:

powershell.exe -NoProfile -ExecutionPolicy Bypass -File G:\Gitea_Clone\homelab-infra\ops\h-drive-nearline\pull-critical-backups.ps1

Reports landen unter:

H:\kallilab-nearline-backups\_reports

Robocopy-Logs landen unter:

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):

$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:

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:

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.