Linux-Kurs / Server-Backups erstellen und unabhängige Zustandsprüfungen einrichten

Zuverlässiger Betrieb erfordert sowohl wiederherstellbare Backups als auch Prüfungen, die Fehler aufdecken. Validieren Sie die Archivierung, Integrität, Wiederherstellung, das HTTP-Verhalten und die Speicherung separat und stellen Sie eine externe Möglichkeit zur Verfügung, um Fehler oder Nichtausführung zu erkennen.

Verbinden Sie das Verfahren, das in manuelle Backup- und Wiederherstellungsüberprüfung bewährt wurde, mit planmäßiger Ausführung. Überprüfen Sie die Erstellung von Backups, die unabhängige Wiederherstellung und die Fehlerberichterstattung separat.

Systemkonfigurationsübungen verwenden eine herkömmliche Ubuntu 26.04 LTS oder Rocky Linux 9 VM als Referenzumgebung. Container, WSL und andere Versionen können sich in Dienst- und Paketkonfiguration unterscheiden. Bereiten Sie die Konsolenwiederherstellung vor und zeichnen Sie Ihre Versionen mit der virtuellen Maschinen-Einrichtungslektion auf.

Definieren Sie die Daten- und Wiederherstellungsumfänge

Das Beispiel behandelt gewöhnliche statische Dateien mit kontrollierten Änderungen, wie den Inhalt der Lektion 33. Sichern Sie die Dienstkonfiguration, Zertifikate, DNS-Informationen und Bereitstellungsverfahren separat; verwenden Sie anwendungs-konsistente Werkzeuge für Datenbanken. Das lokale Archiv zeigt den Arbeitsablauf und ist kein unabhängiger Schutz gegen Festplattenausfall oder die Kompromittierung eines Kontos.

Wählen Sie lesbare Quelldateien und ein privates beschreibbares Backup-Verzeichnis. Planen Sie nicht alles als Root, nur um Lesezugriffe zu umgehen. Produktions-Backups benötigen ein bewusst gewähltes Konto, genehmigte Pfade, Schlüsselverwaltung und eine Aufbewahrungsrichtlinie.

Erstellen Sie ein Backup-Skript mit expliziten Quellen und Zielen

