import DB z druhe instance
Some checks failed
test / smoke-test (push) Successful in 5s
deploy / deploy (push) Has been cancelled

This commit is contained in:
Dusan Vojacek
2026-04-04 23:21:33 +02:00
parent 8a457b7668
commit b46388ac0b
2 changed files with 132 additions and 0 deletions

55
scripts/export_ems_db.sh Executable file
View File

@@ -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"

77
scripts/import_ems_db.sh Executable file
View File

@@ -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)."