You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
29 lines
1.0 KiB
Bash
29 lines
1.0 KiB
Bash
#!/usr/bin/env bash
|
|
# Nightly backup of the HQ SQLite database to S3 (and a local rotation).
|
|
# Usage: HQ_DATA_DIR=/var/lib/sims-hq/data S3_BUCKET=s3://your-bucket/hq-backups ./backup-hq.sh
|
|
# Cron (2am daily): 0 2 * * * /opt/sims-hq/apps/hq/scripts/backup-hq.sh >> /var/log/sims-hq-backup.log 2>&1
|
|
set -euo pipefail
|
|
|
|
DATA_DIR="${HQ_DATA_DIR:-/var/lib/sims-hq/data}"
|
|
DB="$DATA_DIR/hq.db"
|
|
STAMP="$(date +%Y%m%d-%H%M%S)"
|
|
OUT="$DATA_DIR/backups"
|
|
mkdir -p "$OUT"
|
|
|
|
if [ ! -f "$DB" ]; then echo "no db at $DB"; exit 1; fi
|
|
|
|
# Consistent snapshot even while the app is running (WAL-safe).
|
|
sqlite3 "$DB" ".backup '$OUT/hq-$STAMP.db'"
|
|
gzip -f "$OUT/hq-$STAMP.db"
|
|
echo "local backup: $OUT/hq-$STAMP.db.gz"
|
|
|
|
# Off-box copy (recommended). Requires awscli + an IAM role/keys with s3:PutObject.
|
|
if [ -n "${S3_BUCKET:-}" ]; then
|
|
aws s3 cp "$OUT/hq-$STAMP.db.gz" "$S3_BUCKET/hq-$STAMP.db.gz"
|
|
echo "uploaded: $S3_BUCKET/hq-$STAMP.db.gz"
|
|
fi
|
|
|
|
# Keep the last 14 local snapshots.
|
|
ls -1t "$OUT"/hq-*.db.gz 2>/dev/null | tail -n +15 | xargs -r rm -f
|
|
echo "backup ok"
|