#Help with VPS Hetzner VPS setup

1 messages ¡ Page 1 of 1 (latest)

wispy juniperBOT
#

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

woeful viperBOT
#

If you want a “security-conscious” Hetzner VPS setup, the safest default is:

  • Do not expose the OpenClaw Gateway port (18789) to the public internet
  • Keep the VPS with only SSH open
  • Access the Control UI via SSH tunnel (or Tailscale), and keep token auth enabled

Docs you’ll want open in another tab:

First: pick your approach (reply with numbers)

A) How do you want to access the Gateway UI?

  1. SSH tunnel (recommended; simplest + no extra services exposed)
  2. Tailscale (recommended if you already use it)
  3. Public HTTPS reverse proxy (advanced; easiest to misconfigure)
#

B) How do you want to run OpenClaw on the VPS?

  1. Docker / docker-compose (recommended on VPS; matches the Hetzner guide)
  2. Host install (systemd user service; fine but a bit more ops-y)

“Noob-safe” hardening checklist (before OpenClaw)

Do these in a way that won’t lock you out:

  • Create a non-root user with sudo, add SSH key login, and confirm you can log in in a second SSH session
  • Then disable password SSH + root SSH login
  • Turn on a firewall (e.g. UFW) and allow only SSH (and Tailscale if you pick option A2)
  • Enable automatic security updates (Ubuntu/Debian: unattended-upgrades)
  • Enable Hetzner snapshots/backups (at least before big changes)

OpenClaw-specific security “baseline”

Once it’s running, immediately do:

  • Run the built-in audit: openclaw security audit --deep (and optionally --fix)
  • Ensure the Gateway requires auth (token/password). Token is most common.
  • Keep chat channels locked down (DM pairing/allowlists; avoid “open to everyone” while you’re learning)
#

Reply with A + B (e.g. “A1 B1”), and tell me:

  • What OS image you chose on Hetzner (Ubuntu 22.04/24.04, Debian 12, etc.)
  • Which chat channel you want first (Telegram/Discord/WhatsApp)

Then I’ll give you a step-by-step plan that matches your choices and keeps the Gateway non-public.

haughty stratus
#

would you recommend any other providers other than hetzner, e.g. hostinger?

woeful viperBOT
#

Hostinger can work, but I generally recommend picking a provider that gives you a plain, boring Linux VM with full root access + predictable networking, because OpenClaw doesn’t need anything special—just reliability and the ability to not expose ports publicly.

What I’d recommend (in order of “known-good + easiest to follow docs”)

Also totally fine (no official step-by-step guide, but works well)

  • AWS Lightsail / EC2, DigitalOcean, Linode/Akamai, Vultr (all standard “real VPS” experiences)

Hostinger specifically

  • If it’s their VPS product (not shared hosting), and you can install Docker + control firewall rules + SSH normally, it should be fine.
  • I’d avoid anything “managed”/shared where you don’t fully control ports/services.
#

Security-wise, the provider matters less than these two choices:

  1. Keep the Gateway not publicly reachable (SSH tunnel or Tailscale; don’t open 18789 to the world)
  2. Run openclaw security audit --deep after setup and fix anything critical

If you tell me:

  1. your budget/month and region, and
  2. whether you want “cheapest possible” vs “most beginner-friendly UI”,
    I can point you to the best fit from that list.
haughty stratus
#

im in the eu spain specifically. but i want something cheap and reliable to et started with the option to upgrade later if needed. something without too much headaches for a not too savvy person in these matters

woeful viperBOT
#

Given “cheap + reliable + EU + upgrade later + minimal headaches”, I’d stick with Hetzner unless you have a hard requirement for the VPS to be physically in Spain.

Why Hetzner is the usual sweet spot:

  • Very good price/performance, stable networking
  • Easy to start small and resize up later
  • The OpenClaw community already has a “known-good” guide for it (so fewer weird surprises): https://docs.openclaw.ai/install/hetzner

Latency note: Spain → Germany/Finland is usually totally fine for a chat gateway. You’ll notice reliability way more than a few ms.

My recommended “noob-friendly, security-conscious” setup

  1. Hetzner VPS (Ubuntu LTS)
  2. Run OpenClaw via Docker compose (matches the guide)
  3. Keep the Gateway port bound to localhost only on the VPS (127.0.0.1:18789:18789)
  4. Access it from your laptop via SSH tunnel (no public exposure)

That’s basically: “only SSH is open to the internet”.

#

If you really want Spain specifically

Your main “Spain-region” option with an official guide is GCP (Madrid region), but it’s typically more expensive/complex than Hetzner for a simple always-on box: https://docs.openclaw.ai/install/gcp

Quick decision (reply with one number)

  1. Hetzner (recommended: cheapest + least hassle + best community path)
  2. GCP Madrid (if Spain-location is a must)
  3. Fly.io (more platform-y; can be nice, but more moving parts than a plain VPS): https://docs.openclaw.ai/install/fly

If you pick (1): tell me what OS image you chose (Ubuntu 24.04 / Debian 12), and whether you want SSH tunnel or Tailscale, and I’ll give you the exact minimal steps to get it running safely.

haughty stratus
#

what about Contabo as the provider? Hetzner gave me a headache with failed ID verification and i cba waiting

woeful viperBOT
#

Contabo is fine as long as it’s a real VPS where you have root access and can install Docker. OpenClaw doesn’t care who the provider is — it just needs a stable Linux box.

That said, my “operator” take:

  • Hetzner is the nicest “cheap but still solid” option when signup works.
  • Contabo is often very cheap, but you should be mentally prepared for occasional “noisy neighbor / inconsistent performance” type issues (which can show up as random slowness, especially if you start doing heavier things like browser automation). For a basic chat gateway it’s usually still OK.

If you go with Contabo, you can follow the same setup

