feat: add openab-feishu chart#883
Conversation
…ault) Single-pod Helm chart for Feishu/Lark deployments: - OAB agent and gateway as colocated containers - WebSocket mode (default): outbound-only, no public endpoint needed - Optional webhook mode with cloudflared sidecar - Supports both Feishu (feishu.cn) and Lark (larksuite.com) - Only 2 required --set flags: feishu.appId, feishu.appSecret - existingSecret support for production credential management - Security contexts: non-root, read-only rootfs, drop all caps
OpenAB PR ScreeningThis is auto-generated by the OpenAB project-screening flow for context collection and reviewer handoff.
Screening reportscreened PR #883 and moved the project item to `PR-Screening`.GitHub comment: #883 (comment) IntentAdd a standalone FeatFeature / release packaging. This PR adds a new Helm chart with values, Secret handling, ConfigMap rendering, Deployment, PVC, install notes, and README docs for Feishu/Lark deployments. Default behavior is two containers ( Who It ServesPrimarily deployers and agent runtime operators who want to run OpenAB on Feishu or Lark. Secondarily Feishu/Lark users, because a lower-friction install path makes that adapter easier to adopt and support. Rewritten PromptImplement a standalone Helm chart at Merge PitchThis is worth advancing because it extends OpenAB platform coverage with a deployment path that is materially simpler than webhook-based adapters. The risk profile is moderate but bounded: it is a new chart tree, not a core runtime change. Likely reviewer concerns are chart duplication with Best-Practice ComparisonOpenClaw and Hermes Agent mostly do not apply directly here because this PR is deployment packaging, not scheduling, durable job execution, retry routing, or session orchestration. The relevant overlap is operational clarity: OpenClaw favors explicit delivery routing and run visibility, while Hermes favors self-contained prompts/state. This chart partially aligns by making Feishu vs Lark routing explicit via Implementation Options
Comparison Table
RecommendationTake the balanced path. Advance this to review, verify the rendered manifests against both WebSocket and webhook modes, and ask reviewers to focus on Secret behavior, image tags, PVC retention, security contexts, and drift from |
This comment has been minimized.
This comment has been minimized.
Six issues fixed across deployment.yaml, configmap.yaml, and pvc.yaml: F1 (🔴) existingSecret + webhook mode silently dropped env vars: FEISHU_VERIFICATION_TOKEN and FEISHU_ENCRYPT_KEY secretKeyRefs are now rendered whenever connectionMode=webhook (not only when values are non-empty). Added optional: true so pods start even if those keys are absent from the secret (both are optional security hardening). F2 (🟡) Boolean default trap in reactions config: Removed `| default true/false` pipes from configmap.yaml. Defaults are declared in values.yaml; the pipes caused `false` to be treated as empty and substituted with `true`, making reactions un-disableable. BUG1 (🔴) tunnel.enabled=true without token caused silent CrashLoop: Added a `fail` guard that aborts helm template/install with a clear error message when the tunnel is enabled but no token is provided and no existingSecret is set. BUG2 (🟡) storageClass: "-" rendered as literal "-" storageClassName: Applied the standard Helm convention: "-" is mapped to storageClassName: "" (static PV / empty class), any other non-empty value is passed through as-is. BUG3 (🟡) checksum/secret annotation had wrong semantics in existingSecret mode: When existingSecret is set, secret.yaml renders empty and the checksum was a constant — external secret rotations would not trigger a rolling restart. Annotation is now skipped when existingSecret is set. BUG4 (🟡) TOML env map rendered in non-deterministic order: Replaced manual $first-flag iteration with `keys | sortAlpha` + index lookup. Env keys now render alphabetically, eliminating spurious checksum/config diffs in GitOps pipelines.
|
Thanks for the thorough review! All findings addressed in de5bc86. Changes Made🔴 F1 — existingSecret + webhook mode silently dropped verification/encrypt env vars
🟡 F2 — Boolean default trap in reactions configRemoved 🔴 BUG1 —
|
Helm cannot track changes to externally-managed Secrets, so rotating credentials does not automatically trigger a Pod rollout when existingSecret is set. Added a comment in values.yaml explaining this limitation and pointing to Reloader as the recommended solution.
|
One follow-up on BUG3 (94e1bc8): the fix in de5bc86 removed the misleading annotation — a constant hash that falsely implied secret changes would trigger rollouts. That part is resolved. However, the underlying goal of «external secret rotation automatically triggers a Pod rollout» is not achievable at the Helm chart layer: Helm cannot read external Secret contents at render time, so there is no value to checksum. The correct closure here is documentation. 94e1bc8 adds a comment to `existingSecret` in `values.yaml` that explicitly states: credential rotation will not trigger a rollout automatically, and users who need that behaviour should use Reloader with `reloader.stakater.com/auto: "true"` on the Deployment. |
This comment has been minimized.
This comment has been minimized.
|
LGTM ✅ — All previous findings resolved. Feishu chart is production-ready. What This PR DoesAdds How It Works
Findings
Previous Findings — Resolution Status
Baseline Check
What's Good (🟢)
Reviewed by: 超渡法師 · 覺渡法師 |
Summary
Adds
charts/openab-feishu/— a standalone Helm chart that deploys OAB + Gateway in a single pod for Feishu (飛書) and Lark, following the same pattern asopenab-telegram(#873).Install
Only 2 required flags. Everything else has sane defaults.
Credential Management
Three options from simplest to most secure:
--set feishu.appId=X --set feishu.appSecret=Yhelm get valueskubectl create secret --from-literal+--set existingSecret=namekubectl create secret --from-env-file=<(aws sm ...)+--set existingSecret=nameRelease Channel
channelstable(default)ghcr.io/openabdev/openab:stablev0.5.1(pinned)betaghcr.io/openabdev/openab:betav0.5.1(pinned)Gateway is pinned independently since it has its own release cadence (
gateway-v*tags).Key Differences from openab-telegram
feishu(China) /lark(overseas)What it does
openab(agent) +gateway(Feishu adapter)feishu.domainexistingSecretsupport — reference a pre-created K8s Secret, chart skips Secret creationDesign Decision
Default WebSocket mode — the gateway connects outbound to Feishu, eliminating the need for a public endpoint, Cloudflare account, or tunnel configuration. This makes the Feishu chart the simplest platform chart (fewer containers, fewer dependencies).
This is a standalone chart (not a subchart wrapper) for the same reasons as openab-telegram:
Tested
helm lint✅helm template(WebSocket mode, 2 containers) ✅helm template(webhook mode, 3 containers with cloudflared) ✅existingSecretmode (skips Secret, references external) ✅stable/beta) resolves correct tags ✅Discord Discussion URL: https://discord.com/channels/1491295327620169908/1500160821567684660