#!/bin/sh set -eu PROJECT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) cd "$PROJECT_DIR" if [ "$#" -ne 1 ]; then echo "Usage: $0 " echo "Example: $0 backups/mineseeker-postgres.2026-08-18.120000.dump" exit 1 fi BACKUP_FILE=$1 if [ ! -f "$BACKUP_FILE" ]; then echo "Error: Backup file not found: $BACKUP_FILE" exit 1 fi CONTAINER_ID=$(docker compose ps -q db) if [ -z "$CONTAINER_ID" ]; then echo "Error: The MineSeeker PostgreSQL service is not running." exit 1 fi DB_USER=$(docker inspect "$CONTAINER_ID" --format '{{range .Config.Env}}{{println .}}{{end}}' | sed -n 's/^POSTGRES_USER=//p') if [ -z "$DB_USER" ]; then echo "Error: Could not read POSTGRES_USER from the db service." exit 1 fi echo "Verifying PostgreSQL archive..." docker exec -i "$CONTAINER_ID" pg_restore --list < "$BACKUP_FILE" > /dev/null echo "Archive OK." printf 'WARNING: This replaces the current MineSeeker database. Type yes to continue: ' read -r CONFIRM if [ "$CONFIRM" != 'yes' ]; then echo "Aborted." exit 1 fi APP_WAS_RUNNING=0 SCHEDULER_WAS_RUNNING=0 [ -n "$(docker compose ps -q app)" ] && APP_WAS_RUNNING=1 [ -n "$(docker compose ps -q scheduler)" ] && SCHEDULER_WAS_RUNNING=1 restart_services() { [ "$APP_WAS_RUNNING" -eq 1 ] && docker compose start app || true [ "$SCHEDULER_WAS_RUNNING" -eq 1 ] && docker compose start scheduler || true } trap restart_services EXIT echo "Stopping MineSeeker services that use PostgreSQL..." docker compose stop app scheduler echo "Restoring PostgreSQL backup: $BACKUP_FILE" docker exec -i "$CONTAINER_ID" pg_restore \ --username="$DB_USER" \ --dbname=postgres \ --clean \ --create \ --if-exists \ --exit-on-error < "$BACKUP_FILE" echo "Restore complete."