Files
ems/scripts/import_ems_db.sh
Dusan Vojacek 38e5af5373
Some checks failed
deploy / deploy (push) Failing after 9s
test / smoke-test (push) Has been cancelled
dalsi fixly
2026-04-05 03:10:01 +02:00

80 lines
2.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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)."