Backup-Script für Home-Verzeichnis, Paketliste und Emails. Erstellt rotierende Backups (max. 10 Stück) mit zstd-Kompression (MultiCPU – deutlich schneller als tar).

Erstellen einer neuer Datei mit Nano.

Fish
nano ~/.local/bin/backup-home.fish

Kopiere den folgenden Code in die neue Datei.

Fish
#!/usr/bin/env fish

# Backup-Script für Home-Verzeichnis, Paketliste und Emails
# Erstellt rotierende Backups (max. 10 Stück) mit zstd-Kompression

set BACKUP_DIR "/mnt/d4a1646f-a41f-4d91-b95e-53b6beab7027/07_Data/cf"
set TIMESTAMP (date +%Y%m%d_%H%M%S)
set BACKUP_NAME "home_backup_$TIMESTAMP"

# Backup-Verzeichnis erstellen
mkdir -p $BACKUP_DIR

# Paketliste sichern
pacman -Qqe > "$BACKUP_DIR/package_list_$TIMESTAMP.txt"

# Home-Verzeichnis sichern mit zstd (multicore)
tar --zstd \
    --exclude=".cache" \
    --exclude=".local/share/Trash" \
    --exclude=".local/share/baloo" \
    --exclude="Downloads" \
    --exclude=".steam" \
    --exclude=".local/share/Steam" \
    --exclude=".local/share/lutris" \
    --exclude=".wine" \
    --exclude=".local/share/bottles" \
    --exclude="node_modules" \
    --exclude=".npm" \
    --exclude=".cargo/registry" \
    --exclude=".rustup" \
    --exclude=".cache/yay" \
    --exclude=".cache/pacman" \
    --exclude=".cache/paru" \
    --exclude=".local/backups" \
    -cf "$BACKUP_DIR/$BACKUP_NAME.tar.zst" -C $HOME .

# Emails synchronisieren (Thunderbird und andere gängige Clients)
if test -d "$HOME/.thunderbird"
    mkdir -p "$BACKUP_DIR/emails/thunderbird"
    rsync -av --delete "$HOME/.thunderbird/" "$BACKUP_DIR/emails/thunderbird/"
end

if test -d "$HOME/.local/share/evolution"
    mkdir -p "$BACKUP_DIR/emails/evolution"
    rsync -av --delete "$HOME/.local/share/evolution/" "$BACKUP_DIR/emails/evolution/"
end

if test -d "$HOME/.config/geary"
    mkdir -p "$BACKUP_DIR/emails/geary"
    rsync -av --delete "$HOME/.config/geary/" "$BACKUP_DIR/emails/geary/"
end

# Alte Backups löschen (nur die letzten 10 behalten)
cd $BACKUP_DIR
ls -t home_backup_*.tar.zst 2>/dev/null | tail -n +11 | xargs -r rm
ls -t package_list_*.txt 2>/dev/null | tail -n +11 | xargs -r rm

# Alte Email-Backups löschen (nur die letzten 10 behalten)
if test -d "$BACKUP_DIR/emails"
    ls -td "$BACKUP_DIR/emails"/*/ 2>/dev/null | tail -n +11 | xargs -r rm -rf
end

# Log-Eintrag
echo (date): Backup erstellt: $BACKUP_NAME.tar.zst >> "$BACKUP_DIR/backup.log"
echo (date): Emails synchronisiert >> "$BACKUP_DIR/backup.log"

Mit „Strg+O“ (und Return) kannst du die Änderungen speichern. „Strg+X“ verlässt du Nano wieder.

Schritt-für-Schritt-Anleitung zur Einrichtung der Automatisierung

1. Skript ausführbar machen

Stelle sicher, dass dein Skript die nötigen Rechte hat, um ausgeführt zu werden.

Fish
chmod +x /home/cf/.local/bin/backup-home.fish 

Es ist auch eine gute Praxis, am Anfang deines Fish-Skripts einen Shebang zu setzen, falls noch nicht vorhanden: #!/usr/bin/fish.

2. Service-Datei erstellen

Erstelle die Datei am richtigen Ort. Der Ordner muss eventuell erst angelegt werden. Öffne die Datei mit einem Editor und füge den oben korrigierten Inhalt ein:

Fish
# Ordner anlegen falls nicht vorhanden.
mkdir -p ~/.config/systemd/user/
# Datei in Nano erstellen
nano ~/.config/systemd/user/backup-home.service 

Öffne die Datei mit einem Editor und füge den folgenden Inhalt ein:

Fish
[Unit]
Description=Backup home directory on login
After=graphical-session.target

[Service]
Type=oneshot
ExecStart=/home/cf/.local/bin/backup-home.fish
RemainAfterExit=yes

[Install]
WantedBy=default.target

3. User-Service aktivieren

Jetzt kommt der wichtigste Befehl. Wir benutzen systemctl mit dem --user Flag. Das sagt systemd, dass es im Kontext deines Benutzers und nicht des Systems arbeiten soll.

Fish
systemctl --user enable --now backup-home.service
  • --user: Arbeitet mit den User-Units in ~/.config/systemd/user/.
  • enable: Sorgt dafür, dass der Service bei jedem zukünftigen Login automatisch gestartet wird.
  • --now: Startet den Service sofort zum ersten Mal. Das ist super zum Testen!

4. Überprüfen (optional, aber empfohlen)

Du kannst jederzeit den Status deines Services prüfen:

Fish
systemctl --user status backup-home.service  

Manuell ausführen:

Fish
 ~/.local/bin/backup-home.fish

Deaktivieren

Fish
 systemctl --user disable backup-home.service

Wenn alles geklappt hat, sollte dort „active (exited)“ stehen und die letzten Log-Einträge deines Skripts angezeigt werden.

Das war’s! Ab jetzt wird bei jedem Login dein Backup-Skript zuverlässig im Hintergrund ausgeführt.