Just use the Hetzner Docker guide as a generic VPS Docker guide:
https://docs.openclaw.ai/install/hetzner
(and/or the general Docker page: https://docs.openclaw.ai/install/docker)

Security-conscious key point (provider-independent):

  • Keep the Gateway not publicly exposed: publish 18789 on 127.0.0.1 only, and access via SSH tunnel.
    That way your VPS only needs SSH open to the internet.

To keep headaches low, I’d do this (reply with one number)

#
  1. “Contabo + Docker + SSH tunnel” (simple + secure, recommended if you’re proceeding today)
  2. “Pick a one-click platform” (Railway/Northflank) from the VPS hub if you want less Linux admin: https://docs.openclaw.ai/vps

If you pick (1), tell me what OS you installed on the VPS (Ubuntu 24.04 / Debian 12), and I’ll give you the minimal copy/paste steps (and which parts you should not change so you don’t accidentally expose it).

haughty stratus
#

alot of these vps proiders now have a 1-click openclaw setup now, it seems they have the integration done for you. would you recommend against this and if so why? or what are the considerations?

woeful viperBOT
#

“1‑click OpenClaw” deployments (Railway/Northflank/etc.) are not inherently bad — they’re basically a hosted template + a web /setup wizard — but the tradeoffs are real. I’d decide based on what you’re optimizing for.

Docs for the two “official-ish” one‑click paths:

When 1‑click is a good idea

  • You want to try OpenClaw quickly with minimal Linux/Docker work
  • You’re starting with Telegram/Discord/Slack (easy tokens)
  • You’re OK with the Gateway being reachable on a public HTTPS URL (but auth-protected)

Why I might recommend against it for a “security-conscious” setup

The big difference is: with a VPS you can do the safest pattern:

  • Gateway effectively private (bind/publish to localhost only)
  • Access via SSH tunnel or Tailscale
  • Only SSH is internet-exposed
#

With 1‑click platforms, the default experience is the opposite:

  • Your Gateway + Control UI are typically on a public internet URL (still protected by secrets, but it’s an exposed surface)

That’s not automatically unsafe, but it increases:

  • Attack surface (public endpoint, more things to misconfigure)
  • Trust in the platform (their routing/proxying/logging, volume handling, staff access policies, etc.)
  • “Oops” risk (weak SETUP_PASSWORD, forgetting to set OPENCLAW_GATEWAY_TOKEN, etc.)

Practical considerations checklist (1‑click or not)

If you do use 1‑click, I’d treat these as non‑negotiable:

  1. Set a strong random SETUP_PASSWORD (this protects /setup)
  2. Set a strong random OPENCLAW_GATEWAY_TOKEN (this protects the Control UI/Gateway auth)
  3. Make sure you have persistent storage (volume at /data on Railway/Northflank), otherwise you’ll lose config/credentials on redeploy
  4. Keep channels locked down (pairing/allowlists; don’t run “open DMs” while you’re learning)
  5. Plan backups/migration (Railway has /setup/export per the docs)

My recommendation for your stated goal

#
  • If you want least headaches to get started today: 1‑click is fine, but keep it low-stakes (don’t put super sensitive personal accounts on it yet).
  • If you want security-first: a normal VPS where you keep the Gateway non-public (SSH tunnel/Tailscale) is the cleanest model.

If you tell me which channel you want first (Telegram vs Discord vs WhatsApp), I’ll tell you whether 1‑click is likely to be smooth or annoying for that specific channel.

haughty stratus
#

out of ubuntu or debian which should i choose and why

woeful viperBOT
#

If your goal is cheap + reliable + minimal headaches, pick Ubuntu LTS (usually 24.04 LTS) unless you have a specific reason to prefer Debian.

Ubuntu LTS (recommended for most “noob on a VPS” setups)

  • Most cloud/VPS guides (and random blog posts) assume Ubuntu, so troubleshooting is easier
  • Package availability tends to be a bit smoother (especially around Docker, kernel modules, tooling)
  • Very common default in the OpenClaw community (“works like the docs” is the main win)

Debian (also totally fine)

  • Slightly more minimal/conservative defaults
  • Very stable base; great if you already like Debian
  • Sometimes you do an extra step here or there for “newer” packages, but it’s not a big deal

One nuance that matters here

If you’re running OpenClaw via Docker (which is what the Hetzner guide does), the host OS choice matters less — Docker abstracts most of it. So choose the OS you’ll feel most comfortable administering.

My default answer: Ubuntu 24.04 LTS.

#

If you tell me whether you’re doing Docker or host install, I can tailor the exact “first steps” checklist (Docker install, firewall defaults, SSH tunnel, etc.).

haughty stratus
#

that was going to be another quesiton, im still not clear on whether i use docker or not and honestly dont even know what it is. im abit lost on that point

woeful viperBOT
#

Docker is basically a way to run an app in a “container” — think of it like a small, isolated box that has its own filesystem + dependencies, so the app runs the same way everywhere. It’s popular on VPSes because you can start/stop/upgrade things cleanly.

But: you do not need Docker to run OpenClaw.

For you (not familiar with Docker), I’d pick NO Docker first

It’s simpler because you’ll just:

  • install OpenClaw on the VPS like a normal program
  • run the onboarding wizard
  • keep the Gateway private and access it via an SSH tunnel

This is literally the “Beginner quick path (VPS)” in the Linux docs:
https://docs.openclaw.ai/platforms/linux

When Docker is a good idea

Docker is nice if you:

  • already know Docker, or
  • want a very “self-contained” deployment, or
#
  • want to follow the Hetzner Docker guide copy/paste style (even on a non-Hetzner VPS)

Hetzner Docker guide (works on any VPS really): https://docs.openclaw.ai/install/hetzner
General Docker doc: https://docs.openclaw.ai/install/docker

The real tradeoff (simple)

No Docker

  • Pros: fewer moving parts, easier to “install a tool” later (ffmpeg, etc.), easier mental model
  • Cons: you’re managing Node/OpenClaw directly on the VPS

Docker

  • Pros: clean isolation, easy restarts, consistent environment
  • Cons: one more concept to learn; installing extra binaries later usually means rebuilding the image

Pick one (reply 1 or 2)

  1. No Docker (recommended for you right now)
  2. Docker (if you want to follow the Docker guide exactly)
#

If you reply “1”, tell me what VPS you ended up with (provider + Ubuntu 24.04 or Debian 12), and I’ll give you the exact step-by-step commands from “blank VPS” → “OpenClaw running”, including the security-conscious bit (SSH tunnel so you don’t expose the gateway publicly).

haughty stratus
#

does that affect security? honestly it still doesnt really help me decide because i dont even know if or not i benefit in any way. the bottom line is i dont mind setting up things heavily at the beginning as long as once its done it can just run. i have no idea what to expect. i dont know about restarts or anything like that, i thought open claw ran 24/7 so why mention restarts?

woeful viperBOT
#

Docker can affect security a bit, but it’s not the deciding factor for a “security-conscious OpenClaw” setup. The biggest security levers are (in order):

  1. Is your Gateway reachable from the public internet or not?
  2. Does it require auth (token/password) and are your chat allowlists/pairing sane?
  3. What tools you enable (exec/browser/nodes/etc.) and whether you sandbox tools

Docker vs non-Docker is more about operations and isolation, not “safe vs unsafe”.

Does Docker make it “more secure”?

Sometimes, slightly:

  • Running the Gateway in a container can reduce how much of the host it can touch by default.
  • But you still mount volumes for ~/.openclaw (state, creds, sessions), so the sensitive stuff still exists and is reachable.
  • And Docker is not a magic security boundary; misconfig (running as root, mounting lots of host paths, docker socket access, etc.) can erase the benefits.

If you want real isolation for “untrusted content + tools”, the more relevant OpenClaw feature is tool sandboxing (separate from “gateway in Docker”). See: https://docs.openclaw.ai/gateway/sandboxing

Why do people mention restarts if it’s “24/7”?

#

Because “24/7” just means “it’s supposed to always be running”, not “it never restarts”.

In real life, restarts happen because:

  • the VPS reboots (kernel updates, provider maintenance, you reboot it)
  • the Gateway process crashes (rare, but any software can)
  • you update OpenClaw
  • you change certain config that requires a restart (some settings hot-reload, some don’t)

So you want a supervisor that automatically brings it back:

  • No Docker path: systemd service (what openclaw onboard --install-daemon sets up)
  • Docker path: restart: unless-stopped in docker-compose

That’s how you get “set it up once, then it just runs”.

Bottom line: what I’d recommend for you

Given: “I don’t mind upfront setup, I want it to just run, I’m not Docker-savvy”
→ Use NO Docker + systemd daemon. It’s the least conceptual overhead, and it runs 24/7 just fine.

#

This is the exact beginner VPS flow: https://docs.openclaw.ai/platforms/linux (see “Beginner quick path (VPS)”)

Pick one (reply with 1 or 2)

  1. No Docker + systemd (recommended for you)
  2. Docker compose (fine, but you’ll be learning Docker at the same time)

If you pick 1, tell me what OS you installed (Ubuntu 24.04?) and which provider you ended up on, and I’ll give you the step-by-step setup in the “secure by default” way (SSH tunnel, no public Gateway port).

haughty stratus
#

alli know is im going to go with contabo. i dont care about which OS or docker or no dcker happy for you to choose that for me. as long as i have no security headaches and i can chat away with openclaw through my whatsapp in a secure manner after setup i am happy. with this in mind please guide me in the right direction

woeful viperBOT
#

Got it. If you want “set it up once, then it just runs” + WhatsApp + as few security headaches as possible, here’s the path I’d pick for you on a Contabo VPS:

  • OS: Ubuntu 24.04 LTS
  • No Docker (fewer concepts; still runs 24/7 via a service)
  • Security posture: Gateway stays private (loopback only) and you access the UI via an SSH tunnel; WhatsApp is locked to your number (don’t run an “open bot”).

Important: don’t paste phone numbers, tokens, or QR contents into this Discord thread.


1) Provision the VPS (Contabo)

Pick Ubuntu 24.04 LTS, and make sure you can SSH in with an SSH key.

Optional but recommended before you install anything:

  • Create a non-root user with sudo, confirm you can SSH as that user
  • Enable a firewall allowing only SSH
    • The key idea is: you should not open port 18789 to the internet at all
#

2) Install OpenClaw (on the VPS)

OpenClaw’s official installer will install Node 22+ if needed.

On the VPS:

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash

(If you’re security-paranoid, run --dry-run first: ... | bash -s -- --dry-run — docs: https://docs.openclaw.ai/install/installer)

Then confirm:

#
openclaw --version

3) Run onboarding + install the “always on” service

On the VPS:

openclaw onboard --install-daemon

This is what makes it “just run” (systemd service). After onboarding:

#
openclaw gateway status
openclaw status

4) Link WhatsApp (QR) on the VPS

On the VPS:

openclaw channels login --channel whatsapp

It will print a QR. On your phone: WhatsApp → Settings → Linked devices → Link a device → scan QR.

Docs: https://docs.openclaw.ai/channels/whatsapp (see “Quick setup”)

#

5) Lock WhatsApp down (secure-by-default)

In config, you want WhatsApp DMs/groups restricted to you.

A solid baseline (JSON5; edit via openclaw configure or by editing ~/.openclaw/openclaw.json):

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      allowFrom: ["+YOUR_NUMBER_HERE"],

      groupPolicy: "allowlist",
      groupAllowFrom: ["+YOUR_NUMBER_HERE"],
#
    },
  },
}

Notes:

  • dmPolicy: "pairing" means unknown senders get a pairing code and are ignored until you approve.
  • If you only ever want you and no pairing flow, switch to dmPolicy: "allowlist".

If pairing is enabled and you need to approve a request:

openclaw pairing list whatsapp
openclaw pairing approve whatsapp <CODE>
#

6) Access the Control UI securely (from your laptop)

From your laptop (not on the VPS), run:

ssh -N -L 18789:127.0.0.1:18789 <user>@<your-vps-ip>

Then open on your laptop:

http://127.0.0.1:18789/

This keeps the Gateway off the public internet.


#

7) Run the built-in security audit

On the VPS:

openclaw security audit --deep

(And optionally openclaw security audit --fix if it offers safe fixes.)

Docs: https://docs.openclaw.ai/gateway/security


Two quick questions so I can tailor the next steps

  1. Are you planning to run OpenClaw on a dedicated WhatsApp number (recommended) or your personal number (supported, but a bit more confusing operationally)?
  2. Do you already have SSH key login working on the Contabo VPS, and are you logging in as root or a normal user?
#

Answer those, and I’ll give you the exact “do this next” checklist (including the minimal firewall rules that won’t lock you out).

haughty stratus
#

2 questions, should i get private networking for the vps? its cheap so i dont mind if its better. if not ill leave out.
secondly the last step of contabo is rsetting a password for root user. but it does say "You can add SSH keys later in the Control Panel.

Your password won’t be emailed.

Keep it safe for Windows access. If lost, a reinstall is required."

woeful viperBOT
#

1) Private networking on the VPS — do you need it?

For a single OpenClaw VPS, private networking usually doesn’t buy you much. OpenClaw mainly needs:

  • outbound internet (to WhatsApp Web + model providers)
  • SSH access from you
  • optionally Tailscale (which is its own “private network” anyway)

Private networking helps when you have multiple servers (e.g., Gateway VM + separate DB VM) and you want them talking over an internal network.

So I’d choose:

  1. Skip it for now (recommended) — simpler, fewer “why can’t I reach X” network surprises.
  2. Enable it only if you already know you’ll run multiple VMs/services that should talk privately.

If it’s cheap and you want to future-proof, you can enable it, but it won’t make your WhatsApp setup noticeably “more secure” by itself.


#

2) Contabo asking you to set a root password

That’s normal. Even if you’ll use SSH keys, having a root password is useful as a “break glass” recovery credential (console access / rescue mode). Their message about “Windows access” is generic boilerplate — still, the point stands: store it safely.

What I recommend:

  1. Set a strong random root password and save it in a password manager.
  2. As soon as the server is up, add your SSH key (panel or on the box), then switch to key-only SSH (disable password SSH) and ideally disable root SSH login after you have a sudo user.

If you want, paste the exact OS you’re deploying (Ubuntu 24.04 LTS?) and whether you plan to SSH in as root initially, and I’ll give you the safest “don’t lock yourself out” sequence for setting up the non-root user + SSH key-only.

haughty stratus
#

ok i can confirm my vps is now active with contabo. i selected ubuntu 24. please guide for next steps

woeful viperBOT
#

Nice — Ubuntu 24.04 is a good pick. Here’s the “secure, boring, runs 24/7” path I’d do next on a fresh VPS.

