VM Backup Automatisch durchführen

Hallo zusammen,
ich habe mir ein Backup geschrieben, welches die gesamte Maschine sichert.
Mir ist bewusst dass ich hier einen Sonderweg beschreite, aber falls es jemanden Betrifft, möchte ich hier meinen Weg beschreiben den ich für mich als gangbar befunden habe.
Ich betreibe den Home Assistant als virtuelle Maschine unter VMWare Player 17 mit Windows 11 als Host System. Ist nicht ideal, aber tut für mich.
Nun hatte ich mir als Ziel gesetzt, das komplette System (also das gesamte Betriebssystem inkl. allem was dazu gehört) regelmäßig zu sichern, und zusätzlich vor jedem Systemupdate, damit ich im Falle eines Falles schnell wieder die Zeit zurück drehen kann und das System auf den vorherigen Stand zurücksetzen kann - und das möglichst ohne mein Eingreifen über Nacht.
Hierzu muss ich folgende Voraussetzungen erfüllen:

1.) Vorschriftsmäßiges Herunterfahren des Home Assistant und der gesamten Maschine
2.) Nach erfolgtem Shutdown das Sichern der gesamten VM
3.) wieder hochfahren der VM
4.) Sichern der Dateien auf einem externen Speichermedium

da ich das Betriebssystem nicht innerhalb der VM komplett sichern kann, habe ich mich für die externe Lösung entschieden und mache das mit einem Powershell Script.

Nun zum ersten Teil, das Herunterfahren.
Hier habe ich mir einen Text Input Helfer erstellt, der nach belieben befüllt werden kann. Dieser wird überwacht und das System wird per Automation heruntergefahren, sobald ein bestimmter Wert dort gefunden wird.

alias: Shutdown
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_text.filename
    to: hier Euer Codewort rein
conditions: []
actions:
  - action: input_text.set_value
    metadata: {}
    data:
      value: Ich stoppe
    target:
      entity_id: input_text.filename
  - action: hassio.host_shutdown
    metadata: {}
    data: {}
mode: single

Natürlich muss in der Automation festgelegt werden dass wenn der Wert erkannt wird, zuerst der Wert wieder überschrieben werden soll, sonst würde das System in eine “Boot-Loop” laufen und ständig hoch- und runterfahren… nicht gut.
Als zweiter Step wird das System runter gefahren.
Als Sicherheit habe ich mir eine zweite Automation gebastelt, die das Feld beim Start von Home Assistant nochmal überschreibt, also doppelter Boden.
Soweit zu den Vorbereitungen innerhalb HA.
Jetzt zum externen Teil.
Hier das Powershell-Script welches ich mir erstellt habe:

# Script für das Backup der kompletten Home Assistant Installation

# URL der API
$url = "http://homeassistant.local:8123/api/states/input_text.filename"

# Name der Virtuellen Maschine
$ident = "HomeAssistant"

# Pfad der Virtuellen Maschine
$src = "D:\Virtual Machines\$ident"

# Pfad zum Zwischenspeicher -> Dieser Pfad muss existieren, er wird nicht erstellt!
$zwpfad = "D:\VM-Backups\HomeAssistant\"

# Authorization-Token
$token = "euer Token hier rein" 

# Header für die Anfrage
$headers = @{
    "Authorization" = "Bearer $token"
    "Content-Type"  = "application/json"
}

# Payload für die Anfrage
$payload = @{
    "state" = "Euer Codewort für die Automation hier rein"
} | ConvertTo-Json

# Sende die POST-Anfrage
$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $payload

# Überprüfe die Antwort
if ($response) {
    Write-Host "Die Selbstzerstörungssequenz wurde erfolgreich übertragen." -ForegroundColor Red # ;-)
} else {
    Write-Host "Fehler beim Übertragen der Sequenz." -ForegroundColor Red
    Exit
}

# War die Antwort positiv, Starte die Backup-Sequenz
Write-Host Home Assistant wird jetzt heruntergefahren. Ich warte auf Beendigung der VM. -ForegroundColor White
While (Test-Path "$src\$ident.vmdk.lck") { # hier wird gewartet bis der .vmdk.lck Ordner gelöscht wird.
    $i += 1
    Write-Host "Der Ordner existiert noch. Warte 10 Sekunden..." -ForegroundColor Cyan
    Start-Sleep -Seconds 10  # Warten für 300 Sekunden (5 Minuten)
    if ($i -gt 30) {
        Write-Host "nach 5 Minuten keine Änderung, Abbruch." -ForegroundColor Red # Nach der Wartezeit wird das Script abgebrochen, da nach 5 Minuten
        Exit # damit gerechnet wird dass die Automation nicht geklappt hat
    } 
}

