Initial commit - Church Music Database
This commit is contained in:
107
legacy-site/scripts/shell/backup-database.sh
Executable file
107
legacy-site/scripts/shell/backup-database.sh
Executable file
@@ -0,0 +1,107 @@
|
||||
#!/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
|
||||
Reference in New Issue
Block a user