#!/bin/bash # Variablen data_dir="/home/{{ system_user_name }}/docker" nfs_share="{{ nfs_share }}" backup_target_usage_threshold="{{nfs_threshold}}" # Prozentuale Schwellenwert für die Speicherauslastung mount_point="{{ mount_point }}" backup_repository="$mount_point/{{borg_repo}}" borg_password="{{borg_pass}}" email_recipient="{{admin_mail}}" sender_address="{{sender_address}}" # Mounten des Backup-Ziels mount_successful=0 mount_output=$(mount -t nfs "$nfs_share" "$mount_point" 2>&1) mount_status=$? if [ "$mount_status" -eq 0 ]; then mount_successful=1 else echo "Mount fehlgeschlagen: $mount_output" >&2 fi if [ "$mount_successful" -eq 1 ]; then # Repository erstellen, falls nicht vorhanden mkdir -p "$backup_repository" # Alle laufenden Container stoppen running_containers=$(docker ps --format '{{ "{{.Names}}" }}') for container in $running_containers; do docker stop "$container" done # Prüfen, ob das Repository existiert, und ggf. erstellen export BORG_PASSPHRASE="$borg_password" if ! borg list "$backup_repository" >/dev/null 2>&1; then borg init --encryption=repokey "$backup_repository" fi # Backup mit BorgBackup erstellen backup_result=$(borg create --stats --compression lz4 "$backup_repository"::'{hostname}-{now:%Y-%m-%d_%H:%M:%S}' $data_dir 2>&1) backup_status=$? # Alle gestoppten Container starten for container in $running_containers; do docker start "$container" done # Backup-Integrität überprüfen borg_check_result=$(borg check --repository-only --max-duration 43200 "$backup_repository" 2>&1) # Backup-Status und Speicherauslastung prüfen if [ "$backup_status" -eq 0 ]; then backup_result="Backup erfolgreich:\n$backup_result\n\nIntegrität des Backups überprüft:\n$borg_check_result" else backup_result="Backup fehlgeschlagen (Status: $backup_status):\n$backup_result\n\nIntegrität des Backups konnte nicht überprüft werden." fi # Retention Policy anwenden borg_prune_result=$(borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 "$backup_repository" 2>&1) # Unmounten des Backup-Ziels umount_output=$(umount "$mount_point" 2>&1) umount_status=$? if [ "$umount_status" -ne 0 ]; then echo "Unmount fehlgeschlagen: $umount_output" >&2 fi # E-Mail senden target_usage=$(df -h "$mount_point" | tail -1 | awk '{ print $5 }') target_usage_number=${target_usage%%%} if [ "$target_usage_number" -gt "$backup_target_usage_threshold" ]; then target_usage_warning="\n\nWARNUNG: Die Speicherauslastung des Backup-Ziels beträgt $target_usage und überschreitet den festgelegten Schwellenwert von $backup_target_usage_threshold%." else target_usage_warning="" fi hostname=$(hostname) mail_subject="Backup-Bericht: $hostname - $(date +'%Y-%m-%d %H:%M:%S')" mail_body="$backup_result\n" echo -e "$mail_body$target_usage_warning" | mail -s "$mail_subject" -r "$sender_adress" "$email_recipient" fi