I’m going to assume you can SSH in as root right now (with the password Contabo showed you). If that’s not true, tell me what does work.

Step 0 — SSH in (from your laptop)

ssh root@YOUR_VPS_IP

Step 1 — Basic OS update (on the VPS)

apt update
apt upgrade -y

Step 2 — Create a non-root user + SSH key auth (recommended)

This is the part where people lock themselves out if they rush. Keep your current SSH session open until you’ve confirmed the new login works.

#

2.1 Create a user (example: krill)

Pick any username you like:

adduser krill
usermod -aG sudo krill

2.2 Add your SSH key to that user

On your laptop, if you don’t have an SSH key yet:

ssh-keygen -t ed25519

Then copy your public key to the VPS (from your laptop):

ssh-copy-id krill@YOUR_VPS_IP
#

Now test a new SSH session (from your laptop):

ssh krill@YOUR_VPS_IP

Only after that works, you can harden SSH:

2.3 Disable root SSH + password login (do this only after 2.2 works)

On the VPS, edit:

sudo nano /etc/ssh/sshd_config

Set (or add) these:

PasswordAuthentication no
#
PermitRootLogin no

Then reload SSH:

sudo systemctl reload ssh

Open another new terminal and confirm you can still login:

ssh krill@YOUR_VPS_IP

Step 3 — Firewall (keep it simple)

On the VPS:

#
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

Goal: only SSH is reachable from the internet. (Do not open port 18789 publicly.)

Step 4 — Install OpenClaw (on the VPS)

Use the official installer (it ensures Node 22+):

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw --version

Step 5 — Run onboarding + install the “always on” service

On the VPS:

#
openclaw onboard --install-daemon

Afterwards:

openclaw gateway status
openclaw status

Step 6 — Link WhatsApp (QR)

On the VPS:

openclaw channels login --channel whatsapp

Scan the QR in your phone’s WhatsApp (Settings → Linked devices → Link a device).

#

Docs: https://docs.openclaw.ai/channels/whatsapp

Step 7 — Lock WhatsApp down (don’t post your number here)

In ~/.openclaw/openclaw.json, set something like (replace +YOUR_NUMBER locally; don’t paste it into Discord):

{
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      allowFrom: ["+YOUR_NUMBER"],
      groupPolicy: "allowlist",
      groupAllowFrom: ["+YOUR_NUMBER"],
    },
  },
}
#

Then restart:

openclaw gateway restart

Step 8 — Access the Control UI securely (SSH tunnel from your laptop)

From your laptop:

ssh -N -L 18789:127.0.0.1:18789 krill@YOUR_VPS_IP

Open on your laptop:
http://127.0.0.1:18789/

Step 9 — Run the security audit (on the VPS)

#
openclaw security audit --deep

Quick check-in (so I can guide you without guesswork)

Reply with:

  1. Are you currently logging in as root or did you already create a non-root user?
  2. What’s the output of openclaw --version (safe to paste), once you’ve installed it?
haughty stratus
#

quick side bar question, ive seen people suggest tailscale for connecting to the vps, do you suggest it?

woeful viperBOT
#

Yes — Tailscale is a good idea for this exact use case, as long as you use it in the “private tailnet” way (Serve or tailnet-only), not the “public internet” way (Funnel).

Why I like Tailscale for a VPS OpenClaw gateway

  • You don’t have to expose port 18789 to the internet at all
  • You get a stable private address / MagicDNS name for the VPS
  • It’s easier than keeping SSH tunnels running if you switch between laptop/phone/etc.
  • It plays nicely with OpenClaw “remote gateway + nodes” setups later

The two sane modes (pick one)

  1. SSH tunnel (what we already discussed)

    • simplest, zero extra software
    • but you need a tunnel session running when you want the dashboard
  2. Tailscale Serve (recommended if you want convenience)

#

What I’d avoid

  • Tailscale Funnel unless you really want it public. Funnel = public internet exposure, and OpenClaw forces stronger auth for it for a reason.

Security note

Tailscale is “secure” if your tailnet is secure:

  • use Tailscale account 2FA
  • keep device approvals tight
  • don’t share tailnet access broadly

If you want, after you get OpenClaw + WhatsApp working, we can add Tailscale as a “phase 2” improvement so you’re not changing too many variables at once.

haughty stratus
#

can you elaborate on ssh tunnel, what do you mean by but you need a tunnel session running when you want the dashboard? like for example right now i ran this terminal session on my work laptop. im only at the first steps. but then when i get home i want to connect from my personal laptop instead. etc.

woeful viperBOT
#

An SSH tunnel is just port-forwarding over an SSH connection.

The mental model

  • Your OpenClaw Gateway runs on the VPS and (ideally) only listens on 127.0.0.1:18789 (not public).
  • Your laptop can’t directly reach the VPS’s 127.0.0.1 (that’s “localhost on the VPS”).
  • So you open an SSH connection that says:

“Take my laptop’s local port 18789 and forward it through SSH to the VPS’s 127.0.0.1:18789.”

Then your browser opens http://127.0.0.1:18789/ on your laptop, but the traffic is actually going through SSH to the VPS.

What I meant by “you need a tunnel session running”

The tunnel only exists while that SSH command is running.

Example tunnel command (run on your laptop):

#
ssh -N -L 18789:127.0.0.1:18789 krill@YOUR_VPS_IP
  • As long as that terminal stays open and connected, the tunnel is active.
  • If you close the terminal, or your laptop sleeps, or your network changes → the SSH connection drops → the tunnel is gone.
  • The Gateway on the VPS is still running 24/7; you just temporarily lost your private path to the dashboard.

Switching laptops (work → personal)

Totally fine. When you get home:

  1. On your personal laptop, run the same tunnel command:
    ssh -N -L 18789:127.0.0.1:18789 krill@YOUR_VPS_IP
    
  2. Open http://127.0.0.1:18789/ in your browser.
#

Nothing “conflicts” with the work laptop. Each laptop makes its own private tunnel.

Two practical tips

  1. If port 18789 is already used on your laptop, pick another local port:

    ssh -N -L 18790:127.0.0.1:18789 krill@YOUR_VPS_IP
    

    Then open http://127.0.0.1:18790/.

  2. You only need the tunnel for the dashboard / UI access (and any local CLI that talks to the gateway).
    You do not need a tunnel just to chat on WhatsApp — WhatsApp messages go to the VPS and the Gateway replies from there.

If you want “no tunnels, just open a URL from any device”, that’s where Tailscale Serve becomes nice — it gives you a stable HTTPS URL on your tailnet without exposing the gateway publicly.

haughty stratus
#

ive gotten now as far as the add user part, entered the password and created it. this is the last part i got to. do i now enter: usermod -aG sudo krill ?
then can you guide me to install the tailscale stuff and finally the remaining steps?

woeful viperBOT
#

Yes — if your new user is krill, then as root run:

usermod -aG sudo krill

Then do these in order (this order avoids lockouts):

A) Confirm you can SSH in as krill using an SSH key (do this before SSH hardening)

  1. On your work laptop, copy your SSH key to the new user:
ssh-copy-id krill@YOUR_VPS_IP
  1. Test login (still from your work laptop):
#
ssh krill@YOUR_VPS_IP
  1. Confirm sudo works (on the VPS, while logged in as krill):
sudo -v
sudo whoami

If whoami prints root, you’re good.

Only after this works should you disable password SSH / root SSH (we can do that later).


#

B) Install Tailscale on the VPS

While logged in on the VPS (either as krill with sudo, or as root):

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

It will print a login URL — open it in your browser and approve the device.

Then verify:

tailscale status
tailscale ip -4
#

On your laptop(s), install the Tailscale app and sign into the same account. Now your work laptop and home laptop will both be able to reach the VPS over the tailnet.


C) Install OpenClaw (on the VPS)

On the VPS:

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw --version

Then run onboarding + install the always-on service:

openclaw onboard --install-daemon
#

D) Use Tailscale Serve for the Dashboard (so you don’t need SSH tunnels)

Once OpenClaw is installed and Tailscale is up, run on the VPS:

openclaw gateway --tailscale serve

Then from any device on your tailnet, you should be able to open the dashboard over HTTPS at the MagicDNS name Tailscale shows (it’ll look like https://<hostname>...ts.net/).

(If you prefer “token always required even on tailnet”, tell me and I’ll point you at the exact config knob — there’s a default that can allow Control UI auth via Tailscale identity headers.)

Docs: https://docs.openclaw.ai/gateway/tailscale


#

E) Finish WhatsApp

On the VPS:

openclaw channels login --channel whatsapp

Scan the QR on your phone.

Then we’ll set the WhatsApp allowlist/pairing policy in ~/.openclaw/openclaw.json (don’t paste your number here; use a placeholder).


Before you run anything else: quick check

  1. Are you currently connected as root or as krill?
  2. When you run sudo whoami as krill, does it print root?
haughty stratus
#

sorry i didnt do the ssh key stuff as that came after the user part which is where i am now. can you guide me on that again please. i havent made any ssh command yet

woeful viperBOT
#

All good — we’ll do the SSH key setup now from scratch. There are two parts:

  1. generate an SSH key on your laptop
  2. install the public key on the VPS for the krill user

I’ll give you the easiest path first.


0) Quick confirm (on the VPS)

You already created the user krill. Now (still on the VPS as root) run:

usermod -aG sudo krill

(If you already ran it, running it again is fine.)

#

1) Generate an SSH key (on your laptop)

On your work laptop, open Terminal and run:

ssh-keygen -t ed25519

Just press Enter for the defaults. It will create:

  • private key: ~/.ssh/id_ed25519 (keep secret)
  • public key: ~/.ssh/id_ed25519.pub (safe to share/install)

2) Install the key on the VPS (pick 1 option)

#

Option 1 (recommended): ssh-copy-id (fastest)

From your laptop:

ssh-copy-id krill@YOUR_VPS_IP

It will ask for the krill user password you set with adduser. After that, key auth is installed.

Then test:

ssh krill@YOUR_VPS_IP

Option 2: manual paste (if ssh-copy-id isn’t available)

On your laptop, print your public key:

#
cat ~/.ssh/id_ed25519.pub

