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:

  1. Er fährt das OpenShell-Gateway hoch und startet den Sandbox-Container.
  2. 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=oneshot mit RemainAfterExit=yes: das Wrapper-Script startet die Sandbox und beendet sich dann selbst. Der Service gilt trotzdem als „aktiv“, weil RemainAfterExit gesetzt 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 $HOME nicht 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!