mkdir -p "$HOME/bin"
cat > "$HOME/bin/course-backup.sh" <<'EOF'
#!/usr/bin/env bash
set -u
set -o pipefail
umask 077
if (( $# != 2 )); then
  printf "Usage: %s SOURCE_DIRECTORY BACKUP_DIRECTORY\n" "$0" >&2
  exit 2
fi
source_dir=$(realpath -e -- "$1") || exit 1
backup_dir=$(realpath -e -- "$2") || exit 1
[[ -d "$source_dir" && -d "$backup_dir" ]] || exit 1
case "$backup_dir/" in
  "$source_dir/"*) printf "Backup must be outside source\n" >&2; exit 1 ;;
esac
work=$(mktemp -d "$backup_dir/backup.XXXXXXXX") || exit 1
if ! tar -czf "$work/data.tar.gz" -C "$source_dir" .; then
  printf "Archive failed: %s\n" "$work" >&2; exit 1
fi
if ! tar -tzf "$work/data.tar.gz" > /dev/null; then
  printf "Archive listing failed\n" >&2; exit 1
fi
if ! (cd "$work" && sha256sum data.tar.gz > data.tar.gz.sha256); then
  printf "Checksum creation failed\n" >&2; exit 1
fi
if ! date --iso-8601=seconds > "$work/created-at.txt"; then exit 1; fi
printf "complete\n" > "$work/COMPLETE" || exit 1
printf "Backup ready: %s\n" "$work"
EOF
bash -n "$HOME/bin/course-backup.sh"

Das Skript erstellt ein einzigartiges Verzeichnis, wodurch verhindert wird, dass zwei Durchläufe denselben Archivnamen wählen. Nur Archive mit einem endgültigen COMPLETE-Marker werden als abgeschlossene Backups behandelt. Fehlgeschlagene Durchläufe können teilweise Verzeichnisse zur Untersuchung hinterlassen; zählen Sie diese nicht als nutzbare Wiederherstellungspunkte. Es zeichnet die Erstellungszeit auf, löscht jedoch ältere Backups nicht automatisch.

Erstellen, Integrität und Wiederherstellung separat testen

lab=$(mktemp -d "$HOME/linux-ops-lab.XXXXXX")
mkdir "$lab/site" "$lab/backups" "$lab/restored"
printf "site version 1\n" > "$lab/site/index.html"
bash "$HOME/bin/course-backup.sh" "$lab/site" "$lab/backups"
find "$lab/backups" -maxdepth 2 -type f -print

Setzen Sie die untenstehende Variable auf das von diesem Durchlauf ausgegebene Verzeichnis. Die Überprüfung der Prüfsumme und Archiv-Liste beweist nicht die Anwendbarkeit der Wiederherstellung: Vergleichen Sie den wiederhergestellten Inhalt und testen Sie den tatsächlichen Webdienst separat. Ersetzen Sie den Platzhalter, anstatt ihn wörtlich zu kopieren.

backup=ACTUAL_BACKUP_DIRECTORY
test -f "$backup/COMPLETE"
(cd "$backup" && sha256sum -c data.tar.gz.sha256)
tar -xzf "$backup/data.tar.gz" -C "$lab/restored"
diff -r "$lab/site" "$lab/restored"

Erwarten Sie einen COMPLETE-Marker, eine OK-Prüfsumme und keine Differenzen. Stellen Sie in ein leeres Verzeichnis wieder her und überprüfen Sie erforderliche Berechtigungen, Eigentümer und Labels. Wiederholen Sie die Prüfungen nach der Übertragung auf unabhängigen Speicher. Wenden Sie Aufbewahrungsregeln an, die erforderliche Wiederherstellungspunkte erhalten, anstatt alte Kopien wahllos zu löschen, wenn der Speicher knapp wird.

Erstellen Sie eine fokussierte HTTP- und Speicher-Überprüfung

Das Beispiel erfordert curl, df und awk. Es akzeptiert eine URL und einen Mindestfreiraum-Schwellenwert in KiB und betrachtet HTTP 200–299 als gesund. Passen Sie das Kriterium an, wenn Weiterleitungen oder Authentifizierung erwartet werden. Es überprüft nicht den Seiteninhalt, den Datenbankzustand oder jede Anwendungsfunktion.

cat > "$HOME/bin/course-health.sh" <<'EOF'
#!/usr/bin/env bash
set -u
set -o pipefail
if (( $# != 3 )); then
  printf "Usage: %s URL MIN_FREE_KIB STORAGE_PATH\n" "$0" >&2; exit 2
fi
url=$1
minimum=$2
path=$3
[[ "$minimum" =~ ^[0-9]+$ ]] || exit 2
if ! status=$(curl -sS -o /dev/null -w "%{http_code}" --connect-timeout 5 --max-time 15 "$url"); then
  printf "HTTP transport failed\n" >&2; exit 1
fi
[[ "$status" =~ ^2[0-9][0-9]$ ]] || { printf "HTTP status=%s\n" "$status" >&2; exit 1; }
available=$(df -Pk -- "$path" | awk 'NR==2 {print $4}') || exit 1
[[ "$available" =~ ^[0-9]+$ ]] || exit 1
(( 10#$available >= 10#$minimum )) || { printf "Low storage: %s KiB\n" "$available" >&2; exit 1; }
printf "OK http=%s free_kib=%s\n" "$status" "$available"
EOF
bash -n "$HOME/bin/course-health.sh"
bash "$HOME/bin/course-health.sh" http://127.0.0.1/ 102400 "$HOME"

Die Schwelle von 102400 KiB beträgt etwa 100 MiB und ist ein illustrativer Wert, keine Betriebsempfehlung. Wählen Sie Schwellenwerte basierend auf Wachstumsrate und Recovery-Speicherbedarf und prüfen Sie Inodes separat. Für eine namensbasierte Nginx-Site überprüfen Sie die tatsächliche Domain oder das entsprechende Host-Routing; ein 200 von der Standard-Site validiert nicht die beabsichtigte Site.

Planen Sie den Job und erkennen Sie Fehler unabhängig.

Verwenden Sie die Benutzer-Service-/Timer-Struktur aus Lektion 29 erneut, wobei ExecStart /bin/bash %h/bin/course-backup.sh ACTUAL_SOURCE ACTUAL_BACKUP_PATH aufruft. Zitieren Sie Argumente gemäß der systemd-Syntax, wenn Pfade Leerzeichen enthalten, und testen Sie den Befehl zuerst manuell. Wählen Sie einen Zeitplan gemäß den Wiederherstellungsanforderungen und führen Sie Zustandsprüfungen in einer separaten Einheit durch.

Überprüfen Sie den nächsten Auslöser, den Service-Ausgangsstatus und die zuletzt abgeschlossene Sicherungszeit separat. Ein Monitor auf demselben Server stoppt, wenn der Server stoppt, daher sollte ein externer Monitor die echte URL und die Aktualität der Sicherung prüfen. Testen Sie jeden E-Mail- oder Nachrichtenalarmpfad und definieren Sie Verantwortlichkeiten und Wiederherstellungsmaßnahmen für jeden auslösbaren Fehler.

Üben Sie Fehlerpfade und entfernen Sie das Labor

Ändern Sie jeweils nur eine Bedingung: fehlende Sicherungsquelle, nicht vorhandene HTTP-Ressource und absichtlich zu hoher Freispeicher-Schwellenwert. Stellen Sie jeden ursprünglichen Wert wieder her und bestätigen Sie, dass unvollständige Archive nicht als erfolgreich gemeldet werden. Deaktivieren Sie Labortimer, bevor Sie nur die für diese Übung erstellten Skripte und Arbeitsverzeichnisse entfernen.

Offizielle Referenzen