church-website/infra/scripts/backup.sh
2026-08-18 11:15:52 +02:00

34 lines
1.5 KiB
Bash

#!/usr/bin/env bash
# Daily production backup.
# - Local point-in-time archives (DB dump + uploads tarball), 7 days retention.
# - Off-site copy on the staging server: DB dumps (14 days) + incremental
# uploads mirror (rsync, single current copy — the staging server is short
# on disk, so no remote tarball history).
# Installed at /opt/church-website/scripts/backup.sh, run by
# /etc/cron.d/church-website-backup.
set -euo pipefail
DATE=$(date +%F)
BACKUP_DIR=/opt/backups
REMOTE=root@178.104.35.59
REMOTE_DIR=/opt/backups/production
VOLUMES_DIR=/var/lib/docker/volumes
mkdir -p "$BACKUP_DIR"
# Local point-in-time backups
docker exec postgres pg_dump -U postgres -Fc church_website > "$BACKUP_DIR/db-$DATE.dump"
tar -czf "$BACKUP_DIR/uploads-$DATE.tar.gz" -C "$VOLUMES_DIR" \
uploads-production-media/_data uploads-production-documents/_data
# Off-site copy to the staging server
ssh -o StrictHostKeyChecking=accept-new "$REMOTE" "mkdir -p $REMOTE_DIR/db $REMOTE_DIR/uploads/media $REMOTE_DIR/uploads/documents"
scp -q "$BACKUP_DIR/db-$DATE.dump" "$REMOTE:$REMOTE_DIR/db/"
rsync -a --delete "$VOLUMES_DIR/uploads-production-media/_data/" "$REMOTE:$REMOTE_DIR/uploads/media/"
rsync -a --delete "$VOLUMES_DIR/uploads-production-documents/_data/" "$REMOTE:$REMOTE_DIR/uploads/documents/"
# Retention
find "$BACKUP_DIR" -type f -mtime +7 -delete
ssh "$REMOTE" "find $REMOTE_DIR/db -type f -mtime +14 -delete"
echo "$(date -Is) backup OK: db-$DATE.dump + uploads-$DATE.tar.gz (local), synced to $REMOTE"