Skip to content

Deployment: Cloud (Remote Access)

Both Nerve and Gateway hosted remotely. Access from any device, anywhere.

Topology options

Browser (remote) → Nerve cloud → Gateway cloud (same machine)

Split hosts

Browser (remote) → Nerve (host A) → Gateway (host B)

Same-host is simpler and has fewer failure points. Use split hosts only if you have a specific reason.

Prerequisites

  • Cloud Linux host with Node.js 22+
  • OpenClaw gateway running
  • Domain or stable IP for Nerve
  • TLS termination plan (reverse proxy or direct certs)

Same-host setup

1. Install Nerve

bash
curl -fsSL https://raw.githubusercontent.com/daggerhashimoto/openclaw-nerve/master/install.sh | bash

2. Run setup with network access

bash
cd ~/nerve
npm run setup

Recommended choices:

  • Access mode: Network or Custom
  • HOST=0.0.0.0
  • Enable authentication and set a password
  • Enable HTTPS if serving directly

3. Start the service

bash
sudo systemctl restart nerve.service
sudo systemctl status nerve.service

4. Set up TLS

Put Nerve behind a reverse proxy (Nginx, Caddy, or Traefik) that handles HTTPS and forwards HTTP + WebSocket traffic to Nerve.

Or generate certs directly:

bash
mkdir -p certs
openssl req -x509 -newkey rsa:2048 -nodes \
  -keyout certs/key.pem -out certs/cert.pem -days 365 \
  -subj "/CN=your-domain.com"

Nerve auto-detects certificates at certs/cert.pem and certs/key.pem.

Split-host setup

Follow the same-host steps for Nerve, then add:

Point Nerve to remote gateway

In .env:

bash
GATEWAY_URL=<remote-gateway-url>
WS_ALLOWED_HOSTS=<remote-gateway-hostname-or-ip>

Patch remote gateway allowed origins

On the gateway host, add Nerve's public origin to gateway.controlUi.allowedOrigins:

https://nerve.example.com

Ensure gateway tools allowlist

json
"gateway": {
  "tools": {
    "allow": ["cron", "gateway"]
  }
}

Restart both services.

Validation

bash
# Nerve host
curl -sS http://127.0.0.1:3080/health

# Public endpoint
curl -sS https://<nerve-domain>/health

In the browser: login screen appears, connect succeeds, sessions load, messages work.

Common issues

Remote clients may still need manual credentials

Remote clients can still auto-connect when Nerve trusts the request and the browser is using the official gateway URL. In that case /api/connect-defaults reports serverSideAuth=true, the browser sends an empty token, and Nerve injects GATEWAY_TOKEN server-side during the WebSocket handshake.

Manual token entry is only required for custom gateway URLs or untrusted access paths.

Reverse proxy and trusted proxy settings

Wrong IP detection affects rate limiting and logs.

Fix: Set TRUSTED_PROXIES in .env to your reverse proxy addresses.

Security notes

  • Always enable NERVE_AUTH=true for remote access
  • Use HTTPS end-to-end or at least at the edge
  • Keep the gateway on loopback when Nerve and Gateway share a host
  • Rotate gateway token on access changes

Recommendation

Choose same-host unless you have a hard requirement for split hosts. It's easier to secure and support.

Released under the MIT License.