Copy the whole line (starts with ssh-ed25519 ...).

On the VPS (as root), run:

mkdir -p /home/krill/.ssh
nano /home/krill/.ssh/authorized_keys

Paste the public key on its own line, save, exit.

Then fix permissions:

#
chown -R krill:krill /home/krill/.ssh
chmod 700 /home/krill/.ssh
chmod 600 /home/krill/.ssh/authorized_keys

Now from your laptop:

ssh krill@YOUR_VPS_IP

3) Confirm sudo works (once logged in as krill)

On the VPS, as krill:

#
sudo whoami

It should print root.


Reply with:

  1. Which option you used (1 or 2)
  2. Whether ssh krill@YOUR_VPS_IP works now
  3. Whether sudo whoami prints root

Then we’ll do Tailscale next.

haughty stratus
#

my user id is louis and after pasting the ssh-copy-id louis@YOUR_VPS_IP, the terminal returned /usr/bin/ssh-copy-id: ERROR: No identities found

woeful viperBOT
#

That error just means: your laptop doesn’t have an SSH key yet (so ssh-copy-id has nothing to copy).

Do this on your laptop:

1) Create an SSH key

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519
  • Press Enter to accept defaults.
  • Passphrase is optional (recommended if this is a personal laptop; for a work laptop it depends on your setup).

2) Confirm the key files exist

ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
#

You should see both files.

3) Copy the public key to the VPS

Now run:

ssh-copy-id -i ~/.ssh/id_ed25519.pub louis@YOUR_VPS_IP

It should prompt for the password of the louis user on the VPS (the one you set when you ran adduser louis).

4) Test SSH key login

ssh louis@YOUR_VPS_IP

If that works, run on the VPS:

#
sudo whoami

and it should print root.

If you get stuck on step 2, paste the output of:

ls -la ~/.ssh

(just the filenames are fine; don’t paste any private key contents).

haughty stratus
#

please keep in mind im not too tech savy sorry. so do i run this command in the same terminal session im on currently?

woeful viperBOT
#

Yes — run it in the same terminal on your laptop (the one where you just ran ssh-copy-id and got that error).

Quick rule of thumb:

  • Commands like ssh-keygen, ssh, ssh-copy-id are run on your laptop.
  • Commands like sudo ..., apt ..., openclaw ... are run on the VPS after you’ve SSH’d into it.

So right now (on your laptop), run:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

Then we’ll do the next step (ssh-copy-id ...) again.

haughty stratus
#

but right now im on the terminal of my laptop and connected to my vps, because im seeing root@vmi... is that fine? sorry again its not a concept i understand

woeful viperBOT
#

Yep — that prompt (root@vmi...) means you’re inside the VPS right now (you’re in a remote shell).

That’s totally fine, but ssh-keygen needs to run on your laptop, not on the VPS (because the key is for your laptop to authenticate).

Do this:

Option 1 (recommended, safest): open a second terminal window/tab

  1. Keep the current VPS terminal open (don’t touch it).
  2. Open a new Terminal window/tab on your laptop.
  3. In the new terminal (this one should NOT say root@...), run:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

Option 2: exit the VPS session first
In your current terminal (the one showing root@...), type:

#
exit

Now you’ll be back on your laptop. Then run the ssh-keygen command.

Quick way to tell where you are

  • If you see root@vmi... → you’re on the VPS.
  • If you see something like your laptop name/user → you’re on your laptop.

Once you’ve generated the key, tell me what prompt you see in the terminal where you ran ssh-keygen, and we’ll do the ssh-copy-id ... step next.

haughty stratus
#

ok im doing another terminal tab. its asking to enter a passphrase, should i put in whatever i want here?

woeful viperBOT
#

That passphrase is only for protecting the private key file on your laptop (it never gets sent to the VPS). You have two reasonable choices:

  1. Set a passphrase (more secure, recommended)

    • Pick something you can remember or store in a password manager.
    • You’ll type it when you use the key (unless your OS remembers it).
  2. Leave it blank (easier / fewer headaches)

    • Just press Enter twice.
    • Still secure enough for many people if your laptop account + disk are protected, but less protection if someone steals the key file.

If you’re not sure and want the smoothest setup today: option 2 (blank) is fine. If you’re comfortable using a password manager: option 1 is better.

Reply with 1 or 2 and I’ll tell you the next exact command to run.

haughty stratus
#

Saving key "~/.ssh/id_ed25519" failed: No such file or directory

woeful viperBOT
#

No worries — that just means the ~/.ssh folder doesn’t exist yet on your laptop.

In that laptop terminal tab run:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

Then rerun the keygen:

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

After it finishes, run this to confirm the files exist:

#
ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub

Paste the output of that ls (it won’t include secrets), and then we’ll do the ssh-copy-id ... step.

haughty stratus
#

PS C:\Users\LOUIS-> mkdir -p ~/.ssh
mkdir : An item with the specified name C:\Users\LOUIS-DAMEX.ssh already exists.
At line:1 char:1

  • mkdir -p ~/.ssh
  •   + CategoryInfo          : ResourceExists: (C:\Users\LOUIS-\.ssh:String) [New-Item], IOException
      + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand
    
    

PS C:\Users\LOUIS-> chmod 700 ~/.ssh
chmod : The term 'chmod' is not recognized as the name of a cmdlet, function, script file, or operable program. Check
the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1

  • chmod 700 ~/.ssh
  •   + CategoryInfo          : ObjectNotFound: (chmod:String) [], CommandNotFoundException
      + FullyQualifiedErrorId : CommandNotFoundException
woeful viperBOT
#

You’re in Windows PowerShell, so two things are happening:

  • -p is a Linux/macOS thing (PowerShell’s mkdir is different)
  • chmod doesn’t exist in PowerShell (Windows uses different permissions)

No problem — we can do this the Windows-friendly way.

1) Generate the SSH key (PowerShell on your laptop)

In PowerShell run:

ssh-keygen -t ed25519
  • When it asks where to save, just press Enter to accept the default path (it will be under C:\Users\LOUIS-DAMEX\.ssh\...).
  • Passphrase: you can press Enter twice to leave it blank if you want simplest.
#

2) Show (and copy) your public key

Run:

Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"

Copy the whole line it prints (starts with ssh-ed25519 ...). This is safe to copy, but don’t paste it into Discord.

3) Paste that public key onto the VPS (in your VPS terminal)

On the VPS (as root), run:

mkdir -p /home/louis/.ssh
nano /home/louis/.ssh/authorized_keys
#

Paste the public key on a single line, save, exit.

Then run:

chown -R louis:louis /home/louis/.ssh
chmod 700 /home/louis/.ssh
chmod 600 /home/louis/.ssh/authorized_keys

4) Test SSH login from PowerShell

Back on your Windows laptop PowerShell:

ssh louis@YOUR_VPS_IP
#

If that logs you in without asking for the VPS password, you’re done with keys.


Two quick questions so I don’t mislead you:

  1. In PowerShell, does ssh -V work (it should print an OpenSSH version)?
  2. On the VPS, is your username definitely louis (not krill)?
haughty stratus
#

ok ive ran ssh-keygen -t ed25519
left blank passphrase. it returned a key with a radomt art image. now what?

woeful viperBOT
#

Perfect — that random ASCII art means the key was created successfully.

Now you need to copy the public key onto the VPS for your user (louis).

1) Show your public key (on your Windows laptop / PowerShell)

Run:

Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"

This will print one long line that starts with ssh-ed25519 ...

Copy that whole line (but don’t paste it into Discord).

2) Add it to the VPS (in your VPS terminal where you see root@...)

On the VPS:

#
mkdir -p /home/louis/.ssh
nano /home/louis/.ssh/authorized_keys

Paste the public key on its own line, save, exit.

Then run:

chown -R louis:louis /home/louis/.ssh
chmod 700 /home/louis/.ssh
chmod 600 /home/louis/.ssh/authorized_keys

3) Test SSH login with the key (back on your Windows laptop / PowerShell)

#
ssh louis@YOUR_VPS_IP

If it logs you in without asking for the Linux user password, you’re good.

If it still asks for a password, tell me exactly what it says (and confirm: does your VPS username definitely equal louis?).

haughty stratus
#

when i run the mkdir command it opens a menu with consufing options

woeful viperBOT
#

mkdir -p /home/louis/.ssh should not open any menu — it normally just runs silently and returns you to the prompt.

So this almost certainly means you ran it in the wrong place (or you actually opened nano, not mkdir).

Quick check: what prompt do you see?

Reply with just one of these (don’t include IPs):

  1. PS C:\Users\...> (Windows PowerShell prompt)
  2. root@something:~# (Linux VPS prompt)

If you see PS C:\Users\...> (Windows)

Don’t run /home/louis/... commands there — that’s a Linux path and PowerShell will behave weirdly.

In Windows, you only need to run:

Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"

(copy the line)

#

Then switch to your VPS terminal (the one that shows root@...) for the next steps.

If you see root@... (VPS)

Run exactly this (it won’t open a menu):

mkdir -p /home/louis/.ssh

Then you’ll run:

nano /home/louis/.ssh/authorized_keys

Nano is the thing that shows a menu at the bottom — that’s normal. You paste the key, then:

  • Ctrl + O (save)
#
  • press Enter
  • Ctrl + X (exit)

Tell me which prompt you’re on (PS or root@), and I’ll keep you on the correct terminal for each command.

haughty stratus
#

wow this is confusing. right so first i was on my laptop terminal i did the ssh key and you told me to copy the entire line. right i got there. then i went back to the vps terminal and pasted:
mkdir -p /home/louis/.ssh
nano /home/louis/.ssh/authorized_keys
this opened some kind of menu option in the terminal. i exited it because it was consfusing. so now are you saying instead of that command i run mkdir -p /home/louis/.ssh instead?

woeful viperBOT
#

You did the right thing — what you saw wasn’t a “menu”, it was nano, a simple text editor that opens inside the terminal. Nano always shows a strip of shortcut hints at the bottom (that’s the “menu-looking” thing).

Here’s the exact sequence again, with what you should do when nano opens:

On the VPS terminal (the one showing root@...)

  1. Create the folder (this won’t show anything if it worked):
mkdir -p /home/louis/.ssh
  1. Open the file in nano:
