Backup-Strategie für Webprojekte
Was gesichert gehört, wie oft, wohin – und warum ein Backup ohne getesteten Restore nur eine Vermutung ist.
Das Wichtigste
- 3-2-1: drei Kopien, zwei verschiedene Medien oder Anbieter, eine ausserhalb des Systems.
- Ein Server-Snapshot ist kein Backup deiner Inhalte. Er hilft bei Hardwareausfall, nicht bei einer vor drei Wochen gelöschten Tabelle.
- Die Aufbewahrungsdauer entscheidet über den Schutz vor schleichenden Schäden – Verschlüsselung oder Datenverlust fallen oft erst nach Tagen auf.
- Ein nie zurückgespieltes Backup ist keine Sicherung, sondern eine Annahme. Restore-Test terminieren, nicht vornehmen wollen.
Die meisten Backup-Konzepte scheitern nicht am Sichern, sondern am Zurückspielen. Der Weg dorthin führt über drei Fragen: Was, wie oft, wohin – und dann über einen Test.
3-2-1 auf Webprojekte übersetzt
- Drei Kopien: das laufende System plus zwei Sicherungen.
- Zwei verschiedene Medien oder Anbieter: nicht beide Sicherungen beim selben Hoster.
- Eine ausserhalb: an einem Ort, der von einem kompromittierten Server aus nicht erreichbar ist.
Der dritte Punkt ist der, der im Ernstfall zählt. Wer die Sicherungen auf demselben Server ablegt, verliert sie mit ihm. Wer sie mit denselben Zugangsdaten erreichbar hält wie das System, verliert sie bei einem Einbruch mit.
Was gesichert gehört
| Bestandteil | sichern? | Begründung |
|---|---|---|
| Datenbank | ja | nicht reproduzierbar |
| Uploads, Medien | ja | nicht reproduzierbar |
| Konfiguration mit Zugangsdaten | ja | schwer zu rekonstruieren |
| Quellcode | im Repository | Sicherung optional |
vendor/, node_modules/ | nein | aus Lockfile wiederherstellbar |
| Cache, Sessions, Logs | nein | erzeugt sich neu |
| Kompilierte Assets | nein | aus dem Build |
Diese Trennung halbiert das Volumen oft deutlich, was Laufzeit und Speicherkosten senkt.
Ein funktionierendes Skript
#!/usr/bin/env bash
set -euo pipefail
TAG=$(date +%F)
ZIEL=/var/backups/example
mkdir -p "$ZIEL"
# Datenbank - konsistent ohne Tabellensperre bei InnoDB
mysqldump --single-transaction --quick --default-character-set=utf8mb4 \
--databases example_db | gzip > "$ZIEL/db-$TAG.sql.gz"
# Uploads - inkrementell, ohne reproduzierbare Verzeichnisse
tar czf "$ZIEL/files-$TAG.tar.gz" \
--exclude='./var/cache' --exclude='./node_modules' --exclude='./vendor' \
-C /var/www/example .
# ausserhalb ablegen, Ziel darf nur schreiben, nicht löschen
rclone copy "$ZIEL" backup-remote:example/ --immutable
# lokale Aufbewahrung
find "$ZIEL" -name '*.gz' -mtime +14 -delete
Zwei Details, die den Unterschied machen:
set -euo pipefail bricht bei jedem Fehler ab. Ohne das läuft das Skript nach einem fehlgeschlagenen mysqldump weiter, legt eine leere Datei an und meldet Erfolg.
--immutable beim Kopieren verhindert, dass eine bestehende Sicherung überschrieben wird. Besser noch ist ein Zugang am Zielort, der Schreibrechte, aber keine Löschrechte hat – dann kann ein kompromittierter Server die Sicherungen nicht mitnehmen.
Aufbewahrung staffeln
| Rhythmus | Aufbewahrung | wofür |
|---|---|---|
| stündlich (nur Datenbank) | 48 Stunden | Bedienfehler |
| täglich | 14 Tage | die häufigsten Fälle |
| wöchentlich | 8 Wochen | spät entdeckte Schäden |
| monatlich | 12 Monate | Nachvollziehbarkeit |
Die wöchentliche Ebene ist die, die man sich wünscht, wenn es ernst wird. Eine Verschlüsselung durch Schadsoftware oder ein schleichender Datenverlust fällt selten am selben Tag auf. Bei einer Aufbewahrung von sieben Tagen sind dann alle Sicherungen bereits betroffen.
Der Teil, den fast alle auslassen
Restore testen. Nicht “irgendwann mal”, sondern mit Termin:
- Eine leere Umgebung aufsetzen – lokal in einem Container reicht.
- Die aktuelle Sicherung einspielen, ohne auf das laufende System zu schauen.
- Die Zeit stoppen.
- Prüfen, ob die Anwendung startet, ob Daten vollständig sind und wie alt der jüngste Datensatz ist.
- Aufschreiben, was gefehlt hat.
Was dieser Test regelmässig zutage fördert: eine Konfigurationsdatei, die nie mitgesichert wurde, ein Zeichensatzproblem beim Import, ein fehlender Schlüssel für verschlüsselte Felder, Dateirechte, die nach dem Entpacken nicht stimmen.
Aus der gestoppten Zeit ergibt sich die realistische Wiederanlaufzeit. Die kann man kommunizieren – anders als eine Schätzung.
Überwachung der Sicherung
Ein Backup, das seit sechs Wochen scheitert, bemerkt niemand, solange niemand hinschaut. Zwei einfache Sicherungen dagegen:
# Alarm, wenn die jüngste Sicherung älter als 26 Stunden ist
find /var/backups/example -name 'db-*.sql.gz' -mtime -1 | grep -q . \
|| echo "Backup fehlt" | mail -s "Backup-Alarm example" admin@example.com
# Plausibilität der Grösse: plötzlich winzig heisst meist leerer Dump
find /var/backups/example -name 'db-*.sql.gz' -size -1M -mtime -1 \
-exec echo "Backup verdächtig klein: {}" \;
Die zweite Prüfung fängt den Fall ab, in dem das Skript läuft, der Dump aber leer ist – beispielsweise weil das Datenbankpasswort geändert wurde. Die Datei existiert dann, ist aktuell und trotzdem wertlos.
Häufige Fragen
Reicht das Backup meines Hosters?
Als einzige Sicherung nicht. Es liegt beim selben Anbieter, hat oft eine kurze Aufbewahrung und lässt sich manchmal nur über den Support zurückspielen. Als eine von mehreren Kopien ist es wertvoll – aber eine Kopie ausserhalb seiner Infrastruktur gehört dazu.
Wie oft soll ich sichern?
So oft, wie du Datenverlust verkraften kannst. Eine Firmenseite mit wenigen Änderungen im Monat kommt mit täglich aus. Ein Shop mit laufenden Bestellungen braucht zusätzlich fortlaufende Datenbanksicherungen, damit im Ernstfall nicht der ganze Tag fehlt.
Wie lange muss ich Sicherungen aufbewahren?
Mindestens so lange, wie ein Schaden unentdeckt bleiben kann. Sieben Tage sind zu wenig, wenn eine Verschlüsselung erst nach zwei Wochen auffällt. Bewährt hat sich eine Staffelung: täglich für zwei Wochen, wöchentlich für zwei Monate, monatlich für ein Jahr.
Was gehört ins Backup, was nicht?
Datenbank, hochgeladene Dateien und die Konfiguration mit Zugangsdaten. Nicht nötig sind Dinge, die sich reproduzieren lassen: Cache, Abhängigkeiten aus Composer oder npm, kompilierte Assets. Der Quellcode liegt idealerweise ohnehin in einem Repository.
Weiterlesen
- Managed Server: Was der Aufpreis abdeckt
Patching, Monitoring, Notfallreaktion - was Anbieter unter "managed" verstehen und welche Aufgaben trotzdem bei dir bleiben.
- Monitoring und Logauswertung im Alltag
Was überwacht gehört, welche Schwellen sinnvoll alarmieren und wie du aus Logs eine Störungsursache herausliest.
- Webhosting-Vergleich: Worauf es technisch wirklich ankommt
PHP-Versionen, Prozesslimits, Backup-Aufbewahrung und SSH-Zugang - die Merkmale, an denen sich Tarife unterscheiden, sobald das Projekt wächst.
- vServer oder Shared Hosting: Wann sich der Wechsel lohnt
Ab welcher Last Shared Hosting bremst, was ein vServer an Arbeit zurückgibt und welche Zwischenstufen es gibt.