#!/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" JSON_PREFIX="backup" BACKUPDIR=$(jq -r '.${JSON_PREFIX}.backup_dir' "$CONFIG_JSON") ROTATEDIR=$(jq -r '.${JSON_PREFIX}.rotate_dir' "$CONFIG_JSON") TIMESTAMP=$(jq -r '.${JSON_PREFIX}.timestamp_file' "$CONFIG_JSON") SOURCE_FILE=$(jq -r '.${JSON_PREFIX}.source_file' "$CONFIG_JSON") EXCLUDE_FILE=$(jq -r '.${JSON_PREFIX}.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 {} \;