feat(charts): add openab-line Helm chart#1105
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- deployment: data volume unconditional (PVC or emptyDir) so readOnlyRootFilesystem containers always have a writable HOME; iterate agent.env with keys|sortAlpha for deterministic manifest output - configmap: use kindIs "invalid" for null checks on allowAllUsers/allowAllChannels - values: expose gateway.tag with compatibility warning; clarify cloudflare-tunnel-token is required (not optional) when tunnel.enabled=true; add allowAllUsers/allowAllChannels null defaults with resolve_allow_all semantics - NOTES.txt: Deployment (not Pod), expose options cover Ingress/LB/NodePort - README: expand values table to 36 rows covering all user-facing keys
- F1: Remove --token flag from cloudflared args; use TUNNEL_TOKEN env var only (avoids token exposure in procfs/kubectl describe) - F2: Add liveness/readiness probes to gateway container (/healthz) - F3: Add | default false guard for reactions fields in configmap - F4: Add per-container resources blocks for gateway and cloudflared - F5: Harden tunnelEnabled helper with explicit nil/type checks
|
Gateway v0.5.3 exposes GET /health, not /healthz. Aligns with charts/openab gateway deployment template.
|
LGTM ✅ — All findings addressed. Chart is production-ready. What This PR DoesAdds How It WorksSingle-pod architecture: agent ↔ gateway communicate via Findings
All findings resolved. CI green (helm-unittest + check pass on Baseline Check
What's Good (🟢)
Follow-up Suggestions (non-blocking)
Review coverage: Architecture ✅ | Correctness ✅ | Security/CI ✅ | Spec Verification ✅ | Docs/UX pending (no blockers expected) |
What problem does this solve?
There is no official Helm chart for deploying OpenAB as a LINE Messaging API bot. Users who want to self-host a LINE bot have to manually compose Kubernetes manifests, wire up a gateway sidecar, and configure Cloudflare Tunnel — a significant barrier to adoption.
This PR adds
charts/openab-line, a batteries-included Helm chart that deploys the OpenAB agent + gateway as a single unit with onehelm install.Discord Discussion URL: https://discord.com/channels/1491295327620169908/1511661981508305027/1512121004720394261
At a Glance
Why sidecar (not separate Deployment)?
Gateway stores media files at
$HOME/.openab/media/inbound/and passes the file path over the internal WebSocket. The agent reads the file and base64-encodes it before sending to the LLM. This requires gateway and agent to share the same filesystem — i.e. the same Pod. A separate-Deployment approach would break image delivery.Prior Art & Industry Research
OpenClaw:
OpenClaw uses a similar gateway-sidecar pattern for platform adapters. Platform-specific adapters run in the same process/container as the core agent, sharing memory for media payloads. See: https://github.com/openclaw/openclaw
Hermes Agent:
Hermes Agent handles multi-platform messaging but delivers all media as base64 inline in the message event — no local file storage. This avoids the filesystem-sharing constraint but increases WebSocket payload size significantly for images. See: https://github.com/NousResearch/hermes-agent
Key design difference from both:
OpenAB's gateway deliberately uses local file storage + path passing to keep the WebSocket protocol lean. This makes the sidecar colocation requirement explicit (as documented in
gateway/src/store.rs).Proposed Solution
A new Helm chart
charts/openab-linethat:openab(agent),gateway(LINE adapter),cloudflared(Tunnel, optional)datavolume (PVC oremptyDir) is always mounted to bothopenabandgatewaycontainers, ensuring a writable$HOMEeven withreadOnlyRootFilesystem: trueagent.enviterates withkeys | sortAlphafor deterministic ConfigMap output (GitOps-safe)kindIs "invalid"for null-checks onplatform.allowAllUsers/platform.allowAllChannels(avoids nil-pointer panic fromeq ... nil)gateway.tagexposed invalues.yamlwith a warning comment — gateway versions independently from the agentexistingSecretWhy this approach?
Sidecar vs separate Deployment: The shared-filesystem requirement for media delivery makes sidecar the only viable option without introducing a ReadWriteMany PVC (which adds significant operational complexity). Verified experimentally — switching to separate Deployment causes
gateway → line (reply API)to succeed but the agent replies "no content received" becausetokio::fs::read(path)fails on a path that only exists on the gateway pod.Cloudflare Tunnel as the exposure default: LINE requires a public HTTPS webhook with a valid TLS certificate. Cloudflare Tunnel satisfies this without requiring an Ingress controller or public LoadBalancer IP, matching the pattern used in
charts/openab-telegram.Known limitations:
add_reaction/remove_reactioncommands are not supported by LINE Messaging API and are silently ignored by the gateway (logged at INFO).Alternatives Considered
Extend
charts/openab(base chart) — the base chart supportsgateway.deploy: truewith a separate Deployment. This works for text but breaks image delivery due to filesystem isolation. Rejected.Inline base64 in gateway WebSocket message — would remove the filesystem dependency. Rejected because it significantly increases WebSocket payload size for images and would require changes to the core gateway protocol, which is out of scope for a chart PR.
ReadWriteMany PVC shared between gateway and agent Deployments — technically feasible but requires NFS/CephFS/EFS storage class, which is not available in most default Kubernetes clusters. Rejected.
Validation
helm lint charts/openab-linepasses (0 chart(s) failed)helm templaterenders correctly (verified deterministic output withsortAlpha)/home/node/.openab/media/inbound/) → agent (read + base64 → LLM) → reply describing image content ✅readOnlyRootFilesystem: true: containers start without crash ✅