5 Updates
julian edited this page 2026-11-04 21:49:45 +01:00

Updates

update.bat (Windows) bzw. update.sh (Linux) prüft ein Forgejo-Release-Repository und spielt signierte Releases ein. Konfiguration, Daten und portable Laufzeit bleiben erhalten.

Voraussetzungen

  • Portable Laufzeit vorhanden (runtime/python).
  • Anwendung beendet; eine laufende Instanz wird über data/queue.lock erkannt.
  • Keine Migration im Zustand running.
  • Internetzugang zum Release-Server.

Prüfen und einspielen

update.bat
update.bat --apply
./update.sh
./update.sh --apply

Ohne Argument wird nur geprüft:

Installiert: 0.9.0-beta.1 (Kanal beta)
Verfügbar:   0.9.0-beta.2 (v0.9.0-beta.2)

Update einspielen: update.bat --apply  bzw.  ./update.sh --apply

Exit-Code 0 bedeutet erfolgreiche Prüfung, unabhängig davon, ob ein Update verfügbar ist. Nach dem Einspielen die Anwendung neu starten.

Ablauf beim Einspielen:

  1. Installierte Version aus VERSION lesen.
  2. Passendes Release im Kanal wählen.
  3. Paket, SHA256SUMS, SHA256SUMS.sig und Manifest laden.
  4. Signatur prüfen, danach die Dateiprüfsummen.
  5. Archiv entpacken und Version gegen die Release-Version prüfen.
  6. .env und Datenbank sichern.
  7. Anwendungscode austauschen, Datenbankmigrationen ausführen.
  8. Bei Fehler Code und Datenbank zurückrollen.

Kanäle

Kanal Verhalten
auto (Standard) bleibt im bisherigen Kanal: Beta bleibt Beta, stabil bleibt stabil
stable nur endgültige Versionen, Vorabversionen ignoriert
beta nur Vorabversionen, stabile Versionen werden nicht angeboten
update.bat --channel stable
update.bat --channel beta --apply
./update.sh --channel beta --apply

beta bietet bewusst keine stabilen Releases an, damit eine Beta-Installation nicht unbemerkt den Kanal wechselt. Der Wechsel zurück erfordert das explizite Setzen von --channel stable.

Vertrauenskette

SHA256SUMS ist mit Ed25519 signiert; die Signatur liegt als SHA256SUMS.sig daneben. Der öffentliche Schlüssel ist fest im Code hinterlegt, die Integrität hängt damit nicht am Download-Endpunkt. Erst nach gültiger Signatur werden die Dateiprüfsummen ausgewertet; die Version im Archiv muss zur Release-Version passen.

Meldung Bedeutung
Signatur der Prüfsummendatei ist ungültig Release manipuliert oder falscher Schlüssel
Prüfsumme stimmt nicht Download beschädigt
Release enthält keine signierten Prüfsummen unvollständiges Release
Archiv enthält Version …, erwartet … falsches Paket

Was ersetzt wird

Ersetzt werden ausschließlich Anwendungsdateien: backend/, frontend/, scripts/, docs/, VERSION, README.md, LICENSE, LICENSE.md sowie start.*, update.* und setup.*. Nicht angefasst werden .env, data/, runtime/ und .git/. Das Update prüft anhand des Manifests, ob Python, Perl, imapsync und die Python-Pakete zur Zielversion passen, und nennt Abweichungen. Unpassende Laufzeitteile werden mit setup.bat -ForceRuntime bzw. ./setup.sh --force-runtime eingerichtet.

Sicherung und Rollback

Vor dem Austausch werden die .env und die SQLite-Datenbank gesichert — die Datenbank über die SQLite-Backup-API, konsistent und inklusive -wal/-shm. Ablage: data/updates/backup-<Zeitstempel>/.

Schlägt der Austausch oder eine Datenbankmigration fehl, werden Dateien und Datenbank aus dieser Sicherung wiederhergestellt; der Vorgang endet mit Exit-Code 2, die Installation bleibt auf dem vorherigen Stand. Sicherungen werden nicht automatisch gelöscht; bei knappem Speicherplatz alte Verzeichnisse unter data/updates/ entfernen.

Privates Repository

Das Release-Repository ist nicht öffentlich; anonyme Zugriffe liefern HTTP 404 oder 401/403 und das Update endet mit auth_required bzw. not_found. Token mit Lesezugriff ausschließlich über eine Umgebungsvariable bereitstellen:

set FORGEJO_TOKEN=<token>
update.bat --apply
export FORGEJO_TOKEN=<token>
./update.sh --apply

Das Token wird nicht in Dateien, Logs oder Releases gespeichert. Schreibrecht ist für Updates nicht erforderlich.

Reparatur und Sonderfälle

start.bat --repair
./start.sh --repair

Das entspricht einem Setup-Lauf mit erzwungener Neuinstallation von runtime/python, runtime/perl und runtime/imapsync; data/ und .env bleiben unverändert. Für einen eigenen Mirror lassen sich API-Adresse und Repository umstellen (M365SYNC_UPDATE_API=https://git.example.org/api/v1, M365SYNC_UPDATE_REPO=example/IMAPSYNC). Nur Releases mit gültiger Signatur des eingebetteten Schlüssels werden akzeptiert; ein Mirror ohne passenden Signaturschlüssel ist nutzlos.

Grenzen

  • Kein Offline-Update; der Release-Server muss erreichbar sein.
  • Kein automatisches Update im Hintergrund, kein Selbst-Update aus der Oberfläche.
  • Nur bei beendeter Anwendung und ohne laufende Migrationen möglich.
  • Der Signaturschlüssel ist fest eingebettet; eine Rotation erfordert ein neues Release.
  • Eine beschädigte .env repariert das Update nicht. Dann .env sichern, entfernen und das Setup erneut ausführen.

Umstieg von 0.8.0-beta.3 (ohne update.bat)

Die Version 0.8.0-beta.3 enthält den Updater noch nicht. Für den Wechsel gibt es zwei Wege.

A) Archiv über die bestehende Installation entpacken (einfach)

  1. Anwendung beenden (Strg+C im Konsolenfenster).
  2. Neues M365-to-Exchange-Sync-Windows.zip in denselben Ordner entpacken und vorhandene Dateien überschreiben lassen.
  3. start.bat ausführen.

runtime/, data/ und .env liegen nicht im Archiv und bleiben dadurch unverändert. Ab dieser Version steht update.bat für künftige Updates bereit.

B) Updater der neuen Version auf die alte Installation anwenden (getestet)

  1. Neues Archiv in einen temporären Ordner entpacken, z. B. C:\Temp\m365-0.9.
  2. Eingabeaufforderung im Ordner C:\Temp\m365-0.9\backend öffnen und ausführen:
set PYTHONPATH=%CD%
"C:\Pfad\zur\alten\Installation\runtime\python\python.exe" -m app.updater --apply --root "C:\Pfad\zur\alten\Installation"

Unter Linux entsprechend:

cd /tmp/m365-0.9/backend
PYTHONPATH=$PWD "/pfad/zur/alten/installation/runtime/python/bin/python3" -m app.updater --apply --root "/pfad/zur/alten/installation"

Der Updater prüft die Signatur, sichert .env und Datenbank, tauscht nur Programmdateien und führt die Datenbankmigration aus. Die vorhandene Laufzeit wird wiederverwendet. Getestet mit 0.8.0-beta.3 → 0.9.0-beta.1 (Daten, .env und Laufzeit blieben erhalten).