#!/bin/bash # # Borg-Backup taeglich, hier aber auf lokal im Netz vorhandene Ressource # # # 2025-05-14, misc # 2025-05-30, misc, aus borgbackup.sh herausgelöst, um Borg-Backup lokal zu nutzen # !!!!!!!!!!!!!!!!!!!!--------------------!!!!!!!!!!!!!!!!!!!!! # !!! Unbedingt anpassen in .env-synology (wird beim ersten Start erzeugt)!!! # Anschliessend die include-Datei auf nicht vorhandene Verzeichnisse untersuchen # !!! und anpassen. Die exclude-Datei ist in der Regel ok. # !!!!!!!!!!!!!!!!!!!!--------------------!!!!!!!!!!!!!!!!!!!!! # Wenn nicht vorhanden werden include und exclude geschrieben. Ab da nur noch dort aendern. # --------------------------------------------------------------------- # Ab hier normalerweise nichts anpassen HOST="$(hostname)" export BORG_REPO="ssh://ds220/volume1/NetBackup/borg/$HOST" LOGTIME=`date +%m-%d` BORG="/usr/bin/borg --remote-path=/usr/local/bin/borg " BORG_PATH=/root/sc BORG_INCLUDEFILE="$BORG_PATH/include-synology.lst" BORG_EXCLUDEFILE="$BORG_PATH/exclude-synology.lst" BORG_MOUNTPOINT=$BORG_PATH/mountpoint BORG_COMPRESSION=lz4 BORG_ENCRYPTION=repokey LOG="$BORG_PATH/workdir/borgsynology-$LOGTIME.log" ENVFILE=".env-synology" include_list() { cat <&2 ; exit 1; } ## neues Backup erzeugen borg_create() { echo "###### Starting $0 $* on $(date) ######" $BORG create -v \ --warning \ --filter AME \ --list \ --stats \ --show-rc \ --compression $BORG_COMPRESSION \ --exclude-caches \ --exclude-if-present ".nobackup" \ --keep-exclude-tags \ --exclude-from $BORG_EXCLUDEFILE \ $BORG_REPO::'{now:%Y-%m-%d_%H:%M}' \ $(cat ${BORG_INCLUDEFILE}) if [ $? -eq 0 ]; then echo Calling Success_URL curl -o /dev/null -s $SUCCESS_URL else echo Calling Error_URL curl -o /dev/null -s $ERROR_URL fi echo "###### Finished backup on $(date) ######" } # Hilfe zur Nutzung des Skripts usage() { cat </dev/null | grep -oE '[0-9]+\.[0-9]+') MAJOR=$(echo $BORG_VERSION | cut -d. -f1) MINOR=$(echo $BORG_VERSION | cut -d. -f2) if [ "$MAJOR" -gt 1 ] || ([ "$MAJOR" -eq 1 ] && [ "$MINOR" -ge 2 ]); then echo "Borg $BORG_VERSION: führe compact aus" $BORG compact "$BORG_REPO" else echo "Borg $BORG_VERSION: compact nicht unterstützt, da älter als 1.2" fi } # auflisten von Borg-Sicherungen borg_list() { # Auflisten der Sicherungen echo "Vorhandene Sicherungen im Repository:" $BORG list "$BORG_REPO" if [ $? -ne 0 ]; then echo "Fehler beim Auflisten der Sicherungen." return 1 fi } ## mount repo restore to defined directory ##This command mounts an archive as a FUSE filesystem. borg_mount() { if mountpoint -q "$BORG_MOUNTPOINT"; then echo "Already mounted or already a mountpoint!" else mkdir -p ${BORG_MOUNTPOINT} chmod a-w ${BORG_MOUNTPOINT} if $BORG mount ${BORG_REPO} ${BORG_MOUNTPOINT}; then echo "Mounting Repository to ${BORG_MOUNTPOINT}" echo "Switch to ${BORG_MOUNTPOINT} to browse backup archives!" echo echo "--- Showing list of available backups ---" echo ls -al ${BORG_MOUNTPOINT} echo echo echo "-------------------------------------------" echo "MAKE SURE TO UNMOUNT REPO WHEN FINISHED WITH" echo "$ $BORG_SCRIPT umount" echo "-------------------------------------------" return 0 else echo "ERROR mounting Repository to ${BORG_MOUNTPOINT}" return 1 fi fi } #eingebundene Borg-Sicherungen wieder lösen borg_umount() { if mountpoint -q "$BORG_MOUNTPOINT"; then if $BORG umount ${BORG_MOUNTPOINT}; then echo "Restore folder unmounted" else echo "No restore folder mounted!" fi else echo "Nothing is mounted in $BORG_MOUNTPOINT..." fi } # ------------------- MAIN ## Write output to logfile exec > >(tee -i ${LOG}) exec 2>&1 # Include/Exclude [ -f $BORG_INCLUDEFILE ] || include_list >$BORG_INCLUDEFILE [ -f $BORG_EXCLUDEFILE ] || exclude_list >$BORG_EXCLUDEFILE # beim ersten Aufruf .env anlegen [ -f $BORG_PATH/$ENVFILE ] || borg_env >$BORG_PATH/$ENVFILE # Variablen aus .env einlesen source "$BORG_PATH/$ENVFILE" case "$1" in check | init) # überprüfen, ob borg-Repository bereits initialisiert wurde # und führen borg init aus, falls nötig borg_check ;; run | create) borg_umount #eventuell eingebundene Backups entfernen borg_check || die "$BORG_REPO kann nicht angelegt werden" borg_create borg_prune #send_log ;; info) #zeige ausführliche Informationen zum Repo borg_info ;; list) #zeige vorhanden Sicherungen borg_list ;; prune) #bereinige das Backup-Repo borg_prune ;; mount) #stelle Backups als Verzeichnisbaum zur Verfügung borg_mount ;; umount) #entferne das Backup-Repo aus dem Dateisystem borg_umount ;; keyexport) #exportiert Repokey in lokale Datei borg_keyexport ;; *) #Hilfe anzeigen usage ;; esac