34 lines
1.5 KiB
Bash
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"
|