#!/bin/bash # Postgres backup/restore hook for immich's VectorChord/pgvecto.rs `database` service. # Two image-specific constraints: # 1. Never DROP DATABASE — the bundled pgvecto.rs worker PANICs and crashes the server. # So `pg_dump --clean --if-exists` does a per-object replace in the live DB on restore. # 2. Restore rewrites the dump's empty search_path back to `public, pg_catalog` so VectorChord # types resolve (per https://docs.immich.app/administration/backup-and-restore). set -e BACKUP_FILE='/var/lib/postgresql/data/backup.sql' export PGPASSWORD=$(cat "${POSTGRES_PASSWORD_FILE:-/run/secrets/db_password}") DB_USER="${POSTGRES_USER:-postgres}" DB_NAME="${POSTGRES_DB:-immich}" function backup { pg_dump --clean --if-exists -U "$DB_USER" "$DB_NAME" | gzip > "$BACKUP_FILE" } function restore { gunzip -c "$BACKUP_FILE" \ | sed "s/SELECT pg_catalog.set_config('search_path', '', false);/SELECT pg_catalog.set_config('search_path', 'public, pg_catalog', true);/g" \ | psql -U "$DB_USER" -d "$DB_NAME" -f - } $@