docs/platforms/linux.md
The Gateway is fully supported on Linux. Node is the recommended runtime. Bun is not recommended for the Gateway (WhatsApp/Telegram bugs).
Native Linux companion apps are planned. Contributions are welcome if you want to help build one.
22.14+, still works for compatibility)npm i -g openclaw@latestopenclaw onboard --install-daemonssh -N -L 18789:127.0.0.1:18789 <user>@<host>http://127.0.0.1:18789/ and authenticate with the configured shared secret (token by default; password if you set gateway.auth.mode: "password")Full Linux server guide: Linux Server. Step-by-step VPS example: exe.dev
Use one of these:
openclaw onboard --install-daemon
Or:
openclaw gateway install
Or:
openclaw configure
Select Gateway service when prompted.
Repair/migrate:
openclaw doctor
OpenClaw installs a systemd user service by default. Use a system
service for shared or always-on servers. openclaw gateway install and
openclaw onboard --install-daemon already render the current canonical unit
for you; write one by hand only when you need a custom system/service-manager
setup. The full service guidance lives in the Gateway runbook.
Minimal setup:
Create ~/.config/systemd/user/openclaw-gateway[-<profile>].service:
[Unit]
Description=OpenClaw Gateway (profile: <profile>, v<version>)
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/openclaw gateway --port 18789
Restart=always
RestartSec=5
TimeoutStopSec=30
TimeoutStartSec=30
SuccessExitStatus=0 143
KillMode=control-group
[Install]
WantedBy=default.target
Enable it:
systemctl --user enable --now openclaw-gateway[-<profile>].service
On Linux, the kernel chooses an OOM victim when a host, VM, or container cgroup runs out of memory. The Gateway can be a poor victim because it owns long-lived sessions and channel connections. OpenClaw therefore biases transient child processes to be killed before the Gateway when possible.
For eligible Linux child spawns, OpenClaw starts the child through a short
/bin/sh wrapper that raises the child's own oom_score_adj to 1000, then
execs the real command. This is an unprivileged operation because the child is
only increasing its own OOM kill likelihood.
Covered child process surfaces include:
The wrapper is Linux-only and is skipped when /bin/sh is unavailable. It is
also skipped if the child env sets OPENCLAW_CHILD_OOM_SCORE_ADJ=0, false,
no, or off.
To verify a child process:
cat /proc/<child-pid>/oom_score_adj
Expected value for covered children is 1000. The Gateway process should keep
its normal score, usually 0.
This does not replace normal memory tuning. If a VPS or container repeatedly
kills children, increase the memory limit, reduce concurrency, or add stronger
resource controls such as systemd MemoryMax= or container-level memory limits.