Prepare MariaDB restore tests and recover backup disk space safely
This commit is contained in:
1 parent
f0c761213d
commit
b0416461bc
23 files changed
+918
-129
No files matched your search
@@ -19,11 +19,13 @@ UP_MAIL_DIR=''
|
||||
UP_MAIL_HOMES=false
|
||||
UP_STATE=''
|
||||
UP_WORKER=false
|
||||
UP_RESTORE_TEST=false
|
||||
while (( $# )); do
|
||||
case $1 in
|
||||
--config) CONFIG_FILE=${2:?Missing configuration}; shift 2 ;;
|
||||
--foreground) UP_FOREGROUND=true; shift ;;
|
||||
--install-deps) UP_INSTALL_DEPS=true; shift ;;
|
||||
--enable-restore-test) UP_RESTORE_TEST=true; shift ;;
|
||||
--enable-gitea) UP_GITEA=true; shift ;;
|
||||
--no-gitea) UP_GITEA=false; shift ;;
|
||||
--rclone-config) UP_RCLONE=${2:?Missing rclone configuration}; shift 2 ;;
|
||||
@@ -31,7 +33,7 @@ while (( $# )); do
|
||||
--mail-dir) UP_MAIL_DIR=${2:?Missing mailbox directory}; shift 2 ;;
|
||||
--mail-homes-only) UP_MAIL_HOMES=true; shift ;;
|
||||
--worker) UP_WORKER=true; UP_STATE=${2:?Missing state}; shift 2 ;;
|
||||
--help) echo 'Usage: sudo bash update.sh [--foreground] [--config FILE] [--rclone-config FILE] [--enable-gitea | --no-gitea] [--cron-services UNIT,...] [--mail-dir DIR | --mail-homes-only] [--install-deps]'; exit 0 ;;
|
||||
--help) echo 'Usage: sudo bash update.sh [--foreground] [--config FILE] [--rclone-config FILE] [--enable-gitea | --no-gitea] [--cron-services UNIT,...] [--mail-dir DIR | --mail-homes-only] [--install-deps] [--enable-restore-test]'; exit 0 ;;
|
||||
*) die "Unknown argument: $1" ;;
|
||||
esac
|
||||
done
|
||||
@@ -134,10 +136,14 @@ if [[ $UP_WORKER == false ]]; then
|
||||
chmod 600 "$UP_STATE/candidate.conf"
|
||||
printf '\n# Automated package migration (original preserved in update snapshot)\n' >> "$UP_STATE/candidate.conf"
|
||||
append_setting ENABLE_REMOTE_RETENTION false
|
||||
# Retention of existing local sets is also skipped for the acceptance backup.
|
||||
# Normal local age retention is skipped; safe space recovery remains enabled.
|
||||
append_setting ENABLE_UPLOAD true
|
||||
append_setting ENABLE_NEXTCLOUD_MAINTENANCE true
|
||||
append_setting MAIL_BACKUP_MODE stop
|
||||
if [[ $UP_RESTORE_TEST == true ]]; then
|
||||
append_setting ENABLE_RESTORE_TEST true
|
||||
append_setting RESTORE_TEST_MAX_WORK_GB 0
|
||||
fi
|
||||
prepare_mail
|
||||
if [[ $ENABLE_WORDPRESS == true || $ENABLE_NEXTCLOUD == true ]]; then
|
||||
for pair in "ENABLE_HTTPD_STOP:$HTTPD_SERVICE_NAME" "ENABLE_PHPFPM_STOP:$PHPFPM_SERVICE_NAME"; do
|
||||
@@ -239,10 +245,18 @@ if [[ $UP_WORKER == false ]]; then
|
||||
case ${DB_LABELS[i]} in db-wordpress) key=WP_DB_CNF ;; db-nextcloud) key=NC_DB_CNF ;; db-gitea) key=GITEA_DB_CNF ;; *) die 'Unknown database label' ;; esac
|
||||
printf '%s=%q\n' "$key" "$UP_STATE/db-$i.cnf" >> "$UP_STATE/check.conf"
|
||||
done
|
||||
APP_BACKUP_INHERIT_LOCK=1 bash "$UPDATE_ROOT/usr-local-sbin/app-backup.sh" --config "$UP_STATE/check.conf" --check > "$UP_STATE/preflight.log" 2>&1 || {
|
||||
APP_BACKUP_INHERIT_LOCK=1 bash "$UPDATE_ROOT/usr-local-sbin/app-backup.sh" --config "$UP_STATE/check.conf" --prepare-space > "$UP_STATE/preflight.log" 2>&1 || {
|
||||
tail -n 40 "$UP_STATE/preflight.log"; die "Preflight failed; installed package/config/timer unchanged. Details: $UP_STATE";
|
||||
}
|
||||
if [[ $ENABLE_RESTORE_TEST == true ]]; then
|
||||
APP_BACKUP_INHERIT_LOCK=1 bash "$UPDATE_ROOT/usr-local-sbin/app-restore-test.sh" --config "$UP_STATE/check.conf" --cleanup >> "$UP_STATE/preflight.log" 2>&1
|
||||
APP_BACKUP_INHERIT_LOCK=1 bash "$LIB_DIR/prepare-restore-test.sh" "$UP_STATE/check.conf" >> "$UP_STATE/preflight.log" 2>&1 || {
|
||||
tail -n 30 "$UP_STATE/preflight.log"; die 'Automatic MariaDB preparation failed; see preflight.log';
|
||||
}
|
||||
# The preparation publishes a detected image only after the isolated probe.
|
||||
CONFIG_FILE="$UP_STATE/check.conf"
|
||||
load_config
|
||||
append_setting RESTORE_TEST_DB_IMAGE "$RESTORE_TEST_DB_IMAGE"
|
||||
APP_BACKUP_INHERIT_LOCK=1 bash "$UPDATE_ROOT/usr-local-sbin/app-restore-test.sh" --config "$UP_STATE/check.conf" --check >> "$UP_STATE/preflight.log" 2>&1 || {
|
||||
tail -n 20 "$UP_STATE/preflight.log"; die 'Restore-test prerequisites failed; prepare local DB image and disk budget first';
|
||||
}
|
||||
@@ -367,7 +381,7 @@ build_plan
|
||||
for file in "${DB_CNFS[@]}"; do secure_file "$file"; chmod 600 "$file"; done
|
||||
# Hold the shared lock across every child. This also excludes manual restores.
|
||||
bash /usr/local/sbin/app-backup.sh --config "$CONFIG_FILE" --check
|
||||
# Disable all retention in this acceptance run, including local retention.
|
||||
# Skip normal age retention for acceptance; retain safe local space recovery.
|
||||
bash /usr/local/sbin/app-backup.sh --config "$CONFIG_FILE" --no-retention
|
||||
backup_run=$(python3 - "$WORKDIR/last-backup.json" <<'PY'
|
||||
import json,sys
|
||||
@@ -376,7 +390,11 @@ assert value['exit_code'] == 0
|
||||
print(value['run'])
|
||||
PY
|
||||
)
|
||||
bash /usr/local/sbin/app-restore.sh --config "$CONFIG_FILE" --remote-run "$backup_run" --verify-only
|
||||
if [[ $ENABLE_RESTORE_TEST == true ]]; then
|
||||
bash /usr/local/sbin/app-restore-test.sh --config "$CONFIG_FILE" --remote-run "$backup_run"
|
||||
else
|
||||
bash /usr/local/sbin/app-restore.sh --config "$CONFIG_FILE" --remote-run "$backup_run" --verify-only
|
||||
fi
|
||||
printf '%s\n' "$backup_run" > "$UP_STATE/verified-backup-run"
|
||||
# A missed persistent timer can fire immediately, so release the shared lock first.
|
||||
unset APP_BACKUP_INHERIT_LOCK
|
||||
|
||||
Reference in new issue
Block a user