feat(gateway): add /startupz startup probe and fix deployment template admission (#122477)

* feat(gateway): add /startupz startup probe with auth-gated version detail

Startup/traffic-admission probe that excludes downstream channel health:
200 started once startup work completes and the gateway is not draining,
503 starting/draining otherwise. Version and uptime are only included for
local-direct or authenticated callers, reusing the /readyz detail gate.

* fix(deploy): use /startupz for traffic admission in bundled templates

fly.toml gains its missing HTTP check; render.yaml stops using pure
liveness as admission; k8s pins an immutable image tag, seeds config
only when missing, and adds a startupProbe; stale Fly healthcheck-port
doc corrected (healthcheck follows the active gateway lock port since
bc4221a07e).

* docs(k8s): make persistent-file config ownership explicit with reseed path
This commit is contained in:
Peter Steinberger
2026-08-11 23:36:33 -07:00
committed by GitHub
parent 0b4701677b
commit 8190c326ce
16 changed files with 401 additions and 64 deletions
+17 -4
View File
@@ -29,9 +29,12 @@ spec:
- sh
- -c
- |
cp /config/openclaw.json /home/node/.openclaw/openclaw.json
# Seed-if-missing: the PVC copy owns config after first boot so edits made
# through OpenClaw (onboard, channels add, doctor --fix, Control UI) survive
# restarts. ConfigMap edits need an explicit reseed (see docs/install/kubernetes.md).
[ -f /home/node/.openclaw/openclaw.json ] || cp /config/openclaw.json /home/node/.openclaw/openclaw.json
mkdir -p /home/node/.openclaw/workspace
cp /config/AGENTS.md /home/node/.openclaw/workspace/AGENTS.md
[ -f /home/node/.openclaw/workspace/AGENTS.md ] || cp /config/AGENTS.md /home/node/.openclaw/workspace/AGENTS.md
securityContext:
runAsUser: 1000
runAsGroup: 1000
@@ -49,7 +52,8 @@ spec:
mountPath: /config
containers:
- name: gateway
image: ghcr.io/openclaw/openclaw:slim
# Bump this immutable versioned tag when upgrading OpenClaw.
image: ghcr.io/openclaw/openclaw:2026.7.1-2-slim
imagePullPolicy: IfNotPresent
command:
- node
@@ -103,6 +107,15 @@ spec:
limits:
memory: 2Gi
cpu: "1"
startupProbe:
exec:
command:
- node
- -e
- "require('http').get('http://127.0.0.1:18789/startupz', r => process.exit(r.statusCode < 400 ? 0 : 1)).on('error', () => process.exit(1))"
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 30
livenessProbe:
exec:
command:
@@ -117,7 +130,7 @@ spec:
command:
- node
- -e
- "require('http').get('http://127.0.0.1:18789/readyz', r => process.exit(r.statusCode < 400 ? 0 : 1)).on('error', () => process.exit(1))"
- "require('http').get('http://127.0.0.1:18789/startupz', r => process.exit(r.statusCode < 400 ? 0 : 1)).on('error', () => process.exit(1))"
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5