Backup per VPN: Email-Benachrichtigung

Grundkonzept und Voraussetzungen

Im letzten Post habe ich beschrieben, wie man den Veeam Backup Agent for Linux installiert und ein lokales Verzeichnis im eigenen Netzwerk als Ziel für ein Backup konfiguriert. Ein automatisiertes Backup ist damit schon lauffähig, sollte aber trotzdem regelmäßig überprüft werden. Da ich mich nicht immer per SSH verbinden mag, um manuell den Veeam Client zu öffnen, richten wir nun eine Benachrichtigung per Email ein.

Wichtig hierfür ist, dass der Cloud-Server bereits schon über eine funktionierendes Mail-Setup verfügt. Ich selbst verwende mailcow-dockerized, Das Open-Source-Projekt paketiert vorhandene Komponenten zu einem Docker-Stack und erleichtert durch Automatisierungen die Konfiguration dieser. Zusätzlich wird in diesem Stack auch ein Zugriff per WebMail und eine Anti-Spam-Lösung betrieben.

In diesem Post verwenden wir den integrierten Mailserver als Relay-Server für unsere Benachrichtigungen aus Veeam.

Status des Backups exportieren

Um den Status eines vergangenen Backups einzusehen, kann auf der Konsole der Befehl veeam mit erhöhten Berechtigungen ausgeführt werden. Dieser listet die letzten Backup-Jobs, deren Ergebnis und eine Zusammenfassung der Zwischenschritte auf.

Übersicht der Backup Jobs

Diese Informationen können aber ebenso über das Programm veeamconfig abgerufen werden, welches ebenfalls mit dem Veeam Agent installiert wird. Um die Verwendung zu erleichtern, habe ich ein kurzes Skript erstellt, welches die Informationen des letzten Backups-Jobs extrahiert und per Mail versendet. Das Skript ist in einem eigenen Repository auf Github zu finden:

Zunächst prüft das Skript, ob die nötigen Komponenten auf dem System installiert sind. Anschließend wartet das Skript eine Zeit, damit alle Hintergrundprozesse von Veeam - in unserem Fall beispielsweise das Trennen der VPN-Verbindung - abgearbeitet werden können. Mittels des Befehls veeamconfig session list wird dann eine Liste aller Backup-Sessions angezeigt und über sed der gewünschte Eintrag herausgefiltert. In der Liste ist das letzte Backup immer die vorletzte Zeile.

$ sudo veeamconfig session list
Job name     Type    ID                                      State    Started at        Finished at       
backup-hr94  Backup  {6a222fd4-ec5c-4f67-9fc1-4419aafd3482}  Failed   2023-01-01 15:23  2023-01-01 22:16  
backup-hr94  Backup  {9ceaabd5-5323-484f-82e0-8f29957e8b5f}  Failed   2023-01-06 18:43  2023-01-06 21:50  
backup-hr94  Backup  {e7808fe6-d103-4ac4-85c2-61810eb2c613}  Warning  2023-01-07 06:00  2023-01-07 09:08  
backup-hr94  Backup  {a9410f3d-84c8-4a71-8b7a-291c49ae8bbb}  Warning  2023-01-08 17:02  2023-01-08 17:05  
backup-hr94  Backup  {f21675af-54a8-420d-ba8d-f7750d773ca7}  Warning  2023-01-08 17:12  2023-01-08 17:12  
backup-hr94  Backup  {d37d8dbe-8756-4ed9-94f8-39eb21292060}  Warning  2023-01-08 17:25  2023-01-08 17:26  
backup-hr94  Backup  {97f0c584-e3c4-429f-a94c-9c7f2b2baf43}  Failed   2023-01-08 17:29  2023-01-08 17:30  
backup-hr94  Backup  {bdec2a8c-cceb-4b50-b930-b096eef383e2}  Warning  2023-01-08 17:31  2023-01-08 17:38  
backup-hr94  Backup  {c8db8daa-9712-45c3-aa07-aa74e3081b7b}  Warning  2023-01-08 17:40  2023-01-08 17:42  
Total amount: 9

Erzeugen und Versenden der Benachrichtigung

Dieser Eintrag kann mittels sed gefiltert werden. Anschließend werden die gewünschten Parameter mittels der ID des Jobs ausgelesen.

lastBackupID=$(echo $lastBackup | cut -d' ' -f3)
lastBackupState=$(echo $lastBackup | cut -d' ' -f4)
lastBackupStart=$(echo $lastBackup | cut -d' ' -f5,6)
lastBackupEnd=$(echo $lastBackup | cut -d' ' -f7,8)
lastBackupLog=$(veeamconfig session log --id $lastBackupID)

Im letzten Schritt wird dann der Betreff und der Inhalt der Mail aus den Variablen zusammengebaut und die Mail versendet.

# Build subject
subject="Backup with id '${lastBackupID}' ended with state ${lastBackupState^^}"

# Build message
message=$(cat << EOL
Status: ${lastBackupState^^}
Start:  ${lastBackupStart}
End:    ${lastBackupEnd}
Log:
=====
${lastBackupLog}
EOL
)

# Send mail
echo "$message" | mailx -r $sender -a "From: ${sender}" -s "$subject" $recipient

Verbinden mit dem Backup-Job

Damit das Skript nun auch nach dem Ende des aktuellen Backup-Jobs ausgeführt wird, muss es als Post-Job-Skript hinterlegt werden. Hierfür wird ein neues Skript mit dem Namen post-job.sh erstellt, welches unsere bisherigen Schritte aus der Einrichtung beinhaltet und um das neue Skript getVeeamBackupLogs.sh ergänzt wird.

#!/bin/bash

/root/getVeeamBackupLogs.sh &
vpnc-disconnect

Wichtig hierbei ist, dass die Zeile mit dem Verweis zu unserem Benachrichtigungsskript mit einem Ampersand/Et-Zeichen abgeschlossen wird. Dieses bewirkt, dass unser Skript in einen Hintergrundprozess geforked wird und dort ansynchron zu den Veeam-Prozessen weiterlaufen kann. Nach dem Ablauf des initialen Deltas (kann im Skript spezifiziert werden), wird dann die Mail erzeugt und gesendet.

Dieses neue Skript mit dem Namen post-job.sh kann dann im Veeam-Client konfiguriert werden:

Post-Job-Konfiguration

Wurden alle Schritte korrekt ausgeführt, erhalten wir nun nach dem Ende eines Backup-Jobs eine Mail an die im Skript getVeeamBackupLogs.sh spezifizierte Mail.

Benachrichtigung

Durch diese Mail können wir nun schnell und einfach überprüfen, ob ein Backup erfolgreich erstellt wurde und aus welchem Grund es eventuell nicht funktioniert hat.