Back openDesk Edu for a sovereign, open-source education â every vote counts.
Vote nowSave products you love by clicking the heart icon.
Comprehensive DR testing and edge-specific patterns for k3s â failover validation, scheduled snapshots, multi-cluster recovery, and RPO/RTO planning.
Wenn Sie self-hosten, sind Sie Ihr eigener Cloud-Provider. Kein SLA, kein Region-Failover, kein Support-Ticket, das man um 3 Uhr morgens eröffnen kann. Der Vorteil ist die volle Kontrolle. Der Nachteil: Wenn es kracht, liegt es an Ihnen.
Digitale SouverĂ€nitĂ€t bedeutet nicht, seine Daten zu besitzen â es bedeutet, in der Lage zu sein, sie zurĂŒckzuholen.
Bevor wir ĂŒber Tools sprechen, definieren Sie Ihre Failure Modes:
| Szenario | Wahrscheinlichkeit | Auswirkung | Recovery-Ziel |
|---|---|---|---|
| Filesystem-Corruption | Gering | Hoch â kompletter Neuaufbau | 4-8 Stunden |
Versehentliches Löschen (rm -rf /) | Mittel | Hoch â Datenverlust | 1-4 Stunden |
| Ransomware / Crypto-Locker | Mittel | Kritisch | kein Pay, nur Restore |
| Hardware-Ausfall (SSD-Tod) | Gering | Hoch â Austausch + Restore | 4-24 Stunden |
| Software-Bug korrumpiert DB | Mittel | Hoch â Point-in-Time Recovery | Minuten |
| GebÀudebrand / Diebstahl | Sehr gering | Kritisch | Off-site Backup nötig |
Ihre Backup-Strategie sollte alle diese Punkte abdecken. Nicht mit demselben Tool, sondern durch einen mehrschichtigen Ansatz.
FĂŒr allgemeine Datei-Backups â Konfigurationen, Anwendungsdaten, User-Home-Verzeichnisse â sind Restic oder Borg der moderne Standard. Sie bieten:
restic init --repo s3:https://s3.eu-central-1.wasabisys.com/my-backup/bucket
# Backup /etc, /var/lib, and application data
restic backup /etc /var/lib/docker/volumes \
--repo s3:... \
--password-file /etc/restic/pw \
--tag monthly-$(date +%Y-%m)
Borg bietet eine stĂ€rkere Deduplizierung fĂŒr groĂe DateisĂ€tze; Restic hat eine breitere Backend-UnterstĂŒtzung (S3, SFTP, lokal, REST-Server). WĂ€hlen Sie Restic, wenn Sie Cloud-Object-Storage nutzen möchten, und Borg, wenn Sie auf ein lokales NAS oder einen Remote-Server sichern.
Ein Backup eines Datenbank-Verzeichnisses auf Dateiebene ist riskant â Sie sichern Korruption, partielle SchreibvorgĂ€nge und inkonsistente ZustĂ€nde mit. Verwenden Sie immer das native Dump-Tool der Datenbank.
# PostgreSQL: daily full + continuous WAL archiving
pg_dumpall -f /backup/postgres/daily-$(date +%Y-%m-%d).sql
# Or better: pgBackRest for point-in-time recovery
pgbackrest --stanza=main --type=full backup
pgbackrest --stanza=main --type=archived --set=weekly-full backup
FĂŒr PostgreSQL in der Produktion:
# Restore to a specific timestamp
pgbackrest --stanza=main --type=time \
--target="2026-07-10 14:30:00+02" restore
Ransomware, die Ihren Server verschlĂŒsselt, wird auch Ihre angeschlossene Backup-Festplatte verschlĂŒsseln. Schicht 3 durchbricht diese Kette.
rclone oder restic mit einem anderen Remote.# Restic to a second, off-site repository
restic backup /data \
--repo sftp://backup-host:/srv/restic-repo \
--password-file /etc/restic/pw-alt
Ein Zeitplan, der fĂŒr die meisten Self-Hosted-Setups funktioniert:
| Frequenz | Was | Tool |
|---|---|---|
| Alle 6 Stunden | Datei-Snapshots (kritische Pfade) | Borg / Restic |
| Alle 12 Stunden | PostgreSQL WAL-Archiv | pgBackRest |
| TĂ€glich | Full DB Dump + Datei-Snapshot | pg_dumpall + restic |
| Wöchentlich | Full pgBackRest Backup + Off-site Sync | pgbackrest + rclone |
| Monatlich | Full Backup auf getrennte Medien | Manueller Rotate |
Automatisieren Sie dies mit systemd-Timern oder einem cron-Ă€hnlichen Tool:
# /etc/systemd/system/restic-backup.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/restic-backup.sh
Nice=19
IOSchedulingClass=idle
# /etc/systemd/system/restic-backup.timer
[Timer]
OnCalendar=*-*-* 02,10,18,22:00:00
RandomizedDelaySec=600
Persistent=true
rm -rf / im Docker-Datenverzeichnis# 1. Alle Container stoppen, um SchreibvorgÀnge zu verhindern
docker stop $(docker ps -q)
restic restore latest
--path /var/lib/docker/volumes
--target /
--repo s3:...
docker exec db pgbackrest --stanza=main check
docker start $(docker ps -aq)
### Scenario: Database corruption from a failed upgrade
```bash
# 1. Datenbank-Container stoppen
docker stop postgres
# 2. Wiederherstellung mit pgBackRest auf einen Zeitpunkt vor dem Upgrade
pgbackrest --stanza=main --type=time \
--target="2026-07-09 03:00:00+02" restore
# 3. Starten und Verifizieren
docker start postgres
psql -c "SELECT count(*) FROM pg_catalog.pg_tables;"
This should take < 4 hours for a medium setup.
This site runs on a single-node Docker swarm with the following stack. Here's the actual backup posture for production:
| Service | Data | Backup Method | RPO | RTO |
|---|---|---|---|---|
| PostgreSQL | Blog, auth, store orders | pg_dumpall + WAL archiving | 6 hours | 1 hour |
| MinIO | User uploads, media assets | Restic â off-site (Wasabi S3) | 12 hours | 2 hours |
| listmonk | Mailing lists, campaigns | pg_dump (embedded Postgres) | 24 hours | 4 hours |
| n8n | Automation workflows | Volume backup + export JSON | 12 hours | 1 hour |
| Ollama / vLLM | AI model weights | Re-pull from registry | N/A (ephem) | 30 min |
| Next.js (this) | Static build + content | Git (source) + Restic (build) | 24 hours | 30 min |
| Grafana / Loki | Dashboards + logs | Dashboard JSON export + S3 | 24 hours | 4 hours |
| Traefik | TLS certs, routing config | Volume backup + Let's Encrypt | 24 hours | 15 min |
Critical distinction: docker-compose.yml and all .env files live in a private git repo. Losing the server without this repo means rebuilding from memory. Keep your config repo backed up independently.
#!/bin/bash
# /usr/local/bin/daily-backup.sh - wird tĂ€glich um 03:00 Uhr via systemd timer ausgefĂŒhrt
set -euo pipefail
BACKUP_DIR="/backup/$(date +%Y-%m-%d)"
RESTIC_REPO="s3:https://s3.eu-central-1.wasabisys.com/tobias-backup"
RESTIC_PW="/etc/restic/pw"
mkdir -p "$BACKUP_DIR"
# 1. PostgreSQL Dump
docker exec postgres pg_dumpall -U postgres > "$BACKUP_DIR/postgres-full.sql"
# 2. n8n Workflows exportieren
docker exec n8n n8n export:workflow --all --output=/backup/n8n-workflows
# 3. Docker Volumes via Restic sichern
restic backup /var/lib/docker/volumes \
--repo "$RESTIC_REPO" \
--password-file "$RESTIC_PW" \
--tag "$(hostname)-daily-$(date +%Y-%m-%d)" \
--exclude '*/postgres/data/*' # ausgeschlossen â wir haben den SQL-Dump
# 4. Healthchecks benachrichtigen
curl -fsS -m 10 --retry 3 "https://hc-ping.com/YOUR-UUID"
## Notfall-Wiederherstellung: VollstÀndiger Serververlust
**Ziel-Wiederherstellungszeit: 4 Stunden**
### Phase 1: Infrastruktur (30 Min.)
- [ ] Neuen VPS / Bare Metal bereitstellen (Intel/AMD, 32GB+ RAM, NVMe)
- [ ] Docker + Docker Compose Plugin installieren
- [ ] Config-Repo klonen: `git clone git@codeberg:user/server-config`
- [ ] `.env` Dateien aus 1Password / Bitwarden wiederherstellen
### Phase 2: Daten wiederherstellen (1 Std.)
- [ ] S3-Bucket mit Restic-Key mounten
- [ ] `restic restore latest --target / --repo s3:...`
- [ ] Volume-Checksummen prĂŒfen
### Phase 3: Datenbanken (30 Min.)
- [ ] PostgreSQL-Container ohne Datenverzeichnis starten
- [ ] `pg_restore -U postgres -d postgres /backup/postgres-full.sql`
- [ ] Verifizieren: `docker exec postgres psql -c "SELECT count(*) FROM users;"`
### Phase 4: Dienste (1 Std.)
- [ ] `docker compose up -d` â prĂŒfen, ob alle Dienste gesund sind
- [ ] Traefik-Dashboard prĂŒfen: TLS-Zertifikate ausgestellt?
- [ ] Im Store anmelden: Transaktionshistorie intakt?
- [ ] listmonk prĂŒfen: Kampagnenlisten geladen?
### Phase 5: Verifizierung (30 Min.)
- [ ] curl -I https://tobias-weiss.org â gibt 200 zurĂŒck
- [ ] Test-Stripe-Checkout bis zum Redirect durchfĂŒhren
- [ ] Logs ĂŒberwachen: keine ERROR-EintrĂ€ge in den ersten 15 Minuten
- [ ] DR-Log aktualisieren: Datum, tatsÀchliche Uhrzeit, aufgetretene Probleme
Schedule a 2-hour slot every quarter. The drill:
Each quarter you don't test, you're accumulating risk. This is not theoretical â a silent Postgres upgrade or an expired S3 credential will only reveal itself during a drill or an actual disaster.
A backup you never test is a disaster waiting to happen. Schedule a quarterly DR drill:
# Schneller IntegritÀtscheck zwischen Backups
restic check --repo s3:... --password-file /etc/restic/pw
pgbackrest --stanza=main check
Don't rely on "it ran silently." For a deeper look at how production monitoring works across the full stack, see Production Observability Stack and Grafana Dashboards. Monitor your backups:
ERROR in backup logs.mail -s "Backup failed" in the error path. Better than nothing.# Dem Backup-Skript voranstellen
trap 'curl -fsS -m 10 --retry 5 \
https://hc-ping.com/YOUR-UUID/fail' ERR
curl -fsS -m 10 --retry 5 \
https://hc-ping.com/YOUR-UUID/start
| Prinzip | Implementierung |
|---|---|
| Alles automatisieren | systemd timers + restic/pgBackRest |
| Vor dem Senden verschlĂŒsseln | Restic client-side encryption |
| 3-2-1 Regel | Lokal + off-site + periodisch offline |
| Restore testen | Quartalsweise DR-Ăbung |
| Erfolg ĂŒberwachen | Healthchecks.io / Prometheus |
| Playbook dokumentieren | Runbook im Git-Repo |
Self-hosting bedeutet, Verantwortung zu ĂŒbernehmen. Ein ordentlicher DR-Plan verwandelt ein âalles stehen und liegen lassen und in Panik geratenâ-Ereignis in ein âdem Runbook folgenâ-Verfahren. Das ist der Unterschied zwischen Operatoren und Opfern.