#hosting on VPS

1 messages · Page 1 of 1 (latest)

fringe wagon
#

hosting openclaw on VPS, how can I access the openclaw URL web dashboard via the servers IP or a custom domain? does it have auth?

vital lanternBOT
#

To help others find answers, you can mark your question as solved via Right click solution message -> Apps -> âś… Mark Solution

fluid geyserBOT
#

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:

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.

fringe wagon
# fluid geyser By default the Gateway dashboard (Control UI) is served on the **same port as th...

i did this

  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:
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)

fluid geyserBOT
#

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.)

fringe wagon
fluid geyserBOT
#

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:

  1. 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

  1. 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.

  1. 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.

fringe wagon
fluid geyserBOT
#

That’s (mostly) expected on Discord, not really a “bug”.

Two things are happening:

  1. 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

  2. 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 coalesce minChars is 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.

fringe wagon
fluid geyserBOT
#

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

  1. it posting in the wrong Discord channel, or
  2. it sending your text to the LLM provider (Claude) (which is “online” by design), or
  3. it using web/tools to transmit data out?
fringe wagon
#

@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?

fluid geyserBOT
#

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:

  1. Incoming messages (Discord/Telegram/etc)
  2. Heartbeats (periodic agent runs)
  3. Cron jobs (scheduled runs)
  4. 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