103 KiB
ChatGPT - CG
PROMPT 1
ich möchte moltbot auf meiner synology diskstation als container installieren. wie muss ich vorgehen?
RESPONSE 1
So bekommst du Moltbot auf deiner Synology DiskStation sauber als Docker-/Compose-Setup ans Laufen (Gateway + CLI-Container). Offiziell ist dafür ein Setup-Script vorgesehen, das Image baut, Onboarding startet und den Gateway per Docker Compose hochfährt. Moltbot+1
Variante A (empfohlen): per SSH + offizielles docker-setup.sh
1) Voraussetzungen auf der Synology
-
DSM 7.x mit Container Manager installiert
-
SSH aktiviert (Systemsteuerung → Terminal & SNMP → SSH)
-
Ordner für persistente Daten anlegen (z. B. in File Station unter
/volume1/docker/…) -
Hinweis: In Container Manager → Projekt verwaltest du Compose-Stacks bequem über die GUI. Wissensdatenbank
2) Ordnerstruktur auf dem NAS anlegen
Beispiel:
-
/volume1/docker/moltbot/config(Konfiguration) -
/volume1/docker/moltbot/workspace(Workspace)
Wichtig (Permissions): Der Container läuft mit einem normalen User (Node). Wenn die Ordner “root-only” sind, gibt’s später “permission denied”. Daher gleich auf UID 1000 setzen:
sudo chown -R 1000:1000 /volume1/docker/moltbot/config /volume1/docker/moltbot/workspace
3) Repo klonen und Setup ausführen
Per SSH einloggen und dann:
cd /volume1/docker/moltbot
git clone https://github.com/moltbot/moltbot.git
cd moltbot
# Persistente Pfade auf dein NAS legen (statt ~/)
export CLAWDBOT_CONFIG_DIR="/volume1/docker/moltbot/config"
export CLAWDBOT_WORKSPACE_DIR="/volume1/docker/moltbot/workspace"
# optional, falls Ports kollidieren:
# export CLAWDBOT_GATEWAY_PORT=28789
# export CLAWDBOT_BRIDGE_PORT=28790
./docker-setup.sh
Das Script setzt u. a. Ports/Bindings, generiert (falls nötig) ein Gateway-Token, baut das Docker-Image und startet ein interaktives Onboarding. GitHub
4) Onboarding-Eingaben (so wie vom Script empfohlen)
Wenn du gefragt wirst, nimm (typisch):
-
Gateway bind:
lan -
Gateway auth:
token -
Gateway token: das Token, das dir das Script anzeigt
-
Tailscale exposure: Off
-
Install Gateway daemon: No GitHub
5) UI öffnen
Der Gateway mappt standardmäßig:
-
18789 → Control UI
-
18790 → Bridge GitHub+1
Öffne dann im Browser (vom PC im gleichen Netz):
http://<NAS-IP>:18789/
Token im Control UI eintragen (Settings → token). Moltbot
6) Provider verbinden (WhatsApp/Telegram/Discord etc.)
Die Beispiele kommen direkt aus dem Setup-Flow:
# WhatsApp (QR-Login)
docker compose run --rm moltbot-cli providers login
# Telegram
docker compose run --rm moltbot-cli providers add --provider telegram --token "<DEIN_TOKEN>"
# Discord
docker compose run --rm moltbot-cli providers add --provider discord --token "<DEIN_TOKEN>"
Variante B: komplett über Container Manager “Projekt” (GUI)
Geht auch, aber: Das offizielle Compose arbeitet standardmäßig mit moltbot:local und setzt voraus, dass das Image gebaut wird. Genau das erledigt docker-setup.sh automatisch. Moltbot+1
Wenn du trotzdem “nur GUI” willst, brauchst du entweder:
-
vorher das Image einmal per SSH bauen (oder das Script laufen lassen) oder
-
das Compose so anpassen, dass es
build: .nutzt (statt nurimage:).
Sicherheits-Quickcheck (wirklich wichtig auf dem NAS)
-
Nicht ins Internet exponieren (keine Portweiterleitung auf 18789/18790).
-
Wenn Remote-Zugriff nötig ist: lieber VPN (z. B. Tailscale) oder Synology-Reverse-Proxy + Auth davor.
Wenn du mir sagst, welches DiskStation-Modell du hast (ARM vs. x86) und ob bei dir Port 18789 schon belegt ist, passe ich dir die “saubere” Ziel-Ordnerstruktur + Ports direkt passend an.
PROMPT 2
habe Variante A gewählt. Am ende habe ich diese Meldung erhalten:
└ Onboarding complete. Use the tokenized dashboard link above to control Moltbot.
==> Provider setup (optional) WhatsApp (QR): docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml run --rm moltbot-cli providers login Telegram (bot token): docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml run --rm moltbot-cli providers add --provider telegram --token Discord (bot token): docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml run --rm moltbot-cli providers add --provider discord --token Docs: https://docs.molt.bot/providers
==> Starting gateway WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. [+] Running 1/1 ✔ Container moltbot-moltbot-gateway-1 Started 4.4s
Gateway running with host port mapping. Access from tailnet devices via the host's tailnet IP. Config: /volume1/docker/moltbot/config Workspace: /volume1/docker/moltbot/workspace Token: dcf5e0faa5a8214dfcc3fe83c8ef87b47e94b29bbaa60cc12fd876704a73c12c
Commands: docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml logs -f moltbot-gateway docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml exec moltbot-gateway node dist/index.js health --token "dcf5e0faa5a8214dfcc3fe83c8ef87b47e94b29bbaa60cc12fd876704a73c12c" root@Diskstation2:/volume1/docker/moltbot/moltbot#
Der Container läuft jetzt und auch das Webinterface ist erreichbar. Allerdings steht bei Health Offline. disconnected (1008): control ui requires HTTPS or localhost (secure context)
RESPONSE 2
Das Verhalten ist genau das, was Moltbot hier absichtlich macht: Die Control UI braucht einen “secure context” (also HTTPS oder localhost), um eine Geräte-Identität zu erzeugen. Wenn du sie über http://<NAS-IP>:18789 öffnest, gilt das als unsicher, und der Gateway kickt die Verbindung → disconnected (1008): control ui requires HTTPS or localhost. Moltbot+1
Schnellster Fix (empfohlen): SSH-Tunnel → Zugriff über localhost
Damit bleibt alles privat und erfüllt die “localhost”-Bedingung. Moltbot+1
Auf deinem PC (Windows PowerShell):
ssh -N -L 18789:127.0.0.1:18789 root@<NAS-IP>
Dann im Browser öffnen:
http://127.0.0.1:18789/?token=<DEIN_TOKEN>
Wenn du zusätzlich den Bridge-Port brauchst:
ssh -N -L 18789:127.0.0.1:18789 -L 18790:127.0.0.1:18790 root@<NAS-IP>
➡️ Danach sollte Health = Online sein.
Dauerhaft bequem: HTTPS davor (Synology Reverse Proxy)
Wenn du die UI ohne Tunnel nutzen willst, musst du sie per HTTPS bereitstellen (z. B. Synology Reverse Proxy + Zertifikat) – idealerweise nur intern/VPN, nicht öffentlich. Moltbot+1
DSM grob:
-
Systemsteuerung → Anmeldeportal → Erweitert → Reverse Proxy
-
Quelle: HTTPS (Hostname z. B.
moltbot.<dein-domain>, Port 443) -
Ziel: HTTP, Host
127.0.0.1, Port18789 -
WebSocket aktivieren
-
Zertifikat (Let’s Encrypt oder intern)
“Break glass” (nicht empfohlen): HTTP erlauben
Es gibt eine Option, die auf token-only zurückfällt und Device-Pairing skippt – ist aber ein Security Downgrade. Moltbot+1
Wenn du das wirklich nur kurz im LAN testen willst, such in deinem Config (bei dir: /volume1/docker/moltbot/config) die Gateway-Config und setze sinngemäß:
gateway:
controlUi:
allowInsecureAuth: true
Dann Gateway neu starten.
(Hinweis: Rund um allowInsecureAuth gab es zuletzt auch Bug-Reports – wenn’s zickt, ist SSH-Tunnel/HTTPS der stabile Weg.) GitHub+1
Zwei wichtige Nebenpunkte zu deiner Ausgabe
1) Die Claude-WARNs sind harmlos
CLAUDE_* ist nur relevant, wenn du später Claude Web/Session-Auth nutzt. Solange du das nicht konfigurierst: ignorieren. Moltbot
2) Token rotieren
Du hast den Gateway-Token hier gepostet. Ich würde ihn sofort wechseln. Der Wizard schreibt ihn bei Docker in eine .env. Moltbot+1
Auf der Synology:
cd /volume1/docker/moltbot/moltbot
ls -la .env
Dann in .env den Gateway-Token ersetzen (neuen erzeugen z. B. so):
openssl rand -hex 32
und Stack neu starten:
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml down
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml up -d
Wenn du willst, sag mir kurz:
-
greifst du von Windows auf die UI zu?
-
nutzt du lieber SSH-Tunnel dauerhaft oder willst du HTTPS Reverse Proxy sauber einrichten?
Dann gebe ich dir genau die passenden Klickpfade/Commands für deine Variante.
PROMPT 3
soll dann etwas passieren? Habe das eingegeben, aber nichts passiert. Die <nas -IP> habe ich natürlich eingesetzt. ssh -N -L 18789:127.0.0.1:18789 root@192.168.178.6
RESPONSE 3
Ja — “nichts passiert” ist hier korrekt. Der Befehl startet einen Tunnel im Vordergrund und zeigt keine Ausgabe, solange alles ok ist. Er “hängt” einfach, weil er die Verbindung offen hält.
So prüfst du sofort, ob es klappt:
-
Lass das SSH-Fenster offen (nicht schließen).
-
Öffne im Browser auf deinem PC:
http://127.0.0.1:18789/
oder (wenn du den tokenized Link aus dem Onboarding hast) genau diesen Link, aber mit127.0.0.1statt NAS-IP.
Wenn du trotzdem “offline / requires HTTPS” siehst, dann ist meist einer dieser Punkte schuld:
- Du bist gar nicht per SSH verbunden (Auth/Key/Password hängt)
Im SSH-Fenster sollte dich SSH ggf. nach Passwort fragen. Wenn du gar keine Eingabeaufforderung siehst, drück einmal Enter – manchmal kommt dann erst die Passwortabfrage.
- Port 18789 ist auf deinem PC schon belegt
Dann würde SSH normalerweise direkt melden:
bind: Address already in use
Check (Windows PowerShell):
netstat -aon | findstr :18789
Wenn da ein Prozess lauscht, nimm einen freien Port, z. B. 28789:
ssh -N -L 28789:127.0.0.1:18789 root@192.168.178.6
Dann Browser:
http://127.0.0.1:28789/
- Der Gateway lauscht nicht auf 127.0.0.1 auf dem NAS
Unwahrscheinlich, aber checkbar:
Auf der Synology (zweite SSH-Session oder neues Terminal):
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml ps
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml port moltbot-gateway 18789
- Du hast nur den UI-Port getunnelt, aber die UI braucht zusätzlich den Bridge-Port
Dann nimm beide Ports in einem Tunnel:
ssh -N `
-L 18789:127.0.0.1:18789 `
-L 18790:127.0.0.1:18790 `
root@192.168.178.6
Und öffne:
http://127.0.0.1:18789/
Mini-Check: siehst du überhaupt eine Seite?
Wenn du im Browser http://127.0.0.1:18789/ öffnest und gar nichts lädt (Timeout), dann stimmt der Tunnel nicht.
Wenn die UI lädt, aber Health bleibt offline → dann fehlt oft der zweite Port (18790) oder du nutzt noch die NAS-IP statt localhost.
Sag mir kurz, was du siehst, wenn du http://127.0.0.1:18789/ öffnest (lädt / timeout / Fehlermeldung). Dann sag ich dir exakt den nächsten Schritt.
PROMPT 4
dies gibt der Docker Container im Log aus:
PROMPT 4
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker logs moltbot-moltbot-gateway-1 │ ◇ Doctor warnings ───────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → │ │ /home/node/.moltbot): Error: EBUSY: resource busy or locked, rename │ │ '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├─────────────────────────────────────────────────────────────────────────╯ 2026-01-28T11:28:19.003Z [canvas] host mounted at http://0.0.0.0:18789/moltbot/canvas/ (root /home/node/clawd/canvas) 2026-01-28T11:28:19.340Z [heartbeat] started 2026-01-28T11:28:19.347Z [gateway] agent model: google/gemini-3-pro-preview 2026-01-28T11:28:19.351Z [gateway] listening on ws://0.0.0.0:18789 (PID 7) 2026-01-28T11:28:19.355Z [gateway] log file: /tmp/moltbot/moltbot-2026-01-28.log 2026-01-28T11:28:19.367Z [browser/service] Browser control service ready (profiles=2) 2026-01-28T11:28:19.398Z [whatsapp] [default] starting provider (+4917638498278) 2026-01-28T11:28:31.578Z [ws] closed before connect conn=9889054b-2098-4fdd-89d9-c3340022d15d remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=4008 reason=connect failed 2026-01-28T11:28:32.445Z [ws] closed before connect conn=bf0c1478-d845-4f46-87b0-95a13fb765ae remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:28:33.753Z [whatsapp] Listening for personal WhatsApp inbound messages. 2026-01-28T11:28:33.810Z [ws] closed before connect conn=48a3b4a5-5f34-489a-b3a1-e22a286e137b remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:28:36.172Z [ws] closed before connect conn=d7888af9-14f9-43ba-9bbe-5eca40101aa4 remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=4008 reason=connect failed 2026-01-28T11:28:40.130Z [ws] closed before connect conn=7cad6a9f-95cc-483f-9f98-4a3f8c9a8181 remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:28:46.854Z [ws] closed before connect conn=603f56a8-2f1e-41d2-b181-79faadaa2313 remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:28:58.273Z [ws] closed before connect conn=c3d4c048-c258-4370-bdc2-262e32a93db9 remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:29:13.276Z [ws] closed before connect conn=5e53810a-14f9-40bf-a9f4-f8cf8e1ffd0b remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:29:29.086Z [ws] closed before connect conn=598f48c0-f0bf-4dc2-b2a8-dc91c56958e4 remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:29:44.810Z [ws] closed before connect conn=14693147-c938-4083-b527-7c0ff82648e8 remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:29:59.860Z [ws] closed before connect conn=051be327-2a89-4a93-97dc-a3fd7e04290f remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:30:14.890Z [ws] closed before connect conn=fb382b7a-aa83-456b-875c-9f79d88ada0b remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context) 2026-01-28T11:30:29.935Z [ws] closed before connect conn=ba754c90-8080-4a5f-9c9f-9c72efa9c4ef remote=192.168.0.1 fwd=n/a origin=http://192.168.178.6:18789 host=192.168.178.6:18789 ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 code=1008 reason=control ui requires HTTPS or localhost (secure context)
PROMPT 5
hallo?
RESPONSE 5
Ja — ich bin da. 🙂
Dein Log zeigt ganz klar, warum Health “Offline” bleibt:
origin=http://192.168.178.6:18789
reason=control ui requires HTTPS or localhost
Das heißt: Dein Browser öffnet die UI weiterhin über die NAS-IP (unsicheres HTTP) – nicht über den SSH-Tunnel/localhost. Der Tunnel kann laufen, aber solange du im Browser noch http://192.168.178.6:18789 benutzt, wird’s immer wieder mit 1008 abgewiesen.
Fix in 60 Sekunden
1) Tunnel läuft? (so ist es richtig)
Der SSH-Befehl “hängt” ohne Ausgabe – das ist korrekt:
ssh -N -L 18789:127.0.0.1:18789 root@192.168.178.6
➡️ Dieses Fenster muss offen bleiben.
2) Wichtig: Browser auf localhost öffnen (nicht NAS-IP)
Öffne genau:
-
http://127.0.0.1:18789/
oder -
http://localhost:18789/
Wenn du den tokenized dashboard link aus dem Onboarding hast: einfach die Host-Komponente ersetzen:
von http://192.168.178.6:18789/...
zu http://127.0.0.1:18789/...
3) Alte Tabs schließen
Schließ alle Tabs, die noch auf http://192.168.178.6:18789 offen sind, sonst spammt der Browser weiter WS-Connects (genau das siehst du im Log).
4) Wenn du sicher gehen willst: Test auf dem PC
In einem zweiten PowerShell-Fenster:
curl http://127.0.0.1:18789/
Wenn da HTML/Text zurückkommt → Tunnel passt.
Falls es trotzdem nicht geht (2 häufige Ursachen)
A) Port 18789 ist auf deinem PC belegt
Dann nimm lokal einen anderen Port:
ssh -N -L 28789:127.0.0.1:18789 root@192.168.178.6
Dann Browser:
http://127.0.0.1:28789/
B) Du brauchst auch den zweiten Port (Bridge)
Manche UI-Funktionen hängen daran, deshalb direkt beide forwarden:
ssh -N `
-L 18789:127.0.0.1:18789 `
-L 18790:127.0.0.1:18790 `
root@192.168.178.6
Was du gleich im Log sehen solltest, wenn’s passt
Dann taucht statt origin=http://192.168.178.6:18789 sowas auf:
origin=http://127.0.0.1:18789(oder localhost)
und kein1008 secure context.
Nebenbei: dein Token ist jetzt öffentlich
Rotier den Gateway-Token bitte einmal (in deiner .env/Config) und starte den Stack neu, sonst kann jeder, der ihn sieht, theoretisch Zugriff haben.
Wenn du mir sagst, welche URL du im Browser gerade öffnest (die komplette bis zum Port reicht), sag ich dir in einem Satz, ob du noch auf der NAS-IP hängst oder schon korrekt über localhost drin bist.
PROMPT 6
benötigen wir einen Reverse Proxy auf der Diskstation dafür?
RESPONSE 6
Nicht zwingend.
Du brauchst entweder:
-
SSH-Tunnel → dann ist die UI für den Browser “localhost” und Health wird online, ohne Reverse Proxy.
- Du öffnest dann immer
http://127.0.0.1:<lokaler-port>/(z. B. 18789 oder 28789).
- Du öffnest dann immer
oder
-
Reverse Proxy mit HTTPS → wenn du die UI bequem im LAN (oder via VPN) direkt per URL öffnen willst, ohne Tunnel.
- Dann muss es https://… sein, sonst bleibt es “requires HTTPS or localhost”.
Wann Reverse Proxy sinnvoll ist
-
Du willst nicht jedes Mal den SSH-Tunnel starten.
-
Du möchtest eine feste URL wie
https://moltbot.lanoderhttps://moltbot.deinedomain.tld. -
Du willst sauber mit Zertifikat + optional Basic Auth davor.
Wann du KEINEN Reverse Proxy brauchst
-
Du bist ok damit, Moltbot nur “admin-mäßig” zu nutzen und dafür kurz einen Tunnel aufzumachen.
-
Du willst es möglichst einfach und sicher halten (Tunnel ist super dafür).
Wichtig
Ein Reverse Proxy bringt dir nur dann etwas, wenn er HTTPS macht. Ein Proxy, der wieder nur HTTP ausliefert, löst das Problem nicht.
Wenn du willst, sag kurz:
- nutzt du Moltbot nur zu Hause im LAN oder auch von unterwegs?
Dann sag ich dir, ob SSH-Tunnel (schnell/sauber) oder Reverse Proxy + Zertifikat (bequem) für dich die bessere Wahl ist – und gebe dir die konkreten DSM-Klickpfade.
PROMPT 7
ich werde auch von unterwegs darauf zugreifen
RESPONSE 7
Für Zugriff von unterwegs brauchst du nicht zwingend einen Reverse Proxy – aber du brauchst einen “secure context” für die Control UI: HTTPS oder localhost. Genau deshalb kommt bei http://<NAS-IP>:18789 der 1008-Disconnect. (Siehst du ja im Log bei origin=http://192.168.178.6:18789 + requires HTTPS or localhost). Moltbot
Es gibt 2 saubere Wege:
Option 1 (mein Favorit): VPN (Tailscale) + SSH-Tunnel = kein Reverse Proxy nötig
Warum gut: Sehr sicher, kein Port im Internet offen, kein Zertifikats-Drama.
Du nutzt die UI immer über localhost (Tunnel), egal wo du bist.
Setup (grobe Steps):
-
Tailscale auf der DiskStation installieren und verbinden. tailscale.com
-
Von unterwegs: mit Tailscale ins Netz, dann auf deinem Laptop/PC:
ssh -N -L 18789:127.0.0.1:18789 -L 18790:127.0.0.1:18790 root@<TAILSCALE-IP-ODER-MAGICDNS> -
Browser öffnen:
http://127.0.0.1:18789/
Damit ist es “localhost” ⇒ Health sollte online gehen.
Bequem machen (Windows): In C:\Users\<du>\.ssh\config:
Host moltbot
HostName <TAILSCALE-IP-ODER-MAGICDNS>
User root
LocalForward 18789 127.0.0.1:18789
LocalForward 18790 127.0.0.1:18790
ServerAliveInterval 30
Dann reicht: ssh -N moltbot
Option 2 (bequem im Browser ohne Tunnel): Reverse Proxy mit HTTPS
Wenn du direkt https://moltbot.… öffnen willst, brauchst du auf der DiskStation einen Reverse Proxy mit HTTPS (und WebSockets an). Synology hat dafür eine eingebaute Reverse-Proxy-Funktion inkl. WebSocket-Header-Template. kb.synology.com+1
Wichtig bei Moltbot hinter Proxy:
-
WebSockets müssen durchgehen (sonst bricht die UI). kb.synology.com+1
-
Und du solltest Moltbot so konfigurieren, dass Proxy-IPs korrekt behandelt werden (
gateway.trustedProxies), sonst kann es Sicherheits-/“local client”-Fehlinterpretationen geben. Moltbot
Sicherheits-Hinweis (ernst gemeint):
Ich würde Moltbot nicht einfach offen ins Internet stellen. Wenn Reverse Proxy, dann idealerweise nur über VPN erreichbar (z. B. nur Tailnet/LAN), oder mindestens zusätzlich abgesichert (z. B. IP-Allowlist + Auth davor).
Was ich dir konkret empfehle
Wenn du “von unterwegs” willst und es sicher + schnell sein soll: Tailscale + SSH-Tunnel (Option 1). Reverse Proxy ist dann optional, nicht Pflicht.
Nebenbei: bitte Token rotieren
Du hast vorhin deinen Gateway-Token gepostet. Den würde ich einmal neu setzen und den Stack neu starten.
Wenn du magst, sag mir kurz:
-
Hast du Tailscale schon auf der Synology laufen (ja/nein)?
-
Willst du ohne Tunnel direkt im Browser arbeiten (Reverse Proxy), oder ist “ein SSH-Befehl” okay?
Ich gebe dir dann die exakten DSM-Klickpfade (für Reverse Proxy inkl. WebSocket) oder die Tailscale+SSH Konfiguration passend zu deinem Setup.
PROMPT 8
mit Token steht jetzt: disconnected (1008): pairing required
RESPONSE 8
Das ist ein anderer (und “guter”) Zustand als vorher: Du bist jetzt in einem secure context (HTTPS oder localhost), daher kann Moltbot überhaupt erst eine Geräte-Identität nutzen – und jetzt blockt es, weil das Browser-Device noch nicht “gepaired” ist. Das ist bei der Control-UI als Admin-Surface by design. Moltbot+1
- Erst prüfen: bist du wirklich auf Port 18789?
-
18789 = Dashboard / Control UI
-
18790 = Bridge (für Nodes) → verlangt Pairing/Device-Admission Moltbot
👉 Öffne im Browser explizit:
http://127.0.0.1:18789/?token=…(über SSH-Tunnel) Moltbot+1
Wenn du versehentlich …:18790 nutzt, siehst du sehr typisch “pairing required”.
- Token muss beim ersten Laden drin sein (und nicht Incognito)
Die UI speichert den Token nach dem ersten Laden in localStorage. In Inkognito / mit blockiertem Storage bleibt das wacklig. Moltbot+1
- Pairing-Request im Gateway freigeben
Wenn im Dashboard “pairing required” steht, lege genau dann im Terminal (Synology) die Pending-Devices offen und approve sie:
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml run --rm moltbot-cli devices list
Du solltest eine pending Anfrage sehen (mit requestId). Dann:
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml run --rm moltbot-cli devices approve <requestId>
Danach Dashboard neu laden → Health sollte online gehen. (Geräte-Pairing ist genau dafür vorgesehen.) Moltbot
Falls devices list leer ist
Dann ist zu 90% eins davon der Grund:
-
du bist doch auf 18790 gelandet (Bridge)
-
du lädst nicht über localhost/HTTPS (dann wird gar kein sauberer Pairing-Flow erzeugt)
-
Storage/Incognito verhindert den Flow
- Für “von unterwegs” (sauber & ohne Reverse Proxy-Stress)
Die Moltbot-Doku empfiehlt Tailscale Serve für die Control UI: Gateway bleibt loopback, Tailscale liefert HTTPS + Identity Headers. Moltbot+1
(Reverse Proxy geht auch, ist aber fehleranfälliger wegen WebSockets/Headers.)
Wenn du magst, poste nur die URL (ohne Token!), die du gerade im Browser offen hast (Host + Port reichen, z. B. http://127.0.0.1:18789/). Dann kann ich dir sofort sagen, ob du auf 18789 richtig bist oder aus Versehen auf der Bridge gelandet bist.
PROMPT 9
ich nutze den Tunnel über http://127.0.0.1:28789/
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml run --rm moltbot-cli devices list WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — Siri's competent cousin.
│ ◇ Doctor warnings ──────────────────────────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → /home/node/.moltbot): Error: │ │ EBUSY: resource busy or locked, rename '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ [moltbot] CLI failed: Error: gateway closed (1006 abnormal closure (no close frame)): no close reason Gateway target: ws://127.0.0.1:18789 Source: local loopback Config: /home/node/.clawdbot/moltbot.json Bind: loopback at Object.onClose (file:///app/dist/gateway/call.js:169:22) at WebSocket. (file:///app/dist/gateway/client.js:90:32) at WebSocket.emit (node:events:519:28) at WebSocket.emitClose (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:263:12) at emitErrorAndClose (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:1047:13) at ClientRequest. (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:886:5) at ClientRequest.emit (node:events:519:28) at emitErrorEvent (node:_http_client:107:11) at Socket.socketErrorListener (node:_http_client:574:5) at Socket.emit (node:events:519:28) root@Diskstation2:/volume1/docker/moltbot/moltbot#
RESPONSE 9
Alles klar – dein Output erklärt das Problem ziemlich eindeutig:
Warum devices list gerade crasht
moltbot-cli läuft in einem eigenen Container und versucht laut Log zu verbinden mit:
Gateway target: ws://127.0.0.1:18789
Aber 127.0.0.1 im CLI-Container = der CLI-Container selbst, nicht der Gateway-Container. Deshalb kommt der WebSocket-Close 1006.
Zusätzlich siehst du:
Config: /home/node/.clawdbot/moltbot.json
→ der CLI-Container nutzt nicht deine gemountete /volume1/docker/moltbot/config, sondern eine Default/Legacy-Config im Container.
Fix (schnell & robust): Pairing über den Gateway-Container ausführen
Das ist der zuverlässigsten Weg, weil du dann “localhost” im selben Container bist und kein Networking-Guessing brauchst.
- Hilfe anzeigen (damit wir die exakten Subcommands sehen):
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js --help
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices --help
- Devices/Pending Requests listen:
(verwende den Token aus deinem Setup)
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list --token "<DEIN_TOKEN>"
- Pending Device approven
Je nachdem wie der Help-Output die ID nennt (id,requestIdo.ä.):
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve "<ID_AUS_LIST>" --token "<DEIN_TOKEN>"
- Browser neu laden:
http://127.0.0.1:28789/(Tunnel)
→ “pairing required” sollte weg sein, Health sollte auf Online gehen.
Health-Check optional:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js health --token "<DEIN_TOKEN>"
Fix (dauerhaft “sauber”): CLI so konfigurieren, dass sie nicht auf 127.0.0.1 zeigt
Wenn du weiterhin moltbot-cli nutzen willst, dann müssen 2 Dinge passen:
A) CLI muss deine Host-Config nutzen
Prüf, ob in /volume1/docker/moltbot/moltbot/.env die Pfade gesetzt sind. Falls nicht, anhängen:
cd /volume1/docker/moltbot/moltbot
grep -q '^CLAWDBOT_CONFIG_DIR=' .env || echo 'CLAWDBOT_CONFIG_DIR=/volume1/docker/moltbot/config' >> .env
grep -q '^CLAWDBOT_WORKSPACE_DIR=' .env || echo 'CLAWDBOT_WORKSPACE_DIR=/volume1/docker/moltbot/workspace' >> .env
Dann Stack neu:
docker compose -f docker-compose.yml down
docker compose -f docker-compose.yml up -d
B) Gateway-URL in der Config darf nicht 127.0.0.1 sein
Such in deiner Config nach 127.0.0.1:18789:
grep -R "127\.0\.0\.1:18789" -n /volume1/docker/moltbot/config
Wenn du eine Datei findest, ersetze es (Beispiel – Pfad aus dem grep nehmen!):
sed -i 's|ws://127\.0\.0\.1:18789|ws://moltbot-gateway:18789|g' /volume1/docker/moltbot/config/moltbot.json
Danach sollte auch das gehen:
docker compose -f docker-compose.yml run --rm moltbot-cli devices list
Noch 2 kurze Hinweise
-
Die
CLAUDE_*WARNs kannst du ignorieren, solange du Claude nicht nutzt. -
Das
EBUSY“Failed to move legacy state dir …” ist meistens harmlos. Es kommt oft, wenn alte/home/node/.clawdbot-State im Container schon existiert. Sobald deine Host-Config sauber gemountet ist, verschwindet das i.d.R.
Wenn du mir nur den Output von
docker compose -f /volume1/docker/moltbot/moltbot/docker-compose.yml exec moltbot-gateway node dist/index.js devices --help
postest (ohne Token), sage ich dir 1:1 den exakten devices approve ... Befehl, weil die Flags/Parameter je nach Version leicht variieren.
PROMPT 10
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js --help WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — If you can describe it, I can probably automate it—or at least make it funnier.
Usage: moltbot [options] [command]
Options: -V, --version output the version number --dev Dev profile: isolate state under ~/.clawdbot-dev, default gateway port 19001, and shift derived ports (browser/canvas) --profile Use a named profile (isolates CLAWDBOT_STATE_DIR/CLAWDBOT_CONFIG_PATH under ~/.clawdbot-) --no-color Disable ANSI colors -h, --help display help for command
Commands: setup Initialize ~/.clawdbot/moltbot.json and the agent workspace onboard Interactive wizard to set up the gateway, workspace, and skills configure Interactive prompt to set up credentials, devices, and agent defaults config Config helpers (get/set/unset). Run without subcommand for the wizard. doctor Health checks + quick fixes for the gateway and channels dashboard Open the Control UI with your current token reset Reset local config/state (keeps the CLI installed) uninstall Uninstall the gateway service + local data (CLI remains) message Send messages and channel actions memory Memory search tools agent Run an agent turn via the Gateway (use --local for embedded) agents Manage isolated agents (workspaces + auth + routing) acp Agent Control Protocol tools gateway Gateway control daemon Gateway service (legacy alias) logs Gateway logs system System events, heartbeat, and presence models Model configuration approvals Exec approvals nodes Node commands devices Device pairing + token management node Node control sandbox Sandbox tools tui Terminal UI cron Cron scheduler dns DNS helpers docs Docs helpers hooks Hooks tooling webhooks Webhook helpers pairing Pairing helpers plugins Plugin management channels Channel management directory Directory commands security Security helpers skills Skills management update CLI update helpers status Show channel health and recent session recipients health Fetch health from the running gateway sessions List stored conversation sessions browser Manage clawd's dedicated browser (Chrome/Chromium) help display help for command
Examples: moltbot channels login --verbose Link personal WhatsApp Web and show QR + connection logs. moltbot message send --target +15555550123 --message "Hi" --json Send via your web session and print JSON result. moltbot gateway --port 18789 Run the WebSocket Gateway locally. moltbot --dev gateway Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001. moltbot gateway --force Kill anything bound to the default gateway port, then start it. moltbot gateway ... Gateway control via WebSocket. moltbot agent --to +15555550123 --message "Run summary" --deliver Talk directly to the agent using the Gateway; optionally send the WhatsApp reply. moltbot message send --channel telegram --target @mychat --message "Hi" Send via your Telegram bot.
Docs: docs.molt.bot/cli
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices --help WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — Gateway online—please keep hands, feet, and appendages inside the shell at all times.
Usage: moltbot devices [options]
Device pairing + token management
Options: -h, --help display help for command root@Diskstation2:/volume1/docker/moltbot/moltbot#
RESPONSE 10
Perfekt – jetzt sind wir am eigentlichen Punkt:
disconnected (1008): pairing required heißt: die Control-UI ist im sicheren Kontext, aber dein Browser-“Device” ist noch nicht gepaired/approved. (Das ist eine Sicherheitsstufe der UI.) Moltbot+1
Wichtig: Dass devices --help keine Subcommands zeigt, ist normal/“kurz” gehalten – die Subcommands kommen bei devices list --help usw. Moltbot
Schritt 1: Stelle sicher, dass der Token wirklich gesetzt ist
Öffne einmal explizit (damit der Token sicher in localStorage landet):
http://127.0.0.1:28789/?token=DEIN_TOKENMoltbot
Tipp: Mach alle alten Tabs zu (auch die mit NAS-IP), sonst verbinden die parallel weiter.
Schritt 2: Pending Device im Gateway auflisten (im Gateway-Container, nicht im CLI-Container)
Auf der DiskStation:
cd /volume1/docker/moltbot/moltbot
# 1) Zeig die echten devices-subcommands
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list --help
Dann die Pending Requests listen:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
Du solltest etwas sehen wie pending + eine requestId. (Das ist genau der Flow aus der Doku.) Moltbot
Schritt 3: Device approven
Mit der requestId aus devices list:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve <requestId>
Danach die Seite neu laden → Health sollte Online sein. Moltbot
Wenn devices list nichts anzeigt: Logs checken, ob es wirklich “pairing” ist oder “token missing”
Während du die UI offen hast:
docker compose -f docker-compose.yml logs -f moltbot-gateway
Wenn da sowas steht wie reason=token_missing, dann ist es kein Pairing-Problem, sondern der Token wurde nicht übernommen (dann nochmal /?token=... öffnen). (Diesen Fall sieht man auch in Issues rund um die UI.) GitHub
Notfall-Bypass (wenn du es hinter Tunnel/VPN betreibst und dir Pairing egal ist)
Du kannst Device-Identity + Pairing für die Control-UI komplett deaktivieren:
gateway.controlUi.allowInsecureAuth: true Moltbot
Das ist aber ein Security-Downgrade (ok hinter SSH-Tunnel/VPN, nicht ok “offen”). Moltbot
Warum dein vorheriges moltbot-cli devices list kaputt ging
Weil der CLI-Container ws://127.0.0.1:18789 anpeilt – und 127.0.0.1 im Container ist nicht dein Gateway-Container. Daher machen wir es richtig über exec moltbot-gateway ….
Wenn du willst: Poste nur die Ausgabe von
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
(ohne Tokens) – dann sag ich dir exakt, welchen <requestId> du approven musst und ob es evtl. mehrere Pending gibt.
PROMPT 11
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list --help WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — The only bot Mark can't train on your DMs.
Usage: moltbot devices [options]
Device pairing + token management
Options: -h, --help display help for command root@Diskstation2:/volume1/docker/moltbot/moltbot#
RESPONSE 11
Alles gut – dein --help triggert gerade nur die allgemeine Hilfe von devices (dadurch siehst du keine Subcommands). Fürs Pairing musst du die Commands ohne --help laufen lassen.
Dein Status disconnected (1008): pairing required bedeutet: Secure Context passt (localhost via Tunnel), aber dein Browser-Device ist noch nicht freigegeben. Das ist so vorgesehen. Moltbot+1
- Pairing-Request erzeugen (Browser)
-
Tunnel läuft (du nutzt
http://127.0.0.1:28789/✅) -
Öffne die UI einmal mit Token, damit sicher eine Pairing-Anfrage entsteht:
http://127.0.0.1:28789/?token=DEIN_TOKEN
-
Lass den Tab offen (auch wenn “pairing required” steht)
- Pending Devices im Gateway anzeigen
Auf der DiskStation:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
Das sollte eine Liste liefern (typisch mit einer id / requestId / Status wie pending). In den Community-Fixes ist genau dieser Flow dokumentiert. Answer Overflow
- Device freigeben
Nimm die ID aus der Liste und approve:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve <ID_AUS_LIST>
Danach Browser-Tab neu laden → Health sollte Online gehen. Answer Overflow+1
Wenn devices list leer ist
Dann erzeugt die UI gerade noch keine Pairing-Anfrage (oder sie kommt nicht an). Mach das:
- Logs live anschauen:
docker compose -f docker-compose.yml logs -f moltbot-gateway
- Während die Logs laufen: UI-Tab hart neu laden (Strg+F5).
Du solltest dann Einträge sehen, dass eine Verbindung/Pairing-Flow ankommt (und nicht mehr “HTTPS or localhost”). Moltbot
Notlösung (nur wenn du dem Netz komplett vertraust)
Du kannst die Device Identity + Pairing für die Control UI abschalten:
gateway.controlUi.allowInsecureAuth: true Moltbot+1
Das ist praktisch hinter VPN/SSH-Tunnel, aber nicht für “offen im Internet”.
Wenn du magst: Poste die Ausgabe von
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
(das enthält normalerweise keine Secrets), dann sag ich dir genau, welche ID du approven musst.
PROMPT 12
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — Shell yeah—I'm here to pinch the toil and leave you the glory.
│ ◇ Doctor warnings ──────────────────────────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → /home/node/.moltbot): Error: │ │ EBUSY: resource busy or locked, rename '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────╯ │ gateway connect failed: Error: unauthorized: gateway token mismatch (set gateway.remote.token to match gateway.auth.token) ◇ [moltbot] CLI failed: Error: gateway closed (1008): unauthorized: gateway token mismatch (set gateway.remote.token to match gateway.auth.token) Gateway target: ws://127.0.0.1:18789 Source: local loopback Config: /home/node/.clawdbot/moltbot.json Bind: loopback at Object.onClose (file:///app/dist/gateway/call.js:169:22) at WebSocket. (file:///app/dist/gateway/client.js:90:32) at WebSocket.emit (node:events:519:28) at WebSocket.emitClose (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:273:10) at Socket.socketOnClose (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:1346:15) at Socket.emit (node:events:519:28) at TCP. (node:net:346:12) root@Diskstation2:/volume1/docker/moltbot/moltbot#
RESPONSE 12
Du bist jetzt einen Schritt weiter: Der Fehler ist nicht mehr “pairing required”, sondern “gateway token mismatch” – und der blockiert genau die CLI-Kommandos, die wir zum Pairing bräuchten.
Aus deinem Output:
-
CLI liest Config:
/home/node/.clawdbot/moltbot.json -
Gateway erwartet aber einen anderen Token
-
Daher:
unauthorized: gateway token mismatch (set gateway.remote.token to match gateway.auth.token)
Heißt: gateway.remote.token (CLI) ≠ gateway.auth.token (Gateway). Moltbot+1
Fix: Tokens in der Config auf den Gateway-Token “synchronisieren”
1) Token aus der laufenden Gateway-Umgebung auslesen (nicht hier posten!)
Auf der Diskstation:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec moltbot-gateway sh -lc 'echo "$CLAWDBOT_GATEWAY_TOKEN"'
➡️ Den Wert kopieren, aber nicht im Chat teilen.
2) Genau diesen Token in die Config schreiben
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js config set gateway.auth.token "<TOKEN>"
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js config set gateway.remote.token "<TOKEN>"
(Die config set Befehle sind lokal und sollten ohne Gateway-Connect funktionieren.) Moltbot
3) Jetzt nochmal devices list
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
Wenn jetzt ein pending Device auftaucht, kannst du es freigeben:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve <ID_AUS_LIST>
Danach im Browser (Tunnel) einmal neu laden:
http://127.0.0.1:28789/?token=...
Wichtig: Du hast den Token bereits gepostet → bitte rotieren
Weil der Token in deinem Chat steht, würde ich ihn sofort neu setzen:
- neuen Token generieren:
openssl rand -hex 32
- in
.env(Compose) setzen und in Config spiegeln (wie oben), dann restart:
docker compose -f docker-compose.yml down
docker compose -f docker-compose.yml up -d
Wenn du willst: Kopier mir ohne Token die Ausgabe von
docker compose -f docker-compose.yml exec moltbot-gateway sh -lc 'printenv | grep -E "CLAWDBOT_GATEWAY_TOKEN|GATEWAY"'
(also nur Variablennamen/ob gesetzt), dann kann ich dir sagen, ob der Token aus .env kommt oder wo genau die Abweichung herkommt.
PROMPT 13
das ausgegebene Token wich von meinem ursprünglich angezeigten Token ab.
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — Because Threads wasn't the answer either.
│ ◇ Doctor warnings ──────────────────────────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → /home/node/.moltbot): Error: │ │ EBUSY: resource busy or locked, rename '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ Pending (1) ┌──────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┬──────────┬─────────────┬────────┬────────┐ │ Request │ Device │ Role │ IP │ Age │ Flags │ ├──────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼─────────────┼────────┼────────┤ │ 0429f8ed-756a-45b1-9f25-553fdb619dbd │ ded04206eed7fefbbad224dbe7fc59b741cec1451c6b368e6cf190b30d9c333d │ operator │ 192.168.0.1 │ 4m ago │ │ └──────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────┴─────────────┴────────┴────────┘ Paired (1) ┌────────────────────────────────────────────────────────────────────────────────────────┬─────────────────────────────────┬───────────────────────────────────────────────────────────────────────────┬─────────────────────────────────┬────────────┐ │ Device │ Roles │ Scopes │ Tokens │ IP │ ├────────────────────────────────────────────────────────────────────────────────────────┼─────────────────────────────────┼───────────────────────────────────────────────────────────────────────────┼─────────────────────────────────┼────────────┤ │ cc23583eabedc79ab8570591756ae058824c8d084a40cdd2b20eaa0ee8d597ef │ operator │ operator.admin, operator.approvals, operator.pairing │ operator │ │ └────────────────────────────────────────────────────────────────────────────────────────┴─────────────────────────────────┴───────────────────────────────────────────────────────────────────────────┴─────────────────────────────────┴────────────┘ root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve cc23583eabedc79ab8570591756ae058824c8d084a40cdd2b20eaa0ee8d597ef WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — Type the command with confidence—nature will provide the stack trace if needed.
│ ◇ Doctor warnings ──────────────────────────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → /home/node/.moltbot): Error: │ │ EBUSY: resource busy or locked, rename '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ [moltbot] CLI failed: Error: unknown requestId at GatewayClient.handleMessage (file:///app/dist/gateway/client.js:253:36) at WebSocket. (file:///app/dist/gateway/client.js:84:46) at WebSocket.emit (node:events:519:28) at Receiver.receiverOnMessage (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:1225:20) at Receiver.emit (node:events:519:28) at Receiver.dataMessage (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:596:14) at Receiver.getData (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:496:10) at Receiver.startLoop (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:167:16) at Receiver._write (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:94:10) at writeOrBuffer (node:internal/streams/writable:572:12)
RESPONSE 13
Sehr gut — jetzt sieht man exakt, was los ist. 🙂
1) Warum unknown requestId kam
Du hast beim Approve die falsche ID verwendet:
-
Pending → “Request” = RequestId (die musst du approven)
-
Paired → “Device” = bereits gepairtes Device (das kann man nicht “approve’n”, weil es schon drin ist)
Du hast cc2358… aus Paired genommen → daher unknown requestId.
2) Richtig approven: die Request-ID aus “Pending”
In deinem Output ist das:
Request: 0429f8ed-756a-45b1-9f25-553fdb619dbd
Also:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve 0429f8ed-756a-45b1-9f25-553fdb619dbd
Danach prüfen:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
Die Pending-Zeile sollte weg sein und das Device (ded0420…) unter Paired auftauchen.
3) Dann im Browser
-
Tab neu laden (Strg+F5)
-
du solltest nicht mehr “pairing required” sehen und Health sollte Online werden.
Wenn die Request inzwischen “abgelaufen” ist
Dann:
-
UI offen lassen und hart neu laden (Strg+F5), damit eine neue Pairing-Request erzeugt wird
-
nochmal:
docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices list
- die neue Request-ID approven.
Zum Token-Thema (warum der Token plötzlich anders ist)
Das passiert typischerweise, wenn der Token nicht persistent fest verdrahtet ist (z. B. Container restart → neuer Token). Für Stabilität:
- Aktuellen Token aus dem laufenden Gateway holen:
docker compose -f docker-compose.yml exec moltbot-gateway sh -lc 'echo "$CLAWDBOT_GATEWAY_TOKEN"'
- In der UI wirklich mit genau diesem Token öffnen:
http://127.0.0.1:28789/?token=...
Und: Den Token, den du hier im Chat gepostet hattest, würde ich später rotieren.
Wenn du nach dem devices approve <requestId> immer noch “pairing required” siehst, sag mir kurz, ob devices list das Browser-Device jetzt unter Paired zeigt (ja/nein) — dann gehen wir den nächsten Engpass gezielt an.
PROMPT 14
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec moltbot-gateway node dist/index.js devices approve 0429f8ed-756a-45b1-9f25-553fdb619dbd WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string.
🦞 Moltbot 2026.1.27-beta.1 (unknown) — I'm not saying your workflow is chaotic... I'm just bringing a linter and a helmet.
│ ◇ Doctor warnings ──────────────────────────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → /home/node/.moltbot): Error: │ │ EBUSY: resource busy or locked, rename '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├────────────────────────────────────────────────────────────────────────────────────────────╯ │ ◇ [moltbot] CLI failed: Error: unknown requestId at GatewayClient.handleMessage (file:///app/dist/gateway/client.js:253:36) at WebSocket. (file:///app/dist/gateway/client.js:84:46) at WebSocket.emit (node:events:519:28) at Receiver.receiverOnMessage (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/websocket.js:1225:20) at Receiver.emit (node:events:519:28) at Receiver.dataMessage (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:596:14) at Receiver.getData (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:496:10) at Receiver.startLoop (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:167:16) at Receiver._write (/app/node_modules/.pnpm/ws@8.19.0/node_modules/ws/lib/receiver.js:94:10) at writeOrBuffer (node:internal/streams/writable:572:12) root@Diskstation2:/volume1/docker/moltbot/moltbot#
RESPONSE 14
Das unknown requestId passt 1:1 zu dem, was bei Moltbot üblich ist: Pending Pairing-Requests laufen automatisch ab – laut Doku nach 5 Minuten. Moltbot+1
Dein Request war schon “4m ago” in der Liste – bis du den richtigen Befehl ausgeführt hast, war er sehr wahrscheinlich gerade abgelaufen → dann kennt der Gateway die ID nicht mehr.
Schnellster Fix: neuen Request erzeugen + sofort approven
1) Im Browser (Tunnel) nur einen Tab offen lassen
-
http://127.0.0.1:28789/?token=DEIN_TOKEN -
Dann Strg+F5 (hart neu laden), damit ein frischer Pending-Request entsteht.
2) Auf der Diskstation: Pending-ID automatisch ziehen und approven (kein Copy/Paste)
Im Ordner /volume1/docker/moltbot/moltbot:
cd /volume1/docker/moltbot/moltbot
RID=$(
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list \
| grep -Eo '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' \
| head -1
)
echo "Approving requestId: $RID"
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices approve "$RID"
3) Prüfen
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list
Wenn Pending (0) ist und dein Browser-Device unter Paired auftaucht → Browser neu laden → Health sollte online sein.
Bonus: Token “festnageln”, damit er nicht ständig wechselt
Dass dein im Container ausgegebenes Token vom ursprünglichen abweicht, passiert oft, wenn der Token nicht “gepinnt” ist (oder Config/Service vs CLI auseinanderlaufen). In den Security-Docs wird dafür sogar ein Doctor-Command erwähnt. Moltbot+1
Saubere Variante:
- Token generieren:
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js doctor --generate-gateway-token
(oder selbst openssl rand -hex 32)
-
Den Token in deiner Compose/.env als
CLAWDBOT_GATEWAY_TOKEN=...setzen und Stack neu starten. -
Browser: einmal
/?token=...aufrufen (die UI speichert den Token in localStorage; siehe FAQ). Moltbot
Wenn du nach dem Approve immer noch “pairing required” siehst, poste kurz nur die Ausgabe von devices list direkt danach (ohne Token) – dann sieht man sofort, ob der Browser wirklich als Paired drin ist oder ob er beim Reload wieder einen neuen Pending erzeugt.
PROMPT 15
root@Diskstation2:/volume1/docker/moltbot/moltbot# RID=$(
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list
| grep -Eo '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'
| head -1 ) ving requestId: $RID" docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices approve "$RID"WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string.
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. │ ◇ Doctor warnings ───────────────────────────────────────────────────────╮ │ │ │ - Failed to move legacy state dir (/home/node/.clawdbot → │ │ /home/node/.moltbot): Error: EBUSY: resource busy or locked, rename │ │ '/home/node/.clawdbot' -> '/home/node/.moltbot' │ │ │ ├─────────────────────────────────────────────────────────────────────────╯ Paired (1) ┌────────────────────────────────────────────┬────────────┬─────────────────────────────────┬────────────┬────────────┐ │ Device │ Roles │ Scopes │ Tokens │ IP │ ├────────────────────────────────────────────┼────────────┼─────────────────────────────────┼────────────┼────────────┤ │ cc23583eabedc79ab8570591756ae058824c8d084a │ operator │ operator.admin, operator. │ operator │ │ │ 40cdd2b20eaa0ee8d597ef │ │ approvals, operator.pairing │ │ │ └────────────────────────────────────────────┴────────────┴─────────────────────────────────┴────────────┴────────────┘ root@Diskstation2:/volume1/docker/moltbot/moltbot#
Browser immer noch: disconnected (1008): unauthorized: gateway token mismatch (open a tokenized dashboard URL or paste token in Control UI settings)
Soll ich den Brwoser nochmal mit dem neuen token aufrufen?
RESPONSE 15
Ja — genau das. Du bist jetzt gepaired (dein devices list zeigt nur Paired, kein Pending), aber der Browser benutzt noch den alten Token. Deshalb kommt weiterhin:
unauthorized: gateway token mismatch (open a tokenized dashboard URL or paste token in Control UI settings)
Was jetzt zu tun ist (2 Minuten)
- Aktuellen Token aus dem laufenden Gateway holen (nicht hier posten):
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec -T moltbot-gateway sh -lc 'echo "$CLAWDBOT_GATEWAY_TOKEN"'
-
Alle Moltbot-Tabs schließen (wichtig, damit keine alten WS-Verbindungen weiter laufen)
-
Browser neu öffnen mit genau diesem Token:
http://127.0.0.1:28789/?token=PASTE_HERE
- Wenn du wieder im UI bist:
- In der Control UI → Settings → Token nochmal prüfen/neu einfügen (falls es ein Feld gibt) und speichern.
Damit sollte Health auf Online springen.
Warum das passiert ist
Dein Token hat sich zwischendurch geändert (z. B. durch Restart / andere Quelle für CLAWDBOT_GATEWAY_TOKEN). Pairing ist jetzt ok, aber Auth ist token-basiert, also muss der Browser-Token zum Gateway passen.
Empfehlung danach: Token “fixieren”, damit er nicht mehr springt
Damit du nicht jedes Mal neu tokenisieren musst:
- Token in
.envfest eintragen:
cd /volume1/docker/moltbot/moltbot
cat .env | grep -n "CLAWDBOT_GATEWAY_TOKEN"
Wenn nicht vorhanden, hinzufügen:
echo 'CLAWDBOT_GATEWAY_TOKEN=<DEIN_FESTER_TOKEN>' >> .env
- Stack neu starten:
docker compose -f docker-compose.yml down
docker compose -f docker-compose.yml up -d
Dann bleibt der Token stabil über Restarts.
Kurzer Reality-Check zu deinem Shell-Snippet
Dein echo "Approving requestId: $RID" ist beim Copy/Paste kaputt gegangen (deshalb hast du keine Ausgabe gesehen). Aber egal: am Ende zählt devices list → paired, fertig ✅
Wenn du nach dem neuen tokenized URL-Aufruf immer noch “unauthorized” bekommst, sag mir kurz:
-
kommt der Fehler sofort oder nach ein paar Sekunden?
-
und poste nur diese eine Zeile aus den Gateway-Logs (ohne Token):
docker compose -f docker-compose.yml logs --tail=30 moltbot-gateway
PROMPT 16
leider immer noch: disconnected (1008): pairing required In Settings steht: Schema unavailable.
RESPONSE 16
Das Muster passt zu zwei Dingen, die bei dir gerade gleichzeitig passieren:
-
Dein Pairing wird nicht stabil gespeichert (oder du erzeugst jedes Mal ein neues “Device”), deshalb springt es wieder auf
pairing required. -
“Schema unavailable” in Settings heißt praktisch: Die UI bekommt vom Gateway keine gültige Antwort – meistens, weil die WebSocket-Session wegen Pairing/Auth sofort wieder geschlossen wird.
Der wichtigste Hebel ist: Config/State persistent auf dem NAS mounten + Token fixieren, sonst fängst du nach jedem Restart/Session wieder von vorn an.
Schritt A — Prüfen, ob Moltbot wirklich deine NAS-Config nutzt (und nicht Container-intern)
Auf der DiskStation:
cd /volume1/docker/moltbot/moltbot
echo "---- .env ----"
ls -la .env
egrep -n 'CLAWDBOT_CONFIG_DIR|CLAWDBOT_WORKSPACE_DIR|CLAWDBOT_GATEWAY_TOKEN' .env || true
Wenn da nichts (oder nur teilweise) steht: genau das erklärt dein Verhalten. Dann läuft der Gateway mit Default-Pfaden im Container (/home/node/.clawdbot), Pairings/Token können sich “verschieben”.
Fix: .env sauber setzen (persistente Pfade + fixer Token)
- Token aus laufendem Container holen (nicht posten):
TOKEN=$(docker compose -f docker-compose.yml exec -T moltbot-gateway sh -lc 'echo "$CLAWDBOT_GATEWAY_TOKEN"')
echo "Token length: ${#TOKEN}"
.envergänzen (Backup + append):
cp -a .env .env.bak 2>/dev/null || true
# Falls .env nicht existiert:
touch .env
# Setze/überschreibe die drei Werte (einfach anhängen reicht i.d.R.; sauberer wäre editieren)
grep -q '^CLAWDBOT_CONFIG_DIR=' .env || echo 'CLAWDBOT_CONFIG_DIR=/volume1/docker/moltbot/config' >> .env
grep -q '^CLAWDBOT_WORKSPACE_DIR=' .env || echo 'CLAWDBOT_WORKSPACE_DIR=/volume1/docker/moltbot/workspace' >> .env
grep -q '^CLAWDBOT_GATEWAY_TOKEN=' .env || echo "CLAWDBOT_GATEWAY_TOKEN=$TOKEN" >> .env
- Stack neu starten:
docker compose -f docker-compose.yml down
docker compose -f docker-compose.yml up -d
Schritt B — Pairing einmal sauber durchziehen (und sofort approven)
-
Alle Moltbot-Tabs schließen
-
Browser neu öffnen mit Token:
http://127.0.0.1:28789/?token=<DER_TOKEN_AUS_.env> -
Sofort auf der DiskStation:
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list
Wenn du wieder Pending (1) siehst: nimm die Request-ID aus der Pending-Zeile und approve:
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices approve <REQUEST-ID>
Dann Browser Strg+F5.
Wichtig: Du musst die Request-ID approven (die UUID in der “Pending”-Zeile), nicht die Device-ID aus “Paired”.
Schritt C — Wenn es trotzdem immer wieder “pairing required” wird
Dann ist fast immer Browser-Storage das Problem (Device-ID wird nicht gespeichert), z. B. durch:
-
Inkognito/Private Mode
-
“Cookies/Website-Daten beim Schließen löschen”
-
harte Tracking-Protection/Extensions
Mach testweise:
-
normaler Chrome-Tab (kein Inkognito)
-
Extensions kurz deaktivieren
-
für
127.0.0.1Website-Daten erlauben
Warum “Schema unavailable”?
Das verschwindet automatisch, sobald WebSocket verbunden + autorisiert + gepaired ist. Es ist kein eigenes “Settings-Problem”, sondern nur ein Symptom der abgewiesenen Session.
Quick Next Step (ohne Rätselraten)
Führ bitte nach dem Restart diese zwei Commands aus und schau, was rauskommt:
docker compose -f docker-compose.yml exec -T moltbot-gateway sh -lc 'echo "CONFIG_DIR=$CLAWDBOT_CONFIG_DIR"; echo "WORKSPACE_DIR=$CLAWDBOT_WORKSPACE_DIR"; echo "TOKEN_LEN=${#CLAWDBOT_GATEWAY_TOKEN}"'
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list
Wenn CONFIG_DIR/WORKSPACE_DIR die NAS-Pfade zeigen und devices list wieder ein Pending ausspuckt, bist du 1 Klick vom Ziel entfernt (approve + Reload).
PROMPT 17
sollen wir vielleicht mal den Container neustarten?
RESPONSE 17
Ja — aber nicht “nur” neustarten, sondern mit fixierter .env neustarten, damit Token + Pairing nicht wieder wegrutschen. Sonst drehst du dich im Kreis.
Mach das exakt so (Copy/Paste):
- Container sauber stoppen
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml down
- .env stabilisieren (Config/Workspace + fixer Token)
Falls .env noch nicht existiert:
touch .env
Jetzt einen neuen festen Token erzeugen:
NEW_TOKEN=$(openssl rand -hex 32)
echo "New token length: ${#NEW_TOKEN}"
Und in .env setzen (damit es eindeutig ist, überschreiben wir bestehende Zeilen):
# alte Einträge entfernen (falls vorhanden)
sed -i '/^CLAWDBOT_CONFIG_DIR=/d;/^CLAWDBOT_WORKSPACE_DIR=/d;/^CLAWDBOT_GATEWAY_TOKEN=/d' .env
# neue Einträge setzen
cat >> .env <<EOF
CLAWDBOT_CONFIG_DIR=/volume1/docker/moltbot/config
CLAWDBOT_WORKSPACE_DIR=/volume1/docker/moltbot/workspace
CLAWDBOT_GATEWAY_TOKEN=$NEW_TOKEN
EOF
- Sicherstellen, dass die NAS-Ordner existieren + Rechte passen
mkdir -p /volume1/docker/moltbot/config /volume1/docker/moltbot/workspace
chown -R 1000:1000 /volume1/docker/moltbot/config /volume1/docker/moltbot/workspace
- Wieder starten
docker compose -f docker-compose.yml up -d
docker compose -f docker-compose.yml logs --tail=50 moltbot-gateway
- Browser (über deinen Tunnel!)
-
Alle Moltbot-Tabs schließen
-
Öffnen:
http://127.0.0.1:28789/?token=<NEW_TOKEN>
- Pairing sofort approven
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list
Wenn Pending (1) erscheint, nimm die Request-ID aus der Pending-Zeile und:
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices approve <REQUEST-ID>
Dann Browser Strg+F5.
Warum das hilft
-
Token bleibt jetzt stabil (aus
.env, nicht “irgendwoher”) -
Config/State liegen persistiert auf dem NAS
-
Pairing wird nicht mehr “vergessen”
Wenn du nach Schritt 4/5 wieder “pairing required” siehst: poste die Ausgabe von devices list direkt nach dem Reload — dann sehen wir sofort, ob er jedes Mal ein neues Pending erzeugt (Browser speichert nicht) oder ob es ein Gateway/State-Thema ist.
PROMPT 18
moment, das ist nich tder einzige Container den ich laufen habe, fahre ich damit explizit nur diesen einen Container runter?
RESPONSE 18
Ja — wenn du im richtigen Ordner bist und die richtige Compose-Datei angibst, betrifft das nur den Moltbot-Stack (also die Services aus docker-compose.yml in /volume1/docker/moltbot/moltbot/). Andere Container/Stacks bleiben unangetastet.
Konkret:
-
cd /volume1/docker/moltbot/moltbot -
docker compose -f docker-compose.yml down
➡️ Das stoppt nur die Container, die zu diesem Compose-Projekt gehören (z. B. moltbot-gateway, evtl. moltbot-cli wenn er als Service existiert).
Es fährt nicht “alle Docker Container” auf der DiskStation runter.
Extra-sicherer Check (optional, aber schnell)
Vorher anzeigen lassen, was genau zu diesem Stack gehört:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml ps
Wenn dort nur die Moltbot-Container stehen, ist alles safe.
Noch sicherer: nur den Gateway neu starten (ohne “down”)
Wenn du wirklich nur den einen Container anfassen willst:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml restart moltbot-gateway
Oder komplett neu erstellen (falls .env geändert wurde):
docker compose -f docker-compose.yml up -d --force-recreate moltbot-gateway
Wenn du willst, poste kurz die Ausgabe von docker compose ... ps (die enthält keine Secrets) – dann sag ich dir genau, welche Services/Container in deinem Moltbot-Stack stecken und welcher Restart am sinnvollsten ist.
PROMPT 19
root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml logs --tail=50 moltbot-gateway WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. moltbot-moltbot-gateway-1 | │ moltbot-moltbot-gateway-1 | ◇ Doctor warnings ───────────────────────────────────────────────────────╮ moltbot-moltbot-gateway-1 | │ │ moltbot-moltbot-gateway-1 | │ - Failed to move legacy state dir (/home/node/.clawdbot → │ moltbot-moltbot-gateway-1 | │ /home/node/.moltbot): Error: EBUSY: resource busy or locked, rename │ moltbot-moltbot-gateway-1 | │ '/home/node/.clawdbot' -> '/home/node/.moltbot' │ moltbot-moltbot-gateway-1 | │ │ moltbot-moltbot-gateway-1 | ├─────────────────────────────────────────────────────────────────────────╯ root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml logs --tail=50 moltbot-moltbot-cli-1 WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. no such service: moltbot-moltbot-cli-1 root@Diskstation2:/volume1/docker/moltbot/moltbot# docker compose -f docker-compose.yml logs --tail=50 moltbot-cli WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_AI_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_SESSION_KEY" variable is not set. Defaulting to a blank string. WARN[0000] The "CLAUDE_WEB_COOKIE" variable is not set. Defaulting to a blank string. moltbot-moltbot-cli-1 | acp Agent Control Protocol tools moltbot-moltbot-cli-1 | gateway Gateway control moltbot-moltbot-cli-1 | daemon Gateway service (legacy alias) moltbot-moltbot-cli-1 | logs Gateway logs moltbot-moltbot-cli-1 | system System events, heartbeat, and presence moltbot-moltbot-cli-1 | models Model configuration moltbot-moltbot-cli-1 | approvals Exec approvals moltbot-moltbot-cli-1 | nodes Node commands moltbot-moltbot-cli-1 | devices Device pairing + token management moltbot-moltbot-cli-1 | node Node control moltbot-moltbot-cli-1 | sandbox Sandbox tools moltbot-moltbot-cli-1 | tui Terminal UI moltbot-moltbot-cli-1 | cron Cron scheduler moltbot-moltbot-cli-1 | dns DNS helpers moltbot-moltbot-cli-1 | docs Docs helpers moltbot-moltbot-cli-1 | hooks Hooks tooling moltbot-moltbot-cli-1 | webhooks Webhook helpers moltbot-moltbot-cli-1 | pairing Pairing helpers moltbot-moltbot-cli-1 | plugins Plugin management moltbot-moltbot-cli-1 | channels Channel management moltbot-moltbot-cli-1 | directory Directory commands moltbot-moltbot-cli-1 | security Security helpers moltbot-moltbot-cli-1 | skills Skills management moltbot-moltbot-cli-1 | update CLI update helpers moltbot-moltbot-cli-1 | status Show channel health and recent session recipients moltbot-moltbot-cli-1 | health Fetch health from the running gateway moltbot-moltbot-cli-1 | sessions List stored conversation sessions moltbot-moltbot-cli-1 | browser Manage clawd's dedicated browser (Chrome/Chromium) moltbot-moltbot-cli-1 | help display help for command moltbot-moltbot-cli-1 | moltbot-moltbot-cli-1 | Examples: moltbot-moltbot-cli-1 | moltbot channels login --verbose moltbot-moltbot-cli-1 | Link personal WhatsApp Web and show QR + connection logs. moltbot-moltbot-cli-1 | moltbot message send --target +15555550123 --message "Hi" --json moltbot-moltbot-cli-1 | Send via your web session and print JSON result. moltbot-moltbot-cli-1 | moltbot gateway --port 18789 moltbot-moltbot-cli-1 | Run the WebSocket Gateway locally. moltbot-moltbot-cli-1 | moltbot --dev gateway moltbot-moltbot-cli-1 | Run a dev Gateway (isolated state/config) on ws://127.0.0.1:19001. moltbot-moltbot-cli-1 | moltbot gateway --force moltbot-moltbot-cli-1 | Kill anything bound to the default gateway port, then start it. moltbot-moltbot-cli-1 | moltbot gateway ... moltbot-moltbot-cli-1 | Gateway control via WebSocket. moltbot-moltbot-cli-1 | moltbot agent --to +15555550123 --message "Run summary" --deliver moltbot-moltbot-cli-1 | Talk directly to the agent using the Gateway; optionally send the WhatsApp reply. moltbot-moltbot-cli-1 | moltbot message send --channel telegram --target @mychat --message "Hi" moltbot-moltbot-cli-1 | Send via your Telegram bot. moltbot-moltbot-cli-1 | moltbot-moltbot-cli-1 | Docs: docs.molt.bot/cli moltbot-moltbot-cli-1 | root@Diskstation2:/volume1/docker/moltbot/moltbot#
RESPONSE 19
Ja, das passt – und deine Logs sagen gerade zwei wichtige Dinge:
-
moltbot-cliist kein dauerhafter Service, sondern wird normalerweise perdocker compose run --rm ...gestartet. Deshalb siehst du beilogs moltbot-clinur das CLI-Help (der Container startet → zeigt Help → beendet). -
Im Browser kommt der WS-Handshake nicht “bis zum Schema”, daher “Schema unavailable”. Das passiert, wenn der Gateway die Verbindung direkt mit
pairing required(oder Token-Mismatch) schließt.
Wir kriegen das jetzt sauber stabil hin:
- Live sehen, warum die UI abgewiesen wird (wichtigster Debug)
In einem Terminal:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml logs -f --tail=200 moltbot-gateway
Dann im Browser (Tunnel) Strg+F5 auf:
http://127.0.0.1:28789/?token=<AKTUELLER_TOKEN>
👉 In den Logs muss dann eine Zeile kommen mit code=1008 reason=... (wie du sie früher schon hattest). Die “reason” ist der Schlüssel.
- Pairing “sofort” durchziehen (RequestId ist schnell weg)
Wenn du wieder pairing required siehst: direkt danach auf der Diskstation:
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices list
Wenn Pending (1) da ist, nimm die Request-ID (UUID-Spalte “Request”) und approve:
docker compose -f docker-compose.yml exec -T moltbot-gateway node dist/index.js devices approve <REQUEST-ID>
Dann Browser neu laden.
Wenn Pending ständig wiederkommt
Dann speichert der Browser die Device-ID nicht (typisch: Inkognito, “Website-Daten beim Schließen löschen”, harte Privacy-Extensions).
➡️ Test: normaler Chrome-Tab, keine Inkognito-Session, Extensions kurz aus, Website-Daten für 127.0.0.1 erlauben.
- Token wirklich “aktuell” verwenden (nicht raten)
Hol dir den Token aus dem laufenden Gateway (nicht posten):
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml exec -T moltbot-gateway sh -lc 'echo "$CLAWDBOT_GATEWAY_TOKEN"'
Dann alle Moltbot-Tabs schließen und neu öffnen:
http://127.0.0.1:28789/?token=<DIESER_TOKEN>
Wenn der Token nicht stimmt, würdest du eher
unauthorized: token mismatchsehen – aber wir stellen es so auf jeden Fall sauber.
- Warum dein
devices approvevorhin nicht “sichtbar” war
Dein Copy/Paste hat den echo "Approving..." zerlegt, daher kam keine Ausgabe – aber devices list danach zeigt ja: Paired (1). Das Pairing selbst hat also grundsätzlich funktioniert.
- Einmal kurz die Services anzeigen (damit du dich nicht im Namen verhedderst)
cd /volume1/docker/moltbot/moltbot
docker compose -f docker-compose.yml ps
Du siehst dann exakt, welche Container zu diesem Stack gehören (und dass du nicht “alle Container” stoppst).
Kurze Frage nur zur Einordnung (ohne dass du lange suchen musst):
Wenn du jetzt Schritt 1 machst (Gateway-Logs live) und die UI neu lädst: Welche reason= Zeile kommt dann genau?
(Die eine Zeile reicht.) Dann kann ich dir sofort sagen, ob wir nur Pairing erneuern müssen oder ob der Gateway gerade wieder auf einen anderen Token/State zeigt.
PROMPT 20
endlich sind wir da!
RESPONSE 20
Yes!! 🎉 Dann war’s am Ende genau der Klassiker: Secure Context + richtiger Token + Pairing im richtigen Moment (und nicht über die NAS-IP) — und sobald das durch ist, läuft die Control UI stabil.
Damit es jetzt dauerhaft entspannt bleibt (und du nicht nochmal in Token-/Pairing-Schleifen rutschst), hier die 3 “Stabilitäts-Härtungen”, die ich dir sofort empfehlen würde:
- Token fixieren (damit er nicht wieder wechselt)
In /volume1/docker/moltbot/moltbot/.env sollte dauerhaft stehen:
-
CLAWDBOT_GATEWAY_TOKEN=... -
CLAWDBOT_CONFIG_DIR=/volume1/docker/moltbot/config -
CLAWDBOT_WORKSPACE_DIR=/volume1/docker/moltbot/workspace
Check:
cd /volume1/docker/moltbot/moltbot
egrep -n 'CLAWDBOT_GATEWAY_TOKEN|CLAWDBOT_CONFIG_DIR|CLAWDBOT_WORKSPACE_DIR' .env
- Remote-Zugriff: am sichersten über VPN (Tailscale) + Tunnel
Für unterwegs: Tailscale auf NAS + SSH-Tunnel ist extrem robust und du musst keine Ports nach außen öffnen.
Dein “Ritual” dann:
ssh -N -L 28789:127.0.0.1:18789 -L 28790:127.0.0.1:18790 root@<tailscale-ip-oder-magicdns>
Browser:
http://127.0.0.1:28789/
- Token rotieren (weil du ihn hier im Chat mal gezeigt hattest)
Wenn du den Token irgendwo gepostet hast: einmal neu setzen (und UI danach mit neuem Token öffnen).
Wenn du magst, sag kurz: Willst du “von unterwegs” lieber Tunnel (sicher/clean) oder lieber HTTPS-URL ohne Tunnel (Reverse Proxy)?
Dann bau ich dir die sauberste Remote-Variante für dein Setup, ohne dass du dir ein Sicherheitsloch ins NAS fräst.
PROMPT 21
die .env Datei ist da. wie kann ich die Thematik mit dem Tunnel dauerhaft lösen?
RESPONSE 21
Nice — dann machen wir das jetzt “1-Command-komfortabel” und stabil (inkl. Auto-Reconnect), ohne Reverse Proxy.
Ich gehe von Windows aus (dein Chrome/Logs sahen so aus). Wenn du macOS/Linux nutzt, sag kurz Bescheid – die Idee ist die gleiche, nur die Autostart-Schritte sind anders.
Zielbild
-
Du verbindest dich von unterwegs per VPN (am besten Tailscale) auf dein NAS
-
Ein einziger Befehl startet den Tunnel:
ssh moltbot-tunnel -
Browser öffnet immer:
http://127.0.0.1:28789/
Wichtig: Der Tunnel löst nur die “localhost/secure context”-Anforderung. Von unterwegs brauchst du trotzdem einen sicheren Weg, dein NAS per SSH zu erreichen (VPN statt Port-Forwarding).
- SSH-Key einrichten (damit kein Passwort-Geklicke)
Auf deinem Windows-PC (PowerShell):
ssh-keygen -t ed25519 -a 64 -f $env:USERPROFILE\.ssh\id_ed25519_moltbot
Public Key auf die Synology kopieren (einmalig). Wenn du ssh-copy-id nicht hast:
type $env:USERPROFILE\.ssh\id_ed25519_moltbot.pub | ssh <NAS-USER>@<NAS-IP> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
👉 Nimm idealerweise nicht root, sondern einen DSM-User mit SSH-Recht.
- SSH-Konfig anlegen (damit der Tunnel 1 Kommando ist)
Datei: C:\Users\<du>\.ssh\config
Host moltbot-tunnel
HostName <DEIN_NAS_HOST> # z.B. Tailscale-MagicDNS oder Tailscale-IP
User <NAS-USER>
IdentityFile ~/.ssh/id_ed25519_moltbot
# Tunnel Ports (lokal -> NAS)
LocalForward 28789 127.0.0.1:18789
LocalForward 28790 127.0.0.1:18790
# Stabilität
ServerAliveInterval 30
ServerAliveCountMax 3
TCPKeepAlive yes
ExitOnForwardFailure yes
Ab jetzt reicht:
ssh -N moltbot-tunnel
Browser: http://127.0.0.1:28789/
- Von unterwegs: nimm VPN statt Portweiterleitung (empfohlen)
Wenn du noch kein VPN hast: Tailscale auf der DiskStation ist der entspannteste Weg (kein Port im Internet offen).
Dann setzt du in HostName einfach:
-
die Tailscale-IP (100.x.y.z) oder
-
MagicDNS-Name deiner DiskStation
- “Dauerhaft” = Autostart + Auto-Reconnect
A) Einfach: Desktop-Shortcut (manuell starten, aber 1 Klick)
Erstelle moltbot-tunnel.ps1 z.B. auf dem Desktop:
ssh -N moltbot-tunnel
Dann Shortcut erstellen, der PowerShell damit startet:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "C:\Pfad\moltbot-tunnel.ps1"
B) Besser: Task Scheduler (startet automatisch beim Login)
Windows Aufgabenplanung → Aufgabe erstellen
-
Trigger: “Bei Anmeldung”
-
Aktion: Programm:
C:\Windows\System32\OpenSSH\ssh.exe -
Argumente:
-N moltbot-tunnel
Optional: “Neu starten bei Fehler”/“Wiederholen alle 1 Minute” (wenn du es robust willst).
C) Hardcore stabil: Auto-Reconnect mit autossh (über WSL)
Wenn du WSL nutzt:
-
sudo apt install autossh -
dann:
autossh -M 0 -N moltbot-tunnel
Das reconnectet selbst, wenn WLAN/VPN kurz weg ist.
- Kleiner UX-Hack
Wenn der Tunnel läuft: bookmark dir nur
http://127.0.0.1:28789/
(ohne Token im Link). Token lieber in der UI einmal setzen/merken lassen oder im Passwortmanager ablegen.
Zwei Mini-Checks, damit’s wirklich dauerhaft stabil bleibt
-
CLAWDBOT_GATEWAY_TOKENbleibt in deiner.envfix (sonst musst du ständig neu tokenisieren). -
Browser nicht im Inkognito, und Website-Daten für
127.0.0.1nicht automatisch löschen (sonst nervt Pairing wieder).
Wenn du willst, sag mir kurz:
-
Nutzt du schon Tailscale oder brauchst du das Setup noch?
-
Welcher NAS-User ist bei dir fürs SSH am sinnvollsten (admin/normaler User)?
Dann mache ich dir die konkret sicherste Variante für “unterwegs”, ohne Portfreigaben und ohne Reverse Proxy.