linger · XDG_RUNTIME_DIR · Daemon prüfen · Schichtdiagnose · API-Region vs. Egress
Plattformtechniker, SREs und Betreiber selbstgehosteter Agenten scheitern 2026 auf Linux-VPS selten an einem einzelnen Tippfehler, sondern daran, dass nach SSH-Logout user-level systemd stoppt, XDG_RUNTIME_DIR in nicht-interaktiven Pfaden fehlt, Gateway-, Channel- und Modellprotokolle in einer Zeile gelesen werden und Konsolen-API-Region und tatsächlicher VPS-Egress auseinanderlaufen. Der Artikel liefert fünf versteckte Vorabkosten, eine Drei-Wege-Tabelle Bare-Metal-systemd versus systemd-im-Container versus Docker-only, ein sechsstufiges reproduzierbares Runbook mit Beispielbefehlen, eine Checkliste plus drei zitierbare technische Fakten und eine Entscheidungsmatrix. Installation und Gateway: Installations- und Doctor-Checkliste. Compose-Dauerbetrieb: Docker-Compose-Produktionsbaseline. Bestellung: Bestellseite.
OpenClaw auf Linux verschiebt Langläufer, Socket-Verzeichnisse, Logs und Neustart-Semantik von persönlicher Gewohnheit in auditierbare Units. Die folgenden fünf Punkte treten gemeinsam auf und führen zu einem Gate: Schreiben Sie linger und XDG_RUNTIME_DIR vor der Docker-Debatte ins Abnahmeblatt.
Sitzungsbindung: Ohne linger kann das Ende interaktiver SSH den User-systemd-Manager stoppen; Units sterben nachts still, Tickets sagen nur „gestern ging es“.
Fehlendes Runtime-Verzeichnis: Cron, minimale Shells oder falsche Service-Typen lassen XDG_RUNTIME_DIR leer; Socket-Fehler verteilen sich auf App und systemd.
Übersprungene Schichtung: Gateway-Listen, Channel-Tokens, Modellrouting und Upstream-429 werden als eine Geschichte „OpenClaw kaputt“ gelesen.
Region vs. Egress-Drift: Konsole oder Variablen zeigen Region A, der VPS-Pfad liefert Header-Hinweise auf Region B; es wirkt wie flaky Auth statt stabiler 403.
Vermischte Grenzen: Docker plus User-Units auf einem Host uneinig über Neustart-Reihenfolge und Health-Semantik erschweren Rollbacks.
Vergleichen Sie Host-User-Units mit Container-PID-1 anhand der nächsten Tabelle als Review-Folie, nicht als Slogan.
Entscheiden Sie zuerst, wer Neustarts, Logrotation, linger-Semantik und die Grenze zwischen Sockets und Host-Ports besitzt. Es gibt keinen Universalgewinner, nur eine passende Ops-Grenze.
| Modell | Typische Passung | Hauptnutzen | Hauptkosten |
|---|---|---|---|
| Bare-Metal-systemd (User) | Einzel-VPS, enge Zusammenarbeit mit Host-Firewall und Loopback | Passt zur Distro-Toolkette, Units und journal sind fluchtend | linger und Login-Sitzungskanten sind Pflicht |
| systemd-im-Container | Mehrprozess-Supervision im Image | Fühlt sich wie klassischer Linux-Service-Host an | Privilegien- und Image-Kanten sind schärfer, Debug umfasst innen und außen |
| Docker-only | Compose oder Orchestrator besitzt Health und Restart | Versionsierte Artefakte und Rollbacks sind klar | Host-user-linger-Semantik ist nicht automatisch dabei |
Reproduzierbare Abnahme ist nicht „läuft auf meinem Laptop“, sondern: Unit überlebt SSH-Logout, journal-Gründe sind lesbar, Region-Hinweise lassen sich zweimal mit denselben Befehlen erfassen.
Reihenfolge: User-Manager unbeaufsichtigt am Leben halten, Runtime-Verzeichnis prüfen, Units installieren, schichtweise triagieren, zuletzt Egress-Snapshots. Jede Stufe liefert gespeicherte Befehlsausgaben. Gateway-Baseline bleibt in der Installations- und Doctor-Checkliste.
Service-User fixieren: Konto und Primärgruppe festlegen, root nicht mischen. Artefakt: id plus kurzes loginctl user-status-Fragment.
linger aktivieren: Für den Deploy-User linger setzen, damit user@ ohne Login läuft. Artefakt: show-user zeigt linger=yes.
XDG_RUNTIME_DIR prüfen: Variable im selben Profil wie die Unit ausgeben, /run/user/<uid>-Form erwarten.
Installieren und aktivieren: Unit im User-Scope ablegen, daemon-reload und enable --now, mit status Active und Haupt-pid prüfen.
Schichtweise sampeln: Zuerst Gateway-Listen und Config-Parse, dann Channel-Tokens und Webhook-Erreichbarkeit, dann Upstream-Modellkontingente und Regions-Header. Je Schicht die letzten 200 journal-Zeilen.
Egress-Konsistenz: Gleichen Hostnamen auflösen und TLS-sichtbare Metadaten vor und nach Änderungen speichern; keinen Einzel-RTT zum Performanceurteil erheben.
loginctl show-user "${USER}" -p Linger
sudo loginctl enable-linger "${USER}"
systemctl --user show-environment | grep XDG_RUNTIME_DIR || true
echo "${XDG_RUNTIME_DIR}"
systemctl --user daemon-reload
systemctl --user status openclaw-gateway.service --no-pager
journalctl --user -u openclaw-gateway.service -n 200 --no-pager
Hinweis: Ersetzen Sie openclaw-gateway.service durch den echten Unit-Namen. Bei anderem Gateway-Binary gilt weiter die ExecStart-Zeile der Unit.
Ordnen Sie jeden Punkt Owner und Review-Rhythmus zu. Regionschecks sammeln nur wiederholbare TLS- und Antwort-Metadaten, keine erfundenen Durchsatz-Rankings.
linger-Gate: Change-Tickets müssen show-user Linger=yes als Text oder Screenshot enthalten.
Unit-Grenze: Welche Ports User-Units binden und welche Container veröffentlichen, dokumentieren und zur Firewall-Doku synchronisieren.
Log-Retention: journal-Persistenz oder Weiterleitung beschreiben, damit Debug-Logs die Platte nicht leerziehen und Hänger vortäuschen.
Schicht-Runbook: Pro Schicht Gateway, Channel, Model mindestens drei „weiter wenn grün“-Checks als Befehl oder URL.
Region-Snapshots: Resolver-Ausgabe und Header-Stichproben vor und nach Release-Fenstern für Rollback-Kontrast speichern.
loginctl enable-linger wirkt auf die Lebensgrenze des User-systemd-Managers; es ist nicht automatisch gleichbedeutend mit der Docker-Wahl./run/user/<uid>. Fehlt sie off-login, fallen Sockets auf nicht beschreibbare Pfade zurück.Achtung: Ein einmal erfolgreicher curl ist nach CDN-Wechsel kein Beweis. Fester Hostname mit wiederholbaren Befehlen schlägt ein Glücks-Timing.
Ohne versionierte linger-, Unit-, Port- und Region-Snapshots ist Linux-Dauerbetrieb nur halb fertig. Die andere Hälfte teilt Verantwortungssprache mit Gateway-Triage.
| Teamlage | Standard | Abnahmesignal | Typische Falle |
|---|---|---|---|
| Solo, schnelle Iteration | Docker-Compose-Baseline | Health und Restart im Compose reviewbar | mem_limit und Logrotation ignorieren erzeugt Schein-Hänger |
| Multi-Tenant-Host | Container-Grenze plus isolierte Projektnamen | Jeder Stack hat eigenes Datenverzeichnis | Mix mit User-Units erzeugt Restart-Races |
| Host-enge Kopplung | User-systemd plus linger | journal bleibt nach SSH-Ende kontinuierlich | XDG_RUNTIME_DIR auf nicht-interaktiven Pfaden nicht geprüft |
Interaktives bash, linger-freies nohup oder handgeschriebene Watchdogs zahlen oft bei Änderungsreview und Audit nach. Ohne Egress-Snapshots sind Upstream-Regionspolitik-Schwenks schwer erklärbar. Dedizierte Cloud-Mac-Kapazität mit wählbarer Region und lesbaren Netzstufen vereinfacht stabilen Egress und Golden Images neben iOS-Builds oder Desktop-Übergaben.
Typische Falle: Docker entferne alle systemd-Semantiken. Wenn User-Units außerhalb von Compose das Gateway halten, bleiben linger und Runtime-Verzeichnis harte Gates.
Persönliche Skripte und unversionierte Exporte überstehen Übergabe und Compliance selten mit externer SLA. Wenn OpenClaw zusammen mit Upstream-Regionspolitik, TLS-Fingerabdruck und fester Egress-Erzählung ausgeliefert wird, fehlen bash-only-Pfaden oft auditierbare Change-Tickets. Für Teams, die iOS-Übergabe, CI-Regression und Automatisierungs-Agenten in einer Abnahme bündeln und Bestell- und Regionstufen statt selbstgebautem Egress-Glücksspiel wollen, ist VpsMesh Mac Mini Cloud-Miete meist die bessere Passform: dedizierte Knoten vereinfachen ACLs und Hostnamen, Kollaboration bleibt nah an häufigen Schleifen, Ops-Sprache kann mit dem Team-Privatnetz-Build-Node-Runbook übereinstimmen. Regionenmix auf der Preisseite, Verbindungsgrenzen nach dem Hilfezentrum.
Nach Sitzungsende kann systemd --user stoppen und OpenClaw-User-Units beenden. Prüfen Sie linger vor Produktion und gleichen Sie Verbindungs- sowie Dauerbetriebshinweise im Hilfezentrum ab, damit nächtliche Stopps nicht als Upstream-Ausfall fehlinterpretiert werden.
Hostnamen und Toolversionen fixieren, Resolver-Ausgabe und TLS-sichtbare Metadaten zum selben Endpunkt speichern, Konsolenregion mit Umgebungsvariablen abgleichen. Compose-Level-Health: Docker-Compose-Produktionsbaseline.
Wenn Neustart, Logrotation, Limits und Healthchecks vollständig in Compose oder einem Orchestrator deklariert sind und keine Host-User-Sockets plus linger-Semantik nötig sind, ist Docker-only oft einfacher. Schichtabnahme aus Abschnitt drei vor Mischbetrieb mit User-Units abschließen.