Z2M cutover fix: remove permit_join (invalid in 2.x), replicas 1 #368

Merged
k.renner merged 1 commits from claude-bot/zha-to-zigbee2mqtt into master 2026-07-23 11:04:01 +00:00
Member

Live-cutover fix — the previous config makes Z2M refuse to start.

Problem found during cutover

Z2M 2.12 rejected the seeded configuration.yaml as invalid → served its failure page instead of starting. Root cause: the top-level permit_join key was removed in Z2M 2.0; a config containing it fails schema validation. (Verified homeassistant.enabled, frontend.enabled, mqtt.* against current docs — those were already correct.)

Changes

  1. Remove permit_join: false from the ConfigMap. Joining is runtime-only in 2.x (default off; toggled via frontend / bridge/request/permit_join) — which is what we want.
  2. replicas: 0 → 1. The cutover is committed: ZHA is disabled, the zigbee2mqtt-coordinator-backup Secret is populated in OpenBao, Z2M is now the live Zigbee stack. Flux owns replicas, so it must be 1 in git (a manual kubectl scale is reverted on reconcile). Rollback = set 0 + re-enable ZHA.

Cutover state at time of this PR

  • ✅ OpenBao holds the Open Coordinator Backup (pan_id 0x8b2b, 15 devices)
  • ✅ zigbee2mqtt-coordinator-backup ExternalSecret SecretSynced
  • ✅ ZHA config entry disabled (disabled_by=user, coordinator socket free)
  • ⏳ Z2M waiting on this fix to start and restore the network

Immediate post-merge step (I'll do it): the PVC still has the pre-fix seeded configuration.yaml; since the init container only seeds when absent, I'll clear that stale file once and restart the pod so it re-seeds from this fixed ConfigMap, then verify the network restore.

🤖 Generated with Claude Code

Live-cutover fix — the previous config makes Z2M **refuse to start**. ## Problem found during cutover Z2M 2.12 rejected the seeded `configuration.yaml` as invalid → served its failure page instead of starting. Root cause: the top-level **`permit_join`** key was **removed in Z2M 2.0**; a config containing it fails schema validation. (Verified `homeassistant.enabled`, `frontend.enabled`, `mqtt.*` against current docs — those were already correct.) ## Changes 1. **Remove `permit_join: false`** from the ConfigMap. Joining is runtime-only in 2.x (default off; toggled via frontend / `bridge/request/permit_join`) — which is what we want. 2. **`replicas: 0 → 1`.** The cutover is committed: ZHA is disabled, the `zigbee2mqtt-coordinator-backup` Secret is populated in OpenBao, Z2M is now the live Zigbee stack. Flux owns `replicas`, so it must be `1` in git (a manual `kubectl scale` is reverted on reconcile). Rollback = set `0` + re-enable ZHA. ## Cutover state at time of this PR - ✅ OpenBao holds the Open Coordinator Backup (`pan_id 0x8b2b`, 15 devices) - ✅ `zigbee2mqtt-coordinator-backup` ExternalSecret `SecretSynced` - ✅ ZHA config entry disabled (`disabled_by=user`, coordinator socket free) - ⏳ Z2M waiting on this fix to start and restore the network **Immediate post-merge step (I'll do it):** the PVC still has the pre-fix seeded `configuration.yaml`; since the init container only seeds when absent, I'll clear that stale file once and restart the pod so it re-seeds from this fixed ConfigMap, then verify the network restore. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude-bot added 1 commit 2026-07-23 11:02:24 +00:00
Live cutover fix. Two changes:

1. Remove the top-level `permit_join: false` from the Z2M config. It was
   REMOVED in Zigbee2MQTT 2.0 — a config containing it fails schema validation
   and Z2M refuses to start (serves the failure page). Joining is runtime-only
   now (default off; toggled via frontend or the bridge/request/permit_join
   topic), which is what we want anyway. Verified the other 2.x-sensitive keys
   (homeassistant.enabled, frontend.enabled, mqtt.*) against the current docs —
   they were already correct.

2. Flip replicas 0 -> 1. The cutover is committed: ZHA is disabled, the
   coordinator-backup Secret is populated in OpenBao, and Z2M is now the live
   Zigbee stack. Flux owns this field, so it must be 1 in git (a manual
   `kubectl scale` gets reverted on the next reconcile). Rollback = set 0 and
   re-enable ZHA.

Note: the running PVC still holds the pre-fix seeded configuration.yaml; the
init container only seeds when absent, so after merge that stale file must be
cleared once (delete it + restart the pod) so it re-seeds from this fixed
ConfigMap. Tracked as the immediate post-merge step.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
k.renner merged commit be30af53d0 into master 2026-07-23 11:04:01 +00:00
Sign in to join this conversation.