diff --git a/borgbackup.sh b/borgbackup.sh new file mode 100644 index 0000000..2be5724 --- /dev/null +++ b/borgbackup.sh @@ -0,0 +1,305 @@ +#!/bin/bash +# +# Borg-Backup taeglich, siehe Obsidian für Einrichtung +# Anregungen von Artur und +# https://www.4rr0wx.com/borgbackup-mit-hetzner-storage-box-verwenden/ +# +# 2025-05-14, misc + +# !!!!!!!!!!!!!!!!!!!!--------------------!!!!!!!!!!!!!!!!!!!!! +# !!! Unbedingt anpassen in .env (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 +export BORG_REPO="ssh://storagebox/./backup" +LOGTIME=`date +%m-%d` +BORG=/usr/bin/borg +BORG_PATH=/root/sc +BORG_INCLUDEFILE="$BORG_PATH/include.lst" +BORG_EXCLUDEFILE="$BORG_PATH/exclude.lst" +BORG_MOUNTPOINT=$BORG_PATH/mountpoint +BORG_COMPRESSION=lz4 +BORG_ENCRYPTION=repokey +LOG="$BORG_PATH/workdir/borgbackup-$LOGTIME.log" +HOST="$(hostname)" +FROM_EMAIL="$(hostname)@kueckshaus.de" +TO_EMAIL="michael@schaarwaechter.de" + +include_list() { + + cat <$BORG_PATH/encrypted-repokey && \ + return 0 || + return 1 +} + +# überprüfen, ob borg-Repository initialisiert wurde +# und ausführen, falls nötig +borg_check() { + + if $BORG check ${BORG_REPO}; then + echo "Das Repository ist bereits initialisiert." + return 0 + else + echo "Das Repository ist nicht initialisiert. Initialisiere jetzt..." + if $BORG init --encryption="$BORG_ENCRYPTION" "$BORG_REPO"; then + echo "Repository erfolgreich initialisiert." + #Repokey zusätzlich lokal speichern + [ "$BORG_ENCRYPTION" == "repokey" ] && borg_keyexport + return 0 + else + echo "Repository konnte nicht initialisiert werden." + return 1 + fi + fi +} + +# This command displays detailed information about the specified archive or repository. +borg_info() { + + echo "Informationen zum Repository:" + borg info "$BORG_REPO" + if [ $? -ne 0 ]; then + echo "Fehler beim Zugriff." + return 1 + fi +} + +# Borg-Sicherungen aufräumen +# Anzahl der Sicherungen wird in $BORG_PRUNING festgelegt +borg_prune() { + $BORG prune -v --list $BORG_PRUNING "$BORG_REPO" +} + +# 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/.env ] || borg_env >$BORG_PATH/.env +# Variablen aus .env einlesen +source "$BORG_PATH/.env" + +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 +