stones/backup-db.sh

69 lines
2.3 KiB
Bash
Executable File

#!/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 -