Something went wrong. Try again.
Personal atproto services deployment handbook
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123#!/usr/bin/env bashset -euo pipefail
ENV_FILE=${PDS_BACKUP_ENV_FILE:-/etc/pds-backup.env}if [ -r "$ENV_FILE" ]; then # shellcheck disable=SC1090 . "$ENV_FILE"fi
R2_BACKUP_PREFIX=${R2_BACKUP_PREFIX:-pds}BACKUP_TMP_DIR=${BACKUP_TMP_DIR:-/tmp}AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-auto}target=/pdsobject_key=force=false
usage() { cat <<'USAGE'Usage: scripts/restore-pds.sh --object <r2-object-key> [--target /pds] [--force]
Environment can be loaded from /etc/pds-backup.env or PDS_BACKUP_ENV_FILE.Required env: R2_ENDPOINT, R2_BACKUP_BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.USAGE}
while [ "$#" -gt 0 ]; do case "$1" in --object) object_key=${2:-} shift 2 ;; --target) target=${2:-} shift 2 ;; --force) force=true shift ;; -h|--help) usage exit 0 ;; *) printf 'Unknown argument: %s\n' "$1" >&2 usage >&2 exit 2 ;; esacdone
if [ -z "$object_key" ]; then printf 'Missing --object.\n' >&2 usage >&2 exit 2fi
for var_name in R2_ENDPOINT R2_BACKUP_BUCKET AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY; do if [ -z "${!var_name:-}" ]; then printf 'Missing required environment variable: %s\n' "$var_name" >&2 exit 2 fidoneexport AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION
for cmd in aws tar mktemp; do if ! command -v "$cmd" >/dev/null 2>&1; then printf 'Missing required command: %s\n' "$cmd" >&2 exit 2 fidone
if [ -e "$target" ] && [ "$(find "$target" -mindepth 1 -maxdepth 1 2>/dev/null | wc -l | tr -d ' ')" != "0" ] && [ "$force" != true ]; then printf 'Target exists and is not empty: %s\nUse --force to overwrite.\n' "$target" >&2 exit 2fi
tmp_dir=$(mktemp -d "${BACKUP_TMP_DIR%/}/pds-restore.XXXXXX")archive_path="$tmp_dir/backup.tar.gz"aws_config="$tmp_dir/aws-config"
cleanup() { rm -rf "$tmp_dir"}trap cleanup EXIT
cat > "$aws_config" <<EOF[default]region = ${AWS_DEFAULT_REGION}request_checksum_calculation = when_requiredresponse_checksum_validation = when_requireds3 = addressing_style = pathEOFexport AWS_CONFIG_FILE="$aws_config"
aws --endpoint-url "$R2_ENDPOINT" s3 cp "s3://${R2_BACKUP_BUCKET}/${object_key}" "$archive_path" --only-show-errors
tar -C "$tmp_dir" -xzf "$archive_path"
source_dir="$tmp_dir/${target#/}"if [ ! -d "$source_dir" ]; then if [ -d "$tmp_dir/pds" ]; then source_dir="$tmp_dir/pds" else printf 'Archive did not contain expected pds directory.\n' >&2 exit 2 fifi
mkdir -p "$target"if [ "$force" = true ]; then find "$target" -mindepth 1 -maxdepth 1 -exec rm -rf {} +fi
if command -v rsync >/dev/null 2>&1; then rsync -a "$source_dir"/ "$target"/else cp -a "$source_dir"/. "$target"/fi
printf 'Restored %s to %s\n' "$object_key" "$target"