openclaw/scripts/deploy/google/compute-engine
velrino ad9324ddbb feat(deploy): add GCP Compute Engine deployment scripts
One-command deployment for Moltbot on GCP Compute Engine:
- Automated VM creation, Docker setup, and gateway configuration
- Optional Tailscale integration for HTTPS (no SSH tunnel needed)
- Optional Telegram allowlist for auto-approved users
- Auto-generates secure tokens (gateway token, keyring password)
- Container stability checks with auto-restart
- Uninstall script included
2026-01-29 19:14:59 -03:00
..
README.md feat(deploy): add GCP Compute Engine deployment scripts 2026-01-29 19:14:59 -03:00
run.sh feat(deploy): add GCP Compute Engine deployment scripts 2026-01-29 19:14:59 -03:00
uninstall.sh feat(deploy): add GCP Compute Engine deployment scripts 2026-01-29 19:14:59 -03:00

Deploy Moltbot to Google Compute Engine

This script automates the deployment of Moltbot to Google Compute Engine, following the official documentation at docs/platforms/gcp.md.


For Beginners: What is all this?

Architecture Overview

graph TB
    subgraph You["👤 YOU (user)"]
        Laptop["💻 Laptop<br/>(browser)"]
        Phone["📱 Phone<br/>(Telegram)"]
        Tablet["📱 Tablet<br/>(browser)"]
    end

    subgraph GCP["☁️ GOOGLE CLOUD PLATFORM"]
        subgraph VM["🖥️ VM (Compute Engine)<br/>Debian 12, 4GB RAM"]
            subgraph Docker["🐳 DOCKER"]
                Gateway["🤖 MOLTBOT GATEWAY<br/>(port 18789)<br/>─────────────<br/>• Receives Telegram messages<br/>• Processes with Claude AI<br/>• Responds automatically<br/>• Web UI for config"]
            end
            subgraph Volumes["📁 Mounted Volumes"]
                Config["~/.clawdbot/<br/>(config, tokens)"]
                Workspace["~/clawd/<br/>(agent workspace)"]
            end
        end
    end

    Laptop -->|"HTTPS<br/>(Tailscale)"| Gateway
    Phone -->|"Telegram API"| Gateway
    Tablet -->|"HTTPS<br/>(Tailscale)"| Gateway
    Gateway --> Config
    Gateway --> Workspace

What does each technology do?

Technology What it is Simple explanation
Google Cloud Platform (GCP) Cloud computing "Renting a computer in the cloud" - you pay ~$25/mo to have a server running 24/7
Compute Engine (VM) Virtual machine A virtual computer inside GCP with Debian Linux, 4GB RAM, 20GB disk
Docker Container runtime "Isolated box for applications" - ensures Moltbot works the same everywhere
Tailscale Personal VPN Connects your devices securely, provides free HTTPS, only you can access
Gateway Token Authentication "Moltbot password" - even with the URL, you need the token to enter
Anthropic API (Claude) AI service "The bot's brain" - the AI that generates responses, pay per usage

Message flow in Telegram

sequenceDiagram
    participant You as 👤 You
    participant TG as 📱 Telegram
    participant GW as 🤖 Moltbot Gateway
    participant AI as 🧠 Anthropic API

    You->>TG: 1. "Hello, Claude"
    TG->>GW: 2. Forward message
    GW->>AI: 3. Send to Claude
    AI->>GW: 4. Generate response
    GW->>TG: 5. Send reply
    TG->>You: 6. "Hello! How can I help?"

Why use Tailscale?

graph LR
    subgraph Without["❌ WITHOUT TAILSCALE"]
        B1["🌐 Browser"] -->|"HTTP"| IP1["http://35.192.x.x:18789"]
        IP1 -->|"❌ BLOCKED"| Error["Insecure connection<br/>WebSocket requires HTTPS"]
    end
graph LR
    subgraph With["✅ WITH TAILSCALE"]
        B2["🌐 Browser"] -->|"HTTPS"| TS["🔐 Tailscale<br/>Private VPN"]
        TS -->|"Encrypted"| VM2["🖥️ VM on GCP"]
        VM2 --> OK["✅ Works!<br/>Auto SSL + Private access"]
    end

Access Modes Compared

Mode Security Convenience How it works
SSH Tunnel (default) Run SSH command every time, access via localhost:18789
Tailscale (recommended) Install once, automatic HTTPS, only your devices can access
Public IP (not recommended) Anyone can try to access, UI doesn't work (needs HTTPS)

What the script does automatically

