scripts/restore.sh
Rama main · réplica de lectura del repositorio original.
#!/usr/bin/env bash
# Restore a gramsrv backup bundle produced by ./scripts/backup.sh.
#
# The bundle carries the database, the media and key tree, and the configuration,
# so a restore is: put the repository in place, replay the bundle, then start the
# services. Read this script before running it against a live instance; it will
# refuse to overwrite files unless --force is given.
set -euo pipefail
usage() {
cat <<'EOF'
Usage: ./scripts/restore.sh --from DIR [gramsrv-backup flags]
Runs gramsrv-backup restore with defaults for a monolith deployment:
--from bundle directory (required)
--repo-dir deployment root receiving .env and data/ (default: repo root)
--component server, grammystore or all (default: every component present)
--dsn target PostgreSQL DSN (default: read from the restored .env)
--pg-tools local or docker (default: docker when docker is available)
--dry-run print the plan without writing anything
--force overwrite existing files in the data tree
Examples:
# Inspect what a bundle would do.
./scripts/restore.sh --from /srv/backups/20261004 --dry-run
# Restore the database and the media tree onto this host.
./scripts/restore.sh --from /srv/backups/20261004 --force
# Restore only the store bot database.
./scripts/restore.sh --from /srv/backups/20261004 --component grammystore
Run './scripts/restore.sh --help' for the full flag list.
EOF
}
script_dir=$(CDPATH='' cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
repo_root=$(CDPATH='' cd -- "$script_dir/.." && pwd)
binary="$repo_root/bin/gramsrv-backup"
has_flag() {
local name=$1
shift
local arg
for arg in "$@"; do
[[ $arg == "$name" || $arg == "$name="* ]] && return 0
done
return 1
}
build_binary() {
command -v go >/dev/null 2>&1 || {
printf 'restore.sh: go is required to build %s\n' "$binary" >&2
return 1
}
printf 'restore.sh: building %s\n' "$binary" >&2
(cd "$repo_root" && GOFLAGS=-p=1 go build -o "$binary" ./cmd/gramsrv-backup)
}
docker_available() {
command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1
}
if has_flag --help "$@"; then
usage
exit 0
fi
[[ -x $binary ]] || build_binary
args=()
if ! has_flag --repo-dir "$@"; then
args+=(--repo-dir "$repo_root")
fi
if ! has_flag --pg-tools "$@" && docker_available; then
args+=(--pg-tools docker)
fi
cd "$repo_root"
exec "$binary" restore "${args[@]}" "$@"