Add PD to Serenity backup automation scaffolding
This commit is contained in:
73
automation/bin/pd_backup_lib.sh
Executable file
73
automation/bin/pd_backup_lib.sh
Executable file
@@ -0,0 +1,73 @@
|
||||
#!/usr/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
AUTOMATION_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
ENV_FILE="${ENV_FILE:-$AUTOMATION_DIR/.env}"
|
||||
|
||||
if [[ ! -f "$ENV_FILE" ]]; then
|
||||
echo "Missing env file: $ENV_FILE" >&2
|
||||
echo "Copy automation/.env.example to automation/.env and fill in real values first." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
set -a
|
||||
# shellcheck disable=SC1090
|
||||
source "$ENV_FILE"
|
||||
set +a
|
||||
|
||||
required_vars=(
|
||||
SERENITY_BACKUP_HOST
|
||||
SERENITY_BACKUP_ROOT
|
||||
PD_APPDATA_ROOT
|
||||
PD_DATABASES_ROOT
|
||||
PD_TANK_DOCKER_ROOT
|
||||
PD_DB_DUMP_ROOT
|
||||
POSTGRES_CONTAINER
|
||||
)
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [[ -z "${!var:-}" ]]; then
|
||||
echo "Required variable $var is empty in $ENV_FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
mkdir -p "$PD_DB_DUMP_ROOT"
|
||||
|
||||
DOCKER_BIN="${DOCKER_BIN:-/usr/bin/docker}"
|
||||
SUDO_BIN="${SUDO_BIN:-/usr/bin/sudo}"
|
||||
USE_SUDO_FOR_DOCKER="${USE_SUDO_FOR_DOCKER:-true}"
|
||||
BACKUP_KNOWN_HOSTS="${BACKUP_KNOWN_HOSTS:-${HOME:-/root}/.ssh/known_hosts}"
|
||||
|
||||
if [[ ! -x "$DOCKER_BIN" ]]; then
|
||||
echo "Docker binary not executable: $DOCKER_BIN" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
docker_cmd() {
|
||||
if [[ "${EUID:-$(id -u)}" == "0" ]]; then
|
||||
"$DOCKER_BIN" "$@"
|
||||
elif [[ "$USE_SUDO_FOR_DOCKER" == "true" ]]; then
|
||||
"$SUDO_BIN" -n "$DOCKER_BIN" "$@"
|
||||
else
|
||||
"$DOCKER_BIN" "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
timestamp_utc() {
|
||||
date -u +"%Y%m%dT%H%M%SZ"
|
||||
}
|
||||
|
||||
ssh_args() {
|
||||
local opts="-o BatchMode=yes -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=$BACKUP_KNOWN_HOSTS"
|
||||
if [[ -n "${BACKUP_SSH_KEY:-}" ]]; then
|
||||
printf '%s' "-i $BACKUP_SSH_KEY $opts"
|
||||
else
|
||||
printf '%s' "$opts"
|
||||
fi
|
||||
}
|
||||
|
||||
ssh_cmd() {
|
||||
printf 'ssh %s' "$(ssh_args)"
|
||||
}
|
||||
22
automation/bin/pd_backup_postgres.sh
Executable file
22
automation/bin/pd_backup_postgres.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/pd_backup_lib.sh"
|
||||
|
||||
stamp="$(timestamp_utc)"
|
||||
dbs="${POSTGRES_DB_LIST:-}"
|
||||
|
||||
if [[ -z "$dbs" ]]; then
|
||||
echo "POSTGRES_DB_LIST is empty; nothing to dump." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for db in $dbs; do
|
||||
out="$PD_DB_DUMP_ROOT/${db}_${stamp}.sql.gz"
|
||||
echo "Dumping Postgres database '$db' to $out"
|
||||
docker_cmd exec "$POSTGRES_CONTAINER" pg_dump -U postgres "$db" | gzip -9 > "$out"
|
||||
done
|
||||
|
||||
echo "Postgres dumps complete: $PD_DB_DUMP_ROOT"
|
||||
51
automation/bin/pd_backup_sync_to_serenity.sh
Executable file
51
automation/bin/pd_backup_sync_to_serenity.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
# shellcheck disable=SC1091
|
||||
source "$SCRIPT_DIR/pd_backup_lib.sh"
|
||||
|
||||
ssh_opts="$(ssh_args)"
|
||||
remote_root="$SERENITY_BACKUP_HOST:$SERENITY_BACKUP_ROOT"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
ssh $ssh_opts "$SERENITY_BACKUP_HOST" mkdir -p \
|
||||
"$SERENITY_BACKUP_ROOT/appdata" \
|
||||
"$SERENITY_BACKUP_ROOT/databases" \
|
||||
"$SERENITY_BACKUP_ROOT/tank-docker" \
|
||||
"$SERENITY_BACKUP_ROOT/db-dumps"
|
||||
|
||||
rsync_cmd=(
|
||||
rsync -a --delete
|
||||
--exclude '*.sqlite-journal'
|
||||
--exclude '*.db-journal'
|
||||
--exclude '*.sqlite-wal'
|
||||
--exclude '*.db-wal'
|
||||
--exclude '*.tmp'
|
||||
)
|
||||
rsync_cmd+=( -e "$(ssh_cmd)" )
|
||||
|
||||
run_rsync() {
|
||||
local label="$1"
|
||||
shift
|
||||
echo "$label"
|
||||
set +e
|
||||
"${rsync_cmd[@]}" "$@"
|
||||
local rc=$?
|
||||
set -e
|
||||
if [[ $rc -eq 24 ]]; then
|
||||
echo "rsync completed with vanished-file warning (code 24); treating as acceptable for live appdata."
|
||||
return 0
|
||||
fi
|
||||
return $rc
|
||||
}
|
||||
|
||||
run_rsync "Syncing appdata to Serenity" "$PD_APPDATA_ROOT/" "$remote_root/appdata/"
|
||||
|
||||
run_rsync "Syncing database volume roots to Serenity" "$PD_DATABASES_ROOT/" "$remote_root/databases/"
|
||||
|
||||
run_rsync "Syncing selected tank docker data to Serenity" "$PD_TANK_DOCKER_ROOT/" "$remote_root/tank-docker/"
|
||||
|
||||
run_rsync "Syncing DB dumps to Serenity" "$PD_DB_DUMP_ROOT/" "$remote_root/db-dumps/"
|
||||
|
||||
echo "Serenity sync complete: $remote_root"
|
||||
9
automation/bin/run_pd_backups.sh
Executable file
9
automation/bin/run_pd_backups.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
"$SCRIPT_DIR/pd_backup_postgres.sh"
|
||||
"$SCRIPT_DIR/pd_backup_sync_to_serenity.sh"
|
||||
|
||||
echo "PD backup run complete."
|
||||
Reference in New Issue
Block a user