summaryrefslogtreecommitdiffstats
path: root/backup.sh
diff options
context:
space:
mode:
authorLeonard Kugis <leonard@kug.is>2025-04-11 16:42:42 +0200
committerLeonard Kugis <leonard@kug.is>2025-04-11 16:42:42 +0200
commit3c7de9c00773d6a5c11b8e67d66b25356c03ea1f (patch)
tree515e5a1eefbceca78fb10f36b18b76c40ef1f501 /backup.sh
parentf418d5d1625b0e4abe959fb77862b7cf964ff693 (diff)
downloadscripts-3c7de9c00773d6a5c11b8e67d66b25356c03ea1f.tar.gz
Added backup script
Diffstat (limited to 'backup.sh')
-rw-r--r--backup.sh79
1 files changed, 79 insertions, 0 deletions
diff --git a/backup.sh b/backup.sh
new file mode 100644
index 0000000..4970f14
--- /dev/null
+++ b/backup.sh
@@ -0,0 +1,79 @@
+#!/bin/bash
+# Script für inkrementelles Backup mit 30-tägigem Vollbackup unter Nutzung von secrets.json
+
+### JSON einlesen ###
+BASE_DIR="/root/scripts"
+CONFIG_JSON="${BASE_DIR}/config.json"
+
+BACKUPDIR=$(jq -r '.backup.backup_dir' "$CONFIG_JSON")
+ROTATEDIR=$(jq -r '.backup.rotate_dir' "$CONFIG_JSON")
+TIMESTAMP=$(jq -r '.backup.timestamp_file' "$CONFIG_JSON")
+SOURCE_FILE=$(jq -r '.backup.source_file' "$CONFIG_JSON")
+EXCLUDE_FILE=$(jq -r '.backup.exclude_file' "$CONFIG_JSON")
+
+DATUM="$(date +%Y-%m-%d)"
+ZEIT="$(date +%H-%M-%S-%N)"
+
+SOURCE=()
+EXCLUDE=()
+
+### Quellen einlesen ###
+while IFS= read -r line || [ -n "$line" ]; do
+ [[ -z "$line" ]] && continue
+ if [ -e "$line" ]; then
+ SOURCE+=("$line")
+ else
+ echo "Warnung: '$line' existiert nicht und wird übersprungen."
+ fi
+done < "$SOURCE_FILE"
+
+### Ausnahmen einlesen ###
+while IFS= read -r line || [ -n "$line" ]; do
+ [[ -z "$line" ]] && continue
+ if [ -e "$line" ]; then
+ EXCLUDE+=("--exclude=$line")
+ else
+ echo "Warnung: '$line' existiert nicht und wird übersprungen."
+ fi
+done < "$EXCLUDE_FILE"
+
+cd /
+
+mkdir -p "${BACKUPDIR}"
+if [ ! -d "${BACKUPDIR}" ]; then
+ echo "Fehler: Backupverzeichnis konnte nicht erstellt werden!"
+ exit 1
+fi
+
+set -- ${BACKUPDIR}/backup-??.tar.zst
+lastname=${!#}
+backupnr=${lastname##*backup-}
+backupnr=${backupnr%%.*}
+backupnr=${backupnr//\?/0}
+backupnr=$((10#${backupnr}))
+
+if [ "$((backupnr++))" -ge 30 ]; then
+ mkdir -p "${ROTATEDIR}/${DATUM}-${ZEIT}"
+ if [ ! -d "${ROTATEDIR}/${DATUM}-${ZEIT}" ]; then
+ echo "Fehler: Rotateverzeichnis konnte nicht erstellt werden!"
+ exit 1
+ else
+ mv ${BACKUPDIR}/* "${ROTATEDIR}/${DATUM}-${ZEIT}"
+ docker exec mastodon-db-1 pg_dumpall -U postgres | zstd -9 > "${ROTATEDIR}/${DATUM}-${ZEIT}/backup_mastodon-db-1.sql.zst"
+ pg_dumpall -U postgres | zstd -9 > "${ROTATEDIR}/${DATUM}-${ZEIT}/backup_db.sql.zst"
+ fi
+
+ if [ $? -ne 0 ]; then
+ echo "Fehler beim Verschieben der Backups!"
+ exit 1
+ else
+ backupnr=1
+ fi
+fi
+
+backupnr=$(printf "%02d" "$backupnr")
+filename="backup-${backupnr}.tar.zst"
+
+tar "${EXCLUDE[@]}" -v -c -p -I "zstd -9 -T1" -f "${BACKUPDIR}/${filename}" -g "${BACKUPDIR}/${TIMESTAMP}" "${SOURCE[@]}"
+
+find /var/log -type f \( -name "*.log" -o -name "*.log.*" \) ! -name "*.gz" -exec truncate -s 0 {} \; -o -name "*.gz" -exec rm -f {} \; \ No newline at end of file