48 lines
No EOL
1.5 KiB
Django/Jinja
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 |