Empfohlen wird ein Update direkt auf dem Host: Ein systemd Timer prüft neue Image Versionen, während Docker Compose nur den Gateway Dienst aktualisiert. Images sollen über ihren Digest festgeschrieben werden.
Veröffentlicht vonBilder erstellt mit GPT Image 2
Forschungsantwort
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
Für das Gateway bietet sich ein hostseitiger Update-Prozess an, statt dafür einen zusätzlichen Container einzuführen. Ein systemd-Timer prüft regelmäßig, ob ein neues Image verfügbar ist. Bei einem Update wird ausschließlich der Gateway-Dienst neu erstellt; der E-Mail-Dienst bleibt unangetastet.
Die zentrale Sicherheitsidee: Das laufende Image wird nicht einfach durch einen beweglichen Tag wie latest ersetzt. Stattdessen verwendet der Betrieb ein festes Image-Referenzziel mit Digest. Docker Compose unterstützt Images, die auf diese Weise adressiert werden.1 Vor dem Wechsel wird außerdem das bislang eingesetzte Image lokal markiert und als Rückfallversion gesichert.
Das ist ein Entwurf und Implementierungsvertrag, keine bereits installierte Lösung. Es wurden weder Dateien geändert noch Tests ausgeführt oder die beiden entfernten VPS bedient. Aussagen zu Kompatibilität, Geschwindigkeit und vollständigem Rollback müssen deshalb noch praktisch geprüft werden.
Der vorhandene Build-Workflow verwendet Versions-Tags nach dem Muster v3.12 und veröffentlicht außerdem latest, 3.12, v3.12 sowie einen kurzen Commit-SHA. Einen automatisch gepflegten Alias wie v3.x gibt es laut Workflow nicht. Die Definition enthält vier Architekturen; das belegt jedoch nicht, dass ein konkreter Release für alle erfolgreich gebaut wurde (.github/workflows/build_docker.yml).
Der aktuelle Compose-Dienst für das Gateway wird aus dem Quellcode gebaut und bindet Port 8080 lokal. Er verwendet ein schreibgeschütztes Konfigurationsverzeichnis. Der E-Mail-Dienst nutzt einen Speicher im Arbeitsspeicher. Deshalb ist es wichtig, beim Update nicht das gesamte Compose-Projekt neu zu starten: Der E-Mail-Container soll weder ersetzt noch unnötig unterbrochen werden (docker-compose.yml).
Das veröffentlichte Image startet den Programmeinstieg im Projektstamm. Beim Start wird eine lokale Konfiguration der Modellregistrierung benötigt; sie ist nicht im Image enthalten. Ein Update auf ein Image allein reicht daher nicht: Die Konfiguration muss auf dem Zielsystem weiterhin bereitgestellt werden (Dockerfile, main.go). Außerdem liest der gegenwärtige Handler für das Modellverzeichnis einen Registry-Snapshot. Er prüft damit nicht, ob eine echte Chat-Anfrage funktioniert. Auch der Health-Endpunkt liefert nur eine statische Lebenszeichen-Antwort (internal/api/models.go, internal/api/chat.go). Diese Prüfungen dürfen nicht als Beleg für die Verfügbarkeit des gesamten Chat-Dienstes ausgegeben werden.
Beim Beenden bricht die Anwendung ihren Service-Kontext ab; das HTTP-Schließfenster beträgt fünf Sekunden (main.go). Eine längere Docker-Frist allein garantiert daher nicht, dass laufende Streaming-Anfragen abgeschlossen werden. Das Konzept verspricht weder unterbrechungsfreie Updates noch den Erhalt aller Anfragen während des Wechsels.
Der vorgesehene Host-seitige Einstiegspunkt wäre scripts/auto-update.sh. Er existiert bislang nicht. Geplant sind Bash, Docker Engine, das Compose-Plugin, curl, jq, flock und Skopeo, um ein Image-Manifest abzufragen, ohne zuvor die Image-Layer herunterzuladen. Die benötigten Versionen und die konkrete Server-Umgebung müssten vor der Umsetzung geprüft werden.
Der Prozess soll einen gemeinsamen Dateisperrmechanismus für Update, Wiederherstellung und Image-Bereinigung verwenden. Kann er die Sperre nicht erhalten, beendet er sich ohne einen zweiten Update-Lauf zu starten. Vor jedem Update prüft er unter anderem den Compose-Projektnamen, den Gateway-Container, dessen Konfiguration und die Identität des E-Mail-Containers. Erkennt er unerwartete manuelle Änderungen, soll er anhalten, statt sie eigenmächtig zu überschreiben.
Danach wird das entfernte Manifest abgefragt und sein Digest mit dem zuletzt freigegebenen Digest verglichen. Bei Netzwerk-, Authentifizierungs- oder Parserfehlern bleibt das aktuelle Gateway in Betrieb. Eine leere oder unvollständige Antwort darf nicht als neues Update interpretiert werden. Ist der Digest unverändert, soll das Skript weder Image-Layer laden noch Container neu erstellen oder einen Update-Eintrag schreiben.
Ist eine neue Version vorhanden, wird zunächst genau dieses Digest-Image geladen und lokal geprüft. Das bisherige Gateway läuft währenddessen weiter. Erst wenn das neue Image bereitsteht, die Rückfallversion gesichert und der Transaktionsstatus dauerhaft protokolliert ist, wird nur der Gateway-Dienst neu erstellt.
Compose kann für einen einzelnen Dienst so aufgerufen werden, dass abhängige Dienste nicht gestartet, kein Image gebaut und während des Starts kein weiteres Image gezogen wird.2 Der geplante Aufruf nutzt dafür unter anderem
--no-deps, --no-build und --pull never. Ein vollständiges docker compose up für das Projekt oder ein globales Aufräumen ist ausdrücklich nicht vorgesehen.
Nach dem Wechsel wird geprüft, ob der neue Container tatsächlich das vorgesehene Image ausführt und stabil läuft. Eine mögliche Anwendungssonde ruft lokal das Modellverzeichnis ab und erwartet HTTP 200 sowie eine gültige JSON-Struktur. Weiterleitungen oder eine HTML-Fehlerseite sollen nicht als Erfolg gelten. Zusätzlich können Containerstatus und Neustartzähler geprüft werden, damit nicht versehentlich eine Antwort des alten Prozesses als erfolgreicher Test gewertet wird.
Als Startwerte sind ein Prüfzeitraum von 60 Sekunden, höchstens eine Sekunde Verbindungsaufbau, drei Sekunden pro Anfrage, zwei Sekunden Abstand zwischen Abfragen und drei aufeinanderfolgende Erfolge vorgeschlagen. Das sind noch ungetestete Parameter. Ob das Modellverzeichnis zwingend nicht leer sein muss, sollte sich nach dem tatsächlichen Vertrag der Registrierung richten; eine feste Zahl von Modellen darf nicht einfach aus einer älteren Version übernommen werden. Ein echter Chat-Aufruf wäre eine separate Prüfung und soll nicht automatisch ausgelöst werden, weil er Ressourcen oder Kontingente verbrauchen kann.
Schlägt der Containerstart fehl oder bleibt die Prüfung innerhalb des vorgesehenen Fensters erfolglos, soll das Skript auf das lokal gesicherte Image und die bisherige Konfiguration zurückwechseln. Nach erfolgreichem Rollback wird der fehlgeschlagene Digest gesperrt, damit er nicht bei jedem Timer-Lauf erneut ausgerollt wird. Scheitert auch die Wiederherstellung, muss das Skript die Sicherungsdaten erhalten, den Fehler melden und anhalten, statt in einer Neustartschleife weiterzumachen.
Wichtig ist die Grenze dieser Zusage: Bei einem laufenden Host und funktionierendem Docker ist ein automatischer Rollback das Ziel. Bei Stromausfall, einem nicht verfügbaren Docker-Daemon oder einem selbst nicht startfähigen Rückfall-Image kann keine sichere automatische Wiederherstellung garantiert werden. Ein abgebrochener Aufruf beweist außerdem nicht, dass der Docker-Daemon seine Arbeit ebenfalls beendet hat. Vor einem neuen Wechsel muss deshalb erst der tatsächliche Containerzustand geprüft werden.
Auf den beiden VPS soll nur die Image-Quelle der Gateway-Definition geändert werden. Ports, Speicherlimits, Protokollierung, Umgebungsvariablen, das schreibgeschützte Konfigurations-Mount und die E-Mail-Konfiguration müssen erhalten bleiben. Der Quellcode- und Build-Workflow für die lokale Entwicklung bleibt unangetastet.
Als Ausschnitt ist vorgesehen:
services:
app:
image: "${APP_IMAGE:?muss ein festes Image-Referenzziel enthalten}"
pull_policy: never
Das ist keine vollständige Compose-Datei. Die vorhandene Definition muss erhalten bleiben, und beim Gateway ist das bisherige Build-Feld zu entfernen. Der gespeicherte Wert für APP_IMAGE soll auf ein freigegebenes Digest-Image oder eine gesicherte lokale Rollback-Markierung zeigen – nicht bei jedem manuellen Neustart wieder auf latest.
Vor der Installation müssen außerdem der tatsächliche Compose-Projektname, die Umgebungsvariablen und die Konfigurations-Mounts auf jedem VPS geprüft werden. Eine Umgebungsdatei für Compose ist nicht automatisch dasselbe wie die Laufzeitumgebung des Containers. Auch zwei Server müssen nicht denselben Projektnamen verwenden. Die aktuelle Konfiguration enthält zwei explizit aktivierte experimentelle Funktionen; der Entwurf ändert diese Schalter nicht und setzt nicht voraus, dass die VPS exakt dieselben Werte verwenden.
Eine Konfigurationsmigration, die nicht rückgängig gemacht werden kann, ist ein Ausschlussgrund für ein automatisches Update, solange kein reversibler Migrationsplan vorliegt. Auf den Servern sollen dafür nur die Betriebs- und Laufzeitkonfiguration sowie die fertigen Images nötig sein – kein ausgecheckter Quellcode und keine Schreibrechte auf das Repository.
Für den Zugriff auf private Images in der GitHub Container Registry ist laut GitHub-Dokumentation ein klassisches Personal Access Token vorgesehen. Der Token benötigt zum Lesen den Umfang read:packages; zusätzlich muss sein Konto tatsächlich Zugriff auf das betreffende Paket haben. Falls die Organisation Single Sign-on verlangt, muss die nötige Freigabe ebenfalls vorliegen.9
Sinnvoll wäre ein eigener, widerrufbarer und nur leseberechtigter Token pro VPS. Die Anmeldung sollte über die Standardeingabe erfolgen, nicht über einen Token als Kommandozeilenargument. Die Docker-Anmeldedaten gehören in ein nur für Administratoren lesbares Verzeichnis und müssen auch für das Werkzeug verfügbar sein, das das Manifest prüft. Sie dürfen weder an den Gateway- noch an den E-Mail-Container weitergereicht werden. Bei einem Authentifizierungsfehler stoppt der Update-Vorgang; der bisherige Dienst bleibt bestehen.
Der Update-Prozess läuft trotzdem mit weitreichenden Rechten auf dem Host, weil er Docker steuert. Dass weder Docker-Socket noch Registry-Zugang in einen Container eingebunden werden, beseitigt diese Host-Berechtigungen nicht.
Als Scheduler ist systemd vorgesehen, nicht ein zusätzlicher Update-Container. Der Timer könnte beim Start nach einer kurzen Wartezeit beginnen und anschließend jeweils fünf Minuten nach Abschluss des vorherigen Laufs erneut prüfen. Ein zusätzlicher zufälliger Versatz soll die beiden VPS zeitlich auseinanderziehen. Das ist eine Skizze, keine bereits installierte Konfiguration.
Vor dem Aktivieren des Timers müssen Abhängigkeiten und Konfiguration geprüft, eine gesunde Rückfallversion gesichert und die Wiederherstellung in einer freigegebenen Testumgebung geübt werden. Der Zeitplan sorgt für eine spätere Angleichung, nicht für einen gleichzeitigen oder atomaren Versionswechsel. Bleibt ein VPS nach einem Rollback vorübergehend auf der älteren Version, sollte er nicht allein zur Versionsgleichheit erneut auf den bereits gesperrten Digest wechseln.
Ein unauffälliger Lauf ohne Update soll keine Geschäftsausgabe und keinen Update-Verlaufseintrag erzeugen. systemd kann dennoch eigene Meldungen zum Start und Ende eines Dienstes protokollieren. Für echte Update-Ereignisse sind UTC-Zeit, Serverkennung, Transaktionskennung, alte und neue Digests, Phase, Dauer sowie Gesundheits- und Rollback-Ergebnis vorgesehen. Zugangsdaten, vollständige Umgebungen, E-Mail-Konten und Antwortinhalte gehören nicht ins Protokoll.
Eine wöchentliche Bereinigung darf ausschließlich Images bearbeiten, die der Update-Prozess selbst als historische Images registriert hat. Das aktuelle Image, die letzte nutzbare Version und Images aus einer noch offenen Transaktion sind dauerhaft geschützt. Vor dem Entfernen muss außerdem geprüft werden, ob ein vorhandener Container das Image verwendet oder weitere Tags auf dasselbe Image zeigen.
Für alte, vom Update-Prozess verwaltete Images ist eine Frist von 14 Tagen als Vorschlag genannt. Vor einem Löschversuch soll nur die eigene Schutzmarkierung entfernt und anschließend eine nicht erzwungene Löschung versucht werden. Scheitert sie, bleibt das Image erhalten und der Vorgang wird protokolliert. Es sind weder ein globales Image- noch ein Volume-Cleanup vorgesehen. Bei zu wenig Speicherplatz soll das Update ausfallen, statt das einzige Rollback-Image zu löschen.
Die Einführung sollte schrittweise erfolgen: Zuerst werden Plattform, Werkzeuge, Compose-Projekte, Konfigurationen, Registry-Zugriff und gesunde Image-Version auf beiden VPS aufgenommen. Danach werden Transaktionsspeicherung, Wiederherstellung nach Prozessabbruch, Digest-Prüfung und Rollback implementiert und isoliert getestet. Erst nach erfolgreicher Prüfung der ersten Maschine folgt die zweite.
Die Abnahme muss mindestens zeigen, dass ein unveränderter Digest keine unnötigen Pulls oder Neustarts verursacht, der E-Mail-Container vor und nach Update und Rollback unverändert bleibt und ein defektes Image auch ohne Verbindung zur GHCR lokal zurückgerollt werden kann. Ebenso sind Fehler bei HTTP-Prüfung, Timeout, Container-Neustart und Prozessabbruch zu testen. Schließlich muss nachgewiesen werden, dass parallele Läufe verhindert werden und weder Zugangsdaten noch geschützte Images versehentlich offengelegt oder gelöscht werden.
Fazit: Unter der Voraussetzung, dass kurze Umschaltunterbrechungen akzeptabel sind, die Serverkonfiguration vorab geprüft wird und die Leistungsziele realistisch getestet werden, ist ein hostseitiger Timer mit digest-fixierten Images und lokalem Rollback ein plausibler Ansatz. Eine Prüfung über das öffentliche Netz ist nicht verlässlich in unter einer Sekunde zu garantieren. Und solange die tatsächlichen VPS nicht geprüft wurden, sind weder die Kompatibilität noch die Rückkehr im Fehlerfall praktisch belegt.
Studio Global AI
Diese Seite enthält eine quellengestützte Antwort, die Sie in Studio Global fortsetzen können.
Empfohlen wird ein Update direkt auf dem Host: Ein systemd Timer prüft neue Image Versionen, während Docker Compose nur den Gateway Dienst aktualisiert.
Empfohlen wird ein Update direkt auf dem Host: Ein systemd Timer prüft neue Image Versionen, während Docker Compose nur den Gateway Dienst aktualisiert. Images sollen über ihren Digest festgeschrieben werden. Vor dem Wechsel wird das bisherige Image lokal gesichert, damit ein Rollback nicht von einer funktionierenden Internetverbindung abhängt.
Ein unverändertes Image soll weder neu geladen noch neu gestartet werden. Eine Prüfung über das Internet lässt sich allerdings nicht zuverlässig in unter einer Sekunde garantieren.
Empfohlen wird ein Update direkt auf dem Host: Ein systemd Timer prüft neue Image Versionen, während Docker Compose nur den Gateway Dienst aktualisiert. Images sollen über ihren Digest festgeschrieben werden.
Veröffentlicht vonBilder erstellt mit GPT Image 2
Forschungsantwort
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
Für das Gateway bietet sich ein hostseitiger Update-Prozess an, statt dafür einen zusätzlichen Container einzuführen. Ein systemd-Timer prüft regelmäßig, ob ein neues Image verfügbar ist. Bei einem Update wird ausschließlich der Gateway-Dienst neu erstellt; der E-Mail-Dienst bleibt unangetastet.
Die zentrale Sicherheitsidee: Das laufende Image wird nicht einfach durch einen beweglichen Tag wie latest ersetzt. Stattdessen verwendet der Betrieb ein festes Image-Referenzziel mit Digest. Docker Compose unterstützt Images, die auf diese Weise adressiert werden.1 Vor dem Wechsel wird außerdem das bislang eingesetzte Image lokal markiert und als Rückfallversion gesichert.
Das ist ein Entwurf und Implementierungsvertrag, keine bereits installierte Lösung. Es wurden weder Dateien geändert noch Tests ausgeführt oder die beiden entfernten VPS bedient. Aussagen zu Kompatibilität, Geschwindigkeit und vollständigem Rollback müssen deshalb noch praktisch geprüft werden.
Der vorhandene Build-Workflow verwendet Versions-Tags nach dem Muster v3.12 und veröffentlicht außerdem latest, 3.12, v3.12 sowie einen kurzen Commit-SHA. Einen automatisch gepflegten Alias wie v3.x gibt es laut Workflow nicht. Die Definition enthält vier Architekturen; das belegt jedoch nicht, dass ein konkreter Release für alle erfolgreich gebaut wurde (.github/workflows/build_docker.yml).
Der aktuelle Compose-Dienst für das Gateway wird aus dem Quellcode gebaut und bindet Port 8080 lokal. Er verwendet ein schreibgeschütztes Konfigurationsverzeichnis. Der E-Mail-Dienst nutzt einen Speicher im Arbeitsspeicher. Deshalb ist es wichtig, beim Update nicht das gesamte Compose-Projekt neu zu starten: Der E-Mail-Container soll weder ersetzt noch unnötig unterbrochen werden (docker-compose.yml).
Das veröffentlichte Image startet den Programmeinstieg im Projektstamm. Beim Start wird eine lokale Konfiguration der Modellregistrierung benötigt; sie ist nicht im Image enthalten. Ein Update auf ein Image allein reicht daher nicht: Die Konfiguration muss auf dem Zielsystem weiterhin bereitgestellt werden (Dockerfile, main.go). Außerdem liest der gegenwärtige Handler für das Modellverzeichnis einen Registry-Snapshot. Er prüft damit nicht, ob eine echte Chat-Anfrage funktioniert. Auch der Health-Endpunkt liefert nur eine statische Lebenszeichen-Antwort (internal/api/models.go, internal/api/chat.go). Diese Prüfungen dürfen nicht als Beleg für die Verfügbarkeit des gesamten Chat-Dienstes ausgegeben werden.
Beim Beenden bricht die Anwendung ihren Service-Kontext ab; das HTTP-Schließfenster beträgt fünf Sekunden (main.go). Eine längere Docker-Frist allein garantiert daher nicht, dass laufende Streaming-Anfragen abgeschlossen werden. Das Konzept verspricht weder unterbrechungsfreie Updates noch den Erhalt aller Anfragen während des Wechsels.
Der vorgesehene Host-seitige Einstiegspunkt wäre scripts/auto-update.sh. Er existiert bislang nicht. Geplant sind Bash, Docker Engine, das Compose-Plugin, curl, jq, flock und Skopeo, um ein Image-Manifest abzufragen, ohne zuvor die Image-Layer herunterzuladen. Die benötigten Versionen und die konkrete Server-Umgebung müssten vor der Umsetzung geprüft werden.
Der Prozess soll einen gemeinsamen Dateisperrmechanismus für Update, Wiederherstellung und Image-Bereinigung verwenden. Kann er die Sperre nicht erhalten, beendet er sich ohne einen zweiten Update-Lauf zu starten. Vor jedem Update prüft er unter anderem den Compose-Projektnamen, den Gateway-Container, dessen Konfiguration und die Identität des E-Mail-Containers. Erkennt er unerwartete manuelle Änderungen, soll er anhalten, statt sie eigenmächtig zu überschreiben.
Danach wird das entfernte Manifest abgefragt und sein Digest mit dem zuletzt freigegebenen Digest verglichen. Bei Netzwerk-, Authentifizierungs- oder Parserfehlern bleibt das aktuelle Gateway in Betrieb. Eine leere oder unvollständige Antwort darf nicht als neues Update interpretiert werden. Ist der Digest unverändert, soll das Skript weder Image-Layer laden noch Container neu erstellen oder einen Update-Eintrag schreiben.
Ist eine neue Version vorhanden, wird zunächst genau dieses Digest-Image geladen und lokal geprüft. Das bisherige Gateway läuft währenddessen weiter. Erst wenn das neue Image bereitsteht, die Rückfallversion gesichert und der Transaktionsstatus dauerhaft protokolliert ist, wird nur der Gateway-Dienst neu erstellt.
Compose kann für einen einzelnen Dienst so aufgerufen werden, dass abhängige Dienste nicht gestartet, kein Image gebaut und während des Starts kein weiteres Image gezogen wird.2 Der geplante Aufruf nutzt dafür unter anderem
--no-deps, --no-build und --pull never. Ein vollständiges docker compose up für das Projekt oder ein globales Aufräumen ist ausdrücklich nicht vorgesehen.
Nach dem Wechsel wird geprüft, ob der neue Container tatsächlich das vorgesehene Image ausführt und stabil läuft. Eine mögliche Anwendungssonde ruft lokal das Modellverzeichnis ab und erwartet HTTP 200 sowie eine gültige JSON-Struktur. Weiterleitungen oder eine HTML-Fehlerseite sollen nicht als Erfolg gelten. Zusätzlich können Containerstatus und Neustartzähler geprüft werden, damit nicht versehentlich eine Antwort des alten Prozesses als erfolgreicher Test gewertet wird.
Als Startwerte sind ein Prüfzeitraum von 60 Sekunden, höchstens eine Sekunde Verbindungsaufbau, drei Sekunden pro Anfrage, zwei Sekunden Abstand zwischen Abfragen und drei aufeinanderfolgende Erfolge vorgeschlagen. Das sind noch ungetestete Parameter. Ob das Modellverzeichnis zwingend nicht leer sein muss, sollte sich nach dem tatsächlichen Vertrag der Registrierung richten; eine feste Zahl von Modellen darf nicht einfach aus einer älteren Version übernommen werden. Ein echter Chat-Aufruf wäre eine separate Prüfung und soll nicht automatisch ausgelöst werden, weil er Ressourcen oder Kontingente verbrauchen kann.
Schlägt der Containerstart fehl oder bleibt die Prüfung innerhalb des vorgesehenen Fensters erfolglos, soll das Skript auf das lokal gesicherte Image und die bisherige Konfiguration zurückwechseln. Nach erfolgreichem Rollback wird der fehlgeschlagene Digest gesperrt, damit er nicht bei jedem Timer-Lauf erneut ausgerollt wird. Scheitert auch die Wiederherstellung, muss das Skript die Sicherungsdaten erhalten, den Fehler melden und anhalten, statt in einer Neustartschleife weiterzumachen.
Wichtig ist die Grenze dieser Zusage: Bei einem laufenden Host und funktionierendem Docker ist ein automatischer Rollback das Ziel. Bei Stromausfall, einem nicht verfügbaren Docker-Daemon oder einem selbst nicht startfähigen Rückfall-Image kann keine sichere automatische Wiederherstellung garantiert werden. Ein abgebrochener Aufruf beweist außerdem nicht, dass der Docker-Daemon seine Arbeit ebenfalls beendet hat. Vor einem neuen Wechsel muss deshalb erst der tatsächliche Containerzustand geprüft werden.
Auf den beiden VPS soll nur die Image-Quelle der Gateway-Definition geändert werden. Ports, Speicherlimits, Protokollierung, Umgebungsvariablen, das schreibgeschützte Konfigurations-Mount und die E-Mail-Konfiguration müssen erhalten bleiben. Der Quellcode- und Build-Workflow für die lokale Entwicklung bleibt unangetastet.
Als Ausschnitt ist vorgesehen:
services:
app:
image: "${APP_IMAGE:?muss ein festes Image-Referenzziel enthalten}"
pull_policy: never
Das ist keine vollständige Compose-Datei. Die vorhandene Definition muss erhalten bleiben, und beim Gateway ist das bisherige Build-Feld zu entfernen. Der gespeicherte Wert für APP_IMAGE soll auf ein freigegebenes Digest-Image oder eine gesicherte lokale Rollback-Markierung zeigen – nicht bei jedem manuellen Neustart wieder auf latest.
Vor der Installation müssen außerdem der tatsächliche Compose-Projektname, die Umgebungsvariablen und die Konfigurations-Mounts auf jedem VPS geprüft werden. Eine Umgebungsdatei für Compose ist nicht automatisch dasselbe wie die Laufzeitumgebung des Containers. Auch zwei Server müssen nicht denselben Projektnamen verwenden. Die aktuelle Konfiguration enthält zwei explizit aktivierte experimentelle Funktionen; der Entwurf ändert diese Schalter nicht und setzt nicht voraus, dass die VPS exakt dieselben Werte verwenden.
Eine Konfigurationsmigration, die nicht rückgängig gemacht werden kann, ist ein Ausschlussgrund für ein automatisches Update, solange kein reversibler Migrationsplan vorliegt. Auf den Servern sollen dafür nur die Betriebs- und Laufzeitkonfiguration sowie die fertigen Images nötig sein – kein ausgecheckter Quellcode und keine Schreibrechte auf das Repository.
Für den Zugriff auf private Images in der GitHub Container Registry ist laut GitHub-Dokumentation ein klassisches Personal Access Token vorgesehen. Der Token benötigt zum Lesen den Umfang read:packages; zusätzlich muss sein Konto tatsächlich Zugriff auf das betreffende Paket haben. Falls die Organisation Single Sign-on verlangt, muss die nötige Freigabe ebenfalls vorliegen.9
Sinnvoll wäre ein eigener, widerrufbarer und nur leseberechtigter Token pro VPS. Die Anmeldung sollte über die Standardeingabe erfolgen, nicht über einen Token als Kommandozeilenargument. Die Docker-Anmeldedaten gehören in ein nur für Administratoren lesbares Verzeichnis und müssen auch für das Werkzeug verfügbar sein, das das Manifest prüft. Sie dürfen weder an den Gateway- noch an den E-Mail-Container weitergereicht werden. Bei einem Authentifizierungsfehler stoppt der Update-Vorgang; der bisherige Dienst bleibt bestehen.
Der Update-Prozess läuft trotzdem mit weitreichenden Rechten auf dem Host, weil er Docker steuert. Dass weder Docker-Socket noch Registry-Zugang in einen Container eingebunden werden, beseitigt diese Host-Berechtigungen nicht.
Als Scheduler ist systemd vorgesehen, nicht ein zusätzlicher Update-Container. Der Timer könnte beim Start nach einer kurzen Wartezeit beginnen und anschließend jeweils fünf Minuten nach Abschluss des vorherigen Laufs erneut prüfen. Ein zusätzlicher zufälliger Versatz soll die beiden VPS zeitlich auseinanderziehen. Das ist eine Skizze, keine bereits installierte Konfiguration.
Vor dem Aktivieren des Timers müssen Abhängigkeiten und Konfiguration geprüft, eine gesunde Rückfallversion gesichert und die Wiederherstellung in einer freigegebenen Testumgebung geübt werden. Der Zeitplan sorgt für eine spätere Angleichung, nicht für einen gleichzeitigen oder atomaren Versionswechsel. Bleibt ein VPS nach einem Rollback vorübergehend auf der älteren Version, sollte er nicht allein zur Versionsgleichheit erneut auf den bereits gesperrten Digest wechseln.
Ein unauffälliger Lauf ohne Update soll keine Geschäftsausgabe und keinen Update-Verlaufseintrag erzeugen. systemd kann dennoch eigene Meldungen zum Start und Ende eines Dienstes protokollieren. Für echte Update-Ereignisse sind UTC-Zeit, Serverkennung, Transaktionskennung, alte und neue Digests, Phase, Dauer sowie Gesundheits- und Rollback-Ergebnis vorgesehen. Zugangsdaten, vollständige Umgebungen, E-Mail-Konten und Antwortinhalte gehören nicht ins Protokoll.
Eine wöchentliche Bereinigung darf ausschließlich Images bearbeiten, die der Update-Prozess selbst als historische Images registriert hat. Das aktuelle Image, die letzte nutzbare Version und Images aus einer noch offenen Transaktion sind dauerhaft geschützt. Vor dem Entfernen muss außerdem geprüft werden, ob ein vorhandener Container das Image verwendet oder weitere Tags auf dasselbe Image zeigen.
Für alte, vom Update-Prozess verwaltete Images ist eine Frist von 14 Tagen als Vorschlag genannt. Vor einem Löschversuch soll nur die eigene Schutzmarkierung entfernt und anschließend eine nicht erzwungene Löschung versucht werden. Scheitert sie, bleibt das Image erhalten und der Vorgang wird protokolliert. Es sind weder ein globales Image- noch ein Volume-Cleanup vorgesehen. Bei zu wenig Speicherplatz soll das Update ausfallen, statt das einzige Rollback-Image zu löschen.
Die Einführung sollte schrittweise erfolgen: Zuerst werden Plattform, Werkzeuge, Compose-Projekte, Konfigurationen, Registry-Zugriff und gesunde Image-Version auf beiden VPS aufgenommen. Danach werden Transaktionsspeicherung, Wiederherstellung nach Prozessabbruch, Digest-Prüfung und Rollback implementiert und isoliert getestet. Erst nach erfolgreicher Prüfung der ersten Maschine folgt die zweite.
Die Abnahme muss mindestens zeigen, dass ein unveränderter Digest keine unnötigen Pulls oder Neustarts verursacht, der E-Mail-Container vor und nach Update und Rollback unverändert bleibt und ein defektes Image auch ohne Verbindung zur GHCR lokal zurückgerollt werden kann. Ebenso sind Fehler bei HTTP-Prüfung, Timeout, Container-Neustart und Prozessabbruch zu testen. Schließlich muss nachgewiesen werden, dass parallele Läufe verhindert werden und weder Zugangsdaten noch geschützte Images versehentlich offengelegt oder gelöscht werden.
Fazit: Unter der Voraussetzung, dass kurze Umschaltunterbrechungen akzeptabel sind, die Serverkonfiguration vorab geprüft wird und die Leistungsziele realistisch getestet werden, ist ein hostseitiger Timer mit digest-fixierten Images und lokalem Rollback ein plausibler Ansatz. Eine Prüfung über das öffentliche Netz ist nicht verlässlich in unter einer Sekunde zu garantieren. Und solange die tatsächlichen VPS nicht geprüft wurden, sind weder die Kompatibilität noch die Rückkehr im Fehlerfall praktisch belegt.
Studio Global AI
Diese Seite enthält eine quellengestützte Antwort, die Sie in Studio Global fortsetzen können.
Empfohlen wird ein Update direkt auf dem Host: Ein systemd Timer prüft neue Image Versionen, während Docker Compose nur den Gateway Dienst aktualisiert.
Empfohlen wird ein Update direkt auf dem Host: Ein systemd Timer prüft neue Image Versionen, während Docker Compose nur den Gateway Dienst aktualisiert. Images sollen über ihren Digest festgeschrieben werden. Vor dem Wechsel wird das bisherige Image lokal gesichert, damit ein Rollback nicht von einer funktionierenden Internetverbindung abhängt.
Ein unverändertes Image soll weder neu geladen noch neu gestartet werden. Eine Prüfung über das Internet lässt sich allerdings nicht zuverlässig in unter einer Sekunde garantieren.