108 lines
2.9 KiB
Bash
Executable File
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
|