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.lockerkannt. - 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:
- Installierte Version aus
VERSIONlesen. - Passendes Release im Kanal wählen.
- Paket,
SHA256SUMS,SHA256SUMS.sigund Manifest laden. - Signatur prüfen, danach die Dateiprüfsummen.
- Archiv entpacken und Version gegen die Release-Version prüfen.
.envund Datenbank sichern.- Anwendungscode austauschen, Datenbankmigrationen ausführen.
- 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
.envrepariert das Update nicht. Dann.envsichern, 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)
- Anwendung beenden (Strg+C im Konsolenfenster).
- Neues
M365-to-Exchange-Sync-Windows.zipin denselben Ordner entpacken und vorhandene Dateien überschreiben lassen. start.batausfü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)
- Neues Archiv in einen temporären Ordner entpacken, z. B.
C:\Temp\m365-0.9. - 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).