One SSH session. One command. Production-ready OpenClaw deployment.
LaunchClaw is a deployment toolkit for setting up OpenClaw on VPS machines, Mac Minis, and mini PCs in a repeatable way.
git clone https://github.com/bullpen/launchclaw.git
cd launchclaw
chmod +x setup.sh
sudo ./setup.sh setup --profile business --channel discord --domain bot.example.com- Detects OS (Ubuntu/Debian/macOS)
- Installs dependencies (Node.js 22+, git, nginx/certbot/ufw on Linux when needed)
- Installs OpenClaw (
npm -g openclaw@<version>) - Creates
openclawservice user on Linux - Generates a current OpenClaw-compatible
openclaw.json - Installs daemon via native
openclaw gateway install - Enables reverse proxy (nginx) on Linux
- Provisions SSL with certbot when domain is provided
- Configures UFW firewall on Linux
- Verifies daemon health and gateway reachability
./setup.sh setup [options]
./setup.sh status
./setup.sh --uninstallOptions:
--profile <name>:personal|business|developer|agency|minimal(default:personal)--channel <name>:discord|telegram|whatsapp|slack|signal(repeatable)--model <model>: override profile model--name <name>: agent name label--gateway-port <n>: gateway port (default:18789)--openclaw-version <v>: npm tag/version (default:latest)--domain <domain>: domain for SSL (Linux)--soul <path>: custom soul file copied to workspaceSOUL.md--env-file <path>: sourceLAUNCHCLAW_*vars from file--skip-proxy: skip nginx--skip-ssl: skip certbot--skip-firewall: skip UFW--dry-run: no changes--yes/-y: non-interactive overwrite mode--uninstall: remove LaunchClaw-managed install
| Profile | Model | Max Concurrent | Subagents | Heartbeat |
|---|---|---|---|---|
| personal | claude-sonnet-4-5 | 2 | 0 | 30m |
| business | claude-sonnet-4-5 | 4 | 0 | 15m |
| developer | claude-sonnet-4-5 | 4 | 8 | 15m |
| agency | claude-opus-4-6 | 4 | 8 | 15m |
| minimal | claude-sonnet-4-5 | 2 | 0 | 0m |
Example client.env:
LAUNCHCLAW_PROFILE=business
LAUNCHCLAW_CHANNELS=discord,slack
LAUNCHCLAW_MODEL=anthropic/claude-sonnet-4-5
LAUNCHCLAW_DOMAIN=bot.example.com
LAUNCHCLAW_GATEWAY_PORT=18789
LAUNCHCLAW_OPENCLAW_VERSION=latest
LAUNCHCLAW_ASSUME_YES=trueRun:
sudo ./setup.sh setup --env-file ./client.envTemplate: cloud-init/template.yaml
Replace variables before use:
__PROFILE____DOMAIN____MODEL____AGENT_NAME____CHANNEL_CONFIG__(raw JSON object)__ANTHROPIC_KEY____DISCORD_TOKEN__
__CHANNEL_CONFIG__ example:
{"discord":{"enabled":true,"dm":{"enabled":true,"policy":"pairing"}}}Linux:
sudo -u openclaw -H openclaw gateway status --deep
sudo -u openclaw -H openclaw gateway restartmacOS:
openclaw gateway status --deep
openclaw gateway restartGateway health:
curl -sf http://127.0.0.1:18789/health./setup.sh status
sudo ./setup.sh --uninstall- Installer is idempotent and backs up existing
openclaw.jsonbefore overwrite. - Generated config uses current OpenClaw keys (
gateway.auth.token,gateway.mode=local,agents.defaults.*). - Linux daemon runs as
openclawvia user-level systemd service withlingerenabled.
A minimal Hetzner provisioning API scaffold is included in:
/Users/mihajlomicic/Documents/GitHub/launchclaw/api
It supports:
- listing Hetzner locations/server types/images
- checking server-type availability by location/datacenter
- exposing templated plans with live pricing hints
- creating OpenClaw instances with injected LaunchClaw cloud-init
- optional Cloudflare DNS automation for instance domains
- instance status, lifecycle actions (start/stop/restart), and deletion
- pending-order workflow (
pending -> paid -> provisioning -> running/failed) via SQLite - webhook-driven provisioning (
/v1/webhooks/orders)
See /Users/mihajlomicic/Documents/GitHub/launchclaw/api/README.md.
MIT