erste Version
Anpassungen für ein (lokales) ssh-Ziel, z.B. Synology. Fokus darauf, dass dieses Script parallel zum anderen laufen kann.
This commit is contained in:
310
borgsynology.sh
Normal file
310
borgsynology.sh
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
#!/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 <<EOF
|
||||||
|
/data
|
||||||
|
/data1
|
||||||
|
/etc
|
||||||
|
/home
|
||||||
|
/opt
|
||||||
|
/root
|
||||||
|
/srv
|
||||||
|
/usr/local
|
||||||
|
/var/spool/cron
|
||||||
|
/var/www
|
||||||
|
/var/www-vhosts
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
exclude_list() {
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
/home/*/.cache
|
||||||
|
/home/*/.irssi/irclogs/
|
||||||
|
**/.Trash-*
|
||||||
|
**/[Cc]ache/*
|
||||||
|
*.vmdk
|
||||||
|
**/build-area/*
|
||||||
|
/mnt/*
|
||||||
|
/usr/*
|
||||||
|
/proc/*
|
||||||
|
/dev/*
|
||||||
|
/sys/*
|
||||||
|
/tmp/*
|
||||||
|
/var/cache/*
|
||||||
|
/var/log/*
|
||||||
|
/var/tmp/*
|
||||||
|
/root/sc/workdir/borgbackup*
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
#Default-Werte für $BORG_SCRIPT
|
||||||
|
#Variablen sollten in $BORG_PATH/.env anpasst werden
|
||||||
|
borg_env() {
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
### Variablen an eigene Umgebung und Wuensche anpassen
|
||||||
|
###
|
||||||
|
#\$HOST - ein vom hostname und DNS abweichender Name
|
||||||
|
HOST="$HOST"
|
||||||
|
#Passphrase eintragen, wenn verschlüsselt gesichert werden soll
|
||||||
|
export BORG_PASSPHRASE=""
|
||||||
|
# # Nach welchem Schema sollen alte Archive gelöscht werden?
|
||||||
|
# # Die Vorgabe behält alle Sicherungen des aktuellen Tages. Zusätzlich das aktuellste Archiv der
|
||||||
|
# # letzten 7 Sicherungstage, der letzten 4 Wochen sowie der letzten 12 Monate.
|
||||||
|
export BORG_PRUNING="--keep-within=1d --keep-daily=7 --keep-weekly=4 --keep-monthly=12"
|
||||||
|
# URL to call when backup is successful, useful i.e. for uptime kuma push monitor. Deaktivieren: localhost
|
||||||
|
SUCCESS_URL="localhost"
|
||||||
|
# URL to call when backup is _not_ successful. Deaktivieren: localhost
|
||||||
|
ERROR_URL="localhost"
|
||||||
|
# Mailadresse für Log - bitte anpassen!
|
||||||
|
FROM_EMAIL="$(hostname)@kueckshaus.de"
|
||||||
|
# An wen soll die Mail geschickt werden? Bitte anpassen!
|
||||||
|
TO_EMAIL="michael@schaarwaechter.de"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
die() { echo "$*" 1>&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 <<EOF
|
||||||
|
Aufruf $0
|
||||||
|
check|init - prüft, ob \\\$BORG_REPO eingerichtet ist
|
||||||
|
info - zeigt ausführliche Informationen zu \\\$BORG_REPO
|
||||||
|
create|run - legt neues Backup an
|
||||||
|
list - listet vorhandene Backups
|
||||||
|
mount - bindet vorhandenes Backup unter $BORG_MOUNTPOINT ein
|
||||||
|
umount - entfernt eingebundenes Backup unter $BORG_MOUNTPOINT
|
||||||
|
prune - löscht alte Backups aus dem \\\$BORG_REPO
|
||||||
|
keyexport - exportiert Repokey in lokale Datei
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
#Repokey zusätzlich lokal speichern
|
||||||
|
borg_keyexport() {
|
||||||
|
[ "$BORG_ENCRYPTION" == "repokey" ] && $BORG key export "$BORG_REPO" $BORG_PATH/encrypted-repokey && \
|
||||||
|
return 0 ||
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# überprüfen, ob borg-Repository initialisiert wurde
|
||||||
|
# und ausführen, falls nötig
|
||||||
|
borg_check() {
|
||||||
|
echo "Überprüfe, ob das Repository initialisiert ist..."
|
||||||
|
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/$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
|
||||||
|
|
||||||
Reference in New Issue
Block a user