Run a persistent CoderClaw Gateway on a GCP Compute Engine VM using Docker, with durable state, baked-in binaries, and safe restart behavior.
If you want “CoderClaw 24/7 for ~$5-12/mo”, this is a reliable setup on Google Cloud. Pricing varies by machine type and region; pick the smallest VM that fits your workload and scale up if you hit OOMs.
~/.coderclaw + ~/.coderclaw/workspace on the host (survives restarts/rebuilds)The Gateway can be accessed via:
This guide uses Debian on GCP Compute Engine. Ubuntu also works; map packages accordingly. For the generic Docker flow, see Docker.
.env and docker-compose.ymlOption A: gcloud CLI (recommended for automation)
Install from https://cloud.google.com/sdk/docs/install
Initialize and authenticate:
gcloud init
gcloud auth login
Option B: Cloud Console
All steps can be done via the web UI at https://console.cloud.google.com
CLI:
gcloud projects create my-coderclaw-project --name="CoderClaw Gateway"
gcloud config set project my-coderclaw-project
Enable billing at https://console.cloud.google.com/billing (required for Compute Engine).
Enable the Compute Engine API:
gcloud services enable compute.googleapis.com
Console:
Machine types:
| Type | Specs | Cost | Notes |
|---|---|---|---|
| e2-small | 2 vCPU, 2GB RAM | ~$12/mo | Recommended |
| e2-micro | 2 vCPU (shared), 1GB RAM | Free tier eligible | May OOM under load |
CLI:
gcloud compute instances create coderclaw-gateway \
--zone=us-central1-a \
--machine-type=e2-small \
--boot-disk-size=20GB \
--image-family=debian-12 \
--image-project=debian-cloud
Console:
coderclaw-gatewayus-central1, Zone: us-central1-ae2-smallCLI:
gcloud compute ssh coderclaw-gateway --zone=us-central1-a
Console:
Click the “SSH” button next to your VM in the Compute Engine dashboard.
Note: SSH key propagation can take 1-2 minutes after VM creation. If connection is refused, wait and retry.
sudo apt-get update
sudo apt-get install -y git curl ca-certificates
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
Log out and back in for the group change to take effect:
exit
Then SSH back in:
gcloud compute ssh coderclaw-gateway --zone=us-central1-a
Verify:
docker --version
docker compose version
git clone https://github.com/SeanHogg/coderClaw.git
cd coderClaw
This guide assumes you will build a custom image to guarantee binary persistence.
Docker containers are ephemeral. All long-lived state must live on the host.
mkdir -p ~/.coderclaw
mkdir -p ~/.coderclaw/workspace
Create .env in the repository root.
CODERCLAW_IMAGE=coderclaw:latest
CODERCLAW_GATEWAY_TOKEN=change-me-now
CODERCLAW_GATEWAY_BIND=lan
CODERCLAW_GATEWAY_PORT=18789
CODERCLAW_CONFIG_DIR=/home/$USER/.coderclaw
CODERCLAW_WORKSPACE_DIR=/home/$USER/.coderclaw/workspace
GOG_KEYRING_PASSWORD=change-me-now
XDG_CONFIG_HOME=/home/node/.coderclaw
Generate strong secrets:
openssl rand -hex 32
Do not commit this file.
Create or update docker-compose.yml.
services:
coderclaw-gateway:
image: ${CODERCLAW_IMAGE}
build: .
restart: unless-stopped
env_file:
- .env
environment:
- HOME=/home/node
- NODE_ENV=production
- TERM=xterm-256color
- CODERCLAW_GATEWAY_BIND=${CODERCLAW_GATEWAY_BIND}
- CODERCLAW_GATEWAY_PORT=${CODERCLAW_GATEWAY_PORT}
- CODERCLAW_GATEWAY_TOKEN=${CODERCLAW_GATEWAY_TOKEN}
- GOG_KEYRING_PASSWORD=${GOG_KEYRING_PASSWORD}
- XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
- PATH=/home/linuxbrew/.linuxbrew/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
volumes:
- ${CODERCLAW_CONFIG_DIR}:/home/node/.coderclaw
- ${CODERCLAW_WORKSPACE_DIR}:/home/node/.coderclaw/workspace
ports:
# Recommended: keep the Gateway loopback-only on the VM; access via SSH tunnel.
# To expose it publicly, remove the `127.0.0.1:` prefix and firewall accordingly.
- "127.0.0.1:${CODERCLAW_GATEWAY_PORT}:18789"
command:
[
"node",
"dist/index.js",
"gateway",
"--bind",
"${CODERCLAW_GATEWAY_BIND}",
"--port",
"${CODERCLAW_GATEWAY_PORT}",
]
Installing binaries inside a running container is a trap. Anything installed at runtime will be lost on restart.
All external binaries required by skills must be installed at image build time.
The examples below show three common binaries only:
gog for Gmail accessgoplaces for Google Placeswacli for WhatsAppThese are examples, not a complete list. You may install as many binaries as needed using the same pattern.
If you add new skills later that depend on additional binaries, you must:
Example Dockerfile
FROM node:22-bookworm
RUN apt-get update && apt-get install -y socat && rm -rf /var/lib/apt/lists/*
# Example binary 1: Gmail CLI
RUN curl -L https://github.com/steipete/gog/releases/latest/download/gog_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/gog
# Example binary 2: Google Places CLI
RUN curl -L https://github.com/steipete/goplaces/releases/latest/download/goplaces_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/goplaces
# Example binary 3: WhatsApp CLI
RUN curl -L https://github.com/steipete/wacli/releases/latest/download/wacli_Linux_x86_64.tar.gz \
| tar -xz -C /usr/local/bin && chmod +x /usr/local/bin/wacli
# Add more binaries below using the same pattern
WORKDIR /app
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY ui/package.json ./ui/package.json
COPY scripts ./scripts
RUN corepack enable
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm ui:install
RUN pnpm ui:build
ENV NODE_ENV=production
CMD ["node","dist/index.js"]
docker compose build
docker compose up -d coderclaw-gateway
Verify binaries:
docker compose exec coderclaw-gateway which gog
docker compose exec coderclaw-gateway which goplaces
docker compose exec coderclaw-gateway which wacli
Expected output:
/usr/local/bin/gog
/usr/local/bin/goplaces
/usr/local/bin/wacli
docker compose logs -f coderclaw-gateway
Success:
[gateway] listening on ws://0.0.0.0:18789
Create an SSH tunnel to forward the Gateway port:
gcloud compute ssh coderclaw-gateway --zone=us-central1-a -- -L 18789:127.0.0.1:18789
Open in your browser:
http://127.0.0.1:18789/
Paste your gateway token.
CoderClaw runs in Docker, but Docker is not the source of truth. All long-lived state must survive restarts, rebuilds, and reboots.
| Component | Location | Persistence mechanism | Notes |
|---|---|---|---|
| Gateway config | /home/node/.coderclaw/ |
Host volume mount | Includes coderclaw.json, tokens |
| Model auth profiles | /home/node/.coderclaw/ |
Host volume mount | OAuth tokens, API keys |
| Skill configs | /home/node/.coderclaw/skills/ |
Host volume mount | Skill-level state |
| Agent workspace | /home/node/.coderclaw/workspace/ |
Host volume mount | Code and agent artifacts |
| WhatsApp session | /home/node/.coderclaw/ |
Host volume mount | Preserves QR login |
| Gmail keyring | /home/node/.coderclaw/ |
Host volume + password | Requires GOG_KEYRING_PASSWORD |
| External binaries | /usr/local/bin/ |
Docker image | Must be baked at build time |
| Node runtime | Container filesystem | Docker image | Rebuilt every image build |
| OS packages | Container filesystem | Docker image | Do not install at runtime |
| Docker container | Ephemeral | Restartable | Safe to destroy |
To update CoderClaw on the VM:
cd ~/coderclaw
git pull
docker compose build
docker compose up -d
SSH connection refused
SSH key propagation can take 1-2 minutes after VM creation. Wait and retry.
OS Login issues
Check your OS Login profile:
gcloud compute os-login describe-profile
Ensure your account has the required IAM permissions (Compute OS Login or Compute OS Admin Login).
Out of memory (OOM)
If using e2-micro and hitting OOM, upgrade to e2-small or e2-medium:
# Stop the VM first
gcloud compute instances stop coderclaw-gateway --zone=us-central1-a
# Change machine type
gcloud compute instances set-machine-type coderclaw-gateway \
--zone=us-central1-a \
--machine-type=e2-small
# Start the VM
gcloud compute instances start coderclaw-gateway --zone=us-central1-a
For personal use, your default user account works fine.
For automation or CI/CD pipelines, create a dedicated service account with minimal permissions:
Create a service account:
gcloud iam service-accounts create coderclaw-deploy \
--display-name="CoderClaw Deployment"
Grant Compute Instance Admin role (or narrower custom role):
gcloud projects add-iam-policy-binding my-coderclaw-project \
--member="serviceAccount:[email protected]" \
--role="roles/compute.instanceAdmin.v1"
Avoid using the Owner role for automation. Use the principle of least privilege.
See https://cloud.google.com/iam/docs/understanding-roles for IAM role details.