nano /home/louis/.ssh/authorized_keys
  1. Now you are inside nano (this is expected).
    • Paste the public key line you copied from your laptop into the empty file.
#
  • The key should be one long line starting with ssh-ed25519.

    Pasting tips:

    • Often: right‑click to paste
    • Or Shift+Insert
    • (Ctrl+V usually won’t work inside nano)
  1. Save + exit nano:
  • Press Ctrl + O (write out / save)
  • Press Enter (confirm filename)
  • Press Ctrl + X (exit)
  1. Fix permissions (still on VPS):
chown -R louis:louis /home/louis/.ssh
chmod 700 /home/louis/.ssh
#
chmod 600 /home/louis/.ssh/authorized_keys

Then test from your laptop (PowerShell)

ssh louis@YOUR_VPS_IP

So to answer your last question directly: No — you still run mkdir ... and then nano .... The “menu” is just nano’s normal UI, and that’s exactly where you need to paste the key.

If you want, tell me what you see at the top line when nano opens (e.g. “GNU nano … authorized_keys”) and I’ll confirm you’re in the right place.

haughty stratus
#

ok did all of this including the final command from the laptop and it worked now! whats next?

woeful viperBOT
#

Nice — that’s the hardest “VPS 101” step done. Next we want to (a) make sure you won’t get hacked via SSH, then (b) install Tailscale + OpenClaw + WhatsApp.

Next step: SSH + firewall hardening (recommended)

This is the only part that can lock you out if done wrong, so we do it carefully.

Reply with one number:

  1. Harden SSH + firewall now (recommended)
  2. Skip for now (not recommended, but we can)

If you pick (1), do this:

0) Keep your current SSH session open while doing these steps.

1) Confirm sudo works (on the VPS, logged in as louis):

sudo whoami

Should print root.

#

2) Disable root SSH + password SSH (on the VPS):

sudo nano /etc/ssh/sshd_config

Find/set these lines (add them if missing):

PermitRootLogin no
PasswordAuthentication no

Then reload SSH:

sudo systemctl reload ssh

3) Open a NEW terminal on your laptop and test you can still log in:

#
ssh louis@YOUR_VPS_IP

Only after that works, you can close the old session.

4) Enable firewall (on the VPS):

sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

After hardening: Tailscale

Once you tell me you’re ready, we’ll do:

#

On the VPS:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Then we’ll install OpenClaw:

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw onboard --install-daemon

Then link WhatsApp:

openclaw channels login --channel whatsapp
#

Reply with:

  • 1 or 2 (whether to harden now)
  • and (if you already tried it) what sudo whoami prints when you’re logged in as louis.
haughty stratus
#

picking 1 ofc. im on the vps but still seeing root not louis, do i still run sudo whoami? im confused

woeful viperBOT
#

If your prompt shows root@..., you’re logged in as root on the VPS. In that case:

  • sudo whoami isn’t useful (you already are root)
  • What we actually need to verify is: can louis log in and use sudo? (so you don’t lock yourself out when we disable root SSH)

Do this:

1) Keep your current root session open (don’t close it)

It’s your safety net.

2) Open a NEW terminal tab on your laptop and SSH in as louis

From your laptop (PowerShell):

ssh louis@YOUR_VPS_IP
#

You should now see a prompt like louis@... (not root@...).

3) Now (while logged in as louis), run:

sudo whoami

It should print:

root

If that works, you’re safe to proceed with disabling root SSH + password auth.

If you prefer to switch users inside the VPS without opening a new tab, you can also run this in your root session:

#
su - louis

…but the “new laptop tab SSH login” test is the most important one.

Tell me what sudo whoami prints when you’re logged in as louis, and then we’ll edit sshd_config.

haughty stratus
#

i can confirm i printed root and thats all fine.

woeful viperBOT
#

Sweet — that means louis sudo access is working, so we can safely harden SSH now.

1) Harden SSH (disable root login + password login)

Do this on the VPS as louis (or as root — but I’ll write it as louis):

1.1 Create a small SSH config “drop-in” (cleaner on Ubuntu 24)

sudo nano /etc/ssh/sshd_config.d/99-openclaw-hardening.conf

Paste these lines:

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
#

Save + exit (Ctrl+O, Enter, Ctrl+X).

1.2 Validate + reload SSH

sudo sshd -t
sudo systemctl reload ssh

1.3 IMPORTANT: test a fresh login from your laptop

Open a new terminal on your laptop and run:

ssh louis@YOUR_VPS_IP

If that works, SSH hardening is done. (Keep your old sessions open until you confirm.)

#

2) Turn on the firewall (UFW)

On the VPS:

sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

You should see OpenSSH allowed.


3) Install Tailscale (VPS)

On the VPS:

#
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

It’ll print a URL to log in — open it and approve.

Then verify:

tailscale status

Reply with 3 quick confirmations and we’ll move to installing OpenClaw + WhatsApp:

#
  1. Does ssh louis@YOUR_VPS_IP still work after the SSH hardening?
  2. What does sudo ufw status show (just the rules, no IPs)?
  3. Does tailscale status show your VPS as connected?
haughty stratus
#

ok so back on the vps terminal. right now i see root@vmi.. so i now run this command there?

woeful viperBOT
#

Yes — if you see root@vmi... you’re on the VPS as root, and you can run the commands there.

Just one tweak: since you’re already root, remove sudo from the commands.

So on that VPS terminal, run:

nano /etc/ssh/sshd_config.d/99-openclaw-hardening.conf

Paste:

PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
#

Save/exit, then run:

sshd -t
systemctl reload ssh

Important: don’t close your current root session yet. After reloading SSH, go to your laptop and test in a NEW terminal:

ssh louis@YOUR_VPS_IP

If that works, we’re safe to continue with the firewall + Tailscale steps.

haughty stratus
#

after pasting PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes do i control O to write out and then exit?

woeful viperBOT
#

Yep — you’re in nano.

Do this:

  1. Ctrl + O → “Write Out” (save)
  2. Press Enter to confirm the filename
  3. Ctrl + X → exit nano

Then run the next commands:

sshd -t
systemctl reload ssh

If sshd -t prints nothing, that’s good (it means the config is valid).

haughty stratus
#

ok i confirm i did this and finally ran ssh louis@YOUR_VPS_IP in a fresh tab and it worked again, saying welcome contabo bla bla. seeing louis@vmi in that particular tab. so now i have this one and also the other tab which is the vps showing root. what are the next steps now

woeful viperBOT
#

Great — keep both tabs open for now:

  • the root@... tab = your safety net
  • the louis@... tab = the one we’ll use for day-to-day + OpenClaw

Next we’ll do (1) firewall, (2) Tailscale, then (3) install OpenClaw + WhatsApp.


1) Firewall (do this in the root@... tab)

Run:

ufw allow OpenSSH
ufw enable
ufw status
#

(Goal: only SSH is open to the public internet. We are not opening the OpenClaw port publicly.)


2) Install + connect Tailscale (still in the root@... tab)

Run:

curl -fsSL https://tailscale.com/install.sh | sh
tailscale up

It will print a login URL — open it and approve.

Then check:

#
tailscale status

3) Install OpenClaw (do this in the louis@... tab)

Run:

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw --version

Then run onboarding + install the service:

#
openclaw onboard --install-daemon

Make it run 24/7 even when you’re logged out

OpenClaw on Linux defaults to a systemd user service, so we should enable “lingering”:

Run this in the root@... tab (or louis@... with sudo):

loginctl enable-linger louis

Docs (for reference): https://docs.openclaw.ai/gateway (Linux systemd user + lingering)


#

4) Link WhatsApp (in the louis@... tab)

openclaw channels login --channel whatsapp

Scan the QR on your phone (WhatsApp → Settings → Linked devices).


Reply with these 3 things (no secrets)

  1. Output of ufw status (just the rules)
  2. Does tailscale status show the VPS as connected?
  3. Output of openclaw --version

Then we’ll set up Tailscale Serve for the dashboard and lock down the WhatsApp allowlist.

haughty stratus
#

where am i running:
ufw allow OpenSSH
ufw enable
ufw status?

please always be specific on the terminal to run on

woeful viperBOT
#

Those UFW commands run on the VPS, in your root@vmi... terminal tab.

So:

Run on: VPS (root tab) — prompt looks like root@vmi...#

ufw allow OpenSSH
ufw enable
ufw status

For clarity going forward, I’ll label every step like this:

  • Laptop (PowerShell) → prompt PS C:\...>
  • VPS (root tab) → prompt root@...#
  • VPS (louis tab) → prompt louis@...$
haughty stratus
#

after running that it returned:
ufw allow OpenSSH
ufw enable
ufw status
Rules updated
Rules updated (v6)
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Status: active

To Action From


OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)

root@vmi3127119:~#

woeful viperBOT
#

Perfect — that’s exactly what we want. SSH is allowed, everything else is blocked by default, and your SSH sessions should stay up.

Next: install + connect Tailscale

Run on: VPS (root tab) — prompt root@vmi...#

  1. Install Tailscale:
curl -fsSL https://tailscale.com/install.sh | sh
  1. Connect it to your Tailscale account:
tailscale up

It will print a login URL. Open that URL in your browser and approve the VPS.

#
  1. Verify it’s connected:
tailscale status

Reply with whether tailscale status shows your VPS as connected (you can redact/omit the tailnet name if you want). Then we’ll install OpenClaw in your VPS (louis tab).

haughty stratus
#

ok i can confirm success. note i have tailscale app on my iphone running that there. its successfully connected. after running status check i see vmi... and iphone...

woeful viperBOT
#

Nice — Tailscale is connected. Next we install OpenClaw + make it run 24/7 + link WhatsApp.

I’ll be super explicit about which terminal.


1) Install OpenClaw

Run on: VPS (louis tab) — prompt looks like louis@vmi...$

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw --version

This installer may ask for confirmations / use sudo to install prerequisites — that’s normal.


#

2) Make it stay running 24/7 even when you log out

Run on: VPS (root tab) — prompt root@vmi...#

loginctl enable-linger louis

(This is what keeps “systemd user services” running after logout.)


3) Run onboarding + install the Gateway service

Run on: VPS (louis tab) — louis@vmi...$

openclaw onboard --install-daemon

