73 lines
2.9 KiB
Bash
Executable File
73 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
umask 077
|
|
|
|
RECOVERY_BUNDLE=${1:-}
|
|
AGE_IDENTITY=${2:-}
|
|
SOURCE_BUNDLE=${3:-}
|
|
RELEASE_DIR=${4:-}
|
|
ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
|
|
|
|
die() { printf 'FEHLER: %s\n' "$*" >&2; exit 1; }
|
|
[[ $EUID -eq 0 ]] || die "Bitte als root ausführen."
|
|
[[ -s $RECOVERY_BUNDLE ]] || die "Recovery-Bundle fehlt."
|
|
[[ -s $AGE_IDENTITY ]] || die "age-Identität fehlt."
|
|
[[ -s $SOURCE_BUNDLE ]] || die "Git-Quellbundle fehlt."
|
|
[[ -n $RELEASE_DIR && $RELEASE_DIR == /data/* ]] || \
|
|
die "Release-Ziel muss ein eindeutiger Pfad unter /data sein."
|
|
[[ ! -e $RELEASE_DIR ]] || die "Release-Ziel existiert bereits."
|
|
command -v age >/dev/null || die "age fehlt."
|
|
command -v git >/dev/null || die "git fehlt."
|
|
|
|
stage=$(mktemp -d /tmp/mike-ai-data-kit.XXXXXX)
|
|
trap 'rm -rf "$stage"' EXIT
|
|
age -d -i "$AGE_IDENTITY" -o "$stage/bundle.tar.gz" "$RECOVERY_BUNDLE"
|
|
tar -C "$stage" -xzf "$stage/bundle.tar.gz" METADATA SHA256SUMS \
|
|
host-config.tar.gz openwebui-data.tar.gz
|
|
(cd "$stage" && sha256sum -c SHA256SUMS)
|
|
commit=$(sed -n 's/^source_commit=//p' "$stage/METADATA" | head -n 1)
|
|
[[ $commit =~ ^[0-9a-f]{40}$ ]] || die "Recovery-Commit in METADATA ist ungültig."
|
|
git clone -q "$SOURCE_BUNDLE" "$stage/source-check"
|
|
git -C "$stage/source-check" cat-file -e "$commit^{commit}"
|
|
|
|
install -d -m 0700 "$RELEASE_DIR"
|
|
install -m 0600 "$RECOVERY_BUNDLE" "$RELEASE_DIR/recovery.tar.age"
|
|
install -m 0600 "$AGE_IDENTITY" "$RELEASE_DIR/recovery.agekey"
|
|
install -m 0600 "$SOURCE_BUNDLE" "$RELEASE_DIR/source.git.bundle"
|
|
install -m 0700 "$ROOT_DIR/platform/recovery/reinstall-from-data.sh" \
|
|
"$RELEASE_DIR/reinstall-athena.sh"
|
|
cat >"$RELEASE_DIR/kit.env" <<EOF
|
|
RECOVERY_COMMIT=$commit
|
|
RECOVERY_BUNDLE=recovery.tar.age
|
|
SOURCE_BUNDLE=source.git.bundle
|
|
AGE_IDENTITY=recovery.agekey
|
|
EOF
|
|
cat >"$RELEASE_DIR/README.txt" <<'EOF'
|
|
ATHENA SELF-CONTAINED DATA-DISK RECOVERY
|
|
|
|
Auf einem frischen Debian die bestehende Data-SSD unter /data einhängen und
|
|
als root ausführen:
|
|
|
|
/data/mike-ai-recovery-kit/reinstall-athena.sh
|
|
|
|
Das Skript prüft alle Dateien, stellt einen persistenten /data-Mount her,
|
|
installiert minimale Werkzeuge und rekonstruiert den vollständigen MikeAI-
|
|
Stack. Erforderliche Treiber-Neustarts werden höchstens dreimal automatisch
|
|
fortgesetzt.
|
|
|
|
SICHERHEIT: Dieses Kit enthält den Entschlüsselungsschlüssel. Wer die Data-SSD
|
|
lesen kann, kann daher auch die enthaltenen Infrastruktur-Secrets entschlüsseln.
|
|
EOF
|
|
chmod 0600 "$RELEASE_DIR/kit.env" "$RELEASE_DIR/README.txt"
|
|
(
|
|
cd "$RELEASE_DIR"
|
|
sha256sum recovery.tar.age recovery.agekey source.git.bundle \
|
|
reinstall-athena.sh kit.env README.txt >SHA256SUMS
|
|
)
|
|
chmod 0600 "$RELEASE_DIR/SHA256SUMS"
|
|
|
|
link=/data/mike-ai-recovery-kit
|
|
[[ ! -e $link || -L $link ]] || die "$link existiert und ist kein verwalteter Symlink."
|
|
ln -sfn "$(basename "$RELEASE_DIR")" "$link"
|
|
printf 'SELF_CONTAINED_DATA_KIT_OK %s -> %s\n' "$link" "$RELEASE_DIR"
|