flowchart TD
    Start["🚀 run.sh --project X --tailscale --telegram-user-id Y"] --> Step1

    subgraph Step1["Step 1: Verification"]
        V1["✓ gcloud CLI installed?"]
        V2["✓ Authenticated on GCP?"]
        V3["✓ Project has billing?"]
    end

    Step1 --> Step2

    subgraph Step2["Step 2: Create VM"]
        VM1["Create e2-medium (4GB RAM)"]
        VM2["Install Docker"]
        VM3["Configure firewall"]
    end

    Step2 --> Step3

    subgraph Step3["Step 3: Configure Moltbot"]
        C1["Clone repository"]
        C2["Create .env with keys"]
        C3["Auto-generate tokens"]
    end

    Step3 --> Step4

    subgraph Step4["Step 4: Build & Start"]
        B1["docker compose build"]
        B2["docker compose up -d"]
        B3["Verify stability (3 checks)"]
    end

    Step4 --> Step5

    subgraph Step5["Step 5: Tailscale (if --tailscale)"]
        T1["Install Tailscale on VM host"]
        T2["Authenticate (link in terminal)"]
        T3["Run 'tailscale serve' on host"]
        T4["Automatic HTTPS → localhost:18789"]
    end

    Step5 --> Step6

    subgraph Step6["Step 6: Telegram (if --telegram-user-id)"]
        TG1["Set dmPolicy = allowlist"]
        TG2["Add your user ID to allowlist"]
    end

    Step6 --> Result["✅ DONE!<br/>URL: https://moltbot-gateway.tailnet-xxx.ts.net<br/>Telegram: Message @YourBot!"]

Estimated Costs

Service Cost Notes
GCP VM (e2-medium) ~$25/mo 4GB RAM, runs 24/7
GCP Disk (20GB) ~$2/mo Persistent storage
GCP Network ~$1-5/mo Depends on usage
Anthropic API ~$5-20/mo Claude 3.5 Sonnet: $3/1M input, $15/1M output
Tailscale FREE Up to 100 devices
Telegram FREE
TOTAL ~$33-52/mo

What the Script Does (follows docs/platforms/gcp.md)

The script automates the deployment steps from the official documentation:

  1. Checks prerequisites - gcloud CLI, authentication, billing
  2. Enables APIs - Compute Engine API
  3. Creates VM - e2-medium, Debian 12, 20GB (configurable)
  4. Installs Docker - Via startup script
  5. Clones repository - git clone on the VM
  6. Creates persistent directories - ~/.clawdbot and ~/clawd
  7. Configures .env - All required variables including GOG_KEYRING_PASSWORD
  8. Creates docker-compose.yml - With volume mounts for persistence
  9. Creates Dockerfile.gcp - Optimized for GCP deployment
  10. Builds and launches - docker compose build && docker compose up -d
  11. Verifies gateway - Shows startup logs

Prerequisites

Quick Start

# Recommended: Full setup with Tailscale HTTPS + Telegram auto-approval
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT_ID \
  --anthropic-key sk-ant-xxx \
  --tailscale \
  --telegram-user-id YOUR_TELEGRAM_USER_ID

# Production deployment (e2-medium, SSH tunnel access - most secure)
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT_ID \
  --anthropic-key sk-ant-xxx

# Restrict access to your IP only (recommended - auto-detects and confirms)
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT_ID \
  --anthropic-key sk-ant-xxx \
  --my-ip

# Free tier deployment (e2-micro, may OOM under load)
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT_ID \
  --machine-type e2-micro \
  --anthropic-key sk-ant-xxx

# With .env file
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT_ID \
  --env-file .env

# With HTTPS via Tailscale (recommended for direct browser access)
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT_ID \
  --anthropic-key sk-ant-xxx \
  --tailscale

To find your Telegram user ID, message @userinfobot on Telegram.

To find your IP address:

curl -4 ifconfig.me

Options

Option Default Description
--project PROJECT_ID (required) Google Cloud project ID
--zone ZONE us-central1-a Compute Engine zone
--instance NAME moltbot-gateway Instance name
--machine-type TYPE e2-medium Machine type (4GB RAM, needed for builds)
--disk-size SIZE 20GB Boot disk size
--env-file FILE - Load environment variables from file
--anthropic-key KEY - Anthropic API key
--gateway-token TOKEN auto-generated Gateway authentication token
--my-ip - Auto-detect your IP and restrict firewall (API only, UI needs HTTPS)
--allowed-ip IP - Restrict firewall to specific IP (API only, UI needs HTTPS)
--tailscale - Install Tailscale for HTTPS access (recommended for UI)
--telegram-user-id ID - Telegram user ID to auto-approve (no pairing needed)

Access Modes

SSH Tunnel (default, most secure)

