#!/bin/sh # Restores a Siftlode Postgres dump created by backup.sh into the running db container. # Usage: ./scripts/restore.sh backups/siftlode-YYYYMMDD-HHMMSS.dump # # Restoring the database does NOT restore the secrets that decrypt it. If this dump is from an # instance with a different TOKEN_ENCRYPTION_KEY than the current .env, the encrypted sysconfig # values and refresh tokens will not be readable. See docs/self-hosting.md § Backups. set -e # See backup.sh: the documented self-host layout ships only docker-compose.selfhost.yml, so plain # `docker compose` has no configuration file to find there. if [ -z "${COMPOSE_FILE:-}" ] && [ ! -f docker-compose.yml ] && [ -f docker-compose.selfhost.yml ]; then COMPOSE_FILE=docker-compose.selfhost.yml export COMPOSE_FILE fi FILE="$1" if [ -z "$FILE" ]; then echo "Usage: restore.sh "; exit 1; fi if [ ! -f "$FILE" ]; then echo "Dump file not found: $FILE"; exit 1; fi USER_NAME="${POSTGRES_USER:-siftlode}" DB_NAME="${POSTGRES_DB:-siftlode}" # pg_restore exits non-zero for ignorable warnings too (--clean --if-exists on a fresh database # reports every missing object it tried to drop), so a non-zero code is reported as "check this", # not swallowed and not dressed up as success. if docker compose exec -T db pg_restore -U "$USER_NAME" -d "$DB_NAME" --clean --if-exists < "$FILE"; then echo "Restored $FILE" else echo "pg_restore reported errors while restoring $FILE — read the output above before treating this instance as restored." >&2 exit 1 fi