CalejoControl/scripts/backup.sh

153 lines
4.4 KiB
Bash

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