summaryrefslogtreecommitdiffstats
path: root/backup.sh
blob: 4970f146af728dd58996bed17f89b9b295b7d3ee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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 {} \;