1c7bfdf421
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.
82 lines
2.6 KiB
Bash
Executable File
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."
|