Zigbee2MQTT — bridges your Zigbee devices to MQTT using a USB Zigbee coordinator, freeing them from vendor hubs and clouds. Exposes a web frontend and integrates with Home Assistant. Deployed as a host-networked Nomad service with a passed-through serial device and a persistent data volume.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 15.7k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "zigbee2mqtt"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Zigbee2MQTT container image. Pin a tag in production.
image = "ghcr.io/koenkk/zigbee2mqtt:latest"
# Host port for the web frontend (ZIGBEE2MQTT_CONFIG_FRONTEND_PORT).
port = 8124
# Host path to your Zigbee USB coordinator, passed into the container. Prefer a stable /dev/serial/by-id/... path.
serial_device = "/dev/ttyACM0"
# MQTT broker URL (ZIGBEE2MQTT_CONFIG_MQTT_SERVER). Point at the mosquitto pack on this node.
mqtt_server = "mqtt://127.0.0.1:1883"
# Named volume for Zigbee2MQTT data (/app/data): config, database, and the network state.
data_volume = "zigbee2mqtt_data"
# Placement constraints. Pin to the node with the Zigbee adapter and the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the Zigbee2MQTT task.
resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "zigbee2mqtt" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "ghcr.io/koenkk/zigbee2mqtt:latest" | The Zigbee2MQTT container image. Pin a tag in production. |
| port | number | 8124 | Host port for the web frontend (ZIGBEE2MQTT_CONFIG_FRONTEND_PORT). |
| serial_device | string | "/dev/ttyACM0" | Host path to your Zigbee USB coordinator, passed into the container. Prefer a stable /dev/serial/by-id/... path. |
| mqtt_server | string | "mqtt://127.0.0.1:1883" | MQTT broker URL (ZIGBEE2MQTT_CONFIG_MQTT_SERVER). Point at the mosquitto pack on this node. |
| data_volume | string | "zigbee2mqtt_data" | Named volume for Zigbee2MQTT data (/app/data): config, database, and the network state. |
| constraints | list | [] | Placement constraints. Pin to the node with the Zigbee adapter and the volume. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 300
memory = 256
} | Resources for the Zigbee2MQTT task. |
No variables match.
This pack stores data in one Docker named volume:
zigbee2mqtt_data
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/zigbee2mqtt_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/zigbee2mqtt_data/_data backup:<bucket>/zigbee2mqtt_data
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
Zigbee2MQTT — bridges your Zigbee devices to MQTT using a USB Zigbee coordinator, freeing them from vendor hubs and clouds. Supports 3000+ devices, a web frontend for pairing and control, and seamless Home Assistant integration.
Single host-networked Nomad service with a passed-through serial device and a persistent data volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run zigbee2mqtt --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
8124 |
Web frontend port (ZIGBEE2MQTT_CONFIG_FRONTEND_PORT). |
serial_device |
/dev/ttyACM0 |
Host path to your Zigbee USB coordinator. Prefer a /dev/serial/by-id/… path. |
mqtt_server |
mqtt://127.0.0.1:1883 |
MQTT broker URL (ZIGBEE2MQTT_CONFIG_MQTT_SERVER). |
data_volume |
zigbee2mqtt_data |
/app/data — config, database, network state. |
image |
ghcr.io/koenkk/zigbee2mqtt:latest |
Container image. Pin a tag in production. |
resources |
{ cpu = 300, memory = 256 } |
Task resources. |
Requirements: a Zigbee USB coordinator plugged into the node (the pack passes serial_device into the
container — pin the job to that node with constraints), and an MQTT broker (deploy the mosquitto pack
first). Open the frontend, temporarily enable "permit join" to pair devices, then point home-assistant at the
same broker. Back up the data volume — losing it means re-pairing every device. Front the UI with a reverse
proxy for TLS.