🧭 Crumbpage 21: Backup, RAID & Cron - In der Wolke

Subtitle: Daten sichern, Redundanz schaffen, Automatisierung meistern
Pfad: 21 von 23
Schwierigkeit: ⭐⭐⭐⭐ (4/5)
Zeit: ~3-4 Stunden
Voraussetzungen: Pfad 9: Storage, Pfad 11: First Access

"Die einzige Backup-Strategie, die nicht funktioniert, ist keine zu haben." đŸŒČ


📋 Was du in diesem Pfad lernst

✓ Backup-Strategien (3-2-1-Regel)
✓ RAID-Levels verstehen (0, 1, 5, 10)
✓ Cron-Jobs schreiben (automatisierte Backups)
✓ Rsync fĂŒr inkrementelle Backups
✓ Cloud-Backup vs. lokale Backups
✓ Restore-Prozesse testen

🎯 Lernziele

Nach diesem Pfad kannst du:

  • [ ] Die 3-2-1-Backup-Regel erklĂ€ren und anwenden
  • [ ] RAID-Arrays verstehen und konfigurieren
  • [ ] Cron-Jobs fĂŒr automatisierte Backups schreiben
  • [ ] Rsync-Backups anlegen und wiederherstellen
  • [ ] Backup-Strategien fĂŒr verschiedene Szenarien entwerfen

đŸŒ± Grundkonzepte

Konzept 1: Die 3-2-1-Regel

Was ist das?
Die goldene Regel fĂŒr Backups:
- 3 Kopien deiner Daten (Original + 2 Backups)
- 2 verschiedene Medien (z.B. Festplatte + Cloud)
- 1 Kopie off-site (außer Haus / anderer Standort)

Warum ist das wichtig?

Brand im Rechenzentrum? ─→ Off-site-Backup rettet dich
Festplatte kaputt? ───────→ Zweites Medium rettet dich
Ransomware? ──────────────→ Offline-Backup rettet dich

Beispiel-Strategie:

Original:   /home/data/ (auf Laptop)
Backup 1:   Externe Festplatte (USB)
Backup 2:   NAS im Keller (Netzwerk)
Backup 3:   Cloud (Hetzner Storage Box)

Konzept 2: RAID - Redundant Array of Independent Disks

Was ist das?
Mehrere Festplatten arbeiten zusammen fĂŒr:
- Redundanz (eine Platte stirbt → Daten bleiben)
- Performance (parallel lesen/schreiben)

Die wichtigsten RAID-Levels:

RAID Beschreibung Min. Disks Nutzbarer Space Zweck
0 Striping (keine Redundanz) 2 100% Performance, NO BACKUP!
1 Mirroring (volle Kopie) 2 50% Redundanz, einfach
5 Striping + Parity 3 66-80% Balance Performance/Redundanz
10 Mirror + Stripe 4 50% Beste Performance + Redundanz

⚠ WICHTIG: RAID IST KEIN BACKUP!

RAID schĂŒtzt vor: Hardware-Ausfall (eine Disk stirbt)
RAID schĂŒtzt NICHT vor: Ransomware, Löschen, Brand, Diebstahl

Du brauchst: RAID + Backup!

Konzept 3: Cron - Der Zeitplaner

Was ist das?
Cron ist der Unix-Daemon, der Befehle zu bestimmten Zeiten automatisch ausfĂŒhrt.

Syntax:

# ┌───────────── Minute (0 - 59)
# │ ┌───────────── Stunde (0 - 23)
# │ │ ┌───────────── Tag im Monat (1 - 31)
# │ │ │ ┌───────────── Monat (1 - 12)
# │ │ │ │ ┌───────────── Wochentag (0 - 7, 0 = Sonntag)
# │ │ │ │ │
# * * * * * /path/to/command

Beispiele:

# Jeden Tag um 2:00 Uhr
0 2 * * * /usr/local/bin/backup.sh

# Jede Stunde
0 * * * * /usr/local/bin/check-health.sh

