#!/bin/bash # ============================================================================== # KONFIGURATION # ============================================================================== BASE_MAIL_PATH="/home/aknuth/git/email-amazon/DMS/docker-data/dms/mail-data" RCLONE_CONFIG="/home/aknuth/.config/rclone/rclone.conf" LOGFILE="/var/log/mail_backup.log" # ============================================================================== # HILFSFUNKTION: LOGGING (Bildschirm + Datei) # ============================================================================== log() { # Schreibt Zeitstempel + Text auf stdout (Bildschirm) UND in das Logfile echo "$(date '+%Y-%m-%d %H:%M:%S') | $1" | tee -a "$LOGFILE" } # ============================================================================== # PARAMETER & VALIDIERUNG # ============================================================================== DOMAIN=$1 REMOTE_NAME=$2 BUCKET_NAME=$3 if [[ -z "$DOMAIN" || -z "$REMOTE_NAME" || -z "$BUCKET_NAME" ]]; then echo "FEHLER: Fehlende Parameter." echo "Benutzung: sudo $0 " echo "Beispiel: sudo $0 buddelectric.net buddelectric buddelectric-mails" exit 1 fi SOURCE_PATH="${BASE_MAIL_PATH}/${DOMAIN}" if [ ! -d "$SOURCE_PATH" ]; then log "FEHLER: Quell-Ordner existiert nicht: $SOURCE_PATH" exit 1 fi if [[ $EUID -ne 0 ]]; then echo "FEHLER: Dieses Skript muss als root ausgeführt werden (sudo)." exit 1 fi # ============================================================================== # LOCKING # ============================================================================== LOCKFILE_PATH="/var/run/rclone_mail_${DOMAIN}.lock" if [ -e ${LOCKFILE_PATH} ] && kill -0 `cat ${LOCKFILE_PATH}` 2>/dev/null; then log "ABBRUCH: Backup für $DOMAIN läuft bereits." exit 1 fi trap "rm -f ${LOCKFILE_PATH}; exit" INT TERM EXIT echo $$ > ${LOCKFILE_PATH} # ============================================================================== # BACKUP START # ============================================================================== log "----------------------------------------------------------------" log "START Backup" log "Domain: $DOMAIN" log "Quelle: $SOURCE_PATH" log "Ziel: $REMOTE_NAME:$BUCKET_NAME" # Rclone ausführen # --progress zeigt den Balken im Terminal (landet nicht im Logfile, das ist gut so) # --log-file schreibt technische Details NUR ins Logfile (nicht auf den Schirm, um ihn nicht zu fluten) /usr/bin/rclone sync "$SOURCE_PATH" "$REMOTE_NAME:$BUCKET_NAME" \ --config "$RCLONE_CONFIG" \ --exclude "**/tmp/**" \ --exclude "*.lock" \ --exclude "dovecot-uidlist.lock" \ --exclude ".dovecot.lda-dupes" \ --transfers 32 \ --checkers 32 \ --fast-list \ --min-age 15m \ --log-file $LOGFILE \ --log-level INFO \ --progress EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then log "STATUS: ERFOLG - $DOMAIN erfolgreich gesichert." else log "STATUS: FEHLER - Exit Code $EXIT_CODE. Details siehe $LOGFILE" fi log "----------------------------------------------------------------" exit $EXIT_CODE