# Nach Shutdown der VM Backup erstellen
Write-Host Backup-Ordner wird nun erstellt -ForegroundColor Cyan

$fldname = "Backup-$(Get-Date -Format "yyyyMMdd-hhmmss")"
New-Item -Path $zwpfad -Name $fldname -ItemType Directory

Write-Host Ich kopiere nun die Daten in den Zwischenspeicher -ForegroundColor Green

# Alle Dateien in den Zwischenspeicher kopieren
# Ich kopiere die Dateien lokal, da ich eine SSD verwende und die Kopierzeit
# daher nicht 
Copy-Item -Path "$src\*" -Destination "$zwpfad$fldname"

Write-Host Home Assistant wird wieder gestartet -ForegroundColor Cyan

$args = "-T", "player", "start", "`"$src\$ident.vmx`""
Start-Process -FilePath "C:\Program Files\VMware\VMware Player\vmrun.exe" -ArgumentList $args

Write-Host Sichern der Backup-Dateien auf Netzlaufwerk -ForegroundColor Yellow

Move-Item -Path "$zwpfad$fldname" -Destination "\\fritz.box\FRITZ.NAS\Speicher\Virtual Machines\$ident"

Write-Host Das Home Assistant System wurde erfolgreich gesichert. -ForegroundColor Magenta

Das Script wartet bis die VM heruntergefahren ist, sichert die Dateien weg auf die lokale Platte und startet die VM wieder. Das dauert bei mir nur ein paar Sekunden. Danach werden die Dateien vom lokalen Zwischenspeicher auf einen Netzwerkspeicher verschoben (das passiert im Hintergrund, da die Maschine ja wieder läuft).
Ideen und Verbesserungen gerne :slight_smile:

LG,
MikeE

Warum kannst du das nicht? Es würde doch reichen wenn du die Autoprotect Funktion im VM Workcenter aktivierst. Täglich ausgeführt für die letzten xxx Tage und zusätzlich noch ein automatisiertes Backup von Homeassistant über die Standard Backup Funktion nach extern.

Wenn du dir mit irgend welchen Aktionen das OS zerstörst dann hast du die Snapshots in VMWare. Das ist getestet und im permanenten Einsatz. Wenn dir die Festplatte abraucht hast du die HA Backups die du bei einer Neuinstallation einspielen kannst. Optional kannst du auch ncoht den VMWare Ordner der VM einmalig wegsichern … aber wenn die Festplatte defekt ist musst du sowieso alles neu installieren, da kommt es auf ein nacktes HA OS auch nicht mehr an.

Hi Mostie,
Erwähnte ich dass ich dem VMWare “Player” verwende?
Der macht keine Snapshots :wink:
Daher habe ich die besagte Powershell-“Snapshot” Version gewählt.
Das verbraucht -klar- einiges mehr an GB Speicher als die Workstation-Snapshots, aber wie gesagt: die Möglichkeit habe ich nicht.
Mit dieser Variante kann ich in kurzer Zeit auf die vorherige Version zurückgehen (im Falle kaputte Festplatte:) andere Festplatte rein, VM draufspielen, starten, fertig. Wenns den Host (bei mir: Windows) zerschießt, schieb ich die VM auf einen übrigen Rechner, steck den Zigbee Stick an und weiter geht´s.
Standard-Backups von HA nach extern mach ich nebenzu auch noch zur Sicherheit, falls meine Full Backups nicht wollen.
LG,
MikeE

Deine Entscheidung wie du BAckup machst. Warum willst du die Workstation nicht nutzen? Für Privatgebrauch ist die auch kostenlos und behinhaltet bei der Installation den Player sofern du den brauchst. WAr als Hinweis gedacht.

Hi Mostie

Die Info ist in der Tat neu für mich… war vor ein paar Jahren noch nicht so, deshalb hab ich die Version auch links liegen lassen. Werd ich mir gleich anschauen. Danke Dir für die Info!
MikeE