Im letzten Beitrag habe ich Euch gezeigt, wie ich NemoClaw auf einem Dell OptiPlex 5040 mit Ubuntu 24.04 aufgesetzt habe und meinen Ollama-Server als Inferenz-Backend nutze. Ein Punkt ist mir dabei direkt aufgefallen: Nach jedem Reboot des OptiPlex muss ich NemoClaw manuell wieder hochfahren. Docker selbst startet brav als systemd-Service, aber das OpenShell-Gateway und der Sandbox-Container bleiben kalt, bis ich mich einlogge und nemoclaw openclawbox connect aufrufe.
Für einen Maker-Workflow ist das nicht ideal. Mein Anspruch ist: Power-Knopf drücken, kurz warten, SSH-Tunnel vom Arbeitsrechner aufbauen und das Dashboard ist im Browser erreichbar. Ohne manuelles Einloggen auf dem OptiPlex, ohne Befehle eintippen. In diesem kurzen Beitrag zeige ich Euch, wie ich genau das mit einem systemd-Service umsetze.
Die technische Herausforderung die ich hatte
Der Befehl nemoclaw openclawbox connect macht zwei Dinge gleichzeitig:
- Er fährt das OpenShell-Gateway hoch und startet den Sandbox-Container.
- Er öffnet eine interaktive Shell in der Sandbox.
Für unseren systemd-Service ist nur Schritt 1 interessant. Schritt 2 stört, weil systemd keine echte Terminal-Session bereitstellt.
Schaut Euch dazu kurz die Hilfe des connect-Befehls an, denn NemoClaw bringt für genau diesen Anwendungsfall ein eigenes Flag mit:
Befehl: nemoclaw openclawbox connect --help
Bei mir kam folgende Ausgabe:
Usage: nemoclaw openclawbox connect [--probe-only]
Options:
--probe-only Run recovery checks and exit without opening SSH
-h, --help Show this help
Das --probe-only-Flag ist genau das, was wir brauchen: Es führt die Recovery-Checks aus (also die Routine, die nach einem Reboot Gateway und Sandbox wieder hochfährt) und beendet sich dann sauber, ohne eine SSH-Shell zu öffnen. NemoClaw selbst hat damit das Auto-Start-Problem schon mitgedacht. Jetzt müssen wir dieses Flag nur richtig für uns einsetzen.
1. Wrapper-Script anlegen
Ich lege mir ein kleines Bash-Script an, das drei Aufgaben übernimmt: nvm-Umgebung laden, API-Key für Ollama setzen und NemoClaw nicht-interaktiv starten. Jetzt legen wir erst einmal das Verzeichnis für das Skript an. Dazu den folgenden Befehl ausführen.
Befehl: mkdir -p ~/script
Jetzt das Script mit dem Texteditor Nano anlegen.
Befehl: nano ~/script/nemoclaw-start.sh
Jetzt den Inhalt des Skriptes einfügen der hier nachfolgend kommt:
#!/bin/bash
# Wrapper to start NemoClaw OpenClaw sandbox non-interactively for systemd.
set -e
# Load nvm so the 'nemoclaw' command (installed via npm) is on PATH
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
# NemoClaw requires the API key env var to be set, even with Ollama dummy
export COMPATIBLE_API_KEY=ollama
# Start the sandbox in non-interactive mode.
# --probe-only runs the recovery checks (which start the OpenShell gateway
# and the sandbox container if needed) and exits cleanly without trying
# to open an SSH shell. This is exactly what we need for systemd.
nemoclaw openclawbox connect --probe-only
echo "NemoClaw OpenClaw sandbox started."
Das Skript speichert ihr mit STRG + X, dann Y und ENTER. Anschließend müssen wir das Skript noch ausführbar machen:
Befehl: chmod +x ~/script/nemoclaw-start.sh
Bevor wir den systemd-Service bauen, einmal das Script direkt testen. Das ist gefahrlos: --probe-only startet das Skript und wenn die Sandbox bereits läuft, lässt das Flag sie unangetastet und beendet sich einfach. Falls sie nicht läuft, fährt das Skript die NemoClaw Sandbox hoch.
Befehl: ~/script/nemoclaw-start.sh
Wenn das Script sauber durchläuft und am Ende die Meldung „NemoClaw OpenClaw sandbox started.“ erscheint, sind wir bereit für den nächsten Schritt.
2. NemoClaw systemd-Service anlegen
Jetzt die eigentliche Service-Datei. Da NemoClaw im User-Home installiert ist und mit dem User-Account meines Setups läuft, brauchen wir einen System-Service, der mit dem richtigen User gestartet wird:
Befehl: sudo nano /etc/systemd/system/nemoclaw.service
Folgenden Inhalt einfügen. Wichtig: Username (ingmar) und Pfade müsst Ihr an Euer Setup anpassen.
[Unit]
Description=NemoClaw OpenClaw Sandbox Auto-Start
Documentation=https://ai-box.eu
After=docker.service network-online.target
Requires=docker.service
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
User=ingmar
Group=ingmar
Environment="HOME=/home/ingmar"
ExecStart=/home/ingmar/script/nemoclaw-start.sh
TimeoutStartSec=180
[Install]
WantedBy=multi-user.target
Kurz die wichtigsten Zeilen erklärt:
After=docker.service network-online.target: NemoClaw braucht Docker und ein verfügbares Netzwerk (für den Ollama-Server im LAN), bevor es loslegen darf.Requires=docker.service: ohne Docker keine Sandbox.Type=oneshotmitRemainAfterExit=yes: das Wrapper-Script startet die Sandbox und beendet sich dann selbst. Der Service gilt trotzdem als „aktiv“, weilRemainAfterExitgesetzt ist.User=ingmar: der NemoClaw Service läuft mit meinem Account, damit nvm und die NemoClaw-Installation gefunden werden.Environment="HOME=/home/ingmar": systemd setzt$HOMEnicht automatisch, das Wrapper-Script braucht die Variable aber zum Sourcen von nvm.TimeoutStartSec=180: ich gebe NemoClaw drei Minuten Zeit zum Starten. Beim ersten Mal kann das Pullen des Sandbox-Images schon mal etwas dauern.
3. Aktivieren und testen
Erst einmal systemd die neue Datei einlesen lassen:
Befehl: sudo systemctl daemon-reload
Service aktivieren, damit er bei jedem Boot startet:
Befehl: sudo systemctl enable nemoclaw.service
Service einmal direkt starten, um zu prüfen, ob er sauber durchläuft:
Befehl: sudo systemctl start nemoclaw.service
Jetzt den Status prüfen:
Befehl: sudo systemctl status nemoclaw.service
In der Ausgabe sollte Active: active (exited) stehen. Das „exited“ ist genau richtig für unseren Type=oneshot-Service: Das Script ist sauber durchgelaufen, der Service wird trotzdem als aktiv geführt.
Falls Ihr genauer hinschauen wollt, wie das Script abgelaufen ist:
Befehl: journalctl -u nemoclaw.service -n 50
Der eigentliche Test ob alles klappt kommt jetzt: Reboot.
Befehl: sudo reboot
Nach dem Hochfahren des REchners prüft Ihr zuerst, ob der systemd-Service durchgelaufen ist:
Befehl: sudo systemctl status nemoclaw.service
Es sollte wieder Active: active (exited) stehen. Anschließend verifiziert Ihr, dass der Sandbox-Container tatsächlich läuft:
Befehl: docker ps
In der Ausgabe sollte der OpenClaw-Sandbox-Container auftauchen. Wenn beides passt, vom Windows-Arbeitsrechner aus den SSH-Tunnel aufbauen, und das Dashboard ist im Browser erreichbar:
Befehl: ssh -L 18789:127.0.0.1:18789 ingmar@192.168.178.142
URL: http://127.0.0.1:18789/
Das war alles, was sich gegenüber meinem Workflow aus dem ersten Beitrag geändert hat: Den Schritt „nemoclaw openclawbox connect auf dem Host nach dem Reboot“ kann ich mir jetzt sparen, weil systemd den Start für mich übernimmt.
Mein persönliches Fazit
Was mich an dieser kleinen Erweiterung freut: Mit ein paar Zeilen Wrapper-Script plus Service-Datei habe ich einen Auto-Start für NemoClaw umgesetzt und ich muss nicht mehr manuell den Service starten. Der gesamte Workflow auf dem OptiPlex ist jetzt wartungsfrei: Strom an, eine Minute warten, Sandbox läuft. Jetzt kann es an das Ausprobieren gehen. Ideen habe ich genug die ich verproben möchte nach dem ich nicht so richtig mit dem ESP-Claw warm geworden bin.
Das ist auch ein typisches Muster, das ich bei sovereign-AI-Setups immer wieder sehe: Die spannenden Tools bedürfen oft noch kleiner Anpassungen so das sie genau so laufen wie man diese braucht. Genau dafür liebe ich Linux und systemd.
Bis zum nächsten Beitrag und viel Erfolg beim Nachbauen!
Wir lesen uns im nächsten Teil!






Ein toller Guide der leicht zugänglich und verständlich ist. Perfekt für ein kleines Side-Project geeignet. Aktuell half mir noch mein…
Thank you for this great tutorial, could you share n8n workflow and comfyui workflow please?
Hallo Anton, die Meldung besagt das in meinem Beisiel Methoden verwendet werden die veraltet (deprecated) sind. Also müsstest Du die…
Danke für das Tool! Ich habe erst kürzlich angefangen mich mit der Thematik zu beschäftigen und bin für meine Erwartungen…
Hallo, ich habe ihre Anleitung befolgt und bekomme im letzten Schritt leider immer folgende Meldung im Terminal: bash <(wget -qO-…