feat(updater): support updates after verified SeaweedFS migration

This commit is contained in:
2026-09-28 15:47:06 +02:00
parent 790f20b499
commit 2b947c5e8f
20 changed files with 1074 additions and 67 deletions

View File

@@ -15,6 +15,8 @@ docker build -f scripts/storage/tests/Dockerfile.minio -t fedeo-minio-fixture:20
docker build -t fedeo-storage-tools:pilot scripts/storage
node scripts/storage/tests/integration.mjs
python3 -B scripts/storage/tests/host_integration.py
docker pull registry:2
python3 -B scripts/update/tests/host_storage_integration.py
```
Der S3-Test verwendet ausschließlich neu angelegte Testcontainer mit künstlichen
@@ -28,6 +30,14 @@ Der Host-Test verwendet einen echten PostgreSQL-/MinIO-/SeaweedFS-Stack und
künstliche Anwendungscontainer. Er ersetzt keine fachliche Abnahme von FEDEO
(PDF, WebDAV, Exporte, Mandantenrechte) auf der konkreten Instanz.
Der zusätzliche Updater-Test führt Migration, geprüfte Übernahme, zwei Updates
und Restore aus der regulären Updatesicherung aus. Er startet eine eigene lokale
Testregistry. Release-HTTP und öffentliche Versionsantworten sind Testdaten;
Docker Compose, Image-Registry, PostgreSQL, S3-Verträge und Restore sind echt.
Das neue Pilotpaket enthält auch die zusammengehörigen Host-Updater-Dateien.
Nach erfolgreicher Migration übernimmt `pilot.py adopt-updater` den Speicher;
bereits umgestellte Instanzen werden dafür nicht erneut migriert.
Die erste Übernahme ist auf 200.000 Objekte und 1 GiB pro Objekt begrenzt.
Das größte Objekt wird auf Platte gespult; RAM-Verbrauch wächst nicht mit dessen
Größe. Multipart-Übernahmen und Sonderkonfigurationen werden abgelehnt.

View File

@@ -15,10 +15,10 @@ storage_tools="fedeo-storage-tools:pilot-${storage_tools_id#sha256:}"
storage_weed_local="fedeo-seaweedfs:pilot-${storage_weed_id#sha256:}"
docker image tag "$storage_tools_id" "$storage_tools"
docker image tag "$storage_weed_id" "$storage_weed_local"
cp "$storage_repo/scripts/selfhost-storage-migrate.py" "$storage_repo/scripts/selfhost-update.py" "$storage_output/scripts/"
cp "$storage_repo/scripts/"{selfhost-storage-migrate.py,selfhost-update.py,selfhost-update-service.py,selfhost-update-service-install.sh,fedeo-updater.service} "$storage_output/scripts/"
cp "$storage_repo/scripts/storage/"{s3.mjs,cli.mjs,seaweedfs.json,start-seaweedfs.sh,package.json,package-lock.json,Dockerfile.seaweedfs,preserve-s3-content-type.patch} "$storage_output/scripts/storage/"
cp "$storage_repo/scripts/storage/pilot.py" "$storage_output/pilot.py"
cp "$storage_repo/docs/minio-umstellung-pilot.md" "$storage_output/docs/"
cp "$storage_repo/docs/"{minio-umstellung-pilot.md,selfhost-updates.md} "$storage_output/docs/"
docker image save -o "$storage_output/images.tar" "$storage_tools" "$storage_weed_local"
python3 - "$storage_output" "$storage_tools" "$storage_weed_local" "$storage_weed" <<'PY'
import hashlib,json,pathlib,sys

View File

@@ -20,7 +20,7 @@ def checksum(path):
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("command", choices=["load-images", "plan", "migrate", "activate", "resume-start", "rollback", "status"])
parser.add_argument("command", choices=["load-images", "plan", "migrate", "activate", "resume-start", "rollback", "status", "adopt-updater"])
parser.add_argument("--directory", default="/opt/fedeo")
parser.add_argument("--writers-exclusive", action="store_true")
args = parser.parse_args()
@@ -39,6 +39,11 @@ def main():
subprocess.run(["docker", "image", "inspect", image], check=True, stdout=subprocess.DEVNULL)
print("Offline-Images geprüft und geladen. Nächster Schritt: plan.")
return
if args.command == "adopt-updater":
# Install the matching service before releasing the legacy updater guard.
subprocess.run(["bash", str(ROOT / "scripts/selfhost-update-service-install.sh"), "--directory", args.directory], check=True)
raise SystemExit(subprocess.run([sys.executable, str(ROOT / "scripts/selfhost-update.py"), "adopt-storage",
"--directory", args.directory]).returncode)
command = [sys.executable, str(ROOT / "scripts/selfhost-storage-migrate.py"), args.command, "--directory", args.directory]
if args.command == "plan":
command += ["--tools-image", manifest["toolsImage"]]