#!/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" <"$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"