diff --git a/scripts/export_ems_db.sh b/scripts/export_ems_db.sh new file mode 100755 index 0000000..389f76e --- /dev/null +++ b/scripts/export_ems_db.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# Export databáze EMS z lokálního Docker Compose (služba db musí běžet). +# +# Použití (z kořene repa, kde je docker-compose.yml a .env): +# ./scripts/export_ems_db.sh +# ./scripts/export_ems_db.sh ~/zálohy/ems.dump +# +# Výstup: pg_dump -Fc (custom format) – vhodné pro pg_restore na server. +# Volitelně: COMPOSE_FILE, ENV_FILE (cesty k compose / .env). + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +cd "$REPO_ROOT" + +COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}" +ENV_FILE="${ENV_FILE:-.env}" + +if [[ ! -f "$COMPOSE_FILE" ]]; then + echo "ERROR: compose file not found: $COMPOSE_FILE" >&2 + exit 1 +fi + +if [[ -f "$ENV_FILE" ]]; then + set -a + # shellcheck disable=SC1090 + source "$ENV_FILE" + set +a +else + echo "WARN: $ENV_FILE missing – DB_USER / DB_PASSWORD musí být v prostředí" >&2 +fi + +: "${DB_USER:?Set DB_USER in .env or environment}" +: "${DB_PASSWORD:?Set DB_PASSWORD in .env or environment}" + +OUT="${1:-./ems_backup_$(date +%Y%m%d_%H%M%S).dump}" +OUT="$(cd "$(dirname "$OUT")" && pwd)/$(basename "$OUT")" + +if ! docker compose -f "$COMPOSE_FILE" ps --status running -q db | grep -q .; then + echo "ERROR: služba db neběží. Spusť: docker compose -f $COMPOSE_FILE up -d db" >&2 + exit 1 +fi + +echo "Exportuji ems -> $OUT" +docker compose -f "$COMPOSE_FILE" exec -T \ + -e "PGPASSWORD=${DB_PASSWORD}" \ + db \ + pg_dump -U "$DB_USER" -d ems -Fc --no-owner --no-acl -f /tmp/ems_export.dump + +docker compose -f "$COMPOSE_FILE" cp "db:/tmp/ems_export.dump" "$OUT" +docker compose -f "$COMPOSE_FILE" exec -T db rm -f /tmp/ems_export.dump + +echo "Hotovo: $OUT" +echo "Na server: scp \"$OUT\" user@server:/tmp/ems.dump" diff --git a/scripts/import_ems_db.sh b/scripts/import_ems_db.sh new file mode 100755 index 0000000..c0e6df4 --- /dev/null +++ b/scripts/import_ems_db.sh @@ -0,0 +1,77 @@ +#!/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. + +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)."