Restore OpenWebUI with its matching image
This commit is contained in:
@@ -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" \
|
||||
|
||||
Reference in New Issue
Block a user