#!/usr/bin/env bash set -euo pipefail # Restore resume postgres + minio from pre-split monolith named volumes into bind mounts. # Safe to re-run: stops stack, copies from htpc-download-box_* volumes, restarts postgres. OLD_PG_VOL="${OLD_PG_VOL:-htpc-download-box_postgres_data}" OLD_MINIO_VOL="${OLD_MINIO_VOL:-htpc-download-box_minio_data}" PG_BIND="${PG_BIND:-/config/resume/postgres}" MINIO_BIND="${MINIO_BIND:-/storage1/labdata/resume/minio}" echo "=== stop resume stack services ===" docker stop resume minio_resume postgres_resume 2>/dev/null || true echo "=== restore postgres: ${OLD_PG_VOL} -> ${PG_BIND} ===" docker run --rm \ -v "${OLD_PG_VOL}:/from:ro" \ -v "${PG_BIND}:/to" \ alpine sh -c 'rm -rf /to/* /to/.[!.]* /to/..?* 2>/dev/null || true; cp -a /from/. /to/; chown -R 70:70 /to' echo "=== restore minio objects: ${OLD_MINIO_VOL}/default -> ${MINIO_BIND}/default ===" docker run --rm \ -v "${OLD_MINIO_VOL}:/from:ro" \ -v "${MINIO_BIND}:/to" \ alpine sh -c 'mkdir -p /to/default; rm -rf /to/default/* 2>/dev/null || true; cp -a /from/default/. /to/default/ 2>/dev/null || true' echo "=== start postgres ===" docker start postgres_resume for i in $(seq 1 30); do if docker exec postgres_resume pg_isready -U postgres -d postgres >/dev/null 2>&1; then break fi sleep 1 done docker exec postgres_resume pg_isready -U postgres -d postgres echo "=== verify restored data ===" docker exec postgres_resume psql -U postgres -d postgres -c 'SELECT email, username FROM "user"; SELECT slug, is_public FROM resume;' echo "=== align resume user email with Authentik (3nigma.matt@gmail.com) for OAuth linking ===" docker exec postgres_resume psql -U postgres -d postgres -c "UPDATE \"user\" SET email = '3nigma.matt@gmail.com' WHERE username = 'ginnoir';" echo "=== start minio + resume (if compose project exists) ===" docker start minio_resume 2>/dev/null || true docker start resume 2>/dev/null || true echo "done — if resume container was ad-hoc recreated, redeploy stacks/resume via Portainer after git push"