-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbackup.sh
More file actions
executable file
·35 lines (27 loc) · 1.18 KB
/
backup.sh
File metadata and controls
executable file
·35 lines (27 loc) · 1.18 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
#!/usr/bin/env bash
# Backup loopctl Postgres database to Synology DS920+.
# Intended to run via systemd timer on the Beelink.
set -euo pipefail
BACKUP_DIR="/tmp/loopctl_backups"
NAS_USER="mkreyman"
NAS_HOST="192.168.86.53"
NAS_PATH="/volume1/NetBackup/loopctl"
RETENTION_DAYS=7
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DUMP_FILE="loopctl_${TIMESTAMP}.sql.gz"
mkdir -p "$BACKUP_DIR"
echo "==> Dumping database..."
docker compose -f "$HOME/workspace/loopctl/docker-compose.yml" exec -T db \
pg_dump -U loopctl -d loopctl_prod --no-owner --no-acl \
| gzip > "${BACKUP_DIR}/${DUMP_FILE}"
DUMP_SIZE=$(du -h "${BACKUP_DIR}/${DUMP_FILE}" | cut -f1)
echo "==> Dump complete: ${DUMP_FILE} (${DUMP_SIZE})"
echo "==> Syncing to NAS..."
rsync -az --timeout=60 "${BACKUP_DIR}/${DUMP_FILE}" \
"${NAS_USER}@${NAS_HOST}:${NAS_PATH}/"
echo "==> Cleaning up local backups older than ${RETENTION_DAYS} days..."
find "$BACKUP_DIR" -name "loopctl_*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "==> Cleaning up remote backups older than ${RETENTION_DAYS} days..."
ssh "${NAS_USER}@${NAS_HOST}" \
"find ${NAS_PATH} -name 'loopctl_*.sql.gz' -mtime +${RETENTION_DAYS} -delete"
echo "==> Backup complete: ${DUMP_FILE}"