#!/bin/bash # # Scheduler Backup Script # Backs up database and configuration with rotation # set -e # Configuration BACKUP_DIR="${BACKUP_DIR:-/backup/scheduler}" DB_PATH="${DB_PATH:-/opt/scheduler/scheduler.db}" CONFIG_PATH="${CONFIG_PATH:-/etc/scheduler/scheduler.env}" RETENTION_DAYS=30 COMPRESS_AFTER_DAYS=7 # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color DATE=$(date +%Y%m%d_%H%M%S) echo -e "${GREEN}=== Scheduler Backup - $(date) ===${NC}" # Create backup directory mkdir -p "$BACKUP_DIR" # Check if database exists if [ ! -f "$DB_PATH" ]; then echo -e "${RED}✗ Database not found: $DB_PATH${NC}" exit 1 fi # Backup database echo "Backing up database..." cp "$DB_PATH" "$BACKUP_DIR/scheduler_${DATE}.db" if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Database backed up: scheduler_${DATE}.db${NC}" else echo -e "${RED}✗ Database backup failed${NC}" exit 1 fi # Backup config if exists if [ -f "$CONFIG_PATH" ]; then echo "Backing up configuration..." cp "$CONFIG_PATH" "$BACKUP_DIR/config_${DATE}.env" if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Config backed up: config_${DATE}.env${NC}" else echo -e "${YELLOW}⚠ Config backup failed${NC}" fi fi # Get database stats DB_SIZE=$(du -h "$BACKUP_DIR/scheduler_${DATE}.db" | cut -f1) JOB_COUNT=$(sqlite3 "$BACKUP_DIR/scheduler_${DATE}.db" "SELECT COUNT(*) FROM jobs;" 2>/dev/null || echo "N/A") echo -e "Database size: ${DB_SIZE}, Jobs: ${JOB_COUNT}" # Compress old backups (older than COMPRESS_AFTER_DAYS) echo "Compressing old backups..." COMPRESSED=$(find "$BACKUP_DIR" -name "*.db" -mtime +${COMPRESS_AFTER_DAYS} -exec gzip {} \; -print | wc -l) if [ $COMPRESSED -gt 0 ]; then echo -e "${GREEN}✓ Compressed $COMPRESSED old backup(s)${NC}" fi # Delete backups older than RETENTION_DAYS echo "Cleaning up old backups..." DELETED_DB=$(find "$BACKUP_DIR" -name "*.db.gz" -mtime +${RETENTION_DAYS} -delete -print | wc -l) DELETED_CFG=$(find "$BACKUP_DIR" -name "*.env" -mtime +${RETENTION_DAYS} -delete -print | wc -l) if [ $DELETED_DB -gt 0 ] || [ $DELETED_CFG -gt 0 ]; then echo -e "${GREEN}✓ Deleted $DELETED_DB database(s) and $DELETED_CFG config(s)${NC}" fi # List recent backups echo "" echo "Recent backups:" ls -lh "$BACKUP_DIR" | tail -5 # Optional: Upload to S3 or remote storage # Uncomment and configure if needed # # if command -v aws &> /dev/null; then # echo "Uploading to S3..." # aws s3 cp "$BACKUP_DIR/scheduler_${DATE}.db" "s3://your-bucket/scheduler-backups/" # echo -e "${GREEN}✓ Uploaded to S3${NC}" # fi echo "" echo -e "${GREEN}=== Backup completed ===${NC}" echo "Backup location: $BACKUP_DIR/scheduler_${DATE}.db"