infra/ansible/roles/postgresql/templates/backup-postgresql.sh.j2
2025-07-27 11:35:59 -05:00

48 lines
No EOL
1.5 KiB
Django/Jinja

#!/bin/bash
# PostgreSQL backup script for APRS.me
set -euo pipefail
# Configuration
BACKUP_DIR="{{ postgresql_backup_directory }}"
DB_NAME="aprsme_prod"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${TIMESTAMP}.sql.gz"
KEEP_DAYS=7
# Create backup directory if it doesn't exist
mkdir -p "${BACKUP_DIR}"
# Log backup start
echo "[$(date)] Starting backup of ${DB_NAME}" | logger -t postgresql-backup
# Perform backup with compression
if pg_dump -Fc -Z9 "${DB_NAME}" > "${BACKUP_FILE}.tmp"; then
mv "${BACKUP_FILE}.tmp" "${BACKUP_FILE}"
echo "[$(date)] Backup completed: ${BACKUP_FILE}" | logger -t postgresql-backup
# Calculate backup size
SIZE=$(du -h "${BACKUP_FILE}" | cut -f1)
echo "[$(date)] Backup size: ${SIZE}" | logger -t postgresql-backup
else
echo "[$(date)] Backup failed for ${DB_NAME}" | logger -t postgresql-backup -p user.err
rm -f "${BACKUP_FILE}.tmp"
exit 1
fi
# Clean up old backups
echo "[$(date)] Cleaning up backups older than ${KEEP_DAYS} days" | logger -t postgresql-backup
find "${BACKUP_DIR}" -name "${DB_NAME}_*.sql.gz" -type f -mtime +${KEEP_DAYS} -delete
# Verify backup integrity
if pg_restore -l "${BACKUP_FILE}" > /dev/null 2>&1; then
echo "[$(date)] Backup verification successful" | logger -t postgresql-backup
else
echo "[$(date)] Backup verification failed" | logger -t postgresql-backup -p user.err
exit 1
fi
# Optional: Copy to remote backup location
# rsync -av "${BACKUP_FILE}" user@backup-server:/path/to/backups/
exit 0