#!/bin/bash # # Basil Backup Script for Standalone PostgreSQL # Place on database server and run via cron # # Cron example (daily at 2 AM): # 0 2 * * * /path/to/backup-standalone-postgres.sh set -e # Configuration DB_HOST="localhost" DB_PORT="5432" DB_NAME="basil" DB_USER="basil" BACKUP_DIR="/var/backups/basil" RETENTION_DAYS=30 # Create backup directories mkdir -p "$BACKUP_DIR/daily" mkdir -p "$BACKUP_DIR/weekly" mkdir -p "$BACKUP_DIR/monthly" # Timestamp TIMESTAMP=$(date +%Y%m%d_%H%M%S) DATE=$(date +%Y%m%d) DAY_OF_WEEK=$(date +%u) # 1=Monday, 7=Sunday DAY_OF_MONTH=$(date +%d) # Daily backup echo "Starting daily backup: $TIMESTAMP" DAILY_BACKUP="$BACKUP_DIR/daily/basil-$DATE.sql.gz" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" "$DB_NAME" | gzip > "$DAILY_BACKUP" echo "Daily backup completed: $DAILY_BACKUP" # Weekly backup (on Sundays) if [ "$DAY_OF_WEEK" -eq 7 ]; then echo "Creating weekly backup" WEEK=$(date +%V) WEEKLY_BACKUP="$BACKUP_DIR/weekly/basil-week$WEEK-$DATE.sql.gz" cp "$DAILY_BACKUP" "$WEEKLY_BACKUP" echo "Weekly backup completed: $WEEKLY_BACKUP" fi # Monthly backup (on 1st of month) if [ "$DAY_OF_MONTH" -eq 01 ]; then echo "Creating monthly backup" MONTH=$(date +%Y%m) MONTHLY_BACKUP="$BACKUP_DIR/monthly/basil-$MONTH.sql.gz" cp "$DAILY_BACKUP" "$MONTHLY_BACKUP" echo "Monthly backup completed: $MONTHLY_BACKUP" fi # Cleanup old backups echo "Cleaning up old backups..." find "$BACKUP_DIR/daily" -name "basil-*.sql.gz" -mtime +$RETENTION_DAYS -delete find "$BACKUP_DIR/weekly" -name "basil-*.sql.gz" -mtime +90 -delete find "$BACKUP_DIR/monthly" -name "basil-*.sql.gz" -mtime +365 -delete # Verify backup integrity echo "Verifying backup integrity..." if gzip -t "$DAILY_BACKUP"; then BACKUP_SIZE=$(du -h "$DAILY_BACKUP" | cut -f1) echo "Backup verification successful. Size: $BACKUP_SIZE" else echo "ERROR: Backup verification failed!" >&2 exit 1 fi # Optional: Send notification (uncomment to enable) # echo "Basil backup completed successfully on $(hostname) at $(date)" | \ # mail -s "Basil Backup Success" your-email@example.com echo "Backup process completed successfully"