homelab-codex-ws/kb/nodes/chelsty-infra.md
oskar 8a1abd5750 feat(kb): SPLIT chelsty-runtime -> node + runbook
kb/nodes/chelsty-infra.md — runtime layout, SLZB-06U, ograniczenia sieciowe,
  lokalizacja configu Z2M, chelsty-ha bez node-agenta, backup sets
kb/runbooks/chelsty-deploy-recovery.md — Deployment Flow + Recovery Procedures

Tresc sekcji nietknieta; kontrola multizbioru linii == oryginal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 16:58:46 +02:00

4.1 KiB

okf type visibility status updated links
0.1 node private active 2026-05-27
../runbooks/chelsty-deploy-recovery.md

CHELSTY Runtime

This document describes the runtime environment and deployment flow for CHELSTY, an offline-capable home automation edge node split across two VMs.

Node Role Services
chelsty-infra LTE edge hypervisor Mosquitto, Zigbee2MQTT, stability-agent, node-agent
chelsty-ha Home Assistant VM homeassistant (no node-agent — see below)

Both nodes share an LTE uplink and must function fully offline (Zigbee, MQTT, HA automations) without any connectivity to SATURN, VPS, or Forgejo.

Runtime Layout

/opt/homelab/
├── config/          # Service-specific configs and secrets (not in Git)
│   ├── mosquitto/
│   └── zigbee2mqtt/
├── data/            # Persistent service data
│   ├── mosquitto/   # Persistence DB, password file
│   └── zigbee2mqtt/
│       └── data/    # z2m config, coordinator backup, network key
└── logs/

SLZB-06U Integration

CHELSTY uses a SMLIGHT SLZB-06U Zigbee coordinator connected over Ethernet/TCP.

  • Coordinator IP: 192.168.1.105
  • Port: 6638
  • Adapter: ezsp (deprecated — migration to ember recommended, requires only changing adapter: ember in configuration.yaml)
  • Zigbee2MQTT config key: serial.port: tcp://192.168.1.105:6638

⚠️ Never use /dev/ttyUSB0 — the coordinator is always TCP-only on this site.

Networking Constraints

Mosquitto — network_mode: host

Mosquitto runs with network_mode: host so that all containers on the same host can reach it at localhost:1883. Do not change this.

Zigbee2MQTT — bridge network + extra_hosts

Zigbee2MQTT runs in a bridge-networked container (needed for port mapping compatibility with docker-compose v1). To reach the host-networked Mosquitto:

# hosts/chelsty-infra/runtime/zigbee2mqtt/docker-compose.override.yml
services:
  zigbee2mqtt:
    extra_hosts:
      - "mosquitto:host-gateway"

This maps the mosquitto hostname inside the z2m container to the Docker host gateway IP, so mqtt://mosquitto:1883 reaches the host-networked Mosquitto process.

Why not network_mode: host for z2m?
chelsty-infra runs docker-compose v1 (1.29.2). In v1, network_mode: host cannot coexist with ports: declared in the base docker-compose.yml — raises InvalidArgument. The extra_hosts approach avoids this.

Zigbee2MQTT Config Location

The configuration.yaml must be writable — z2m migrates and rewrites it on startup. It lives in the data directory:

/opt/homelab/data/zigbee2mqtt/data/configuration.yaml

This path is mounted read-write by the base docker-compose.yml:

volumes:
  - /opt/homelab/data/zigbee2mqtt/data:/app/data

Do not mount configuration.yaml as a separate :ro volume — z2m will fail with EROFS.

Minimal configuration.yaml

homeassistant: true
permit_join: false
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://mosquitto:1883
serial:
  port: tcp://192.168.1.105:6638
  adapter: ezsp
frontend:
  port: 8080
advanced:
  log_level: info

chelsty-ha — No node-agent

chelsty-ha does not have a node-agent deployed. Home Assistant is monitored indirectly: if MQTT goes silent on chelsty-infra, HA is likely down.

In hosts/chelsty-ha/services.yaml:

services:
  homeassistant:
    monitor: false   # No node-agent; suppresses supervisor action generation

Remove monitor: false once node-agent is bootstrapped on this VM.

Critical Backup Sets

Data Path
HA config + DB /opt/homelab/data/homeassistant/ on chelsty-ha
z2m config + coordinator backup + network key /opt/homelab/data/zigbee2mqtt/data/
Mosquitto persistence + password file /opt/homelab/data/mosquitto/
SLZB-06U coordinator state Backup via SLZB-06U web UI at 192.168.1.105

⚠️ The Zigbee network key is in configuration.yaml or coordinator_backup.json — losing it requires re-pairing all devices.