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>
28 lines
1.7 KiB
Bash
28 lines
1.7 KiB
Bash
#!/usr/bin/env sh
|
|
# PostgreSQL + release-storage backup of the GTI Fiscal Hub (restorable with
|
|
# restore.sh + restore_releases.sh). Run from deploy/hub.
|
|
# ./backup.sh -> ./backups/gti_fiscal_YYYYmmdd_HHMMSS.dump (Postgres, last 14 kept)
|
|
# -> ./backups/gti_fiscal_releases_YYYYmmdd_HHMMSS.tgz (release binaries + AgentRelease metadata is IN the dump above)
|
|
set -eu
|
|
COMPOSE="docker compose -f docker-compose.prod.yml --env-file .env"
|
|
DIR="${BACKUP_DIR:-./backups}"
|
|
mkdir -p "$DIR"
|
|
STAMP="$(date +%Y%m%d_%H%M%S)"
|
|
FILE="gti_fiscal_${STAMP}.dump"
|
|
$COMPOSE exec -T postgres pg_dump -U gti -d gti_fiscal -Fc -f "/backups/${FILE}"
|
|
[ -s "$DIR/$FILE" ] || { echo "backup empty or missing: $DIR/$FILE" >&2; exit 1; }
|
|
# Retention runs inside the container: Docker creates the bind-mounted
|
|
# backup directory as root, so a host-side rm would fail from the 15th dump.
|
|
$COMPOSE exec -T postgres sh -c 'ls -1t /backups/gti_fiscal_*.dump | tail -n +15 | xargs -r rm -f'
|
|
echo "backup ok: $DIR/$FILE"
|
|
|
|
# Release storage (central/app/release_storage.py: every published Agent
|
|
# package zip/exe, never in Postgres — only its metadata is, in the dump
|
|
# above). Streamed out of the fiscal-hub container's stdout so this works
|
|
# regardless of the compose project/container name.
|
|
RELEASES_FILE="gti_fiscal_releases_${STAMP}.tgz"
|
|
$COMPOSE exec -T fiscal-hub tar -C /app/data -cz releases > "$DIR/$RELEASES_FILE"
|
|
[ -s "$DIR/$RELEASES_FILE" ] || { echo "release backup empty or missing: $DIR/$RELEASES_FILE" >&2; exit 1; }
|
|
find "$DIR" -maxdepth 1 -name 'gti_fiscal_releases_*.tgz' -type f -printf '%T@ %p\n' 2>/dev/null | sort -rn | tail -n +15 | cut -d' ' -f2- | xargs -r rm -f
|
|
echo "release storage backup ok: $DIR/$RELEASES_FILE"
|