Server Snap

Server-Snapshots und Backups.

Snapshot-Strategie

System-Snapshots

#!/bin/bash
# System-Snapshot Script

DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_DIR="/snapshots/system"
CONFIG_DIR="/etc"
HOME_DIR="/home"

# Snapshot-Verzeichnis erstellen
mkdir -p $SNAPSHOT_DIR

# System-Konfiguration sichern
tar -czf $SNAPSHOT_DIR/etc_$DATE.tar.gz $CONFIG_DIR

# Home-Verzeichnisse sichern
tar -czf $SNAPSHOT_DIR/home_$DATE.tar.gz $HOME_DIR

# Datenbank-Snapshots
mysqldump --all-databases --single-transaction | gzip > $SNAPSHOT_DIR/mysql_$DATE.sql.gz

# Alte Snapshots aufräumen (30 Tage)
find $SNAPSHOT_DIR -name "*.tar.gz" -mtime +30 -delete
find $SNAPSHOT_DIR -name "*.sql.gz" -mtime +30 -delete

echo "Snapshot erstellt: $DATE"

Incus-Snapshots

#!/bin/bash
# Incus Container Snapshots

CONTAINERS=$(incus list --format csv -c n)
DATE=$(date +%Y%m%d)

for container in $CONTAINERS; do
    echo "Snapshot für $container erstellen..."
    incus snapshot create $container backup-$DATE
done

# Alte Snapshots aufräumen (7 Tage)
for container in $CONTAINERS; do
    incus delete $container/backup-$(date -d '7 days ago' +%Y%m%d) --force
done

Backup-Automatisierung

Cron Jobs

# Tägliche Snapshots (02:00)
0 2 * * * /usr/local/bin/system-snapshot.sh

# Wöchentliche Full-Backups (Sonntag 03:00)
0 3 * * 0 /usr/local/bin/full-backup.sh

# Monatliche Archive (1. des Monats 04:00)
0 4 1 * * /usr/local/bin/monthly-archive.sh

Full-Backup Script

#!/bin/bash
# Full-System Backup

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/full"
EXCLUDE_FILE="/etc/backup-exclude.txt"

# Exclude-Datei erstellen
cat > $EXCLUDE_FILE << EOF
/proc
/sys
/dev
/run
/tmp
/var/tmp
/var/cache
/var/lock
/mnt
/media
/lost+found
EOF

# Full-Backup
rsync -av --exclude-from=$EXCLUDE_FILE / $BACKUP_DIR/full_$DATE/

# Backup-Info erstellen
echo "Full Backup erstellt: $(date)" > $BACKUP_DIR/full_$DATE/info.txt
echo "Größe: $(du -sh $BACKUP_DIR/full_$DATE | cut -f1)" >> $BACKUP_DIR/full_$DATE/info.txt

# Alte Backups aufräumen (90 Tage)
find $BACKUP_DIR -name "full_*" -type d -mtime +90 -exec rm -rf {} \;

Remote-Backups

Rsync zu Remote-Server

#!/bin/bash
# Remote Backup Script

LOCAL_DIR="/snapshots"
REMOTE_SERVER="backup.example.com"
REMOTE_DIR="/backups/server-$(hostname)"
SSH_KEY="/home/user/.ssh/backup_key"

# Remote-Verzeichnis erstellen
ssh -i $SSH_KEY $REMOTE_SERVER "mkdir -p $REMOTE_DIR"

# Sync zu Remote
rsync -avz -e "ssh -i $SSH_KEY" --delete $LOCAL_DIR/ $REMOTE_SERVER:$REMOTE_DIR/

echo "Remote Backup abgeschlossen: $(date)"

S3 Backup

#!/bin/bash
# S3 Backup Script

BUCKET_NAME="server-backups-$(hostname)"
LOCAL_DIR="/snapshots"
DATE=$(date +%Y%m%d)

# AWS CLI konfigurieren
aws configure set default.region eu-central-1

# Upload zu S3
for file in $LOCAL_DIR/*_$DATE*; do
    if [ -f "$file" ]; then
        aws s3 cp "$file" s3://$BUCKET_NAME/
        echo "Upload: $file"
    fi
done

# Alte Dateien in S3 löschen (30 Tage)
aws s3 ls s3://$BUCKET_NAME/ | while read -r line; do
    createDate=$(echo $line | awk '{print $1" "$2}')
    createDate=$(date -d"$createDate" +%s)
    olderThan=$(date -d"30 days ago" +%s)

    if [[ $createDate -lt $olderThan ]]; then
        fileName=$(echo $line | awk '{print $4}')
        aws s3 rm s3://$BUCKET_NAME/$fileName
    fi
done

Wiederherstellung

System-Wiederherstellung

#!/bin/bash
# System Restore Script

SNAPSHOT_DATE=$1
SNAPSHOT_DIR="/snapshots/system"

if [ -z "$SNAPSHOT_DATE" ]; then
    echo "Verwendung: $0 <YYYYMMDD>"
    exit 1
fi

# Konfiguration wiederherstellen
tar -xzf $SNAPSHOT_DIR/etc_$SNAPSHOT_DATE.tar.gz -C /

# Home-Verzeichnisse wiederherstellen
tar -xzf $SNAPSHOT_DIR/home_$SNAPSHOT_DATE.tar.gz -C /

# Datenbank wiederherstellen
gunzip < $SNAPSHOT_DIR/mysql_$SNAPSHOT_DATE.sql.gz | mysql

echo "Wiederherstellung abgeschlossen: $SNAPSHOT_DATE"

Container-Wiederherstellung

#!/bin/bash
# Container Restore Script

SNAPSHOT_DATE=$1
CONTAINER_NAME=$2

if [ -z "$SNAPSHOT_DATE" ] || [ -z "$CONTAINER_NAME" ]; then
    echo "Verwendung: $0 <YYYYMMDD> <container-name>"
    exit 1
fi

# Container aus Snapshot wiederherstellen
incus snapshot restore $CONTAINER_NAME backup-$SNAPSHOT_DATE

echo "Container $CONTAINER_NAME wiederhergestellt: $SNAPSHOT_DATE"

Überwachung

Backup-Status

#!/bin/bash
# Backup Status Check

BACKUP_DIR="/snapshots"
LOG_FILE="/var/log/backup-status.log"

# Letztes Backup prüfen
LAST_BACKUP=$(ls -t $BACKUP_DIR/*.tar.gz | head -1)
LAST_DATE=$(stat -c %Y "$LAST_BACKUP")
CURRENT_DATE=$(date +%s)
DIFF_DAYS=$(( (CURRENT_DATE - LAST_DATE) / 86400 ))

if [ $DIFF_DAYS -gt 2 ]; then
    echo "WARNUNG: Letztes Backup ist $DIFF_DAYS Tage alt" >> $LOG_FILE
    # Email-Benachrichtigung senden
    echo "Backup-Alarm: Letztes Backup ist $DIFF_DAYS Tage alt" | mail -s "Backup-Warnung" admin@example.com
fi

echo "Backup-Status geprüft: $(date)" >> $LOG_FILE

Zurück zur Monitoring-Übersicht