Files
Church-Music/legacy-site/scripts/shell/backup-database.sh

108 lines
2.9 KiB
Bash
Executable File

#!/bin/bash
#
# PostgreSQL Database Backup Script with Rotation
# Backs up database and maintains 7 days of history
#
set -e # Exit on error
# Configuration
BACKUP_DIR="/media/pts/Website/Church_HOP_MusicData/backups"
DB_NAME="church_songlyric"
DB_USER="songlyric_user"
DB_HOST="192.168.10.130"
DB_PORT="5432"
RETENTION_DAYS=7
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql.gz"
LOG_FILE="$BACKUP_DIR/backup.log"
# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Logging function
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# Create backup directory if it doesn't exist
mkdir -p "$BACKUP_DIR"
log "=========================================="
log "Starting database backup"
log "Database: $DB_NAME"
log "Timestamp: $TIMESTAMP"
# Check if PostgreSQL client is installed
if ! command -v pg_dump &> /dev/null; then
log "ERROR: pg_dump not found. Install postgresql-client"
exit 1
fi
# Check database connectivity
if ! PGPASSWORD="$POSTGRES_PASSWORD" psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -c "\q" 2>/dev/null; then
log "WARNING: Cannot connect to database. Check credentials in .env"
fi
# Perform backup
log "Creating backup..."
if PGPASSWORD="$POSTGRES_PASSWORD" pg_dump \
-h "$DB_HOST" \
-U "$DB_USER" \
-d "$DB_NAME" \
--verbose \
--format=plain \
--no-owner \
--no-privileges \
2>> "$LOG_FILE" | gzip > "$BACKUP_FILE"; then
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "✓ Backup created successfully: $BACKUP_FILE"
log " Size: $BACKUP_SIZE"
else
log "✗ Backup failed"
exit 1
fi
# Verify backup integrity
log "Verifying backup integrity..."
if gzip -t "$BACKUP_FILE"; then
log "✓ Backup file integrity verified"
else
log "✗ Backup file is corrupted"
exit 1
fi
# Clean up old backups
log "Cleaning up old backups (keeping last $RETENTION_DAYS days)..."
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
OLD_COUNT=$(find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f | wc -l)
log "✓ Retained $OLD_COUNT backup file(s)"
# Create a 'latest' symlink
ln -sf "$BACKUP_FILE" "$BACKUP_DIR/${DB_NAME}_latest.sql.gz"
log "✓ Updated latest backup symlink"
# Display backup summary
echo ""
echo -e "${GREEN}=========================================="
echo -e "BACKUP COMPLETED SUCCESSFULLY"
echo -e "==========================================${NC}"
echo "Backup file: $BACKUP_FILE"
echo "Size: $BACKUP_SIZE"
echo "Retention: $RETENTION_DAYS days"
echo "Total backups: $OLD_COUNT"
echo ""
# Optional: Upload to cloud storage (uncomment and configure)
# log "Uploading to cloud storage..."
# aws s3 cp "$BACKUP_FILE" "s3://your-bucket/backups/" || log "Cloud upload failed"
log "Backup process completed"
log "=========================================="
exit 0