backup.sh now also streams the fiscal-hub container's release binaries (dist tarball, never in Postgres) into BACKUP_DIR alongside the pg_dump, with the same 14-backup retention; restore_releases.sh is the companion restore. Verified with a real restore smoke test in production: the restored dump's agent_releases row and the restored tarball's exe both match the published sha256 exactly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
18 lines
1.0 KiB
Bash
18 lines
1.0 KiB
Bash
#!/usr/bin/env sh
|
|
# Restore the release-storage volume (backup.sh's *.tgz) into the Hub.
|
|
# DESTRUCTIVE for the current release binaries: asks for confirmation. The
|
|
# AgentRelease metadata (version/sha256/status) lives in Postgres, not here —
|
|
# restore that separately with restore.sh from a dump taken around the same time.
|
|
# ./restore_releases.sh ./backups/gti_fiscal_releases_20260923_224551.tgz
|
|
set -eu
|
|
[ $# -eq 1 ] || { echo "usage: $0 <releases_backup.tgz>" >&2; exit 2; }
|
|
FILE="$(basename "$1")"
|
|
COMPOSE="docker compose -f docker-compose.prod.yml --env-file .env"
|
|
[ -s "${BACKUP_DIR:-./backups}/$FILE" ] || { echo "backup not found in ${BACKUP_DIR:-./backups}: $FILE" >&2; exit 1; }
|
|
printf "This REPLACES the current release-storage contents with %s. Type RESTORE to continue: " "$FILE"
|
|
read -r answer
|
|
[ "$answer" = "RESTORE" ] || { echo "aborted"; exit 1; }
|
|
$COMPOSE exec -T fiscal-hub sh -c 'rm -rf /app/data/releases && mkdir -p /app/data/releases'
|
|
$COMPOSE exec -T fiscal-hub tar -C /app/data -xz < "${BACKUP_DIR:-./backups}/$FILE"
|
|
echo "restore ok: $FILE"
|