Restore OpenWebUI with its matching image

This commit is contained in:
Mikei386
2026-08-21 14:28:44 +02:00
parent 0c21aed7af
commit 934a4d8ced
3 changed files with 85 additions and 1 deletions
+64 -1
View File
@@ -8,6 +8,8 @@ BACKUP=${1:-}
STACK_DIR=${STACK_DIR:-/opt/mike-ai/stack}
SECRETS_DIR=${SECRETS_DIR:-/etc/mike-ai}
OPENWEBUI_VOLUME=${OPENWEBUI_VOLUME:-mike-ai_open-webui-data}
INSTALL_CONFIG=${INSTALL_CONFIG:-/root/mike-ai-install.env}
REFERENCE_OPENWEBUI_TAG=${REFERENCE_OPENWEBUI_TAG:-mike-ai/openwebui:reference}
die() { printf 'FEHLER: %s\n' "$*" >&2; exit 1; }
log() { printf '\n==> %s\n' "$*"; }
@@ -20,7 +22,8 @@ log() { printf '\n==> %s\n' "$*"; }
ui_archive=$BACKUP/archives/open-webui-migrated.tar.gz
mcp_archive=$BACKUP/archives/mcp-and-search-config.tar.gz
for archive in "$ui_archive" "$mcp_archive"; do
image_archive=$BACKUP/images/openwebui-mcp-images.tar.gz
for archive in "$ui_archive" "$mcp_archive" "$image_archive"; do
[[ -f $archive ]] || die "Archiv fehlt: $archive"
expected=$(awk -v suffix="/${archive#"$BACKUP"/}" \
'$2 ~ suffix "$" {print $1; exit}' "$BACKUP/SHA256SUMS")
@@ -29,6 +32,62 @@ for archive in "$ui_archive" "$mcp_archive"; do
[[ $actual == "$expected" ]] || die "Prüfsumme falsch: $archive"
done
[[ -f $BACKUP/inventory/docker-images.txt ]] || \
die "Docker-Image-Inventar fehlt."
reference_openwebui_image=$(awk \
'$1 == "ghcr.io/open-webui/open-webui" { print $3; exit }' \
"$BACKUP/inventory/docker-images.txt")
[[ $reference_openwebui_image == sha256:* ]] || \
die "Gesicherte OpenWebUI-Image-ID ist nicht eindeutig ermittelbar."
[[ -f $BACKUP/inventory/docker-inspect.json ]] || \
die "Docker-Inspect-Inventar fehlt."
reference_openwebui_ref=$(python3 - "$BACKUP/inventory/docker-inspect.json" <<'PY'
import json
import sys
for container in json.load(open(sys.argv[1], encoding="utf-8")):
name = (container.get("Name") or "").lstrip("/").lower()
if name in {"open-webui", "mike-ai-open-webui"}:
image = (container.get("Config") or {}).get("Image", "")
if "@sha256:" in image:
print(image)
break
PY
)
reference_openwebui_revision=$(python3 - "$BACKUP/inventory/docker-inspect.json" <<'PY'
import json
import sys
for container in json.load(open(sys.argv[1], encoding="utf-8")):
name = (container.get("Name") or "").lstrip("/").lower()
if name in {"open-webui", "mike-ai-open-webui"}:
labels = (container.get("Config") or {}).get("Labels") or {}
print(labels.get("org.opencontainers.image.revision", ""))
break
PY
)
log "Versionsgleiches OpenWebUI-Image aus der Sicherung laden"
docker load -i "$image_archive" >/dev/null
selected_openwebui_image=$reference_openwebui_image
if ! docker image inspect "$selected_openwebui_image" >/dev/null 2>&1; then
[[ $reference_openwebui_ref == *@sha256:* ]] || \
die "Image-Archiv enthält OpenWebUI nicht und Registry-Digest fehlt."
log "Image-Archiv unvollständig; exakten OpenWebUI-Digest nachladen"
docker pull "$reference_openwebui_ref" >/dev/null
selected_openwebui_image=$reference_openwebui_ref
fi
docker image inspect "$selected_openwebui_image" >/dev/null 2>&1 || \
die "Gesichertes OpenWebUI-Image wurde nicht geladen."
actual_openwebui_revision=$(docker image inspect --format \
'{{ index .Config.Labels "org.opencontainers.image.revision" }}' \
"$selected_openwebui_image")
if [[ -n $reference_openwebui_revision && \
$actual_openwebui_revision != "$reference_openwebui_revision" ]]; then
die "OpenWebUI-Build-Revision stimmt nicht mit der Sicherung überein."
fi
docker tag "$selected_openwebui_image" "$REFERENCE_OPENWEBUI_TAG"
stage=$(mktemp -d /data/mike-ai-restore.XXXXXX)
trap 'rm -rf "$stage"' EXIT
@@ -82,6 +141,10 @@ rsync -a --delete "$ui_source/data/" "$volume_path/"
log "Schlüssel und aktuelle Tool-Secrets wiederherstellen"
set_env_value "$SECRETS_DIR/stack.env" WEBUI_SECRET_KEY "$old_webui_key"
set_env_value "$SECRETS_DIR/stack.env" ROUTER_API_KEY "$old_router_key"
set_env_value "$SECRETS_DIR/stack.env" OPENWEBUI_IMAGE "$REFERENCE_OPENWEBUI_TAG"
if [[ -f $INSTALL_CONFIG ]]; then
set_env_value "$INSTALL_CONFIG" OPENWEBUI_IMAGE "$REFERENCE_OPENWEBUI_TAG"
fi
install -d -m 0700 "$SECRETS_DIR/runraid" "$SECRETS_DIR/keys" "$SECRETS_DIR/ssh"
install -m 0600 "$stage/approved/etc/mike-ai/homeassistant-admin-mcp.env" \