By default, the gateway binds to loopback only (127.0.0.1:18789). Access via SSH tunnel:

# Create tunnel from your laptop
gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT -- -L 18789:127.0.0.1:18789

# Open in browser
http://127.0.0.1:18789/

Pros: Most secure, no ports exposed to internet Cons: Requires SSH tunnel every time you access the UI

With --tailscale flag, the script:

  1. Installs Tailscale on the VM host (before Docker build)
  2. Authenticates Tailscale (you click the link in terminal)
  3. Runs sudo tailscale serve --bg --yes 18789 on the host
  4. Docker container binds to 0.0.0.0:18789 for Tailscale to proxy
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT \
  --anthropic-key sk-ant-xxx \
  --tailscale

# Follow the authentication link that appears in the terminal
# Then access via: https://moltbot-gateway.your-tailnet.ts.net/

After deployment, you can access the Gateway UI directly via the Tailscale URL - no port number needed (Tailscale Serve handles HTTPS on port 443).

Pros: HTTPS works, direct browser access, secure, no SSH tunnel needed Cons: Requires Tailscale account (free)

IP Restricted Access (API only - UI requires HTTPS)

With --my-ip flag, the script auto-detects your IP and asks for confirmation.

Note: Due to browser security (secure context), the UI only works via localhost or HTTPS. Use SSH tunnel or Tailscale for UI access.

# Deploy with auto-detected IP restriction (recommended)
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT \
  --anthropic-key sk-ant-xxx \
  --my-ip

# The script will:
# 1. Detect your IP (e.g., 186.220.38.207)
# 2. Ask: "Restrict access to IP 186.220.38.207? [Y/n]"
# 3. If yes, proceed with deployment restricted to your IP

# Or specify IP manually:
./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT \
  --anthropic-key sk-ant-xxx \
  --allowed-ip 186.220.38.207

# Access directly (no tunnel needed)
http://INSTANCE_IP:18789/?token=YOUR_GATEWAY_TOKEN

Pros: Direct access to UI without SSH tunnel, secure (only your IP can connect) Cons: If your IP changes, you need to update the firewall rule:

# Update allowed IP
gcloud compute firewall-rules update moltbot-gateway \
  --project=YOUR_PROJECT \
  --source-ranges="NEW_IP/32"

With --public flag, the gateway is exposed to all IPs:

# Deploy with public access (open to everyone)
./scripts/deploy/google/compute-engine/run.sh --project YOUR_PROJECT --anthropic-key sk-ant-xxx --public

# Access directly
http://INSTANCE_IP:18789/?token=YOUR_GATEWAY_TOKEN

Warning: Anyone with the token can access your gateway. Only use this if you understand the security implications.

How to Find Your IP Address

# Use curl
curl -4 ifconfig.me

This will return something like 186.220.38.207.

Tip: Use --my-ip flag during deployment to auto-detect and confirm your IP automatically.

Managing Allowed IPs

Add or change your IP

If your IP changes, update the firewall rule:

# Update to new single IP
gcloud compute firewall-rules update moltbot-gateway \
  --project=YOUR_PROJECT \
  --source-ranges="NEW_IP/32"

Allow multiple IPs

To allow multiple IPs (e.g., home and office):

# Allow multiple IPs (comma-separated)
gcloud compute firewall-rules update moltbot-gateway \
  --project=YOUR_PROJECT \
  --source-ranges="186.220.38.207/32,200.100.50.25/32"

Allow an IP range

To allow a range of IPs:

# Allow a /24 subnet (e.g., 186.220.38.0 - 186.220.38.255)
gcloud compute firewall-rules update moltbot-gateway \
  --project=YOUR_PROJECT \
  --source-ranges="186.220.38.0/24"

Check current allowed IPs

gcloud compute firewall-rules describe moltbot-gateway \
  --project=YOUR_PROJECT \
  --format="value(sourceRanges)"

What Persists Where

Component Location Persistence Notes
Gateway config ~/.clawdbot/ Host volume moltbot.json, tokens
OAuth tokens ~/.clawdbot/ Host volume Model auth profiles
WhatsApp session ~/.clawdbot/ Host volume Preserves QR login
Gmail keyring ~/.clawdbot/ Host volume Requires GOG_KEYRING_PASSWORD
Agent workspace ~/clawd/ Host volume Code and artifacts
Application Docker image Rebuilt on update Node.js app and dependencies

Machine Types

Type vCPU Memory Monthly Cost Notes
e2-micro 0.25 1 GB Free tier OOM during build and runtime
e2-small 0.5 2 GB ~$12/mo OOM during Docker build
e2-medium 1 4 GB ~$25/mo Default - works for build and runtime

