diff options
Diffstat (limited to 'backup.sh')
-rw-r--r-- | backup.sh | 79 |
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 |