# Jeden Montag um 3:00 Uhr
0 3 * * 1 /usr/local/bin/weekly-backup.sh

# Alle 15 Minuten
*/15 * * * * /usr/local/bin/sync.sh

🔧 Praktische Befehle

Befehl 1: rsync - Der Backup-König

# Grundlegende Syntax
rsync [optionen] quelle ziel

# Lokales Backup
rsync -av /home/user/data/ /mnt/backup/data/

# Remote Backup (SSH)
rsync -avz /home/user/data/ user@backup-server:/backups/data/

# Wichtige Flags:
# -a : Archive-Mode (behÀlt Rechte, Timestamps)
# -v : Verbose (zeigt, was passiert)
# -z : Kompression (spart Bandbreite)
# -h : Human-readable GrĂ¶ĂŸen
# --delete : Löscht Dateien im Ziel, die in Quelle nicht mehr existieren
# --dry-run : Simuliert ohne Änderungen

⚠ Slash-Magie:

# MIT Slash = Inhalt kopieren
rsync -av /source/ /dest/
# Ergebnis: /dest/ enthÀlt die Dateien aus /source/

# OHNE Slash = Ordner kopieren
rsync -av /source /dest/
# Ergebnis: /dest/source/ enthÀlt die Dateien

Inkrementelles Backup:

#!/bin/bash
# backup-incremental.sh

SOURCE="/home/user/data"
DEST="/mnt/backup"
DATE=$(date +%Y-%m-%d_%H-%M)
LATEST="$DEST/latest"
BACKUP="$DEST/backup-$DATE"

# Erstes Backup oder inkrementell?
if [ -d "$LATEST" ]; then
    # Inkrementell mit Hard-Links
    rsync -av --delete --link-dest="$LATEST" "$SOURCE/" "$BACKUP/"
else
    # Erstes Backup
    rsync -av "$SOURCE/" "$BACKUP/"
fi

# Symlink auf neuestes Backup
rm -f "$LATEST"
ln -s "$BACKUP" "$LATEST"

echo "Backup completed: $BACKUP"

Befehl 2: crontab - ZeitplÀne verwalten

# Crontab bearbeiten
crontab -e

# Crontab anzeigen
crontab -l

# Crontab löschen (⚠ Vorsicht!)
crontab -r

# Crontab eines anderen Users (als root)
crontab -u username -e

Beispiel-Crontab:

# TĂ€gliches Backup um 2 Uhr nachts
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Wöchentliches Cleanup am Sonntag
0 4 * * 0 /usr/local/bin/cleanup-old-backups.sh

# StĂŒndlicher Health-Check
0 * * * * /usr/local/bin/check-disk-space.sh

Tipp: Immer Logs schreiben!

0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
#                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#                                    Stdout und Stderr ins Log

Befehl 3: tar - Archivieren

# Backup erstellen (komprimiert)
tar -czf backup-$(date +%Y-%m-%d).tar.gz /home/user/data/

# Backup entpacken
tar -xzf backup-2025-12-13.tar.gz

# Inhalt anschauen (ohne entpacken)
tar -tzf backup-2025-12-13.tar.gz

# Flags:
# -c : Create (erstellen)
# -x : Extract (entpacken)
# -t : List (auflisten)
# -z : Gzip-Kompression
# -f : Dateiname folgt
# -v : Verbose

VerschlĂŒsseltes Backup:

# Mit GPG verschlĂŒsseln
tar -czf - /home/user/data/ | gpg -e -r your@email.com > backup.tar.gz.gpg

# EntschlĂŒsseln und entpacken
gpg -d backup.tar.gz.gpg | tar -xzf -

💡 Best Practices

DO ✅

# 1. Backups testen (Restore simulieren)
rsync -av --dry-run /mnt/backup/latest/ /tmp/restore-test/

# 2. Backup-Logs behalten
echo "$(date): Backup started" >> /var/log/backup.log

# 3. Monitoring einbauen
if [ $? -eq 0 ]; then
    echo "SUCCESS"
