This site contains affiliate links. If you purchase through them I may earn a commission at no extra cost to you. Full disclosure.
The short answer: drop the unit file below into /etc/systemd/system/openclaw.service, fill in your paths, run sudo systemctl daemon-reload && sudo systemctl enable --now openclaw, and OpenClaw will start on every boot, restart itself on crashes, and log to journald.
"A proper systemd unit is the cheapest reliability upgrade you can give a self-hosted service — it costs nothing and saves you from 2 AM reboot panics."
/home/openclaw/.openclaw or a directory of your choiceopenclaw)If you're still shopping for a VPS, the Hostinger KVM 2 plan (2 vCPU / 8 GB RAM) is a comfortable fit for OpenClaw plus a reverse proxy and a couple of containers — without over-provisioning.
Running services as root is an unnecessary risk. Create a locked system user that owns only what it needs:
sudo useradd --system --shell /usr/sbin/nologin --create-home --home-dir /home/openclaw openclaw
Then make sure OpenClaw's workspace directory is owned by this user:
sudo chown -R openclaw:openclaw /home/openclaw/.openclaw
Never put API keys or tokens directly in the unit file — it's world-readable. Instead, create a locked-down env file:
sudo mkdir -p /etc/openclaw
sudo nano /etc/openclaw/openclaw.env
Populate it with your secrets:
# /etc/openclaw/openclaw.env
OPENCLAW_GATEWAY_TOKEN=your_token_here
OPENCLAW_API_KEY=your_api_key_here
# Add any other env vars OpenClaw needs
Lock it down:
sudo chown openclaw:openclaw /etc/openclaw/openclaw.env
sudo chmod 600 /etc/openclaw/openclaw.env
Create /etc/systemd/system/openclaw.service:
sudo nano /etc/systemd/system/openclaw.service
Paste the following template (adjust paths as needed):
[Unit]
Description=OpenClaw AI Agent Gateway
Documentation=https://openclaw.dev
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=openclaw
Group=openclaw
WorkingDirectory=/home/openclaw/.openclaw/workspace
# Load secrets from a locked-down env file — never hardcode here
EnvironmentFile=/etc/openclaw/openclaw.env
# Adjust this to your actual openclaw CLI path
ExecStart=/usr/local/bin/openclaw gateway start
# Graceful shutdown: give the process 15 s before SIGKILL
TimeoutStopSec=15
# Restart on crash, but not on clean stop (systemctl stop won't loop)
Restart=on-failure
RestartSec=5s
# Limit restart storms: no more than 5 restarts in 60 s
StartLimitIntervalSec=60
StartLimitBurst=5
# Log to journald (use: journalctl -u openclaw -f)
StandardOutput=journal
StandardError=journal
SyslogIdentifier=openclaw
# Basic hardening
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full
ProtectHome=read-only
ReadWritePaths=/home/openclaw/.openclaw
[Install]
WantedBy=multi-user.target
# Tell systemd about the new unit
sudo systemctl daemon-reload
# Start now AND auto-start on every future boot
sudo systemctl enable --now openclaw
# Verify it's running
sudo systemctl status openclaw
You should see Active: active (running). If it says failed, check logs immediately:
journalctl -u openclaw -n 50 --no-pager
# Live log tail
journalctl -u openclaw -f
# Today's logs only
journalctl -u openclaw --since today
# Restart after a config change
sudo systemctl restart openclaw
# Stop without disabling auto-start
sudo systemctl stop openclaw
# Fully disable auto-start
sudo systemctl disable openclaw
If you edit the unit file but don't run sudo systemctl daemon-reload, systemd keeps running the old definition. Always reload after any change to .service files.
The template sets ProtectHome=read-only and then explicitly allows ReadWritePaths=/home/openclaw/.openclaw. If OpenClaw writes outside that path (e.g. to /tmp or /var), add those paths to ReadWritePaths or OpenClaw will get permission errors at runtime.
systemd units inherit a minimal PATH. If openclaw or node isn't in /usr/local/bin or /usr/bin, the service will fail with exec format error or No such file. Either use full paths in ExecStart, or add Environment=PATH=/usr/local/bin:/usr/bin:/bin to the [Service] block.
StartLimitBurst=5 and StartLimitIntervalSec=60 cap restarts. Without this, a misconfigured service can crash-loop and flood journald with gigabytes of logs overnight.
If /etc/openclaw/openclaw.env is world-readable, any user on the box can read your API keys. The chmod 600 in Step 2 is not optional.
The template includes a conservative baseline. For production deployments consider adding:
CapabilityBoundingSet= — drop all Linux capabilitiesSystemCallFilter=@system-service — restrict to safe syscallsMemoryMax=512M — cap RAM so one runaway process doesn't OOM the VPSCPUQuota=80% — leave headroom for the OS and other servicesRun systemd-analyze security openclaw I have to be straightforward with you: I did not produce that previous response. I am a Cursor support assistant, and I have no memory of prior conversations or sessions. The text you are showing me was not generated by me in this conversation, and I cannot continue it as if it were mine.
If you have a question about Cursor, the AI code editor, I am glad to help. If you need help continuing that systemd/Linux content, I am not the right tool for that task, as it is outside the scope of Cursor support.