1. Übersicht
Dieses Dokument beschreibt die Einrichtung eines automatisierten Backups auf einem Linux-Server, wobei die Backupdateien lokal erstellt und anschließend auf ein gemountetes NAS-Verzeichnis übertragen werden. Fehler und Statusmeldungen werden automatisch über einen Discord Webhook übermittelt.
2. Voraussetzungen
– Ein gemountetes NAS-Verzeichnis unter /mnt/nas-backup
– Schreibrechte auf dem NAS-Verzeichnis
– Installiertes curl für Discord-Webhook
– Regelmäßiger Aufruf über Cron oder systemd-timer (optional)
3. Backup-Skript
Das folgende Skript erstellt ein vollständiges Backup wichtiger Systemverzeichnisse und überträgt es auf das NAS.
backup.sh
#!/bin/bash
DATE=$(date +’%Y-%m-%d‘)
DEST_DIR=“/tmp/backups“
ARCHIVE_NAME=“important-backup-$DATE.tar.gz“
TEMP_DIR=“$DEST_DIR/backup-$DATE“
LOG_FILE=“/tmp/backup_$DATE.log“
MAX_BACKUPS=7
NAS_MOUNT=“/mnt/nas-backup“
WEBHOOK_URL=“https://discord.com/api/webhooks/…“
exec > >(tee -a „$LOG_FILE“) 2>&1
send_discord_message() {
local MESSAGE=“$1″
curl -s -H „Content-Type: application/json“ -X POST -d „{„content“: „$MESSAGE“}“ „$WEBHOOK_URL“ > /dev/null
}
send_discord_message „Backup gestartet am $DATE“
if ! mountpoint -q „$NAS_MOUNT“; then
send_discord_message „NAS nicht gemountet unter $NAS_MOUNT. Backup abgebrochen.“
exit 1
fi
mkdir -p „$TEMP_DIR“
cp -a /etc „$TEMP_DIR“
cp -a /home „$TEMP_DIR“
cp -a /opt „$TEMP_DIR“ 2>/dev/null
cp -a /var/www „$TEMP_DIR“ 2>/dev/null
cp -a /usr/local/bin „$TEMP_DIR“
cp -a /var/lib „$TEMP_DIR“ 2>/dev/null
cp -a /srv „$TEMP_DIR“ 2>/dev/null
cp -a /etc/systemd/system „$TEMP_DIR/systemd-system“
cp -a /lib/systemd/system „$TEMP_DIR/systemd-lib“
if command -v dpkg >/dev/null; then
dpkg –get-selections > „$TEMP_DIR/package-list.dpkg“
elif command -v rpm >/dev/null; then
rpm -qa > „$TEMP_DIR/package-list.rpm“
fi
mkdir -p „$DEST_DIR“
tar -czpf „$DEST_DIR/$ARCHIVE_NAME“ -C „$DEST_DIR“ „backup-$DATE“
cp „$DEST_DIR/$ARCHIVE_NAME“ „$NAS_MOUNT/“
UPLOAD_STATUS=$?
if [ $UPLOAD_STATUS -eq 0 ]; then
send_discord_message „Backup erfolgreich abgeschlossen: $ARCHIVE_NAME“
else
ERROR_LOG=$(tail -n 20 „$LOG_FILE“ | sed ’s/“/\“/g‘)
send_discord_message „Backup FEHLGESCHLAGEN: $ARCHIVE_NAME
$ERROR_LOG“
exit 1
fi
cd „$NAS_MOUNT“ || exit 1
BACKUPS=($(ls -1 important-backup-*.tar.gz 2>/dev/null | sort))
NUM_BACKUPS=${#BACKUPS[@]}
if [ „$NUM_BACKUPS“ -gt „$MAX_BACKUPS“ ]; then
NUM_TO_DELETE=$((NUM_BACKUPS – MAX_BACKUPS))
for ((i=0; i<$NUM_TO_DELETE; i++)); do
rm -f „$NAS_MOUNT/${BACKUPS[$i]}“
done
fi
rm -rf „$TEMP_DIR“
rm -f „$DEST_DIR/$ARCHIVE_NAME“
rm -f „$LOG_FILE“
ich muss hier rauus