#!/bin/bash # Calejo Control Adapter Backup Script # This script creates backups of the database and configuration set -e # Configuration BACKUP_DIR="/backups/calejo" DATE=$(date +%Y%m%d_%H%M%S) RETENTION_DAYS=7 # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Logging function log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } warn() { echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING:${NC} $1" } error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR:${NC} $1" exit 1 } # Check if running as root if [ "$EUID" -eq 0 ]; then warn "Running as root. Consider running as a non-root user with appropriate permissions." fi # Create backup directory if it doesn't exist mkdir -p "$BACKUP_DIR" log "Starting Calejo Control Adapter backup..." # Database backup log "Creating database backup..." DB_BACKUP_FILE="$BACKUP_DIR/calejo_db_backup_$DATE.sql" if command -v docker-compose &> /dev/null; then # Using Docker Compose docker-compose exec -T postgres pg_dump -U calejo calejo > "$DB_BACKUP_FILE" else # Direct PostgreSQL connection if [ -z "$DATABASE_URL" ]; then error "DATABASE_URL environment variable not set" fi # Extract connection details from DATABASE_URL DB_HOST=$(echo "$DATABASE_URL" | sed -n 's/.*@\\([^:]*\\):.*/\\1/p') DB_PORT=$(echo "$DATABASE_URL" | sed -n 's/.*:\\\([0-9]*\\\)\\/.*/\\1/p') DB_NAME=$(echo "$DATABASE_URL" | sed -n 's/.*\\/\\\([^?]*\\\)/\\1/p') DB_USER=$(echo "$DATABASE_URL" | sed -n 's/.*:\\\([^:]*\\\):.*/\\1/p') DB_PASS=$(echo "$DATABASE_URL" | sed -n 's/.*:\\\([^@]*\\\)@.*/\\1/p') PGPASSWORD="$DB_PASS" pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" "$DB_NAME" > "$DB_BACKUP_FILE" fi if [ $? -eq 0 ] && [ -s "$DB_BACKUP_FILE" ]; then log "Database backup created: $DB_BACKUP_FILE" else error "Database backup failed or created empty file" fi # Configuration backup log "Creating configuration backup..." CONFIG_BACKUP_FILE="$BACKUP_DIR/calejo_config_backup_$DATE.tar.gz" tar -czf "$CONFIG_BACKUP_FILE" config/ logs/ 2>/dev/null || warn "Some files might not have been backed up" if [ -s "$CONFIG_BACKUP_FILE" ]; then log "Configuration backup created: $CONFIG_BACKUP_FILE" else warn "Configuration backup might be empty" fi # Logs backup (optional) log "Creating logs backup..." LOGS_BACKUP_FILE="$BACKUP_DIR/calejo_logs_backup_$DATE.tar.gz" if [ -d "logs" ]; then tar -czf "$LOGS_BACKUP_FILE" logs/ 2>/dev/null if [ -s "$LOGS_BACKUP_FILE" ]; then log "Logs backup created: $LOGS_BACKUP_FILE" else warn "Logs backup might be empty" fi else warn "Logs directory not found, skipping logs backup" fi # Compress database backup log "Compressing database backup..." gzip "$DB_BACKUP_FILE" DB_BACKUP_FILE="$DB_BACKUP_FILE.gz" # Verify backups log "Verifying backups..." for backup_file in "$DB_BACKUP_FILE" "$CONFIG_BACKUP_FILE"; do if [ -f "$backup_file" ] && [ -s "$backup_file" ]; then log "✓ Backup verified: $(basename "$backup_file") ($(du -h "$backup_file" | cut -f1))" else error "Backup verification failed for: $(basename "$backup_file")" fi done # Clean up old backups log "Cleaning up backups older than $RETENTION_DAYS days..." find "$BACKUP_DIR" -name "calejo_*_backup_*" -type f -mtime +$RETENTION_DAYS -delete # Create backup manifest MANIFEST_FILE="$BACKUP_DIR/backup_manifest_$DATE.txt" cat > "$MANIFEST_FILE" << EOF Calejo Control Adapter Backup Manifest ====================================== Backup Date: $(date) Backup ID: $DATE Files Created: - $(basename "$DB_BACKUP_FILE") - Database backup - $(basename "$CONFIG_BACKUP_FILE") - Configuration backup EOF if [ -f "$LOGS_BACKUP_FILE" ]; then echo "- $(basename "$LOGS_BACKUP_FILE") - Logs backup" >> "$MANIFEST_FILE" fi cat >> "$MANIFEST_FILE" << EOF Backup Size Summary: $(du -h "$BACKUP_DIR/calejo_*_backup_$DATE*" 2>/dev/null | while read size file; do echo " $size $(basename "$file")"; done) Retention Policy: $RETENTION_DAYS days EOF log "Backup manifest created: $MANIFEST_FILE" log "Backup completed successfully!" log "Total backup size: $(du -sh "$BACKUP_DIR/calejo_*_backup_$DATE*" 2>/dev/null | cut -f1)" # Optional: Upload to cloud storage if [ -n "$BACKUP_UPLOAD_COMMAND" ]; then log "Uploading backups to cloud storage..." eval "$BACKUP_UPLOAD_COMMAND" fi