improvements

main
Anthony 2025-01-06 23:33:56 +08:00
parent 716fcce79c
commit 1291e4a255
4 changed files with 158 additions and 358 deletions

View File

@ -172,7 +172,7 @@ actions:
backupnow: backupnow:
- cmd[cp]: - cmd[cp]:
user: root user: root
commands: bash /home/jelastic/mb-backups/backup_all.sh "backup_now" commands: bash /home/jelastic/mb-backups/backup-logic.sh "backup"
- return: - return:
type: info type: info
message: "${response.out}" message: "${response.out}"

View File

@ -1,261 +1,107 @@
#!/bin/bash #!/bin/bash
BASE_URL=$2 set -e # Exit on error
BACKUP_TYPE=$3 trap 'echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: An error occurred. Exiting." | tee -a "$LOG_FILE"' ERR
BACKUP_LOG_FILE=$4
ENV_NAME=$5
BACKUP_COUNT=$6
APP_PATH=$7
USER_SESSION=$8
USER_EMAIL=$9
BACKUP_PATH=${10}
# Ensure restic is installed # Global Configurations
if ! which restic &>/dev/null; then 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"
}
# Validate required variables
validate_inputs() {
: "${RESTIC_PASSWORD:?RESTIC_PASSWORD not set}"
: "${BACKUP_REPO_PATH:?BACKUP_REPO_PATH not set}"
}
# Ensure Restic is installed
install_restic() {
if ! which restic &>/dev/null; then
log_message "Restic not found. Installing..."
if which dnf &>/dev/null; then if which dnf &>/dev/null; then
dnf install -y epel-release dnf install -y epel-release && dnf install -y restic
dnf install -y restic
elif which yum &>/dev/null; then elif which yum &>/dev/null; then
yum-config-manager --add-repo https://copr.fedorainfracloud.org/coprs/copart/restic/repo/epel-7/copart-restic-epel-7.repo yum install -y restic
yum-config-manager --enable copart-restic
yum -y install restic
yum-config-manager --disable copart-restic
fi
fi
# Function definitions remain the same, but adjustments are made to use $BACKUP_PATH
function update_restic(){
restic self-update 2>&1;
}
function check_backup_repo() {
local backup_repo_path="/mnt/backups/${ENV_NAME}"
local password_file="/etc/restic-password"
local backup_log_file="/var/log/backup_addon.log"
# Ensure the backup repository directory exists
[ -d "${backup_repo_path}" ] || mkdir -p "${backup_repo_path}"
# Generate a new 10-character random password if password file does not exist or is empty
if [ ! -f "$password_file" ] || [ -z "$(cat "$password_file")" ]; then
local new_password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 10)
echo "$new_password" > "$password_file"
echo "$(date) Password file created with a new random password." | tee -a "${backup_log_file}"
fi
# Load the password from the file for use with Restic
export RESTIC_PASSWORD=$(cat "$password_file")
export RESTIC_REPOSITORY="$backup_repo_path"
export FILES_COUNT=$(find "${backup_repo_path}" -mindepth 1 | wc -l)
# Check if the repository is accessible with the current password
if [ "${FILES_COUNT}" -gt 0 ]; then
echo "$(date) ${ENV_NAME} Checking the backup repository integrity and consistency" | tee -a "${backup_log_file}"
if ! GOGC=20 restic -r "${backup_repo_path}" snapshots > /dev/null 2>&1; then
echo "$(date) ${ENV_NAME} ERROR: Repository exists but password does not match." | tee -a "${backup_log_file}"
echo "$(date) Reinitializing the repository with a new password." | tee -a "${backup_log_file}"
rm -rf "${backup_repo_path}"/*
GOGC=20 restic init -r "${backup_repo_path}"
echo "$(date) Repository reinitialized with a new password." | tee -a "${backup_log_file}"
else else
# Remove stale lock if exists log_message "ERROR: Unsupported package manager."
if [[ $(ls -A "${backup_repo_path}/locks") ]]; then
echo "$(date) ${ENV_NAME} Backup repository has a stale lock, removing" | tee -a "${backup_log_file}"
GOGC=20 restic -r "${backup_repo_path}" unlock
sendEmailNotification
fi
# Run the repository check command
if ! GOGC=20 restic -q -r "${backup_repo_path}" check --read-data-subset=5%; then
echo "Backup repository integrity check failed." | tee -a "${backup_log_file}"
exit 1 exit 1
fi fi
fi fi
log_message "Restic is installed."
}
# Initialize or validate repository
check_backup_repo() {
[ -d "$BACKUP_REPO_PATH" ] || mkdir -p "$BACKUP_REPO_PATH"
if ! restic -r "$BACKUP_REPO_PATH" snapshots &>/dev/null; then
log_message "Initializing new Restic repository..."
restic -r "$BACKUP_REPO_PATH" init
else else
echo "$(date) ${ENV_NAME} Initializing new backup repository" | tee -a "${backup_log_file}" log_message "Restic repository validated."
GOGC=20 restic init -r "${backup_repo_path}"
fi fi
} }
# Backup a given path
perform_backup() {
local path="$1"
local tag="$2"
local exclude="$3"
function sendEmailNotification() { log_message "Backing up $path with tag $tag..."
if [ -e "/usr/lib/jelastic/modules/api.module" ]; then restic -r "$BACKUP_REPO_PATH" backup "$path" --tag "$tag" $exclude
[ -e "/var/run/jem.pid" ] && return 0; log_message "Backup for $path completed."
CURRENT_PLATFORM_MAJOR_VERSION=$(jem api apicall -s --connect-timeout 3 --max-time 15 [API_DOMAIN]/1.0/statistic/system/rest/getversion 2>/dev/null | jq .version | grep -o [0-9.]* | awk -F . '{print $1}')
if [ "${CURRENT_PLATFORM_MAJOR_VERSION}" -ge "7" ]; then
echo "$(date) ${ENV_NAME} Sending e-mail notification about removing the stale lock" | tee -a "$BACKUP_LOG_FILE"
SUBJECT="Stale lock is removed on ${BACKUP_PATH}/${ENV_NAME} backup repo"
BODY="Please pay attention to ${BACKUP_PATH}/${ENV_NAME} backup repo because the stale lock left from previous operation is removed during the integrity check and backup rotation. Manual check of backup repo integrity and consistency is highly desired."
jem api apicall -s --connect-timeout 3 --max-time 15 [API_DOMAIN]/1.0/message/email/rest/send --data-urlencode "session=$USER_SESSION" --data-urlencode "to=$USER_EMAIL" --data-urlencode "subject=$SUBJECT" --data-urlencode "body=$BODY"
if [[ $? != 0 ]]; then
echo "$(date) ${ENV_NAME} Sending of e-mail notification failed" | tee -a "$BACKUP_LOG_FILE"
else
echo "$(date) ${ENV_NAME} E-mail notification is sent successfully" | tee -a "$BACKUP_LOG_FILE"
fi
elif [ -z "${CURRENT_PLATFORM_MAJOR_VERSION}" ]; then
echo "$(date) ${ENV_NAME} Error when checking the platform version" | tee -a "$BACKUP_LOG_FILE"
else
echo "$(date) ${ENV_NAME} Email notification is not sent because this functionality is unavailable for current platform version." | tee -a "$BACKUP_LOG_FILE"
fi
else
echo "$(date) ${ENV_NAME} Email notification is not sent because this functionality is unavailable for current platform version." | tee -a "$BACKUP_LOG_FILE"
fi
} }
function rotate_snapshots(){ # Rotate snapshots
local backup_repo_path="/mnt/backups/${ENV_NAME}" rotate_snapshots() {
echo "$(date) ${ENV_NAME} Rotating snapshots by keeping the last ${BACKUP_COUNT}" | tee -a "${BACKUP_LOG_FILE}" local keep_count="${1:-$DEFAULT_BACKUP_COUNT}"
log_message "Rotating snapshots. Keeping the last $keep_count..."
if [[ $(ls -A "${backup_repo_path}/locks") ]]; then restic -r "$BACKUP_REPO_PATH" forget --keep-last "$keep_count" --prune
echo "$(date) ${ENV_NAME} Backup repository has a stale lock, removing" | tee -a "${BACKUP_LOG_FILE}" log_message "Snapshot rotation completed."
GOGC=20 RESTIC_PASSWORD="${ENV_NAME}" restic -r "${backup_repo_path}" unlock
sendEmailNotification
fi
if ! GOGC=20 RESTIC_COMPRESSION=off RESTIC_PACK_SIZE=8 RESTIC_PASSWORD="${ENV_NAME}" restic forget -q -r "${backup_repo_path}" --keep-last "${BACKUP_COUNT}" --prune | tee -a "${BACKUP_LOG_FILE}"; then
echo "Backup rotation failed." | tee -a "${BACKUP_LOG_FILE}"
exit 1
fi
} }
function create_snapshot(){ # Backup database
local backup_repo_path="/mnt/backups/${ENV_NAME}" backup_database() {
DUMP_NAME=$(date "+%F_%H%M%S_%Z") log_message "Starting database backup..."
echo "$(date) ${ENV_NAME} Begin uploading the ${DUMP_NAME} snapshot to backup storage" | tee -a "${BACKUP_LOG_FILE}" local db_dump
db_dump=$(mktemp)
if ! GOGC=20 RESTIC_COMPRESSION=off RESTIC_PACK_SIZE=8 RESTIC_READ_CONCURRENCY=8 RESTIC_PASSWORD="${ENV_NAME}" restic backup -q -r "${backup_repo_path}" --tag "${DUMP_NAME} ${BACKUP_ADDON_COMMIT_ID} ${BACKUP_TYPE}" "${APP_PATH}" ~/wp_db_backup.sql | tee -a "${BACKUP_LOG_FILE}"; then # Generate DB dump
echo "Backup snapshot creation failed." | tee -a "${BACKUP_LOG_FILE}" mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$db_dump"
exit 1 perform_backup "$db_dump" "database-backup"
fi rm -f "$db_dump"
log_message "Database backup completed."
echo "$(date) ${ENV_NAME} End uploading the ${DUMP_NAME} snapshot to backup storage" | tee -a "${BACKUP_LOG_FILE}"
}
function backup_database() {
local backup_repo_path="/mnt/backups/${ENV_NAME}/db"
local log_file="/home/litespeed/mbmanager/logs/${ENV_NAME}_db_backup.log"
# Ensure the backup and log directories exist
mkdir -p "${backup_repo_path}"
mkdir -p "$(dirname "${log_file}")"
echo "$(date) ${ENV_NAME} Starting database backup..." | tee -a "${log_file}"
# Extract database credentials from wp-config.php
DB_NAME=$(grep DB_NAME /var/www/webroot/ROOT/wp-config.php | cut -d "'" -f 4)
DB_USER=$(grep DB_USER /var/www/webroot/ROOT/wp-config.php | cut -d "'" -f 4)
DB_PASSWORD=$(grep DB_PASSWORD /var/www/webroot/ROOT/wp-config.php | cut -d "'" -f 4)
DB_HOST=$(grep DB_HOST /var/www/webroot/ROOT/wp-config.php | cut -d "'" -f 4 | awk -F':' '{print $1}')
DB_PORT=$(grep DB_HOST /var/www/webroot/ROOT/wp-config.php | cut -d "'" -f 4 | awk -F':' '{print $2}' | sed 's/)//')
DB_PORT=${DB_PORT:-3306}
# Determine the correct --column-statistics option based on MySQL or MariaDB version
local column_statistics_option=""
SERVER_VERSION=$(mysql -h "${DB_HOST}" -u "${DB_USER}" -p"${DB_PASSWORD}" -e 'SELECT VERSION();' -s -N)
if [[ "${SERVER_VERSION}" =~ ^5\.7|^8\.0|MariaDB ]]; then
column_statistics_option="--column-statistics=0"
fi
# Create a database dump
local dump_file="${backup_repo_path}/${ENV_NAME}_$(date "+%Y-%m-%d_%H-%M-%S").sql"
mysqldump -h "${DB_HOST}" -P "${DB_PORT}" -u "${DB_USER}" -p"${DB_PASSWORD}" ${column_statistics_option} --force --single-transaction --quote-names --opt "${DB_NAME}" > "${dump_file}"
if [ $? -ne 0 ]; then
echo "$(date) ${ENV_NAME} Database backup process failed." | tee -a "${log_file}"
exit 1
fi
# Backup the dump file using Restic
restic -r "${backup_repo_path}" backup "${dump_file}" --tag "db" --host "${ENV_NAME}"
if [ $? -ne 0 ]; then
echo "$(date) ${ENV_NAME} Restic backup process failed." | tee -a "${log_file}"
exit 1
fi
echo "$(date) ${ENV_NAME} Database backup completed successfully." | tee -a "${log_file}"
# Optionally, remove the dump file after successful backup
rm -f "${dump_file}"
}
function backup_wp_core() {
echo "Starting backup of WordPress core files excluding uploads directory..."
# Define the path to the WordPress installation and the backup tag
local wp_path="$APP_PATH"
local backup_tag="wp-core-$(date "+%F_%H%M%S_%Z")"
# Exclude the uploads directory using the --exclude option
GOGC=20 RESTIC_PASSWORD="$RESTIC_PASSWORD" restic -r "$backupPath" backup \
--tag "$backup_tag" \
--exclude="$wp_path/wp-content/uploads" \
"$wp_path"
echo "WordPress core files backup completed."
}
function backup_uploads() {
echo "Starting backup of WordPress uploads directory..."
# Define the path to the uploads directory and the backup tag
local uploads_path="$APP_PATH/wp-content/uploads"
local backup_tag="wp-uploads-$(date "+%F_%H%M%S_%Z")"
# Perform the backup
GOGC=20 RESTIC_PASSWORD="$RESTIC_PASSWORD" restic -r "$backupPath" backup \
--tag "$backup_tag" \
"$uploads_path"
echo "WordPress uploads directory backup completed."
}
function backup_database() {
echo "Starting backup of WordPress database..."
# Define the backup tag and the path for the temporary SQL dump
local backup_tag="wp-db-$(date "+%F_%H%M%S_%Z")"
local sql_dump_path="/tmp/wp_db_backup.sql"
# Create a database dump
mysqldump -h "$DB_HOST" -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$sql_dump_path"
# Perform the backup
GOGC=20 RESTIC_PASSWORD="$RESTIC_PASSWORD" restic -r "$backupPath" backup \
--tag "$backup_tag" \
"$sql_dump_path"
# Remove the temporary SQL dump file
rm -f "$sql_dump_path"
echo "WordPress database backup completed."
} }
# Main entry point
case "$1" in case "$1" in
backup) backup)
backup_wp_core validate_inputs
backup_uploads 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"
backup_database backup_database
rotate_snapshots
;; ;;
backup_wp_core) check_repo)
backup_wp_core validate_inputs
;;
backup_uploads)
backup_uploads
;;
backup_database)
backup_database
;;
check_backup_repo)
check_backup_repo check_backup_repo
;; ;;
rotate_snapshots) rotate_snapshots)
rotate_snapshots rotate_snapshots "$2"
;;
create_snapshot)
create_snapshot
;;
update_restic)
update_restic
;; ;;
*) *)
echo "Usage: $0 {backup|backup_wp_core|backup_uploads|backup_database|check_backup_repo|rotate_snapshots|create_snapshot|update_restic}" echo "Usage: $0 {backup|check_repo|rotate_snapshots}"
exit 2 exit 1
;;
esac esac
exit $?

View File

@ -8,55 +8,54 @@ LOG_DIR="/home/jelastic/mb-backups/logs"
mkdir -p "$LOG_DIR" mkdir -p "$LOG_DIR"
# Properly escape the trap command # Properly escape the trap command
trap 'echo "[$(date +'\''%Y-%m-%d %H:%M:%S'\'')] Backup failed" >> "$LOG_DIR/backup_error.log"' ERR trap 'echo "[$(date +'%Y-%m-%d %H:%M:%S')] Backup failed" >> "$LOG_DIR/backup_error.log"' ERR
# Load the backup logic functions # Load the backup logic functions
source /home/jelastic/mb-backups/backup-logic.sh source /home/jelastic/mb-backups/backup-logic.sh
# Configuration # Configuration
password_file="/etc/restic-password" password_file="/etc/restic-password"
APP_PATH='/var/www/webroot/ROOT' APP_PATH="/var/www/webroot/ROOT"
WP_CONFIG="${APP_PATH}/wp-config.php" WP_CONFIG="${APP_PATH}/wp-config.php"
backupPath='/mnt/backups' backupPath="/mnt/backups"
TEMP_DIR="/tmp/wp_backup_tmp" TEMP_DIR="/tmp/wp_backup_tmp"
MAX_BACKUP_SIZE=$((10 * 1024 * 1024 * 1024)) # 10GB MAX_BACKUP_SIZE=$((10 * 1024 * 1024 * 1024)) # 10GB
# Database configuration # Function: Ensure required commands are available
DB_NAME=$(grep "define( 'DB_NAME'" "$WP_CONFIG" | cut -d "'" -f 4) validate_dependencies() {
DB_USER=$(grep "define( 'DB_USER'" "$WP_CONFIG" | cut -d "'" -f 4) for cmd in restic mysqldump jq; do
DB_PASSWORD=$(grep "define( 'DB_PASSWORD'" "$WP_CONFIG" | cut -d "'" -f 4) if ! command -v "$cmd" &>/dev/null; then
BACKUP_USER='wp_backup' echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Required command '$cmd' not found" | tee -a "$LOG_DIR/backup_error.log"
BACKUP_PASSWORD='gaQjveXl24Xo66w' exit 1
# Ensure directories exist
mkdir -p "$LOG_DIR"
mkdir -p "$TEMP_DIR"
# Cleanup function
cleanup() {
local exit_code=$?
rm -rf "${TEMP_DIR}"/*
if [ $exit_code -ne 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Backup failed with exit code $exit_code" | tee -a "$LOG_DIR/backup_error.log"
fi fi
done
} }
trap cleanup EXIT
# Check backup size # Function: Initialize logging
log_message() {
local log_file="$1"
local message="$2"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $message" | tee -a "$log_file"
}
# Function: Check if backup size exceeds limit
check_backup_size() { check_backup_size() {
local path="$1" local path="$1"
local size=$(du -sb "$path" | cut -f1) local size
size=$(du -sb "$path" | cut -f1)
if [ "$size" -gt "$MAX_BACKUP_SIZE" ]; then if [ "$size" -gt "$MAX_BACKUP_SIZE" ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Warning: Backup size exceeds 10GB for $path" | tee -a "$LOG_DIR/backup_warning.log" log_message "$LOG_DIR/backup_warning.log" "Warning: Backup size exceeds 10GB for $path"
return 1 return 1
fi fi
return 0 return 0
} }
# Verify backup # Function: Verify backup
verify_backup() { verify_backup() {
local tag="$1" local tag="$1"
local latest_snapshot=$(restic snapshots --latest 1 --tag "$tag" --json | jq -r '.[0].id') local latest_snapshot
latest_snapshot=$(restic snapshots --latest 1 --tag "$tag" --json | jq -r '.[0].id')
if [ -n "$latest_snapshot" ]; then if [ -n "$latest_snapshot" ]; then
restic check --read-data "$latest_snapshot" restic check --read-data "$latest_snapshot"
return $? return $?
@ -64,30 +63,20 @@ verify_backup() {
return 1 return 1
} }
# Initialize backup # Function: Initialize backup
if [ ! -f "$password_file" ]; then initialize_backup() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Password file not found at $password_file" | tee -a "$LOG_DIR/backup_error.log" if [ ! -f "$password_file" ]; then
exit 1 log_message "$LOG_DIR/backup_error.log" "ERROR: Password file not found at $password_file"
fi
export RESTIC_PASSWORD=$(cat "$password_file")
export RESTIC_REPOSITORY="$backupPath"
# Check repository
check_backup_repo() {
restic snapshots > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Backup repository is not accessible" | tee -a "$LOG_DIR/backup_error.log"
exit 1 exit 1
fi fi
export RESTIC_PASSWORD=$(cat "$password_file")
export RESTIC_REPOSITORY="$backupPath"
} }
check_backup_repo # Function: Backup core files
# Backup functions
backup_core_files() { backup_core_files() {
local log_file="${LOG_DIR}/backup_core_files_$(date +'%Y-%m-%d').log" local log_file="${LOG_DIR}/backup_core_files_$(date +'%Y-%m-%d').log"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Starting Core Files Backup" | tee -a "$log_file" log_message "$log_file" "Starting Core Files Backup"
check_backup_size "$APP_PATH" || return 1 check_backup_size "$APP_PATH" || return 1
@ -99,72 +88,22 @@ backup_core_files() {
if restic backup $excludeOptions "$APP_PATH" --tag core_files --tag full_backup; then if restic backup $excludeOptions "$APP_PATH" --tag core_files --tag full_backup; then
verify_backup "core_files" || return 1 verify_backup "core_files" || return 1
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Core files backup completed successfully" | tee -a "$log_file" log_message "$log_file" "Core files backup completed successfully"
return 0 return 0
fi fi
return 1 return 1
} }
backup_media_themes() {
local log_file="${LOG_DIR}/backup_media_themes_$(date +'%Y-%m-%d').log"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Starting Media and Themes Backup" | tee -a "$log_file"
local includePaths=("$APP_PATH/wp-content/uploads")
for path in "${includePaths[@]}"; do
check_backup_size "$path" || continue
if restic backup "$path" --tag media_themes --tag full_backup; then
verify_backup "media_themes" || return 1
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Backup completed successfully for $path" | tee -a "$log_file"
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Backup failed for $path" | tee -a "$log_file"
return 1
fi
done
}
backup_database() {
local log_file="${LOG_DIR}/backup_database_$(date +'%Y-%m-%d').log"
local temp_dump="${TEMP_DIR}/wp_backup_${DB_NAME}_$(date +'%Y%m%d').sql"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Starting Database Backup" | tee -a "$log_file"
if ! mysqldump -u "$BACKUP_USER" --password="$BACKUP_PASSWORD" "$DB_NAME" > "$temp_dump" 2>> "$log_file"; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Database dump failed" | tee -a "$log_file"
return 1
fi
check_backup_size "$temp_dump" || return 1
if restic backup "$temp_dump" --tag wordpress_db --tag full_backup; then
verify_backup "wordpress_db" || return 1
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Database backup completed successfully" | tee -a "$log_file"
return 0
else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Database backup failed" | tee -a "$log_file"
return 1
fi
}
cleanup_old_backups() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Starting backup rotation" | tee -a "$LOG_DIR/backup_rotation.log"
restic forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 3 \
--prune \
--tag full_backup \
2>> "$LOG_DIR/backup_rotation.log"
}
# Main execution # Main execution
main() { main() {
validate_dependencies
initialize_backup
local start_time=$(date +%s) local start_time=$(date +%s)
local backup_date=$(date +'%Y-%m-%d_%H-%M-%S') local backup_date=$(date +'%Y-%m-%d_%H-%M-%S')
local main_log="${LOG_DIR}/full_backup_${backup_date}.log" local main_log="${LOG_DIR}/full_backup_${backup_date}.log"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Starting full backup process" | tee -a "$main_log" log_message "$main_log" "Starting full backup process"
backup_core_files || exit 1 backup_core_files || exit 1
backup_media_themes || exit 1 backup_media_themes || exit 1
@ -175,7 +114,7 @@ main() {
local end_time=$(date +%s) local end_time=$(date +%s)
local duration=$((end_time - start_time)) local duration=$((end_time - start_time))
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Full backup completed in $duration seconds" | tee -a "$main_log" log_message "$main_log" "Full backup completed in $duration seconds"
} }
# Argument handling # Argument handling

View File

@ -1,8 +1,34 @@
#!/bin/bash #!/bin/bash
# Exit on error and handle errors with a trap
set -e
trap 'echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: An error occurred during the backup process." | tee -a "$LOG_FILE"' ERR
# Load the backup logic functions # Load the backup logic functions
source /home/jelastic/mb-backups/backup-logic.sh source /home/jelastic/mb-backups/backup-logic.sh
# Function: Log messages
log_message() {
local message="$1"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $message" | tee -a "$LOG_FILE"
}
# Function: Validate the password
validate_password() {
local password="$1"
if [ ! -f "$password_file" ]; then
log_message "ERROR: Password file not found at $password_file"
exit 1
fi
local stored_password
stored_password=$(cat "$password_file")
if [ "$stored_password" != "$password" ]; then
log_message "ERROR: Password mismatch. Aborting backup."
exit 1
fi
}
# Check for required arguments # Check for required arguments
if [ $# -ne 2 ]; then if [ $# -ne 2 ]; then
echo "Usage: $0 <RESTIC_PASSWORD> <ADDITIONAL_TAG>" echo "Usage: $0 <RESTIC_PASSWORD> <ADDITIONAL_TAG>"
@ -14,8 +40,8 @@ RESTIC_PASSWORD="$1"
ADDITIONAL_TAG="$2" ADDITIONAL_TAG="$2"
# Configuration # Configuration
APP_PATH='/var/www/webroot/ROOT' APP_PATH="/var/www/webroot/ROOT"
backupPath='/mnt/backups' backupPath="/mnt/backups"
password_file="/etc/restic-password" password_file="/etc/restic-password"
LOG_DIR="/home/jelastic/mb-backups/logs" LOG_DIR="/home/jelastic/mb-backups/logs"
LOG_FILE="${LOG_DIR}/backup_core_files_$(date +'%Y-%m-%d').log" LOG_FILE="${LOG_DIR}/backup_core_files_$(date +'%Y-%m-%d').log"
@ -30,42 +56,31 @@ mkdir -p "$LOG_DIR"
export RESTIC_REPOSITORY="$backupPath" export RESTIC_REPOSITORY="$backupPath"
export RESTIC_PASSWORD export RESTIC_PASSWORD
# Verify that the password file exists and matches the supplied password # Validate the password
if [ ! -f "$password_file" ]; then validate_password "$RESTIC_PASSWORD"
echo "ERROR: Password file not found at $password_file" | tee -a "$LOG_FILE"
exit 1
fi
# Load and verify password from the file
stored_password=$(cat "$password_file")
if [ "$stored_password" != "$RESTIC_PASSWORD" ]; then
echo "ERROR: Password mismatch. Aborting backup." | tee -a "$LOG_FILE"
exit 1
fi
# Check repository accessibility and integrity # Check repository accessibility and integrity
check_backup_repo if ! check_backup_repo; then
if [ $? -ne 0 ]; then log_message "ERROR: Backup repository check failed. Aborting backup."
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Backup repository check failed. Aborting backup." | tee -a "$LOG_FILE"
exit 1 exit 1
fi fi
# Logging start # Start logging
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Starting Core Files Backup with tags: core_files, $ADDITIONAL_TAG" | tee -a "$LOG_FILE" log_message "Starting Core Files Backup with tags: core_files, $ADDITIONAL_TAG"
# Building exclude options # Build exclude options
excludeOptions="" excludeOptions=""
for path in "${excludePaths[@]}"; do for path in "${excludePaths[@]}"; do
excludeOptions+="--exclude $path " excludeOptions+="--exclude $path "
done done
# Perform backup with both tags # Perform backup
if restic backup $excludeOptions "$APP_PATH" --tag core_files --tag "$ADDITIONAL_TAG"; then if restic backup $excludeOptions "$APP_PATH" --tag core_files --tag "$ADDITIONAL_TAG"; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Core files backup completed successfully." | tee -a "$LOG_FILE" log_message "Core files backup completed successfully."
else else
echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: Core files backup failed." | tee -a "$LOG_FILE" log_message "ERROR: Core files backup failed."
exit 1 exit 1
fi fi
# Logging end # Finish logging
echo "[$(date +'%Y-%m-%d %H:%M:%S')] Backup process finished." | tee -a "$LOG_FILE" log_message "Backup process finished."