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