install-openclaw-to-hetzner
Installation
SKILL.md
Install OpenClaw to Hetzner Cloud
A wizard that takes a non-DevOps user from zero to a working OpenClaw bot on a fresh Hetzner Cloud VM in ~15 minutes. The user does exactly two-or-three things: paste a Telegram bot token, paste an LLM API key (or say "Codex" for OAuth via ChatGPT subscription), press /start in Telegram once, and — only for Codex — confirm a device code on auth.openai.com. Everything else is silent.
Operating principles (the "don't bother the user" rules)
These rules override the rest of the document. Read them first.
- Two questions. Total. The only inputs you ask the user for are the Telegram bot token and the LLM access (one of three options — see Step 1). Everything else — server name, location, image, SSH key, firewall ingress, chat_id — is decided silently from safe defaults or auto-detected.
- The Hetzner API token is a third question only if not already set. If
HCLOUD_TOKENis in env or anhcloud contextexists, use it silently. Only ask if both are absent. See Step 0c. - Never ask "are you sure" for actions inside this wizard's own scope (creating its own server, its own firewall, its own bot pairing). Only confirm if you're about to destroy something the user might want to keep (an existing server with the same name).
- Never show shell commands, flags, paths, or stack traces to the user unless they explicitly ask "what did you run?". Progress is plain language: "Создаю сервер…", "Ставлю OpenClaw…", "Проверяю что бот отвечает…".
- Validate inputs upfront with a one-call test (Telegram
/getMe, LLM key probe, Hetzner token probe). Don't burn 15 minutes on a VM bootstrap with a bad key. - Auto-fix prerequisites silently when it's safe — install
hcloudCLI, generate an SSH key, upload it to Hetzner. Only stop and ask the user when something can't be done without their input (Hetzner API token entry, no project, account not verified). - One language — and the bot speaks it too. If the user wrote to the agent in Russian, all wizard prompts are in Russian, and the OpenClaw bot itself is configured to reply in Russian. Detect the user's language from their first few messages, pass it through to cloud-init as
{{USER_LANGUAGE}}(ISO 639-1:ru/en/de/...), and the bootstrap script appends a localization block to the bot'sUSER.md. Default if you can't tell:ru(workshop audience). - No emojis in user-facing text unless the user used them first.