#!/bin/bash # Backup script for Stones Database PostgreSQL database set -e # Exit immediately if a command exits with a non-zero status # Configuration DB_NAME="stones" DB_USER="stonesadmin" # Replace with your actual database user BACKUP_DIR="/var/backups/stones-database" DATETIME=$(date +"%Y-%m-%d_%H-%M-%S") BACKUP_FILE="$BACKUP_DIR/stones_db_backup_$DATETIME.sql" LOG_FILE="$BACKUP_DIR/backup.log" ROTATION_DAYS=30 # Number of days to keep backups # Colors for pretty output GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # Create backup directory if it doesn't exist if [ ! -d "$BACKUP_DIR" ]; then echo -e "${YELLOW}Creating backup directory...${NC}" mkdir -p $BACKUP_DIR fi # Log start of backup echo -e "$(date): Starting backup of $DB_NAME database" | tee -a $LOG_FILE # Export database echo -e "${YELLOW}Exporting database to $BACKUP_FILE...${NC}" if pg_dump -U $DB_USER $DB_NAME > $BACKUP_FILE; then # Compress the backup file echo -e "${YELLOW}Compressing backup file...${NC}" gzip $BACKUP_FILE BACKUP_FILE="$BACKUP_FILE.gz" # Calculate file size FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) echo -e "${GREEN}Backup completed successfully: $BACKUP_FILE (Size: $FILE_SIZE)${NC}" | tee -a $LOG_FILE else echo -e "${RED}Backup failed!${NC}" | tee -a $LOG_FILE exit 1 fi # Remove old backups echo -e "${YELLOW}Removing backups older than $ROTATION_DAYS days...${NC}" find $BACKUP_DIR -name "stones_db_backup_*.sql.gz" -type f -mtime +$ROTATION_DAYS -delete echo -e "$(date): Removed old backups" | tee -a $LOG_FILE # Optional: Copy backup to another location (e.g., remote server or cloud storage) # Uncomment and modify these lines to enable remote backup # SCP to remote server # echo -e "${YELLOW}Copying backup to remote server...${NC}" # scp $BACKUP_FILE user@remote-server:/path/to/backup/dir/ # Or upload to S3 (requires AWS CLI) # echo -e "${YELLOW}Uploading backup to S3...${NC}" # aws s3 cp $BACKUP_FILE s3://your-bucket/stones-database/ echo -e "${GREEN}Backup process completed!${NC}" # To use this script as a cronjob, add a line like this to your crontab: # Run daily at 2:00 AM: 0 2 * * * /path/to/backup-db.sh # To setup the cronjob automatically, uncomment these lines: # (crontab -l 2>/dev/null; echo "0 2 * * * $(readlink -f $0)") | crontab -