#!/usr/bin/env bash set -Eeuo pipefail ######################################## # Konfiguration ######################################## SFTP_HOST="${SFTP_HOST:-sftp.example.com}" SFTP_PORT="${SFTP_PORT:-22}" SFTP_USER="${SFTP_USER:-user}" SFTP_PASS="${SFTP_PASS:-Tpassw0rd}" SFTP_REMOTE_DIR="${SFTP_REMOTE_DIR:-/uploads}" MAIL_TO="${MAIL_TO:-}" MAIL_FROM="${MAIL_FROM:-}" # Nicht /tmp verwenden: viele Systeme mounten /tmp klein oder als tmpfs. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DIR_NAME="$(basename "$SCRIPT_DIR")" BACKUP_DIR="${BACKUP_DIR:-$(dirname "$SCRIPT_DIR")/${DIR_NAME}_backups}" LOG_DIR="${LOG_DIR:-${BACKUP_DIR}/logs}" KEEP_LOCAL_BACKUP="${KEEP_LOCAL_BACKUP:-false}" MIN_FREE_MB="${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 "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 } 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 <