#!/usr/bin/env bash # # ARGUS restore — loads a backup created by backup.sh into a FRESH ARGUS # installation (empty database, no prior data). To restore onto a machine # that already has data on it, uninstall.sh --remove-data && install.sh # first, then run this. # # cd /opt/argus && ./restore.sh argus-backup-20260719-120000.tar.gz # set -euo pipefail INSTALL_DIR="${ARGUS_INSTALL_DIR:-/opt/argus}" ARCHIVE="${1:-}" bold() { printf '\033[1m%s\033[0m\n' "$1"; } info() { printf ' %s\n' "$1"; } ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; } warn() { printf ' \033[33m!\033[0m %s\n' "$1"; } fail() { printf ' \033[31m✗\033[0m %s\n' "$1" >&2; exit 1; } [ -n "$ARCHIVE" ] || fail "Usage: ./restore.sh " [ -f "$ARCHIVE" ] || fail "No such file: $ARCHIVE" [ -f "$INSTALL_DIR/docker-compose.yml" ] || fail "No ARGUS installation found at $INSTALL_DIR (set ARGUS_INSTALL_DIR if you installed elsewhere)." cd "$INSTALL_DIR" warn "This assumes a freshly installed, empty ARGUS instance." warn "Restoring onto an instance that already has data will fail or corrupt it." printf " Type YES to continue: " read -r CONFIRM [ "$CONFIRM" = "YES" ] || fail "Aborted." WORKDIR="$(mktemp -d)" trap 'rm -rf "$WORKDIR"' EXIT tar xzf "$ARCHIVE" -C "$WORKDIR" [ -f "$WORKDIR/db.sql.gz" ] && [ -f "$WORKDIR/api-data.tar.gz" ] || fail "Not a valid ARGUS backup archive (missing db.sql.gz / api-data.tar.gz)." bold "Stopping the API (keeping the database up)..." docker compose stop api ui nginx >/dev/null bold "Restoring database..." gunzip -c "$WORKDIR/db.sql.gz" | docker compose exec -T db psql -U postgres argus >/dev/null ok "Database restored" bold "Restoring application data..." docker run --rm -v argus_api_data:/data -v "$WORKDIR":/backup alpine \ sh -c "rm -rf /data/* && tar xzf /backup/api-data.tar.gz -C /data" >/dev/null 2>&1 ok "Application data restored" bold "Starting ARGUS..." docker compose up -d echo ok "Restore complete" info "Give it a minute to finish starting, then check: ./healthcheck.sh"