#hosting on VPS
1 messages · Page 1 of 1 (latest)
By default the Gateway dashboard (Control UI) is served on the same port as the Gateway WebSocket (default 18789) and the Gateway usually binds to loopback, so it’s only reachable from the VPS itself.
Recommended ways to access it (VPS)
1) SSH tunnel (safest / easiest)
Keep gateway.bind: "loopback" and tunnel from your laptop:
ssh -N -L 18789:127.0.0.1:18789 user@<vps-ip>
Then open on your laptop:
Docs: https://docs.openclaw.ai/gateway/remote
2) Tailscale Serve (best UX if you have Tailscale)
This gives you a stable URL (MagicDNS) without exposing the port publicly.
Docs: https://docs.openclaw.ai/gateway/tailscale
Overview: https://docs.openclaw.ai/web
3) Bind to the VPS IP (not recommended on the public internet)
You can set:
{ gateway: { bind: "lan" } } // 0.0.0.0
…and then open:
http://<vps-ip>:18789/
But only do this if you also lock it down (firewall / VPN) because:
Does it have auth?
Yes. Dashboard auth is enforced at the WebSocket handshake via gateway.auth (token or password). It’s an admin surface (chat/config/exec approvals), so don’t expose it publicly.
Docs:
- Dashboard + auth: https://docs.openclaw.ai/web/dashboard
- Gateway auth config: https://docs.openclaw.ai/gateway/configuration
Custom domain
Use a reverse proxy (Caddy/Nginx) in front of 127.0.0.1:18789 (make sure WebSockets are proxied; Caddy does this automatically). Keep the Gateway bound to loopback and keep gateway.auth enabled.
If you tell me what you’re using for the domain (Caddy vs Nginx) I can paste a minimal working config snippet.
i did this
- SSH tunnel (safest / easiest)
Keep gateway.bind: "loopback" and tunnel from your laptop:
ssh -N -L 18789:127.0.0.1:18789 user@<vps-ip>
Then open on your laptop:
http://127.0.0.1:18789/
but now it says disconnected (1008): unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)
Disconnected from gateway.
disconnected (1008): unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)
That’s expected: the SSH tunnel only makes the port reachable — the dashboard still needs the Gateway auth token.
Get the token from the VPS
Run on the VPS (or via SSH):
openclaw config get gateway.auth.token
If it prints nothing, generate one (only creates if missing):
openclaw doctor --generate-gateway-token
openclaw config get gateway.auth.token
(If your gateway runs under a different user / via systemd/docker, make sure you run the command as the same user that owns the OpenClaw config.)
Paste it into the Control UI
- Open: http://127.0.0.1:18789/
- Open Control UI settings (gear icon)
- Paste the token into the auth/token field
- Connect again
Refs:
- Dashboard auth: https://docs.openclaw.ai/web/dashboard
- Remote/SSH tunnel notes: https://docs.openclaw.ai/gateway/remote
If you paste what openclaw config get gateway.auth.token outputs (just whether it’s empty vs a value — don’t post the token itself), I can tell you the next step.
also i use claude code max as my API key. how will i know when i am approaching limit
Claude Code Max is a subscription quota, so OpenClaw can’t always “predict” it unless the provider exposes a usage endpoint.
What you can do in OpenClaw:
- See provider quota / usage window (when available)
- In chat:
/status(it can show provider usage/quota like “X% left” if supported) - On the VPS:
openclaw status --usage
Docs: https://docs.openclaw.ai/tools/slash-commands#usage-surfaces-what-shows-where
More detail: https://docs.openclaw.ai/reference/api-usage-costs#cli-usage-windows-provider-quotas
- See how many tokens you’re burning per reply
- In chat:
/usage tokens(or/usage full)
Note: with OAuth/subscription-style auth (often the case with Claude/Max flows), OpenClaw may show tokens but will usually not show $ cost.
- For the actual “Max plan” limit
That’s tracked on the Claude/Anthropic side (in your Claude account/app). When you’re close, you’ll typically see it there first; OpenClaw will otherwise only notice once the provider starts returning rate/limit errors.
If you run /status and it doesn’t show a quota line, paste that /status output (redact any tokens/URLs) and I’ll tell you what’s missing / whether your provider supports usage snapshots.
i also noticed a bug where discord messages are sent in one go, but they are thinking messages like telling me findings in seperate messagees. i think it's a bug and they're ment to send as sent rather than all in one go as it defeats the point
That’s (mostly) expected on Discord, not really a “bug”.
Two things are happening:
-
Discord doesn’t have true token-streaming.
OpenClaw can only do block streaming (send normal Discord messages in chunks). The only “live typing as it generates” surface is Telegram draft streaming. Docs: https://docs.openclaw.ai/concepts/streaming -
Even when block streaming is enabled, Discord is aggressively coalesced by default
To avoid spamming / hitting rate limits, OpenClaw merges streamed blocks and flushes them after an idle gap. For Signal/Slack/Discord the default coalesceminCharsis bumped to 1500, which often makes it look like “everything arrives at once”. Docs: https://docs.openclaw.ai/concepts/streaming#coalescing-merge-streamed-blocks
If you want more “sent as it goes” on Discord
Tune streaming/coalescing (example):
{
agents: {
defaults: {
blockStreamingDefault: "on",
blockStreamingBreak: "text_end",
blockStreamingChunk: { minChars: 200, maxChars: 800 },
},
},
channels: {
discord: {
blockStreaming: true,
blockStreamingCoalesce: { minChars: 0, idleMs: 200 },
},
},
}
That will make Discord emit smaller chunks sooner (at the cost of being more chatty).
If what you mean is specifically “I want to see the thinking/reasoning live”: that’s Telegram-only (/reasoning stream goes into the draft bubble). Discord will always show that only once it’s ready.
If you paste your current streaming-related config (redact tokens), I can point out exactly which knob is making it batch.
how can i put blocks on clawdbot so it doesnt post my info online?
If you mean “stop OpenClaw from accidentally posting sensitive stuff publicly” (Discord / web / random channels), you want two layers:
1) Restrict where it’s allowed to run on Discord (best first step)
In your openclaw.json, only allow a private channel (and/or DMs), and require a mention in guild channels:
{
channels: {
discord: {
guilds: {
"YOUR_GUILD_ID": {
requireMention: true,
channels: {
"private-bot-channel": { allow: true, requireMention: true }
// don’t set allow:true anywhere else
}
}
}
}
}
}
That way it won’t even respond in random public channels.
2) Add a hard “don’t send messages from risky places” kill-switch (sendPolicy)
This blocks outbound delivery for whole session types (super useful if you’re paranoid about group chats):
{
session: {
sendPolicy: {
rules: [
{ action: "deny", match: { channel: "discord", chatType: "group" } }
],
default: "allow"
}
}
}
With that rule, it can still work in DMs, but it won’t post back into Discord group/channel contexts.
Docs: https://docs.openclaw.ai/concepts/session#send-policy-optional
Optional: prevent it from “sending stuff elsewhere” via tools
If you’re worried about it using tools to push data out (proactive sends / web calls), you can disable those tools globally:
{
tools: {
deny: ["group:web", "message"] // blocks web_search/web_fetch + proactive messaging tool
}
}
Docs: https://docs.openclaw.ai/gateway/configuration-reference#toolsallow--toolsdeny
Quick clarification so I point you at the right config: are you worried about
- it posting in the wrong Discord channel, or
- it sending your text to the LLM provider (Claude) (which is “online” by design), or
- it using web/tools to transmit data out?
i mean like it has web access, how do I know that while im sleeping it wont go off and post on forums?
@fluid geyser i mean like it has web access, how do I know that while im sleeping it wont go off and post on forums?
OpenClaw won’t just “decide to go post on forums” on its own.
What can actually make it do stuff while you’re asleep?
Only triggers:
- Incoming messages (Discord/Telegram/etc)
- Heartbeats (periodic agent runs)
- Cron jobs (scheduled runs)
- HTTP hooks/webhooks (someone calls your
/hooks/...endpoint with your token)
If none of those fire, the model isn’t running, so it can’t do anything.
Also: “web access” ≠“can post to forums”
The built-in web tools (web_search, web_fetch) are read-only (search/fetch). There is no “post to forum” tool.
The only realistic ways it could post somewhere are:
- browser tool (automating a logged-in browser session)
- exec tool (running curl/scripts)
- message tool (proactive sends to chats you’ve configured)
So you can hard-block those.
“Paranoid mode” hard blocks (recommended)
In openclaw.json:
{
agents: { defaults: { heartbeat: { every: "0m" } } }, // disable heartbeats
cron: { enabled: false }, // disable scheduler
hooks: { enabled: false }, // disable /hooks/* HTTP triggers (unless you need them)
tools: {
deny: ["group:web", "group:ui", "group:runtime", "message"] // no web tools, no browser/canvas, no exec/process, no proactive messaging tool