mb-backup-manager/scripts/backup-logic.sh

108 lines
2.9 KiB
Bash
Raw Normal View History

2024-03-13 13:25:45 +00:00
#!/bin/bash
2025-01-06 15:33:56 +00:00
set -e # Exit on error
trap 'echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: An error occurred. Exiting." | tee -a "$LOG_FILE"' ERR
# Global Configurations
LOG_FILE="/var/log/backup_script.log"
BACKUP_REPO_PATH="/mnt/backups/${ENV_NAME}"
PASSWORD_FILE="/etc/restic-password"
RESTIC_CONFIG_FILE="/etc/restic-config"
DEFAULT_BACKUP_COUNT=5
# Logging function
log_message() {
local message="$1"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $message" | tee -a "$LOG_FILE"
2024-03-13 13:25:45 +00:00
}
2025-01-06 15:33:56 +00:00
# Validate required variables
validate_inputs() {
: "${RESTIC_PASSWORD:?RESTIC_PASSWORD not set}"
: "${BACKUP_REPO_PATH:?BACKUP_REPO_PATH not set}"
2024-03-13 13:25:45 +00:00
}
2025-01-06 15:33:56 +00:00
# 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
2024-03-13 13:25:45 +00:00
else
2025-01-06 15:33:56 +00:00
log_message "ERROR: Unsupported package manager."
exit 1
2024-03-13 13:25:45 +00:00
fi
fi
2025-01-06 15:33:56 +00:00
log_message "Restic is installed."
2024-03-13 13:25:45 +00:00
}
2025-01-06 15:33:56 +00:00
# Initialize or validate repository
check_backup_repo() {
[ -d "$BACKUP_REPO_PATH" ] || mkdir -p "$BACKUP_REPO_PATH"
2024-03-13 13:25:45 +00:00
2025-01-06 15:33:56 +00:00
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."
2024-03-13 13:25:45 +00:00
fi
}
2025-01-06 15:33:56 +00:00
# Backup a given path
perform_backup() {
local path="$1"
local tag="$2"
local exclude="$3"
2024-03-13 13:25:45 +00:00
2025-01-06 15:33:56 +00:00
log_message "Backing up $path with tag $tag..."
restic -r "$BACKUP_REPO_PATH" backup "$path" --tag "$tag" $exclude
log_message "Backup for $path completed."
2024-03-13 13:25:45 +00:00
}
2025-01-06 15:33:56 +00:00
# Rotate snapshots
rotate_snapshots() {
local keep_count="${1:-$DEFAULT_BACKUP_COUNT}"
log_message "Rotating snapshots. Keeping the last $keep_count..."
restic -r "$BACKUP_REPO_PATH" forget --keep-last "$keep_count" --prune
log_message "Snapshot rotation completed."
2024-03-13 13:25:45 +00:00
}
2025-01-06 15:33:56 +00:00
# Backup database
backup_database() {
log_message "Starting database backup..."
local db_dump
db_dump=$(mktemp)
# Generate DB dump
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."
2024-03-13 13:25:45 +00:00
}
2025-01-06 15:33:56 +00:00
# Main entry point
2024-03-13 13:25:45 +00:00
case "$1" in
backup)
2025-01-06 15:33:56 +00:00
validate_inputs
install_restic
check_backup_repo
perform_backup "$APP_PATH/wp-content" "wp-core" "--exclude $APP_PATH/wp-content/uploads"
perform_backup "$APP_PATH/wp-content/uploads" "wp-uploads"
2024-03-13 13:25:45 +00:00
backup_database
2025-01-06 15:33:56 +00:00
rotate_snapshots
2024-03-13 13:25:45 +00:00
;;
2025-01-06 15:33:56 +00:00
check_repo)
validate_inputs
2024-03-13 13:25:45 +00:00
check_backup_repo
;;
rotate_snapshots)
2025-01-06 15:33:56 +00:00
rotate_snapshots "$2"
2024-03-13 13:25:45 +00:00
;;
*)
2025-01-06 15:33:56 +00:00
echo "Usage: $0 {backup|check_repo|rotate_snapshots}"
exit 1
;;
2024-03-13 13:25:45 +00:00
esac