else
    echo "FAILED" | mail -s "Backup failed!" admin@example.com
fi

# 4. Alte Backups automatisch löschen
find /mnt/backup/ -type f -name "backup-*.tar.gz" -mtime +30 -delete
#                                                   ^^^^^^^^^^^^^^^^
#                                                   Älter als 30 Tage

DON'T ❌

# 1. Nie Backups nur auf einem Medium
❌ Nur externe Festplatte

# 2. Nie Backups ungetestet lassen
❌ "Ich hab ein Backup" (aber nie wiederhergestellt)

# 3. Nie ohne Monitoring
❌ Cron lĂ€uft, aber niemand sieht Fehler

# 4. Nie Passwörter in Crontabs
❌ rsync user:password@server:/backup  # Klartext!
✅ Nutze SSH-Keys stattdessen

đŸ”„ Hands-On: Automatisiertes Backup-System

Setup 1: Lokales Rsync-Backup

# 1. Backup-Script erstellen
sudo mkdir -p /usr/local/bin
sudo nano /usr/local/bin/daily-backup.sh
#!/bin/bash
# /usr/local/bin/daily-backup.sh

SOURCE="/home/$(whoami)/wichtig"
DEST="/mnt/backup"
DATE=$(date +%Y-%m-%d_%H-%M)
LOG="/var/log/backup.log"

echo "$(date): Backup started" >> "$LOG"

# Backup mit rsync
rsync -av --delete "$SOURCE/" "$DEST/latest/" >> "$LOG" 2>&1

if [ $? -eq 0 ]; then
    echo "$(date): Backup successful" >> "$LOG"
    # Snapshot erstellen
    cp -al "$DEST/latest" "$DEST/backup-$DATE"
else
    echo "$(date): Backup FAILED!" >> "$LOG"
    exit 1
fi
# 2. AusfĂŒhrbar machen
sudo chmod +x /usr/local/bin/daily-backup.sh

# 3. Testen
sudo /usr/local/bin/daily-backup.sh

# 4. Cron einrichten
crontab -e
# FĂŒge hinzu:
0 2 * * * /usr/local/bin/daily-backup.sh

Setup 2: Remote-Backup via SSH

# 1. SSH-Key fĂŒr passwordless login
ssh-keygen -t ed25519 -f ~/.ssh/backup_key
ssh-copy-id -i ~/.ssh/backup_key user@backup-server

# 2. Backup-Script
#!/bin/bash
SOURCE="/home/data"
DEST="user@backup-server:/backups/$(hostname)"

rsync -avz --delete \
    -e "ssh -i ~/.ssh/backup_key" \
    "$SOURCE/" "$DEST/"

Setup 3: Cloud-Backup (Hetzner Storage Box)

# Hetzner Storage Box mounten
sudo apt install sshfs

# Mount-Point erstellen
sudo mkdir -p /mnt/storagebox

# Mounten
sshfs -o IdentityFile=~/.ssh/backup_key \
      u123456@u123456.your-storagebox.de:/ \
      /mnt/storagebox

# Backup
rsync -av --delete /home/data/ /mnt/storagebox/backups/

🧠 Backup-Strategien fĂŒr verschiedene Szenarien

Strategie 1: Entwickler-Workstation

TĂ€gliches Backup:
- Code → GitHub/GitLab (automatisch via git push)
- Dotfiles → Private Git Repo
- Dokumente → Rsync auf NAS (Cron, 2 Uhr)

Wöchentliches Backup:
- Komplettes Home → Externe Festplatte (am Wochenende)

Monatliches Backup:
- System-Snapshot → Cloud Storage (Hetzner)

Strategie 2: Web-Server (Production)

StĂŒndlich:
- Datenbank-Dump → /var/backups/db/

TĂ€glich:
- Datenbank → Remote Server (rsync)
- Web-Files → Remote Server (rsync)
- Logs → Archivieren + komprimieren

Wöchentlich:
- Komplettes System-Image → Cloud
- Test-Restore durchfĂŒhren

Strategie 3: NAS (Familien-Daten)

