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
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.
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)
⏳ 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.
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)
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>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Live-cutover fix — the previous config makes Z2M refuse to start.
Problem found during cutover
Z2M 2.12 rejected the seeded
configuration.yamlas invalid → served its failure page instead of starting. Root cause: the top-levelpermit_joinkey was removed in Z2M 2.0; a config containing it fails schema validation. (Verifiedhomeassistant.enabled,frontend.enabled,mqtt.*against current docs — those were already correct.)Changes
permit_join: falsefrom the ConfigMap. Joining is runtime-only in 2.x (default off; toggled via frontend /bridge/request/permit_join) — which is what we want.replicas: 0 → 1. The cutover is committed: ZHA is disabled, thezigbee2mqtt-coordinator-backupSecret is populated in OpenBao, Z2M is now the live Zigbee stack. Flux ownsreplicas, so it must be1in git (a manualkubectl scaleis reverted on reconcile). Rollback = set0+ re-enable ZHA.Cutover state at time of this PR
pan_id 0x8b2b, 15 devices)zigbee2mqtt-coordinator-backupExternalSecretSecretSynceddisabled_by=user, coordinator socket free)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