You’ll need to pick a model/auth option during onboarding (API key / OAuth / etc.). Don’t paste any keys into Discord.

#

After onboarding, check:

openclaw gateway status
openclaw status

4) Link WhatsApp (QR)

Run on: VPS (louis tab) — louis@vmi...$

openclaw channels login --channel whatsapp

Scan the QR with your WhatsApp app.


#

Reply with:

  1. the output of openclaw --version (safe)
  2. whether openclaw gateway status says it’s running
  3. whether the WhatsApp QR step worked (yes/no)

Then we’ll do the final “secure defaults” config + (optional) set up Tailscale Serve so you can open the dashboard from any of your devices without SSH tunnels.

haughty stratus
#

louis@vmi3127119:~$ curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash
openclaw --version

🦞 OpenClaw Installer
I'll refactor your busywork like it owes me money.

✓ Detected: linux

Install plan
OS: linux
Install method: npm
Requested version: latest

[1/3] Preparing environment
¡ Node.js found but version could not be parsed; reinstalling v22+
¡ Installing Node.js via NodeSource
¡ Installing Linux build tools (make/g++/cmake/python3)
✗ Installing build tools failed — re-run with --verbose for details
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
✓ Build tools installed
✗ Installing Node.js failed — re-run with --verbose for details
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
openclaw: command not found

woeful viperBOT
#

You’re super close — this is just Ubuntu’s package manager being in a slightly “broken dependencies” state, so the installer can’t finish installing build tools + Node 22.

We’ll fix APT first, then rerun the installer with verbose output.

1) Fix broken apt deps (run on: VPS (louis tab) — louis@...$)

sudo apt update
sudo apt --fix-broken install -y

If that completes cleanly, also run:

sudo apt upgrade -y

2) Quick sanity check (still on VPS louis tab)

#
node -v
which node

If node -v errors or prints something weird, paste just that output.

3) Rerun the OpenClaw installer in verbose mode

Run on VPS (louis tab):

curl -fsSL --proto '=https' --tlsv1.2 https://openclaw.ai/install.sh | bash -s -- --verbose

Then paste the last ~30 lines of output around the failure (no secrets should appear there).

Why this happens

#

The installer uses Ubuntu apt to install compiler tools + NodeSource Node 22. If apt has unmet dependencies, it can’t install anything reliably until you run apt --fix-broken install.

Send me the output of step (1) if it errors, otherwise the tail of the --verbose installer run and we’ll get you unstuck quickly.

haughty stratus
#

node -v printed this:
which node
v22.22.0
/usr/bin/node

woeful viperBOT
#

Good news: Node is installed correctly now (v22.22.0 at /usr/bin/node). So we can move forward — we just need to get OpenClaw itself installed on your user.

Next, I need one quick check:

1) Run on: VPS (louis tab) (louis@...$)

npm -v
npm config get prefix

What we’re checking

  • npm -v confirms npm is present
  • the prefix tells us where npm i -g ... will install binaries (and whether you’ll hit permission errors)

Once you paste those two outputs, I’ll tell you the exact next command.

(If you want to try immediately and you don’t mind a possible permission error, the next step will be npm i -g openclaw@latest, but let’s confirm the prefix first so it installs cleanly without sudo.)

haughty stratus
#

after running that it printed:
10.9.4
/usr

woeful viperBOT
#

Great — that explains the problem.

npm config get prefix is /usr, which means global installs want to go into a system folder (needs root). We want OpenClaw installed under your user (louis) instead.

Fix npm prefix for louis (run on: VPS (louis tab))

Copy/paste these:

mkdir -p ~/.npm-global
npm config set prefix ~/.npm-global

Now add that to your PATH (so the openclaw command is found):

echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.bashrc
#
source ~/.bashrc

Quick check:

npm config get prefix
which openclaw || true
  • Prefix should now be something like /home/louis/.npm-global
  • which openclaw will be empty for now (until we install it)

Install OpenClaw (still VPS louis tab)

#
npm i -g openclaw@latest

Then verify:

openclaw --version

If you hit any error, paste the last ~20 lines and we’ll fix it. Once openclaw --version works, we’ll go back to:

  • openclaw onboard --install-daemon
  • then WhatsApp QR (openclaw channels login --channel whatsapp)
haughty stratus
#

louis@vmi3127119:~$ npm i -g openclaw@latest
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated are-we-there-yet@2.0.0: This package is no longer supported.
npm warn deprecated gauge@3.0.2: This package is no longer supported.
npm warn deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm warn deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm warn deprecated npmlog@5.0.1: This package is no longer supported.
npm warn deprecated tar@6.2.1: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
npm warn deprecated glob@10.5.0: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me

added 698 packages in 1m

131 packages are looking for funding
run npm fund for details

woeful viperBOT
#

Nice — that install succeeded. Those “deprecated” warnings are normal npm noise (annoying, but not your fault).

Next: confirm OpenClaw runs

Run on: VPS (louis tab) — louis@...$

openclaw --version

If that works, we move on immediately.

If it says “command not found”, run:

source ~/.bashrc
echo $PATH
ls -l ~/.npm-global/bin/openclaw

(and tell me what you see)

#

Then: onboarding + install the always-on service

Run on: VPS (louis tab)

openclaw onboard --install-daemon

During onboarding you’ll be asked to set up a model/auth method (API key / OAuth etc.). Don’t paste any keys here.

After onboarding, check:

openclaw gateway status
openclaw status

#

After that: link WhatsApp (QR)

Run on: VPS (louis tab)

openclaw channels login --channel whatsapp

Reply with:

  1. the output of openclaw --version
  2. whether openclaw gateway status says it’s running

…and we’ll do the final “secure WhatsApp allowlist” config + (optional) Tailscale Serve for the dashboard.

haughty stratus
#

it just printed 2026.3.2

woeful viperBOT
#

Perfect — OpenClaw is installed (2026.3.2).

Next: run onboarding + install the always-on service

Run on: VPS (louis tab) — louis@...$

openclaw onboard --install-daemon

Notes:

  • It will ask you to set up a model/auth method (API key / OAuth). Don’t paste any keys in Discord.
  • When it offers to install/start the gateway service, say yes.

After onboarding: verify the gateway is actually running

Run on: VPS (louis tab)

openclaw gateway status
#
openclaw status

Make sure it keeps running after logout (“linger”)

Run on: VPS (root tab) — root@...#

loginctl show-user louis -p Linger

If it says Linger=no, enable it:

loginctl enable-linger louis

Then: link WhatsApp (QR)

Run on: VPS (louis tab)

#
openclaw channels login --channel whatsapp

Reply with what openclaw gateway status says (running or not), and whether the WhatsApp QR appeared successfully.

haughty stratus
#

onboarding mode with quick start or manual?

woeful viperBOT
#

Pick Quick Start.

It’s the best path when you’re new because it:

  • gets you to a working Gateway + service quickly
  • uses sane defaults (token auth, local/loopback-first patterns)
  • you can still tighten/adjust everything afterwards in ~/.openclaw/openclaw.json

After Quick Start finishes, we’ll do the “security-conscious” pass:

  • confirm bind/auth
  • set WhatsApp allowlist/pairing policy
  • run openclaw security audit --deep

So: Quick Start now, then we harden/verify.

haughty stratus
#

when selecting model i chose open ai, i have a chat gpt plus subscription. then it asks auth method openai code or open ai api key, not sure which to select

woeful viperBOT
#

If you only have a ChatGPT Plus subscription (and you don’t have an API key from platform.openai.com), pick:

→ “OpenAI Code” (Codex OAuth / subscription sign-in)

That uses your ChatGPT account login.

Pick “OpenAI API key” only if you have (or want to create) a paid API key on the OpenAI developer platform — that’s separate billing from ChatGPT Plus.

Heads-up for VPS/headless onboarding: the OAuth flow usually prints a URL for you to open on your laptop. After you log in, you may need to copy the final redirect URL and paste it back into the wizard to finish.

Docs reference:

haughty stratus
#

ok so i clicked the first one openai codex, it gave me a url, i tried to open it on my phone, signed in but it said autherntication error?

woeful viperBOT
#

That’s a common gotcha on a VPS: the Codex OAuth flow tries to send you back to a callback URL on http://127.0.0.1:1455/... (localhost). On your phone, “localhost” is your phone — not the VPS — so the callback can’t complete and you’ll see an auth error.

Do it from your laptop, with a small SSH tunnel for the callback port.

Fix (recommended): use your laptop + tunnel port 1455 to the VPS

1) Run on: Laptop (PowerShell) (NEW terminal tab)

ssh -N -L 1455:127.0.0.1:1455 louis@YOUR_VPS_IP

Keep that running.

2) Now open the Codex login URL on your laptop browser (not phone)

  • Go back to the onboarding wizard on the VPS, have it show you the login URL again if needed.
  • Open that URL on your laptop, sign in.

3) If you still get a “callback error” page

#

Check your browser’s address bar — you’ll usually end up on a URL like http://127.0.0.1:1455/auth/callback?....
Copy the full URL and paste it back into the wizard if it asks.

Important: don’t paste that URL into Discord — it contains a one-time auth code.

If you tell me what the wizard is currently showing (e.g. “waiting for callback” vs “paste redirect URL”), I can tell you exactly which of the last steps applies.

haughty stratus
#

dam it i got far down the setup but i clicked escape thinking i could go back and it said setup cancelled by mistake. what do i do now?

woeful viperBOT
#

No big deal — you didn’t “break” anything. The onboarding wizard is safe to re-run.

Do this now

Run on: VPS (louis tab) (louis@...$)

openclaw onboard --install-daemon

If it detects partial setup, it will usually offer to continue/repair (pick that), not reset.

Then check what state you’re in

Still on the VPS:

openclaw gateway status
#
openclaw status

When you get back to the “OpenAI Codex login URL” step

Remember: do the OAuth on your laptop with the SSH tunnel for port 1455:

Run on: Laptop (PowerShell, new tab):

ssh -N -L 1455:127.0.0.1:1455 louis@YOUR_VPS_IP

Keep that running while you complete the login in your laptop browser.

If openclaw onboard shows an error or asks something confusing, paste the exact prompt text (no tokens/URLs) and I’ll tell you which option to pick.

haughty stratus
#