Kontinuierlich:
- RAID 1 (zwei Disks gespiegelt)

TĂ€glich:
- Snapshots behalten (7 Tage)

Wöchentlich:
- Externe USB-Festplatte (off-site mitnehmen)

Monatlich:
- Cloud-Backup (wichtige Daten)

🐛 Troubleshooting

Problem: Cron-Job lÀuft nicht

# 1. Ist Cron aktiv?
sudo systemctl status cron

# 2. Logs checken
grep CRON /var/log/syslog

# 3. Script manuell testen
/usr/local/bin/backup.sh

# 4. Pfade in Cron absolut?
# ❌ backup.sh
# ✅ /usr/local/bin/backup.sh

Problem: Rsync bricht ab

# Zu wenig Speicherplatz?
df -h

# Netzwerk-Probleme?
ping backup-server

# SSH-Key funktioniert?
ssh -i ~/.ssh/backup_key user@backup-server

# Verbose-Mode fĂŒr Debugging
rsync -avvv /source/ /dest/

Problem: Backup ist zu langsam

# Kompression nutzen (Remote)
rsync -avz /source/ user@server:/dest/

# Nur geÀnderte Dateien
rsync -av --checksum /source/ /dest/

# Bandbreite limitieren
rsync -av --bwlimit=1000 /source/ /dest/
#          ^^^^^^^^^^^^^ 1000 KB/s

📚 WeiterfĂŒhrende Konzepte

Snapshot-Backups mit Btrfs

# Btrfs-Snapshot erstellen (instant, kein Copy)
sudo btrfs subvolume snapshot /home /home-snapshot-$(date +%Y-%m-%d)

# Snapshots auflisten
sudo btrfs subvolume list /

# Snapshot löschen
sudo btrfs subvolume delete /home-snapshot-2025-12-01

Backup-VerschlĂŒsselung

# Mit restic (modernes Backup-Tool)
restic init --repo /mnt/backup
restic backup /home/data --repo /mnt/backup

# VerschlĂŒsselt automatisch, dedupliziert, inkrementell

Monitoring

# Einfaches Monitoring-Script
#!/bin/bash
BACKUP_DIR="/mnt/backup/latest"
MAX_AGE=86400  # 24 Stunden in Sekunden

if [ ! -d "$BACKUP_DIR" ]; then
    echo "CRITICAL: Backup dir not found"
    exit 2
fi

AGE=$(( $(date +%s) - $(stat -c %Y "$BACKUP_DIR") ))

if [ $AGE -gt $MAX_AGE ]; then
    echo "WARNING: Backup older than 24h"
    exit 1
else
    echo "OK: Backup is fresh"
    exit 0
fi

✅ Skill-Check

Bevor du zu Pfad 22 gehst:

  • [ ] Ich kann die 3-2-1-Regel erklĂ€ren
  • [ ] Ich verstehe den Unterschied zwischen RAID 0, 1, 5
  • [ ] Ich weiß: RAID ≠ Backup
  • [ ] Ich kann einen Cron-Job schreiben
  • [ ] Ich kann ein Rsync-Backup anlegen
  • [ ] Ich habe ein Backup GETESTET (Restore)
  • [ ] Ich habe Logs fĂŒr meine Backups
  • [ ] Ich weiß, was "off-site" bedeutet

Bonus-Aufgabe:
Schreibe ein Backup-Script fĂŒr deine wichtigsten Daten und richte einen Cron-Job ein. Teste das Restore!


đŸ—ș Navigation

Vorheriger Pfad: Pfad 20: Tanz am Kernel
NĂ€chster Pfad: Pfad 22: Hallo Nullfeld
ZurĂŒck zur Übersicht: Admin-Vektor


Lizenz: CC BY-SA 4.0 (Dokumentation) + CKL v0.1 (bei Nutzung mit Kindern)
Teil von: Crumbforest | OZM⟡NEXUS Ecosystem


🩉 "Ein Backup, das nicht getestet wurde, ist kein Backup - es ist Hoffnung."