#!/usr/bin/env bash # Import zálohy EMS (pg_dump -Fc) do Postgresu v Dockeru na serveru. # # Předpoklad: čerstvý volume nebo vědomá obnova přes existující data. # Spouštěj na serveru z /opt/ems-deploy (nebo nastav EMS_DEPLOY_ROOT). # # Postup (nová instance, ještě bez plného stacku): # 1) /opt/ems-deploy/.env vyplněné (DB_USER, DB_PASSWORD stejné jako v cílové DB – po initu db) # 2) docker compose -f /opt/ems-deploy/docker-compose.yml --env-file /opt/ems-deploy/.env up -d db # 3) Počkej na healthy: docker compose ... ps # 4) bash app/scripts/import_ems_db.sh /tmp/ems.dump # 5) Celý stack: /opt/ems-deploy/deploy.sh (nebo docker compose up -d) # # Volby prostředí: # EMS_DEPLOY_ROOT=/opt/ems-deploy (výchozí) # COMPOSE_FILE, ENV_FILE – přepíšou cesty k souborům # # Poznámky: # - Záloha musí být z podobného stacku (Postgres 16 + Timescale). Jiná major verze může selhat. # - Dump by měl obsahovat i Flyway metadata (tabulku historie), jinak při dalším startu Flyway znovu spustí migrace a může spadnout. # - TimescaleDB: u pg_restore nepoužívejte paralelizaci (-j); může zůstat nekonzistentní katalog chunků # (chyba „chunk not found“ / selhání ADD PK na hypertable). Viz dokumentace Timescale backup/restore. set -euo pipefail ROOT="${EMS_DEPLOY_ROOT:-/opt/ems-deploy}" COMPOSE_FILE="${COMPOSE_FILE:-$ROOT/docker-compose.yml}" ENV_FILE="${ENV_FILE:-$ROOT/.env}" if [[ $# -lt 1 ]]; then echo "Usage: $0 /cesta/k/ems.dump" >&2 exit 1 fi DUMP="$(readlink -f "$1")" if [[ ! -f "$DUMP" ]]; then echo "ERROR: soubor neexistuje: $DUMP" >&2 exit 1 fi if [[ ! -f "$COMPOSE_FILE" ]]; then echo "ERROR: compose not found: $COMPOSE_FILE" >&2 exit 1 fi if [[ ! -f "$ENV_FILE" ]]; then echo "ERROR: .env not found: $ENV_FILE" >&2 exit 1 fi set -a # shellcheck disable=SC1090 source "$ENV_FILE" set +a : "${DB_USER:?DB_USER missing in $ENV_FILE}" : "${DB_PASSWORD:?DB_PASSWORD missing in $ENV_FILE}" cd "$ROOT" if ! docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps --status running -q db | grep -q .; then echo "ERROR: db neběží. Spusť jen databázi, např.:" >&2 echo " docker compose -f \"$COMPOSE_FILE\" --env-file \"$ENV_FILE\" up -d db" >&2 exit 1 fi CID="$(docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" ps -q db)" echo "Kopíruji dump do kontejneru..." docker cp "$DUMP" "${CID}:/tmp/ems_import.dump" echo "Obnovuji databázi ems (--clean smaže existující objekty ve schématech ze zálohy)..." docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T \ -e "PGPASSWORD=${DB_PASSWORD}" \ db \ pg_restore -U "$DB_USER" -d ems --clean --if-exists --no-owner --no-acl --verbose /tmp/ems_import.dump docker compose -f "$COMPOSE_FILE" --env-file "$ENV_FILE" exec -T db rm -f /tmp/ems_import.dump echo "Import dokončen. Spusť zbytek stacku (deploy.sh nebo docker compose up -d)."