Why e2-medium?

The Docker build process (pnpm install) requires ~3GB of RAM. Smaller machines will be killed by the OS (OOM - Out of Memory) during the build phase.

  • e2-micro (1GB): Will OOM during build and often during runtime
  • e2-small (2GB): Will OOM during Docker build (pnpm install)
  • e2-medium (4GB): Works for build and runtime

After the initial build, runtime memory usage is lower (~1-2GB). If cost is a concern, you can:

  1. Build with e2-medium
  2. After successful deployment, downgrade to e2-small for runtime

Post-Deployment Commands

SSH to instance

gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT

View logs

gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT \
  --command='cd ~/moltbot && docker compose logs -f'

Restart gateway

gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT \
  --command='cd ~/moltbot && docker compose restart'

Update Moltbot

gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT \
  --command='cd ~/moltbot && git pull && docker compose build && docker compose up -d'

Telegram Auto-Approval

By default, Moltbot requires users to "pair" before using the bot via Telegram. With --telegram-user-id, you can pre-approve your Telegram account:

./scripts/deploy/google/compute-engine/run.sh \
  --project YOUR_PROJECT \
  --anthropic-key sk-ant-xxx \
  --telegram-user-id 123456789

This sets:

  • channels.telegram.dmPolicy: "allowlist" - Only allowlisted users can message the bot
  • channels.telegram.allowFrom: ["123456789"] - Your user ID is pre-approved

How to find your Telegram user ID:

  1. Message @userinfobot on Telegram
  2. It will reply with your user ID (a number like 123456789)

Uninstall

# Delete instance and firewall rule
./scripts/deploy/google/compute-engine/uninstall.sh --project YOUR_PROJECT

# Keep firewall for future deployments
./scripts/deploy/google/compute-engine/uninstall.sh --project YOUR_PROJECT --keep-firewall

Troubleshooting

SSH connection refused

SSH key propagation can take 1-2 minutes after VM creation. Wait and retry.

Instance not starting

Check the serial console output:

gcloud compute instances get-serial-port-output moltbot-gateway \
  --zone=us-central1-a --project=YOUR_PROJECT

Out of memory (OOM)

If you see exit code: 137 or Killed during Docker build, the VM ran out of memory.

Solution: Upgrade to e2-medium (4GB RAM):

# Stop the VM
gcloud compute instances stop moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT

# Change machine type to e2-medium (4GB RAM)
gcloud compute instances set-machine-type moltbot-gateway \
  --zone=us-central1-a --project=YOUR_PROJECT \
  --machine-type=e2-medium

# Start the VM
gcloud compute instances start moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT

# Re-run the build
gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT \
  --command='cd ~/moltbot && docker compose build && docker compose up -d'

Note: The default is now e2-medium to avoid this issue. See Machine Types for details.

Docker build fails

SSH into the instance and check disk space:

gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT
df -h
docker system prune -a  # Clean up old images

Security Recommendations

  1. Use --tailscale (recommended) - Automatic HTTPS, private access via your tailnet
  2. Use SSH tunnel - Most secure, but requires tunnel for each access
  3. Use --allowed-ip - Restricts to your IP only (API only, UI needs HTTPS)
  4. Avoid --public - Open to all IPs, only use if you understand the risks
  5. Rotate tokens - Change CLAWDBOT_GATEWAY_TOKEN periodically
  6. Use --telegram-user-id - Pre-approve only your Telegram account (no open pairing)

Tailscale HTTPS Details

When using --tailscale, the script sets up automatic HTTPS via Tailscale Serve:

  1. VM Host: Tailscale daemon runs on the VM, authenticated to your tailnet
  2. Tailscale Serve: The script runs sudo tailscale serve --bg --yes 18789 on the HOST
  3. Docker Container: Binds to 0.0.0.0:18789 so Tailscale can proxy to it

The architecture is:

Internet → Tailscale (HTTPS:443) → localhost:18789 → Docker (gateway)

Tailscale Serve runs on the HOST (not in the container) because it requires root permissions.

Manual Tailscale Setup (if not using --tailscale)

If you deployed without --tailscale and want to add it later:

# SSH to instance
gcloud compute ssh moltbot-gateway --zone=us-central1-a --project=YOUR_PROJECT

# Install Tailscale on the VM host
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --hostname=moltbot-gateway

# Configure Tailscale Serve to proxy HTTPS to the gateway port
sudo tailscale serve --bg --yes 18789

# Verify it's working
tailscale serve status

This gives you a secure URL like https://moltbot-gateway.your-tailnet.ts.net.