Deine OSS-Version aktualisieren
Logto folgt semver. Du findest jede Veröffentlichung und ihre Änderungen in den GitHub Releases. Diese Anleitung erklärt, wie ein Upgrade funktioniert, wie du die gängigsten Bereitstellungstypen aktualisierst und wie du Probleme behebst, auf die du stoßen könntest.
Wie ein Upgrade funktioniert
Ein Upgrade besteht aus zwei Teilen:
- Der Logto-Code: das Docker-Image oder das Release-Tarball, das du ausführst.
- Das Datenbankschema: Schemaänderungen zwischen Versionen werden als Datenbankänderungen ausgeliefert und du setzt sie mit der Logto CLI um. Deine Datenbank zeichnet auf, welche Änderungen bereits angewendet wurden.
Wenn Logto startet, prüft es die Datenbank. Falls eine Änderung, die in dieser Version von Logto enthalten ist, noch nicht angewendet wurde, verweigert Logto den Start:
Found undeployed database alterations, you must deploy them first by npm run alteration deploy command.
...
Error: Undeployed database alterations found.
Änderungen sind so gestaltet, dass sie mit der vorherigen Version von Logto kompatibel sind, sodass Instanzen, die noch die vorherige Version ausführen, nach dem Anwenden der Änderungen weiterhin funktionieren. Daraus ergibt sich folgende Reihenfolge, die Ausfallzeiten vermeidet:
- Setze die Änderungen mit der neuen Version von Logto um.
- Ersetze die laufenden Instanzen durch die neue Version.
Wir empfehlen, vor Beginn ein Backup der Datenbank zu erstellen.
Setze Änderungen immer mit der CLI um, die mit der Version geliefert wird, auf die du aktualisierst, also mit dem neuen Docker-Image oder dem neuen Release-Tarball. Änderungsskripte sind mit der CLI gebündelt, daher kann eine ältere CLI die Änderungen einer neueren Logto-Version nicht anwenden.
Du kannst auch mehrere Versionen auf einmal überspringen. Das Anwenden der Änderungen auf die Zielversion setzt alle dazwischenliegenden Änderungen in der richtigen Reihenfolge um.
Vor dem Upgrade
- Lies die Release Notes jeder Version zwischen deiner aktuellen Version und der Zielversion.
- Sichere deine Datenbank (empfohlen), zum Beispiel mit
pg_dumpoder einem Snapshot deines Datenbankanbieters. Änderungen können zurückgesetzt werden, aber ein Backup ist der zuverlässigste Weg zurück. - Fixiere die Zielversion. Verwende eine exakte Version wie
ghcr.io/logto-io/logto:1.45.0stattlatest. Mitlatestkann ein Neustart oder ein neuer Pull Logto aktualisieren, bevor die Änderungen angewendet wurden, und Logto startet dann nicht. - Prüfe die Node.js-Anforderung, falls du Logto direkt mit Node.js betreibst. Jede Veröffentlichung gibt dies im Feld
enginesihrerpackage.jsonan. Zum Beispiel benötigt Logto 1.45.0 Node.js^22.14.0. - Prüfe deine eigenen Connectoren, falls du welche hast. Siehe Custom connectors are skipped after upgrading.
- Upgrade zuerst die Staging-Umgebung, falls du eine Staging-Umgebung mit eigener Datenbank hast. Wenn deine Staging-Umgebung die Datenbank mit der Produktion teilt, ändern die Änderungen aus dem Staging auch die Produktionsdatenbank. Produktionsinstanzen mit der vorherigen Version funktionieren weiterhin, da die Änderungen kompatibel sind.
Upgrade-Schritte
In den folgenden Beispielen ist 1.45.0 die Zielversion. Ersetze sie und die Datenbank-URL durch deine eigenen Werte.
Docker
-
Ziehe das neue Image:
docker pull ghcr.io/logto-io/logto:1.45.0 -
Setze die Änderungen mit dem neuen Image um. Dein aktueller Logto-Container läuft während dieses Schritts weiter:
docker run --rm \-e DB_URL=postgres://username:password@your_postgres_url:port/db_name \ghcr.io/logto-io/logto:1.45.0 \alteration deploy 1.45.0Du solltest eine Ausgabe wie diese sehen. Die Anzahl und Namen der Änderungen hängen von den Versionen ab, die du überspringst:
info Deploy target 1.45.0info Found 1 alteration to deployinfo Run alteration 1.45.0-1791531333-add-tenant-viewer-role.js `up()` function succeededhinweis:Der Entrypoint des Images ist
npm run, daher werden die Argumente nach dem Image-Namen annpm runübergeben. Schreibealteration deploy 1.45.0, nichtnpm run alteration deploy 1.45.0. -
Ersetze den laufenden Container durch einen, der das neue Image verwendet. Behalte die gleichen Ports, Umgebungsvariablen und andere Optionen wie zuvor bei:
docker stop logto && docker rm logtodocker run -d --name logto \-p 3001:3001 \-p 3002:3002 \-e DB_URL=postgres://username:password@your_postgres_url:port/db_name \ghcr.io/logto-io/logto:1.45.0
Docker Compose
-
Aktualisiere das Image-Tag des Logto-Services in deiner Compose-Datei und ziehe es dann:
services:logto:image: ghcr.io/logto-io/logto:1.45.0docker compose pull logto -
Setze die Änderungen in einem Einweg-Container des neuen Images um:
docker compose run --rm --entrypoint sh logto -c "npm run alteration deploy 1.45.0"Ersetze
logtodurch den Namen des Logto-Services in deiner Compose-Datei (die Demo-docker-compose.ymlnennt ihnapp). Das Überschreiben des Entrypoints sorgt dafür, dass der Befehl auch funktioniert, wenn der Service einen eigenenentrypointdefiniert, wie es die Demo-Datei tut. -
Erstelle den Logto-Container mit dem neuen Image neu:
docker compose up -d logto
Wenn du eine einzelne Logto-Instanz betreibst, kannst du den Container so konfigurieren, dass er bei jedem Start eine neue Datenbank befüllt und Änderungen anwendet:
services:
logto:
image: ghcr.io/logto-io/logto:1.45.0
entrypoint:
['sh', '-c', 'npm run cli db seed -- --swe && npm run alteration deploy latest && npm start']
Hier bedeutet latest die neueste Version, die im Image enthalten ist, sodass die Änderungen immer zum Image passen, das du ausführst. Verwende diesen Ansatz nicht mit mehreren Instanzen. Siehe Kubernetes für den Grund.
Wenn dein Setup auf der Demo-docker-compose.yml basiert, speichert der Postgres-Container Daten in einem anonymen Volume. Anonyme Volumes werden nach docker compose down nicht erneut eingebunden, sodass der nächste docker compose up mit einer leeren Datenbank startet. Bevor du docker compose down ausführst, verschiebe die Daten in ein benanntes Volume oder eine externe Datenbank.
Kubernetes
Setze die Änderungen einmalig mit einem Job um und rolle dann das neue Image aus.
-
Erstelle einen Job, der die Änderungen mit dem neuen Image ausführt:
apiVersion: batch/v1kind: Jobmetadata:name: logto-alteration-1-45-0spec:backoffLimit: 0template:spec:restartPolicy: Nevercontainers:- name: alterationimage: ghcr.io/logto-io/logto:1.45.0command: ['/bin/sh', '-c', 'npm run alteration deploy 1.45.0']env:- name: DB_URLvalueFrom:secretKeyRef:name: logtokey: db-urlWende ihn an und warte, bis er abgeschlossen ist:
kubectl apply -f logto-alteration-job.yamlkubectl wait --for=condition=complete job/logto-alteration-1-45-0 --timeout=10mkubectl logs job/logto-alteration-1-45-0 -
Aktualisiere das Image des Logto-Deployments und warte auf das Rollout. Falls dein Deployment einen Init-Container verwendet, der das Logto-Image nutzt, wie im Beispiel des shared connectors folder, aktualisiere diesen ebenfalls:
kubectl set image deployment/logto logto=ghcr.io/logto-io/logto:1.45.0kubectl rollout status deployment/logto
Wenn du mit Helm oder einem GitOps-Tool bereitstellst, führe den Job vor dem Update des Deployments aus, zum Beispiel als Helm-pre-upgrade-Hook oder Argo CD-PreSync-Hook.
Setze Änderungen immer nur von einem Ort aus um. Die CLI sperrt die Datenbank beim Anwenden der Änderungen nicht, daher solltest du sie nicht vom Startbefehl jeder Replik aus anwenden.
Node.js
Wenn du Logto mit npm init @logto oder aus einem Release-Tarball installiert hast, installiere die neue Version neben der aktuellen. Behalte das aktuelle Verzeichnis, bis das Upgrade abgeschlossen ist, damit du schnell zurückwechseln kannst.
-
Stelle sicher, dass deine Node.js-Version die Anforderung der neuen Version erfüllt.
-
Lade das neue Release herunter und entpacke es:
curl -fL -o logto-1.45.0.tar.gz https://github.com/logto-io/logto/releases/download/v1.45.0/logto.tar.gzmkdir logto-1.45.0tar -xzf logto-1.45.0.tar.gz -C logto-1.45.0 --strip-components=1Um das neueste Release zu erhalten, kannst du auch
npm init @logto@latest -- --path ./logto-new --skip-seedausführen. Die Option--skip-seedist erforderlich, da deine Datenbank bereits existiert. -
Kopiere deine Konfiguration aus der aktuellen Installation (standardmäßig
~/logto):cp ~/logto/.env logto-1.45.0/.env -
Die offiziellen Connectoren sind im Release enthalten. Falls du weitere Connectoren hinzugefügt hast, füge sie erneut in das neue Verzeichnis ein, zum Beispiel:
cd logto-1.45.0npm run cli connector add <connector-package-name> -
Setze die Änderungen aus dem neuen Verzeichnis um. Die CLI liest
DB_URLaus der.env-Datei:npm run alteration deploy 1.45.0 -
Stoppe den aktuellen Logto-Prozess und starte den neuen aus dem neuen Verzeichnis:
npm startFalls du einen Prozessmanager wie systemd oder pm2 verwendest, aktualisiere dessen Arbeitsverzeichnis auf das neue Verzeichnis.
Hosting-Anbieter
Wenn du Logto mit einer One-Click-Vorlage eines Hosting-Anbieters bereitgestellt hast, ändere das Logto-Image-Tag auf die Zielversion. Bevor die neue Version startet, setze die Änderungen mit dem neuen Image über den Einmal-Befehl oder die Shell-Funktion des Anbieters um, indem du npm run alteration deploy 1.45.0 ausführst. Für eine einzelne Instanz kannst du auch den Startbefehl aus dem Docker Compose Tipp verwenden. Die Vorlagen werden von den Anbietern gepflegt, daher lies deren Dokumentation für Details.
Rollback
Falls die neue Version nicht wie erwartet funktioniert:
-
Wechsle zurück zur vorherigen Version. Da Änderungen mit der vorherigen Version von Logto kompatibel sind, kannst du in der Regel die vorherige Version erneut ausführen, ohne die Datenbank anzufassen. Dies gilt nur für die Version direkt vor der Zielversion. Wenn du mehrere Versionen übersprungen hast, setze auch die Änderungen zurück.
-
Setze die Änderungen zurück. Führe das Rollback mit der neuen Version durch, da die vorherige Version die neueren Änderungsskripte nicht enthält. Starte dann die vorherige Version. Zum Beispiel mit Docker:
docker run --rm \-e DB_URL=postgres://username:password@your_postgres_url:port/db_name \ghcr.io/logto-io/logto:1.45.0 \alteration rollback 1.44.0Nach einem Rollback startet die neue Version nicht, bis du die Änderungen erneut anwendest. Siehe Rollback alterations für Details.
-
Stelle das Backup wieder her, falls du eines erstellt hast. Dies ist die zuverlässigste Option, aber alle nach dem Backup geschriebenen Daten gehen verloren.
Fehlerbehebung
Logto startet nach dem Upgrade nicht
Wenn die Logs Undeployed database alterations found anzeigen, setze die Änderungen wie unter Upgrade-Schritte beschrieben um.
Falls du die Änderungen bereits angewendet hast und diesen Fehler trotzdem siehst, wurden sie wahrscheinlich mit einer älteren CLI angewendet, etwa einem global installierten logto-Befehl oder einem npx @logto/cli, das auf eine ältere Version verweist. In diesem Fall meldet die CLI Found 0 alteration to deploy, weil sie die neueren Änderungen nicht kennt. Setze sie erneut mit der CLI der neuen Version um: dem neuen Docker-Image, dem neuen Release-Verzeichnis oder npx @logto/cli@1.45.0 db alteration deploy 1.45.0.
Logto startet nach einem Neustart nicht mehr
Wenn du das latest-Tag verwendest, kann ein Neustart oder ein neuer Pull des Images Logto aktualisiert haben, ohne die Änderungen anzuwenden. Setze die Änderungen mit dem Image um, das du gerade ausführst, und fixiere dann eine exakte Version, um ungeplante Upgrades zu vermeiden.
Error: Missing target version
Ohne ein interaktives Terminal kann die CLI nicht nachfragen, welche Version angewendet werden soll. Gib die Zielversion explizit an, zum Beispiel alteration deploy 1.45.0, oder verwende alteration deploy latest, um bis zur neuesten in der CLI enthaltenen Version zu aktualisieren.
npm error Missing script: "npm"
Du hast npm run alteration ... nach dem Image-Namen in docker run übergeben. Der Entrypoint des Images ist bereits npm run, daher übergib stattdessen alteration deploy 1.45.0.
Eine Änderung schlägt fehl
Jede Änderung läuft in einer Transaktion, sodass eine fehlgeschlagene Änderung keine Teiländerungen hinterlässt. Behebe die Ursache und führe denselben Befehl erneut aus. Bereits angewendete Änderungen werden übersprungen. Häufige Ursachen:
- Statement timeout. Änderungen an großen Tabellen können länger dauern als das Standard-Statement-Timeout von 60 Sekunden. Setze
DATABASE_STATEMENT_TIMEOUT(in Millisekunden) oder aufDISABLE_TIMEOUTfür den Änderungsbefehl. - Datenbankberechtigungen. Führe Änderungen als Datenbankbenutzer mit denselben Rechten aus, die du zum Befüllen der Datenbank verwendet hast.
Einige Änderungen enthalten Schritte, die außerhalb einer Transaktion laufen. Wenn die Fehlermeldung besagt, dass nicht-transaktionale Schritte angewendet worden sein könnten, prüfe den Zustand deiner Datenbank, bevor du den Befehl erneut ausführst.
Eigene Connectoren werden nach dem Upgrade übersprungen
Logto prüft, ob jeder Connector die Version von @logto/connector-kit unterstützt, die mit Logto gebündelt ist. Falls ein Connector dies nicht tut, überspringt Logto ihn und protokolliert:
[load-connector] skip <connector-name> due to error: Connector requires @logto/connector-kit to be <range>, but the version here is <version>.
Aktualisiere den Connector, damit er die neue Version von @logto/connector-kit unterstützt. Das Setzen von IGNORE_CONNECTOR_VERSION_CHECK=1 überspringt die Prüfung, wird aber in der Produktion dringend abgeraten.
Dies kann auch bei offiziellen Connectoren in einem shared connectors folder passieren: npm run cli connector add -- --official lädt die neuesten Connectoren von npm herunter, die eventuell eine neuere Version von Logto benötigen. In diesem Fall aktualisiere Logto oder verwende die offiziellen Connectoren, die im Docker-Image enthalten sind, statt eines gemeinsamen Ordners.
npm init @logto entfernt das neue Verzeichnis
Wenn du npm init @logto gegen deine bestehende Datenbank ohne --skip-seed ausführst, schlägt das Befüllen fehl, weil die Datenbank bereits existiert, und die CLI entfernt das gerade erstellte Verzeichnis. Deine Datenbank bleibt unverändert. Führe den Befehl erneut mit --skip-seed aus.