diff --git a/scripts/backup-logic.sh b/scripts/backup-logic.sh index e3f1a94..6fe81d5 100644 --- a/scripts/backup-logic.sh +++ b/scripts/backup-logic.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e # Exit on error -trap 'echo "ERROR: An error occurred. Exiting."' ERR +trap 'echo "ERROR: An error occurred while executing $COMMAND for $ENV_NAME. Exiting."' ERR # Validate arguments if [ $# -lt 2 ]; then @@ -28,6 +28,11 @@ fi mkdir -p "$BACKUP_REPO_PATH" # Set environment variables +if [ ! -f "$PASSWORD_FILE" ]; then + echo "Error: Password file not found at $PASSWORD_FILE." + exit 1 +fi + export RESTIC_REPOSITORY="$BACKUP_REPO_PATH" export RESTIC_PASSWORD=$(cat "$PASSWORD_FILE") @@ -36,35 +41,89 @@ log_message() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } -# Commands +# Ensure Restic is installed +install_restic() { + if ! which restic &>/dev/null; then + log_message "Restic not found. Installing..." + if which dnf &>/dev/null; then + dnf install -y epel-release && dnf install -y restic + elif which yum &>/dev/null; then + yum install -y restic + else + log_message "ERROR: Unsupported package manager." + exit 1 + fi + fi + log_message "Restic is installed." +} + +# Initialize or validate repository +check_backup_repo() { + if ! restic -r "$BACKUP_REPO_PATH" snapshots &>/dev/null; then + log_message "Initializing new Restic repository..." + restic -r "$BACKUP_REPO_PATH" init + else + log_message "Restic repository validated." + fi +} + +# Perform backup operations +perform_backup() { + local path="$1" + local tag="$2" + local exclude="$3" + + log_message "Backing up $path with tag $tag..." + restic -r "$BACKUP_REPO_PATH" backup "$path" --tag "$tag" $exclude + log_message "Backup for $path completed." +} + +# Backup database +backup_database() { + log_message "Starting database backup for $ENV_NAME..." + local db_dump + db_dump=$(mktemp) + + mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$db_dump" + perform_backup "$db_dump" "database-backup" + rm -f "$db_dump" + log_message "Database backup completed." +} + +# Handle commands case "$COMMAND" in backup) log_message "Starting full backup for environment: $ENV_NAME" - # Add logic to perform the full backup + install_restic + check_backup_repo + perform_backup "/var/www/webroot/ROOT/wp-content" "wp-core" "--exclude /var/www/webroot/ROOT/wp-content/uploads" + perform_backup "/var/www/webroot/ROOT/wp-content/uploads" "wp-uploads" + backup_database ;; backup_wp_core) log_message "Backing up WordPress core files for environment: $ENV_NAME" - # Add logic for WordPress core backup + perform_backup "/var/www/webroot/ROOT/wp-content" "wp-core" "--exclude /var/www/webroot/ROOT/wp-content/uploads" ;; backup_uploads) log_message "Backing up WordPress uploads for environment: $ENV_NAME" - # Add logic for uploads backup + perform_backup "/var/www/webroot/ROOT/wp-content/uploads" "wp-uploads" ;; backup_database) - log_message "Backing up WordPress database for environment: $ENV_NAME" - # Add logic for database backup + backup_database ;; check_backup_repo) log_message "Checking backup repository for environment: $ENV_NAME" - # Add repository check logic + check_backup_repo ;; rotate_snapshots) log_message "Rotating snapshots for environment: $ENV_NAME" - # Add snapshot rotation logic + restic -r "$BACKUP_REPO_PATH" forget --keep-last 5 --prune + log_message "Snapshot rotation completed." ;; create_snapshot) log_message "Creating snapshot for environment: $ENV_NAME" - # Add snapshot creation logic + restic -r "$BACKUP_REPO_PATH" backup --tag "manual-snapshot" + log_message "Snapshot creation completed." ;; update_restic) log_message "Updating Restic for environment: $ENV_NAME"