#!/bin/sh set -eu cd "$(dirname "$0")/../.." backup_file="${1:-}" confirmation="${2:-}" project="${COMPOSE_PROJECT_NAME:-mobilityops}" compose_files="-f compose.yaml -f compose.unraid.yaml" if [ ! -f "$backup_file" ]; then echo "Backup file not found: $backup_file" >&2 exit 1 fi if [ "$confirmation" != "RESTORE-MOBILITYOPS" ]; then echo "Refusing destructive restore; pass RESTORE-MOBILITYOPS as the second argument" >&2 exit 1 fi docker compose -p "$project" $compose_files exec -T db pg_restore --list \ < "$backup_file" > /dev/null safety_backup="$(./deploy/unraid/backup-postgres.sh)" echo "Pre-restore safety backup: $safety_backup" restart_api() { docker compose -p "$project" $compose_files up -d api web > /dev/null } trap restart_api EXIT INT TERM docker compose -p "$project" $compose_files stop api > /dev/null docker compose -p "$project" $compose_files exec -T db sh -eu -c \ 'dropdb --force -U "$POSTGRES_USER" "$POSTGRES_DB" && createdb -U "$POSTGRES_USER" "$POSTGRES_DB"' docker compose -p "$project" $compose_files exec -T db sh -eu -c \ 'pg_restore --no-owner --no-acl -U "$POSTGRES_USER" -d "$POSTGRES_DB"' \ < "$backup_file" restart_api trap - EXIT INT TERM docker compose -p "$project" $compose_files exec -T api alembic current echo "Restore completed from $backup_file"