-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackup.sh
More file actions
91 lines (70 loc) · 2.16 KB
/
Copy pathbackup.sh
File metadata and controls
91 lines (70 loc) · 2.16 KB
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
80
81
82
83
84
85
86
87
88
89
90
91
#!/bin/bash
set -euo pipefail
TIMESTAMP=$(date +%s)
FILE_NAME="${DATABASE_NAME}_${TIMESTAMP}.sql.gz"
TMP_FILE="/tmp/${FILE_NAME}"
echo "Iniciando processo de backup: ${FILE_NAME}"
echo "Dumping e comprimindo database..."
PGPASSWORD="${DATABASE_PASSWORD}" pg_dump \
--host "${DATABASE_HOST}" \
--port "${DATABASE_PORT}" \
--username "${DATABASE_USER}" \
--dbname "${DATABASE_NAME}" \
--clean \
--if-exists \
--format plain \
--encoding UTF-8 \
--no-privileges \
--no-owner \
--verbose | gzip > "${TMP_FILE}"
echo "Enviando para o Google Drive..."
rclone copy "${TMP_FILE}" gdrive:
echo "Limpando arquivo local..."
rm -f "${TMP_FILE}"
echo "Aplicando política de retenção..."
FILES=()
INDEX_FILE=$(mktemp)
while IFS= read -r file; do
file="${file%$'\r'}"
ts="${file##*_}"
ts="${ts%.sql.gz}"
ts="${ts%$'\r'}"
if [[ "$ts" =~ ^[0-9]{10,}$ ]]; then
printf '%s\t%s\n' "$ts" "$file" >> "$INDEX_FILE"
fi
done < <(rclone lsf gdrive: --files-only)
if [ -s "$INDEX_FILE" ]; then
mapfile -t FILES < <(sort -rn "$INDEX_FILE" | cut -f2-)
fi
echo " -> Arquivos elegiveis para retenção: ${#FILES[@]}"
rm -f "$INDEX_FILE"
if [ "${#FILES[@]}" -eq 0 ]; then
echo " -> Nenhum arquivo elegivel para retenção foi encontrado em gdrive:."
fi
DAILY_KEPT=0
WEEKLY_KEPT=0
WEEKLY_SEEN_WEEKS=""
MAX_DAILY=${RETENTION_DAILY:-5}
MAX_WEEKLY=${RETENTION_WEEKLY:-4}
for FILE in "${FILES[@]}"; do
FILE_TS="${FILE##*_}"
FILE_TS="${FILE_TS%.sql.gz}"
if [[ ! "$FILE_TS" =~ ^[0-9]{10,}$ ]]; then
continue
fi
ISO_WEEK=$(date -d "@$FILE_TS" +%G-W%V)
if [ "$DAILY_KEPT" -lt "$MAX_DAILY" ]; then
echo " -> [DIÁRIO] Mantendo backup recente: $FILE (Semana: $ISO_WEEK)"
DAILY_KEPT=$((DAILY_KEPT + 1))
else
if [[ ! "$WEEKLY_SEEN_WEEKS" =~ " $ISO_WEEK " ]] && [ "$WEEKLY_KEPT" -lt "$MAX_WEEKLY" ]; then
echo " -> [SEMANAL] Mantendo primeiro da semana: $FILE (Semana: $ISO_WEEK)"
WEEKLY_KEPT=$((WEEKLY_KEPT + 1))
WEEKLY_SEEN_WEEKS="$WEEKLY_SEEN_WEEKS $ISO_WEEK "
else
echo " -> Deletando backup antigo: $FILE"
rclone deletefile gdrive:"$FILE"
fi
fi
done
echo "Processo de backup concluído com sucesso: ${FILE_NAME}"