ok so i dont do it again, if i need to go back during onboarding what do i click

woeful viperBOT
#

In the CLI onboarding wizard, think of it like a “step-by-step interview”, not a web form:

  • Arrow keys + Enter = choose an option within the current question
  • Esc = cancel the whole wizard (that’s what bit you)
  • There usually isn’t a universal “go back to the previous step” key

So if you realize you need to change something from an earlier step, the safe workflow is:

  1. Esc (cancel)
  2. Re-run:
    openclaw onboard --install-daemon
    
  3. If it asks about existing config, choose Keep or Modify (do not choose Reset)

Good news: re-running the wizard doesn’t wipe anything unless you explicitly pick Reset. So “cancel + rerun” is the normal way to “go back”.

#

If you tell me which screen you’re on right now (just the text of the prompt, not any URLs/tokens), I can tell you the safest option to pick.

haughty stratus
#

can we maybe do the manual setup? instal of quickstart, guide me this way

woeful viperBOT
#

Yep — we can do Manual/Advanced. It’s more prompts, but you’ll understand what’s being configured, and we can make it “secure by default”.

Start the wizard (Manual)

Run on: VPS (louis tab) (louis@...$)

openclaw onboard --install-daemon

When it asks QuickStart vs Advanced/Manual → pick Advanced/Manual.


What to pick at each step (recommended for your setup)

1) “Existing config detected” (if it appears)

  • Pick Modify (or Keep + then Modify), NOT Reset.
#

2) Model/Auth

Since you have ChatGPT Plus:

  • Pick OpenAI Code (Codex OAuth)

When it gives you the login URL:

  • Do NOT do it on your phone
  • Do it on your laptop with the callback tunnel running:

Run on: Laptop (PowerShell, new tab)

ssh -N -L 1455:127.0.0.1:1455 louis@YOUR_VPS_IP

Keep that running, then open the URL on your laptop browser and sign in.

3) Workspace

  • Accept the default (usually ~/.openclaw/workspace)
#

4) Gateway

  • Mode: Local
  • Bind: loopback (this keeps it private)
  • Port: 18789
  • Auth: Token (auto-generated or you set one)
  • Tailscale exposure: Serve (tailnet-only) (NOT Funnel)

5) Channels

  • Enable WhatsApp
  • DM policy: choose allowlist (simplest) or pairing (also fine)
  • When asked for your allowed number, enter your number there, but don’t paste it into Discord.

6) Daemon / service

  • Install the systemd user service
  • If it offers to enable “linger” so it stays running after logout, choose Yes (it may ask for sudo)

7) Finish / health check

#

Let it run.


Make this easy: tell me what prompt you’re currently looking at

The wizard is interactive, so I should guide you screen-by-screen.

Reply with the exact text of the current question you see (but don’t include any URLs, tokens, or phone numbers), and I’ll tell you exactly what to select next.

haughty stratus
#

it has workspace: ~/.openclaw/workspace │
│ model: openai-codex/gpt-5.3-codex │
│ gateway.mode: local │
│ gateway.port: 18789 │
│ gateway.bind: loopback

those values then asks to modify the values then asks to click local gateway or remote gateway?

woeful viperBOT
#

You’re on the right screen.

What to pick here (on the VPS)

  • Those defaults look good (workspace, model, gateway.bind: loopback, port 18789).
  • When it asks Local gateway vs Remote gateway → pick Local gateway.

Why: You’re running the Gateway on this VPS.
“Remote gateway” is only for machines that should connect to a gateway somewhere else (like if you were running the wizard on your laptop and the gateway lived on the VPS).

About “Modify values?”

  • If you’re happy with what it shows, choose Continue / don’t modify.
  • If the next screens offer Tailscale exposure, choose Serve (tailnet-only) (not Funnel).

Tell me what the next prompt says after you pick Local gateway, and I’ll tell you exactly what to select.

haughty stratus
#

at the end it says gateway token (blank to generate) but it automatically already has a token there. do i copy it or just click enter?

woeful viperBOT
#

Leave it as-is.

  • That token is the admin key for your Gateway (don’t paste it into Discord).
  • If the wizard already filled one in, it’s fine to just press Enter to accept it.

I do recommend you copy it into a password manager for your own records, because you’ll need it to connect the Control UI (unless you later rely purely on Tailscale Serve identity headers).

If you ever lose it later, you can retrieve it on the VPS with:

openclaw config get gateway.auth.token

For now: press Enter to continue, and save it somewhere private if you can.

haughty stratus
#

ok thats fine. towards the end of the setup at the end after i lick enter on node for gatway service. i get the following error and then it ends my setup. what do i do?:
◇ Systemd ────────────────────────────────────────────────────────────────────────────────╮
│ │
│ Linux installs use a systemd user service by default. Without lingering, systemd stops │
│ the user session on logout/idle and kills the Gateway. │
│ Enabling lingering now (may require sudo; writes /var/lib/systemd/linger). │
│ │
├──────────────────────────────────────────────────────────────────────────────────────────╯
│
◇ Systemd ──────────────────────────────╮
│ │
│ Enabled systemd lingering for louis. │
│ │
├────────────────────────────────────────╯
│
◇ Gateway service runtime
│ Node (recommended)
Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service

woeful viperBOT
#

That error means: the wizard tried to manage a systemd user service, but in your current session systemctl --user … isn’t working/available (common on fresh servers when the user-session DBus bits aren’t set up right).

Good news: your setup isn’t ruined. We can install/start the gateway service manually.

0) First: which terminal are you in?

Make sure you do the next commands from your VPS (louis tab) where the prompt is louis@...$ (not the root@...# tab).


1) Check what the actual systemctl error is

Run on: VPS (louis tab)

systemctl --user status
echo $XDG_RUNTIME_DIR

Paste the output of those two lines (it’s safe).

#

2) Most likely fix (if systemctl --user can’t connect to a bus)

Run on: VPS (root tab) (root@...#)

apt update
apt install -y dbus-user-session

Then log out and back in as louis (important):

  • In the louis@...$ tab, type exit
  • Reconnect from your laptop: ssh louis@YOUR_VPS_IP

Now try installing/enabling the service manually:

Run on: VPS (louis tab)

#
openclaw gateway install
systemctl --user enable --now openclaw-gateway.service
openclaw gateway status

If you paste me the output from step (1), I’ll tell you which exact branch you’re on (and if we need to fall back to a system-wide service instead).

haughty stratus
#

louis@vmi3127119:~$ systemctl --user status
echo $XDG_RUNTIME_DIR
● vmi3127119
State: running
Units: 158 loaded (incl. loaded aliases)
Jobs: 0 queued
Failed: 0 units
Since: Thu 2026-03-05 13:15:43 CET; 3h 1min ago
systemd: 255.4-1ubuntu8.12
CGroup: /user.slice/user-1000.slice/user@1000.service
└─init.scope
├─7010 /usr/lib/systemd/systemd --user
└─7012 "(sd-pam)"
/run/user/1000

woeful viperBOT
#

Perfect — your systemd user session is healthy (/usr/lib/systemd/systemd --user is running and XDG_RUNTIME_DIR is set). So the earlier wizard error was almost certainly just:

it tried systemctl --user is-enabled openclaw-gateway.service before the unit existed, and treated that as a hard error.

Let’s just install/enable the unit manually.

1) Install + start the Gateway service

Run on: VPS (louis tab) (louis@...$)

openclaw gateway install
systemctl --user daemon-reload
systemctl --user enable --now openclaw-gateway.service
openclaw gateway status

If that works, you should see the service as running.

#

2) (Optional) Confirm lingering is on

Run on: VPS (root tab) (root@...#)

loginctl show-user louis -p Linger

If it says yes, the gateway will keep running even after you log out.


Reply with the output of openclaw gateway status (it should be safe), and then we’ll finish:

  • Codex OAuth (with the port 1455 tunnel)
  • WhatsApp QR linking (openclaw channels login --channel whatsapp)
  • WhatsApp allowlist/pairing policy hardening
  • openclaw security audit --deep
haughty stratus
#

the first command didnt work
printed:
louis@vmi3127119:~$ openclaw gateway install
systemctl --user daemon-reload
systemctl --user enable --now openclaw-gateway.service
openclaw gateway status

🦞 OpenClaw 2026.3.2 (85377a2) — iMessage green bubble energy, but for everyone.

Gateway service check failed: Error: systemctl is-enabled unavailable: Command failed: systemctl --user is-enabled openclaw-gateway.service
Failed to enable unit: Unit file openclaw-gateway.service does not exist.

🦞 OpenClaw 2026.3.2 (85377a2) — Type the command with confidence—nature will provide the stack trace if needed.

│
◇
Service: systemd (disabled)
File logs: /tmp/openclaw/openclaw-2026-03-05.log

Service config looks out of date or non-standard.
Service config issue: Gateway service PATH is not set; the daemon should use a minimal PATH.
Recommendation: run "openclaw doctor" (or "openclaw doctor --repair").
Config (cli): ~/.openclaw/openclaw.json
Config (service): ~/.openclaw/openclaw.json

woeful viperBOT
#

You didn’t do anything wrong — OpenClaw is installed, but the systemd service file didn’t get created, so systemctl --user enable … has nothing to enable.

The key line is:

Failed to enable unit: Unit file openclaw-gateway.service does not exist.

Let’s fix the service install the “supported” way: Doctor repair.

1) Create the systemd user dir (just in case)

Run on: VPS (louis tab) (louis@...$)

mkdir -p ~/.config/systemd/user

2) Run Doctor repair (this usually fixes exactly this)

Run on: VPS (louis tab)

#
openclaw doctor --repair

It may ask for sudo for some steps (that’s normal). Say yes.

3) Check gateway service again

Run on: VPS (louis tab)

openclaw gateway status

If it still says the unit doesn’t exist

Run these and paste the output:

#
ls -ლა ~/.config/systemd/user | grep -i openclaw || true
systemctl --user list-unit-files | grep -i openclaw || true

Then we’ll force-install the unit (openclaw gateway install --force) and enable it.

(We’ll get you to a running service before we touch WhatsApp/Codex auth again.)

haughty stratus
#

ok now i think were good, after running openclaw gateway status it looks fine. What to do now?

woeful viperBOT
#

