Gasclaw runs a Gastown multi-agent workspace managed by OpenClaw on Telegram, with Kimi K2.5 as the LLM backend. This guide deploys it to any Kubernetes cluster using the included Helm chart.
- Kubernetes cluster (1.24+)
- Helm 3
kubectlconfigured for your cluster- API keys: Kimi keys, Telegram bot token, Telegram owner ID
git clone https://github.com/gastown-publish/gasclaw.git
cd gasclawOption A — External Secret (recommended for production):
kubectl create secret generic gasclaw-secrets \
--from-literal=GASTOWN_KIMI_KEYS="sk-key1:sk-key2:sk-key3" \
--from-literal=OPENCLAW_KIMI_KEY="sk-overseer-key" \
--from-literal=TELEGRAM_BOT_TOKEN="123456789:ABCdefGHIjklMNOpqrsTUVwxyz" \
--from-literal=TELEGRAM_OWNER_ID="2045995148"Option B — Inline values (quick testing only):
# Pass secrets directly (stored in Helm release — less secure)
helm install gasclaw deploy/helm/gasclaw/ \
--set secret.create.gastwonKimiKeys="sk-key1:sk-key2" \
--set secret.create.openclawKimiKey="sk-overseer" \
--set secret.create.telegramBotToken="123:ABC" \
--set secret.create.telegramOwnerId="12345"# With external secret (Option A):
helm install gasclaw deploy/helm/gasclaw/ \
--set secret.existingSecret=gasclaw-secrets
# Optional: customize values
helm install gasclaw deploy/helm/gasclaw/ \
--set secret.existingSecret=gasclaw-secrets \
--set config.gtAgentCount="4" \
--set persistence.workspace.size=50Gi \
--set resources.requests.memory=1Gi \
--set resources.limits.memory=4GiBootstrap runs a 10-step startup sequence (Kimi proxy → Gastown → Dolt → OpenClaw → skills → daemon → mayor). This takes 2–5 minutes on first start.
# Watch pod status
kubectl get pods -l app.kubernetes.io/instance=gasclaw -w
# Tail bootstrap logs
kubectl logs -f statefulset/gasclaw# Port-forward the OpenClaw gateway
kubectl port-forward svc/gasclaw 18789:18789
# Health check
curl http://localhost:18789/healthOnce healthy, send a message to your Telegram bot — it should respond.
| Resource | Kind | Purpose |
|---|---|---|
gasclaw |
StatefulSet (1 replica) | Runs the container |
gasclaw |
Service (ClusterIP) | Exposes gateway port 18789 |
gasclaw |
ConfigMap | Non-secret env vars (agent count, intervals, ports) |
gasclaw |
Secret | API keys + tokens (conditional) |
gasclaw |
ServiceAccount | Pod identity |
workspace |
PVC (20Gi) | Agent workspace, logs, Gastown HQ state |
project |
PVC (10Gi) | The git repo agents work on |
Home directories (/root/.openclaw, .dolt, .gasclaw, .claude-config, .kimi-accounts) use emptyDir by default — bootstrap regenerates them on start.
All values are in deploy/helm/gasclaw/values.yaml. Highlights:
| Value | Default | Description |
|---|---|---|
image.repository |
thanakijwanavit/gasclaw |
Docker Hub image (amd64 + arm64) |
config.gtAgentCount |
"6" |
Number of Gastown crew workers |
config.monitorInterval |
"300" |
Health check interval (seconds) |
config.activityDeadline |
"3600" |
Max seconds between commits |
persistence.workspace.size |
20Gi |
Workspace PVC size |
persistence.project.size |
10Gi |
Project PVC size |
probes.startup.failureThreshold |
27 |
~5 min startup budget |
helm upgrade gasclaw deploy/helm/gasclaw/ \
--set secret.existingSecret=gasclaw-secretsConfigMap changes trigger a pod restart automatically (via checksum annotation).
helm uninstall gasclaw
# PVCs are retained by default — delete manually if needed:
kubectl delete pvc workspace-gasclaw-0 project-gasclaw-0Pod stuck in CrashLoopBackOff:
kubectl logs gasclaw-0 --previous # check the last crashUsually a missing or invalid secret. Verify your keys are set.
Pod stuck in not-ready: The startup probe allows 5 minutes. If it's still not ready, check logs — bootstrap likely failed at a specific step.
Storage class issues:
# List available storage classes
kubectl get sc
# Use a specific one
helm install gasclaw deploy/helm/gasclaw/ \
--set secret.existingSecret=gasclaw-secrets \
--set persistence.workspace.storageClass=gp3 \
--set persistence.project.storageClass=gp3