#!/usr/bin/env bash set -Eeuo pipefail ######################################## # Script- und Konfigurationspfade ######################################## SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DIR_NAME="$(basename "$SCRIPT_DIR")" CONFIG_FILE="${CONFIG_FILE:-${SCRIPT_DIR}/docker-backup-sftp-uploader.conf}" if [[ -f "$CONFIG_FILE" ]]; then # shellcheck source=/dev/null source "$CONFIG_FILE" else echo "FEHLER: Konfigurationsdatei nicht gefunden: $CONFIG_FILE" >&2 exit 1 fi ######################################## # Optionale Fallbacks ######################################## : "${SFTP_PORT:=22}" : "${MAIL_TO:=}" : "${MAIL_FROM:=}" : "${BACKUP_DIR:=$(dirname "$SCRIPT_DIR")/${DIR_NAME}_backups}" : "${LOG_DIR:=${BACKUP_DIR}/logs}" : "${KEEP_LOCAL_BACKUP:=false}" : "${MIN_FREE_MB:=1024}" ######################################## # Variablen ######################################## DATE="$(date +"%Y-%m-%d_%H-%M-%S")" BACKUP_FILE="${DIR_NAME}_${DATE}.tar.gz" mkdir -p "$BACKUP_DIR" "$LOG_DIR" BACKUP_DIR="$(cd "$BACKUP_DIR" && pwd)" LOG_DIR="$(cd "$LOG_DIR" && pwd)" BACKUP_PATH="${BACKUP_DIR}/${BACKUP_FILE}" LOGFILE="${LOG_DIR}/${DIR_NAME}_backup_${DATE}.log" DOCKER_STOPPED=false SUCCESS=false ######################################## # Logging ######################################## exec > >(tee -a "$LOGFILE") exec 2>&1 log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $*" } log "=========================================" log "Backup gestartet" log "Projekt: $DIR_NAME" log "Konfiguration: $CONFIG_FILE" log "Backup-Datei: $BACKUP_PATH" log "Log-Datei: $LOGFILE" log "=========================================" ######################################## # Hilfsfunktionen ######################################## require_command() { local command_name="$1" if ! command -v "$command_name" >/dev/null 2>&1; then log "FEHLER: Benötigtes Kommando fehlt: $command_name" return 1 fi } require_config_value() { local variable_name="$1" if [[ -z "${!variable_name:-}" ]]; then log "FEHLER: Pflichtwert fehlt in der Konfiguration: $variable_name" return 1 fi } send_mail() { local subject="$1" local body="$2" if [[ -z "$MAIL_TO" ]]; then log "Hinweis: MAIL_TO ist leer, Mailversand wird übersprungen." return 0 fi if ! command -v mail >/dev/null 2>&1; then log "WARNUNG: Kommando 'mail' wurde nicht gefunden, Mailversand nicht möglich." return 0 fi if [[ -n "$MAIL_FROM" ]]; then if printf '%s\n' "$body" | mail -r "$MAIL_FROM" -s "$subject" "$MAIL_TO"; then return 0 fi log "WARNUNG: Mailversand mit MAIL_FROM fehlgeschlagen, versuche ohne Absenderoption." fi if ! printf '%s\n' "$body" | mail -s "$subject" "$MAIL_TO"; then log "WARNUNG: Mailversand fehlgeschlagen." fi } send_error_mail() { local exit_code="$1" local body body="$(cat </dev/null || true) EOF )" send_mail "Backup FEHLGESCHLAGEN - ${DIR_NAME}" "$body" } send_success_mail() { local size local body size="$(du -h "$BACKUP_PATH" | awk '{print $1}')" body="$(cat <