63 lines
1.7 KiB
Bash
63 lines
1.7 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ENV_FILE="${ENV_FILE:-./.env}"
|
|
if [[ -f "$ENV_FILE" ]]; then
|
|
set -a
|
|
# shellcheck source=/dev/null
|
|
. "$ENV_FILE"
|
|
set +a
|
|
fi
|
|
|
|
if [[ -z "${BACKUP_FILE:-}" ]]; then
|
|
echo "BACKUP_FILE is required."
|
|
exit 1
|
|
fi
|
|
if [[ ! -f "$BACKUP_FILE" ]]; then
|
|
echo "BACKUP_FILE does not exist: $BACKUP_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
CHECKSUM_FILE="${BACKUP_FILE}.sha256"
|
|
if [[ ! -f "$CHECKSUM_FILE" ]]; then
|
|
echo "Missing checksum file: ${CHECKSUM_FILE}"
|
|
exit 1
|
|
fi
|
|
EXPECTED_HASH="$(awk '{print $1; exit}' "$CHECKSUM_FILE")"
|
|
if [[ ! "$EXPECTED_HASH" =~ ^[A-Fa-f0-9]{64}$ ]]; then
|
|
echo "Invalid checksum format in: ${CHECKSUM_FILE}"
|
|
exit 1
|
|
fi
|
|
ACTUAL_HASH="$(sha256sum "$BACKUP_FILE" | awk '{print $1}')"
|
|
if [[ "$ACTUAL_HASH" != "$EXPECTED_HASH" ]]; then
|
|
echo "Backup checksum verification failed for: ${BACKUP_FILE}"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "${DATABASE_URL:-}" ]]; then
|
|
echo "DATABASE_URL is required."
|
|
exit 1
|
|
fi
|
|
|
|
RESTORE_DB="${RESTORE_DB:-skymoney_restore_test}"
|
|
RESTORE_URL="${RESTORE_DATABASE_URL:-}"
|
|
ADMIN_URL="${ADMIN_DATABASE_URL:-$DATABASE_URL}"
|
|
|
|
if [[ ! "$RESTORE_DB" =~ ^[A-Za-z0-9_]+$ ]]; then
|
|
echo "RESTORE_DB must match ^[A-Za-z0-9_]+$"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "$RESTORE_URL" ]]; then
|
|
echo "RESTORE_DATABASE_URL is required (example: postgresql://user:pass@host:5432/${RESTORE_DB})."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Creating restore database: ${RESTORE_DB}"
|
|
psql "$ADMIN_URL" -v ON_ERROR_STOP=1 -c "DROP DATABASE IF EXISTS \"${RESTORE_DB}\";" >/dev/null
|
|
psql "$ADMIN_URL" -v ON_ERROR_STOP=1 -c "CREATE DATABASE \"${RESTORE_DB}\";" >/dev/null
|
|
|
|
pg_restore --no-owner --no-privileges --dbname="$RESTORE_URL" "$BACKUP_FILE"
|
|
|
|
echo "Restore completed into: ${RESTORE_DB}"
|