- All commands run in the container shell, not the VPS host shell. The host has no
openclaw, no/entrypoint.sh, and nothing you install there reaches the app. - Changing any env var in the Hostinger panel recreates the container, wiping everything installed inside it. Only the
/datamount survives.
This guide uses the cloud broker at getsesame.dev. Read the main OpenClaw guide first for the concepts (secrets, injection, approvals) — this page covers only what Hostinger changes.
1. Dashboard prep
You, in the browser — in getsesame.dev (Secrets → Add), add one secret per provider your agent will call, e.g. OpenAI (
api.openai.com, Bearer) and Stripe (api.stripe.com, Bearer). The presets fill the injection mode. Secrets live in your Sesame account, not on the box — they survive anything Hostinger does.2. Panel prep (optional — only if going keyless on the LLM)
This step is not required for a working setup — the full path below works with the panel env untouched. Do it only if you want OpenClaw’s stored provider key replaced with a dummy.You, in the browser — in Hostinger’s hPanel, replace the provider key field (e.g.
OPENAI_API_KEY) with sesame-managed-placeholder. This recreates the container — that’s expected. Wait for the app to come back up before continuing, and do it before any container work.3. Enter the container shell
Hostinger’s browser terminal drops you inside the container as root. From the VPS host shell instead:docker exec -it openclaw-<suffix>-openclaw-1 bash (find the name with docker ps). The OpenClaw chat UI is never a setup shell.
Verify before anything else:
openclaw’s path plus an exec runuser -u node -- line → you’re inside. openclaw: command not found → you’re still on the host.
4. Install the Sesame CLI
As root, in the container shell:node user can’t create it itself (/run is root-owned) — without it, sesame login crashes with PermissionError: '/run/user/1000'. That’s the only fix a fresh template container needs. (Any other PermissionError on an older or modified container: see Troubleshooting row 1.)
5. Register as the app user
You, in the browser:
login prints a claim URL and blocks — open it, sign in to getsesame.dev, approve the device, wait for Agent approved.Why
runuser -u node --? The gateway and its exec tool run as the node user (uid 1000, HOME=/data), and Sesame reads its device identity from the home of whoever runs it — it lands in /data/.config/sesame and /data/.local/share/sesame/keys, owned by node. Register as root and the identity is invisible to the agent — it fails on first use. Create the identity as the user that will consume it.Choose your integration path
Quick path: sesame request
The agent calls Sesame as a shell tool when told to. No proxy, no restart, nothing changed about OpenClaw. Right for trying Sesame out.
Full path: transparent egress
Every outbound call intercepted at the wire — enforced, not opt-in, and covers the LLM key too. One entrypoint edit + a restart.
Quick path: sesame request
No proxy needed — skip proxyd entirely. Test as the same user the agent runs as:
You, in the browser: the request pauses; approve it in the dashboard’s Approvals tab. The broker injects the real key server-side and the balance prints in your terminal.
When you need to call the Stripe API, run sesame request GET https://api.stripe.com/v1/balance in the shell — you don’t have a Stripe key; auth is handled externally. What’s my account balance?
No gateway restart at any point: the agent spawns fresh shells per command, so they see the CLI and identity immediately.
Full path: transparent egress
On a normal host this issesame launch -- openclaw gateway run (main guide, step 5). On Hostinger you don’t type that — the template’s supervisor already starts the gateway, so the wrapper goes where the gateway is actually started: the container’s entrypoint.
1
Install the edge proxy
2
Wrap the entrypoint
One sed, as root in the container shell:Two details are load-bearing: the mkdir is baked in because
/run is a tmpfs that empties on every boot, and the absolute path /usr/local/bin/sesame is used because the boot-time PATH differs from your interactive shell’s.3
Restart the app
Hostinger panel restart button, or
kill 1 in the container shell, or docker restart <container> from the host — all equivalent. The gateway reboots through sesame launch: proxy env and CA are set at process birth, which is why a restart is required here and nowhere else.The template’s boot logs always show a failed
openclaw plugins install oxylabs-ai-studio-openclaw (“plugin already exists”). That error is pre-existing and harmless — it appears on every boot of the stock template and is unrelated to the entrypoint edit. What you don’t want to see is runuser: failed to execute lines (Troubleshooting, row 4).4
Prove it, then set the model-host policy
Send a chat message → the model call pauses → You, in the browser: approve it at getsesame.dev. The reply arrives with your real key injected server-side. Then immediately set an auto-approve policy on your model host — model calls fire on every turn, and per-call approvals make chat unusable. Keep per-call approval on side-effecting hosts like Stripe.
The mental model: OpenClaw never learns Sesame exists. There is no fallback setting to configure — it keeps sending the same key material as before. The edge proxy intercepts the call, and the broker swaps in the real key on the wire. The provider sees a valid request; OpenClaw sees a normal response.
Verify
Registration and reachability, from the container shell:sesame-managed-placeholder values — the real keys exist only in Sesame’s vault.