Files
EvoFirewall/deploy/docker/restore.sh
T
Denozordec ce90fa9701
quality / changes (push) Successful in 7s
quality / commitlint (push) Skipped
quality / openapi (push) Successful in 27s
quality / web (push) Successful in 48s
quality / api (push) Successful in 1m13s
quality / linux-agent-smoke (push) Successful in 22s
quality / docker-check (push) Successful in 4m43s
CD / quality (push) Successful in 7m42s
CD / publish (push) Successful in 5m17s
fix(ci): restore backups through remote Docker API
2026-10-26 14:28:36 +07:00

36 lines
1.7 KiB
Bash

#!/usr/bin/env sh
set -eu
image="${1:?Usage: restore.sh IMAGE VOLUME BACKUP_FILE}"
volume="${2:?VOLUME required}"
backup="${3:?BACKUP_FILE required}"
[ -f "$backup" ] || { echo 'Backup file missing' >&2; exit 1; }
backup="$(cd "$(dirname "$backup")" && pwd)/$(basename "$backup")"
# Named volumes only. All users must remain stopped for the whole operation.
docker volume inspect "$volume" >/dev/null
active="$(docker ps -q --filter "volume=$volume")"
[ -z "$active" ] || { echo 'Stop every container using the volume before restore' >&2; exit 1; }
helper="evofw-restore-$(date +%s)-$$"
cleanup() {
result=$?
trap - EXIT HUP INT TERM
# -v removes anonymous helper volumes only, never the target named volume.
docker rm -fv "$helper" >/dev/null 2>&1 || true
exit "$result"
}
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
# Transfer input through the Docker API, including when its daemon is remote.
docker create --name "$helper" --network none --cap-drop ALL \
--security-opt no-new-privileges:true --mount "type=volume,src=$volume,dst=/data" \
--entrypoint node "$image" tools/sqlite-backup.mjs restore /tmp/evofw-restore-input.db /data/app.db --offline >/dev/null
docker cp "$backup" "$helper:/tmp/evofw-restore-input.db"
active="$(docker ps -q --filter "volume=$volume")"
[ -z "$active" ] || { echo 'Target volume became active before restore; helper was not started' >&2; exit 1; }
docker start --attach "$helper"
result="$(docker wait "$helper")"
case "$result" in ''|*[!0-9]*) echo 'Invalid restore container exit status' >&2; exit 1;; esac
[ "$result" -le 255 ] || { echo 'Invalid restore container exit status' >&2; exit 1; }
exit "$result"