Files
hoerdle/scripts/migration-precopy.sh
T
Hördle Bot 1c7bfdf421 Ops: add Proxmox migration tooling and runbook
Add end-to-end migration scripts for inventory, precopy, cutover, smoke tests, rollback, and post-migration checks. Include an operational runbook and Proxmox env template to move Hördle behind Nginx Proxy Manager while preserving persistent volumes safely.
2026-04-25 09:46:52 +00:00

82 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# Vorabkopie der persistenten Daten von Quelle -> Ziel (App bleibt online).
# Auf dem Quellsystem ausfuehren.
TARGET_HOST="${TARGET_HOST:-root@10.0.0.19}"
TARGET_APP_DIR="${TARGET_APP_DIR:-/opt/hoerdle}"
SOURCE_APP_DIR="${SOURCE_APP_DIR:-$(pwd)}"
SSH_OPTS="${SSH_OPTS:-}"
cd "$SOURCE_APP_DIR"
require_cmd() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Fehlend: $1"
exit 1
fi
}
require_cmd rsync
require_cmd ssh
require_cmd sha256sum
require_cmd find
echo "== Hördle Precopy =="
echo "Quelle: $(pwd)"
echo "Ziel: $TARGET_HOST:$TARGET_APP_DIR"
echo
for d in data public/uploads; do
if [ ! -d "$d" ]; then
echo "Pfad fehlt: $d"
exit 1
fi
done
echo "-- Zielordner sicherstellen --"
ssh $SSH_OPTS "$TARGET_HOST" "mkdir -p '$TARGET_APP_DIR/data' '$TARGET_APP_DIR/public/uploads'"
echo
echo "-- Vorabkopie data/ --"
rsync -aHAX --numeric-ids --delete \
-e "ssh $SSH_OPTS" \
"./data/" "$TARGET_HOST:$TARGET_APP_DIR/data/"
echo
echo "-- Vorabkopie public/uploads/ --"
rsync -aHAX --numeric-ids --delete \
-e "ssh $SSH_OPTS" \
"./public/uploads/" "$TARGET_HOST:$TARGET_APP_DIR/public/uploads/"
echo
echo "-- Verifikation (Dateien/Groesse) --"
LOCAL_DATA_COUNT="$(find data -type f 2>/dev/null | wc -l)"
REMOTE_DATA_COUNT="$(ssh $SSH_OPTS "$TARGET_HOST" "cd '$TARGET_APP_DIR' && find data -type f 2>/dev/null | wc -l")"
echo "data files local=$LOCAL_DATA_COUNT remote=$REMOTE_DATA_COUNT"
LOCAL_UPLOAD_COUNT="$(find public/uploads -type f 2>/dev/null | wc -l)"
REMOTE_UPLOAD_COUNT="$(ssh $SSH_OPTS "$TARGET_HOST" "cd '$TARGET_APP_DIR' && find public/uploads -type f 2>/dev/null | wc -l")"
echo "uploads files local=$LOCAL_UPLOAD_COUNT remote=$REMOTE_UPLOAD_COUNT"
LOCAL_DATA_SIZE="$(du -sb data | awk '{print $1}')"
REMOTE_DATA_SIZE="$(ssh $SSH_OPTS "$TARGET_HOST" "du -sb '$TARGET_APP_DIR/data' | awk '{print \$1}'")"
echo "data bytes local=$LOCAL_DATA_SIZE remote=$REMOTE_DATA_SIZE"
LOCAL_UPLOAD_SIZE="$(du -sb public/uploads | awk '{print $1}')"
REMOTE_UPLOAD_SIZE="$(ssh $SSH_OPTS "$TARGET_HOST" "du -sb '$TARGET_APP_DIR/public/uploads' | awk '{print \$1}'")"
echo "uploads bytes local=$LOCAL_UPLOAD_SIZE remote=$REMOTE_UPLOAD_SIZE"
echo
if [ -f "data/prod.db" ]; then
echo "-- DB Hash Vergleich (Precopy) --"
LOCAL_HASH="$(sha256sum data/prod.db | awk '{print $1}')"
REMOTE_HASH="$(ssh $SSH_OPTS "$TARGET_HOST" "sha256sum '$TARGET_APP_DIR/data/prod.db' | awk '{print \$1}'")"
echo "prod.db sha256 local=$LOCAL_HASH"
echo "prod.db sha256 remote=$REMOTE_HASH"
fi
echo
echo "Precopy abgeschlossen. Fuer konsistente Enddaten jetzt Cutover ausfuehren."