ZeroClaw is a Rust single-binary
agent runtime (OpenAI / Anthropic / OpenRouter / Ollama compatible). Its HTTP
client honors HTTP(S)_PROXY and SSL_CERT_FILE natively — no Node workaround.
From the repo root:
OUT_DIR=deploy/compose/certs ./scripts/gen-certs.shdocker compose -f deploy/compose/docker-compose.zeroclaw.yml upWarden is pulled from Docker Hub (
ethosagent/warden) — no local build. Override the version withWARDEN_VERSION(default0.2.1):WARDEN_VERSION=0.2.0 docker compose -f deploy/compose/docker-compose.zeroclaw.yml up
- ZeroClaw gateway: http://localhost:42617
- Warden dashboard: http://localhost:9090/dashboard/ (+
/metrics)
ZeroClaw is on an internal: true network; its only route out is Warden. The
gateway is reachable via a socat forwarder, not a direct port on ZeroClaw.
ARM64: if the distroless image exits immediately, switch the
zeroclawservice toimage: ghcr.io/zeroclaw-labs/zeroclaw:debian.
# Through Warden — succeeds, and shows in the dashboard:
docker compose -f deploy/compose/docker-compose.zeroclaw.yml \
exec zeroclaw sh -c 'curl -sS --max-time 10 https://example.com -o /dev/null -w "via proxy: %{http_code}\n"'
# Bypassing the proxy — FAILS (no direct route out):
docker compose -f deploy/compose/docker-compose.zeroclaw.yml \
exec zeroclaw sh -c 'curl -sS --noproxy "*" --max-time 5 https://example.com' ; echo "exit: $?"(Distroless image has no shell — use the :debian variant for the exec test, or
just read the dashboard's Traffic view.)
The compose hands ZeroClaw a placeholder API key
(openrouter_secret_001), never a real one. Warden swaps it at the edge. Keep
real keys in Warden's environment only.
configs/config.recipe.yaml ships allow-all for first-run visibility. Once you
see ZeroClaw's real traffic in the dashboard, replace the ~.* catch-all with the
hosts it actually needs and add secrets: placeholder→envVar mappings. See
docs/docker-end-to-end.md.