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
LG,
MikeE