Awesome — if openclaw gateway status looks healthy now, you’ve got the “runs 24/7” part sorted. Next we need to make sure:

  1. your model auth is actually configured (so the bot can reply), and
  2. WhatsApp is linked + locked down to only you.

I’ll label exactly where to run things.


1) Check model/auth status

Run on: VPS (louis tab) (louis@...$)

openclaw models status

This should tell us if OpenAI Codex auth is set up and usable. (It shouldn’t print secrets; don’t paste anything that looks like a token.)

#

2) Link WhatsApp (QR)

Run on: VPS (louis tab)

openclaw channels login --channel whatsapp

Scan the QR on your phone: WhatsApp → Settings → Linked devices → Link a device.

Then check:

openclaw channels status

#

3) Lock WhatsApp to ONLY you (security)

Run on: VPS (louis tab)

Open the config file:

nano ~/.openclaw/openclaw.json

Ensure you have something like (don’t paste your number into Discord; just edit it on the VPS):

{
  channels: {
    whatsapp: {
      dmPolicy: "allowlist",      // or "pairing" if you prefer approve-codes
      allowFrom: ["+YOUR_NUMBER"],
      groupPolicy: "allowlist",
#
      groupAllowFrom: ["+YOUR_NUMBER"],
    },
  },
}

Then restart the gateway service:

openclaw gateway restart

4) Quick test

Send a WhatsApp message to the linked account / self-chat (depending on how you linked it). You should get a reply.

#

Reply with:

  1. what openclaw models status says at a high level (e.g. “authenticated” vs “missing auth”), and
  2. whether the WhatsApp QR login succeeded.

If Codex auth isn’t set yet, we’ll redo that OAuth step using the laptop tunnel (1455) again.

haughty stratus
#

ok i clicked openclaw gateway restart and it printed: 🦞 OpenClaw 2026.3.2 (85377a2) — Your .env is showing; don't worry, I'll pretend I didn't see it.

Restarted systemd service: openclaw-gateway.service

woeful viperBOT
#

Perfect — that means the systemd service restart worked. The “.env is showing” line is just a silly banner message, nothing scary.

Now continue with the actual setup steps:

1) Verify the gateway is up

Run on: VPS (louis tab) (louis@...$)

openclaw gateway status

2) Check model auth (so it can reply)

Run on: VPS (louis tab)

openclaw models status

3) Link WhatsApp (QR)

#

Run on: VPS (louis tab)

openclaw channels login --channel whatsapp

Then:

openclaw channels status

Tell me:

  • does openclaw models status show OpenAI Codex as authenticated/usable?
  • and did the WhatsApp QR appear and scan successfully?
haughty stratus
#

i scanned whatsapp earlier and was successful. model status is fine too. it all looks fine now. where do i go next

woeful viperBOT
#

If WhatsApp is linked and openclaw models status looks good, you’re basically “live”. Next steps are about (a) testing, (b) hardening, and (c) making access convenient.

1) Do a real end-to-end test

Send a WhatsApp message to the linked account / chat you intend to use (e.g. “ping”).
You should get a reply back from OpenClaw.

If you don’t, run on VPS (louis tab):

openclaw logs --follow

and send one more test message while watching logs.

2) Run the security audit (recommended)

Run on VPS (louis tab):

openclaw security audit --deep
#

If it reports fixes you’re comfortable with:

openclaw security audit --fix

3) (Optional) Make the dashboard easy from any device: Tailscale Serve

If you want to open the Control UI from your laptop/phone without SSH tunnels:

Run on VPS (louis tab):

openclaw config set gateway.tailscale.mode serve
openclaw gateway restart

Then open the HTTPS URL for your VPS MagicDNS name in your browser (Tailscale app shows it).

4) Confirm your WhatsApp access policy is locked down

#

Make sure your channels.whatsapp.dmPolicy is allowlist or pairing, and that allowFrom is only your number (don’t paste it here). If you want, run:

openclaw config get channels.whatsapp.dmPolicy

If you tell me which of these you care about most next:

  1. “Just chat and keep it stable”
  2. “Tailscale dashboard on my phone”
  3. “Maximum security lockdown”
    …I’ll give you the exact next 3–5 commands and we’ll finish it cleanly.
haughty stratus
#

hold on i mean i linked whatspp but now how do i get or find the chat on my whatsapp? i only have it linked but dont see a chat anywhere

#

?

woeful viperBOT
#

What part is unclear / what do you want to do next?

Pick one and I’ll give you the exact steps:

  1. Just confirm it’s stable + secure (run the security audit + check WhatsApp allowlist)
  2. Open the dashboard from your phone/laptop via Tailscale (Serve setup)
  3. Backups / “how do I not lose this setup?” (what to snapshot + what not to back up)

Reply with 1, 2, or 3.

haughty stratus
#

well what im saying is how do i do this part "Send a WhatsApp message to the linked account / chat you intend to use (e.g. “ping”).
You should get a reply back from OpenClaw."

i dont know where to send the message because i dont know how to message the linked account or chat. i cannot see it. all i can see on my whatsapp is that i have open claw linked. but no option to message anywhere

woeful viperBOT
#

What you’re seeing is normal: linking WhatsApp doesn’t create a new “OpenClaw contact/chat”.

OpenClaw is acting like WhatsApp Web on your same WhatsApp account. So there isn’t a new person to message — it will reply inside whatever chat the message arrives in (as long as your allowlist/policy allows it).

Easiest way to test (if you linked your personal WhatsApp number)

Use WhatsApp’s “Message yourself” / self-chat:

  1. On your phone WhatsApp, tap New chat (the pencil / message icon)
  2. Search for your own name/number (many WhatsApp versions show “Message yourself”)
  3. Open that chat and send: ping

If your WhatsApp UI doesn’t show a self-chat, another trick:

  • Save your own number as a contact (“Me”), then start a chat with that contact.

If you want it to feel like a bot you message

You need a separate WhatsApp number for OpenClaw (recommended). Then you’d simply message that number from your personal WhatsApp like any other contact.

#

Quick check (so I can tell you which case you’re in)

Run on VPS (louis tab) and paste the outputs (no secrets):

openclaw config get channels.whatsapp.dmPolicy
openclaw config get channels.whatsapp.selfChatMode

Also tell me: did you link WhatsApp using your main personal number, or do you have a second number for the bot?

haughty stratus
#

ok i wrote ping to myself and openclaw responded pong im guessing that works. perhaps then i should set it up on telegram? i do rather a bot style responding to me

woeful viperBOT
#

Yep — Telegram is a much nicer “bot-style” experience, because it’s a separate bot identity you message like a normal contact (unlike WhatsApp Web which is tied to your own account).

You can keep WhatsApp working and also add Telegram — they can run side-by-side.

Telegram setup (secure DM-only)

1) Create a Telegram bot + token (on your phone / Telegram app)

  • Message @BotFather
  • Run: /newbot
  • Copy the bot token (looks like 123456:ABC...)
  • Do not paste the token into Discord

2) Add the token to OpenClaw config

Run on: VPS (louis tab) (louis@...$)

#
nano ~/.openclaw/openclaw.json

Add this block (or merge it into your existing channels object):

{
  channels: {
    telegram: {
      enabled: true,
      botToken: "PASTE_YOUR_TOKEN_HERE",
      dmPolicy: "pairing"
    }
  }
}
#

Notes:

  • dmPolicy: "pairing" is a good secure default: only you can approve yourself.
  • Don’t set groups at all for now — that keeps groups effectively blocked by default.

Save/exit nano.

3) Restart OpenClaw

Run on: VPS (louis tab)

openclaw gateway restart

4) Pair your Telegram user

  1. In Telegram, DM your new bot with “hi”
  2. On the VPS, run:
#
openclaw pairing list telegram
openclaw pairing approve telegram <CODE>

Then DM the bot again — it should reply normally.


If you tell me whether you already have the BotFather token, I can also tell you the safest way to paste it (and how to confirm Telegram is running via openclaw channels status).

haughty stratus
#

putting telegram aside from now, i still feel like the setup wasnt fully complete, i didnt get to the part where it asks what should i call you etc. and the skills part. how do i get back to setting up openclaw how i want it. i want to first complete that before considering tranistioning to telegram

woeful viperBOT
#

You can get back into “finish setup / customize it” mode anytime — onboarding isn’t a one-shot.

A) Re-run the onboarding wizard (safest way to finish what you skipped)

Run on: VPS (louis tab) (louis@...$)

openclaw onboard

When it detects your existing setup, choose:

  • Modify / Keep (do not choose Reset)

Then pick Advanced/Manual and continue — you should be able to go through the remaining steps (workspace/skills/health check, etc.). Re-running the wizard won’t wipe anything unless you explicitly reset.

B) The “what should I call you?” part is usually just editing your workspace files

OpenClaw’s “personalization” mostly lives in the workspace (markdown files the agent reads).

1) Find your workspace path

#

Run on VPS (louis tab):

openclaw config get agents.defaults.workspace

Usually it’s ~/.openclaw/workspace.

2) Edit your user/preferences file

Run on VPS (louis tab):

nano ~/.openclaw/workspace/USER.md

Put whatever you want there (your name, what the assistant should call you, tone, etc.). Save/exit.

If you also want to name the assistant / set personality, check:

#
ls ~/.openclaw/workspace

and look for IDENTITY.md, SOUL.md, AGENTS.md.

C) Skills on Linux

You can either:

  1. pick skills during the wizard’s skills step, or
  2. install later via ClawHub (optional; wizard can also guide this)

If you paste the exact prompt text you see when you run openclaw onboard (no tokens/URLs), I’ll tell you which option to pick so you land specifically on the “skills” part and complete the setup cleanly.

haughty stratus
#

what to select for:
◇ Gateway service runtime
│ Node (recommended)
│
◆ Gateway service already installed
│ ● Restart
│ ○ Reinstall
│ ○ Skip

woeful viperBOT
#

Select Restart.

  • Restart = quickest/safest: applies whatever config changes the wizard just made and brings the gateway back up cleanly.
  • Reinstall = only if you think the systemd service file is broken/outdated (you just fixed it, so no need).
  • Skip = leaves the running gateway untouched (not what you want if you’re trying to “finish setup” and have changes take effect).