Initial: RPi Docker Compose stack

- Mosquitto MQTT broker
- Zigbee2MQTT with BLZ dongle (ThirdReality, BL702, Pine64 fork)
- Node-RED 5.0 with dashboard
- justfile for remote management
This commit is contained in:
2026-06-30 19:17:18 -07:00
commit 3674dd747e
6 changed files with 216 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
services:
mosquitto:
image: eclipse-mosquitto:latest
container_name: mosquitto
restart: unless-stopped
user: "1883:1883"
ports:
- "1883:1883"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
zigbee2mqtt:
image: ghcr.io/pine64/zigbee2mqtt:latest-dev # BLZ fork, NOT koenkk
container_name: zigbee2mqtt
restart: unless-stopped
depends_on:
- mosquitto
ports:
- "8080:8080"
volumes:
- ./zigbee2mqtt:/app/data
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
environment:
TZ: America/Los_Angeles
# govee2mqtt:
# image: ghcr.io/wez/govee2mqtt:latest
# container_name: govee2mqtt
# restart: unless-stopped
# network_mode: host
# environment:
# GOVEE_EMAIL: your@email.com
# GOVEE_PASSWORD: yourpassword
# GOVEE_API_KEY: your-api-key
# MQTT_HOST: 127.0.0.1
# TZ: America/Los_Angeles
#
nodered:
image: nodered/node-red:latest
container_name: nodered
restart: unless-stopped
depends_on:
- mosquitto
user: "1000:1000"
ports:
- "1880:1880"
volumes:
- ./nodered:/data
environment:
TZ: America/Los_Angeles
+106
View File
@@ -0,0 +1,106 @@
# rpi-zigbee-stack — Docker Compose stack management for RPi 3B+
set export
RPI := "root@192.168.9.147"
COMPOSE := "/root/compose.yaml"
# Default: show stack status
default:
ssh {{RPI}} "docker compose -f {{COMPOSE}} ps"
# ---- Service management ----
# Start all services
up:
ssh {{RPI}} "docker compose -f {{COMPOSE}} up -d"
# Stop all services
down:
ssh {{RPI}} "docker compose -f {{COMPOSE}} down"
# Restart all services
restart:
ssh {{RPI}} "docker compose -f {{COMPOSE}} restart"
# Restart a specific service
restart-svc SERVICE:
ssh {{RPI}} "docker compose -f {{COMPOSE}} restart {{SERVICE}}"
# Pull latest images
pull:
ssh {{RPI}} "docker compose -f {{COMPOSE}} pull"
# ---- Logs ----
# Tail all logs
logs:
ssh {{RPI}} "docker compose -f {{COMPOSE}} logs --tail 50"
# Follow all logs
logs-follow:
ssh {{RPI}} "docker compose -f {{COMPOSE}} logs -f"
# Logs for a specific service
logs-svc SERVICE:
ssh {{RPI}} "docker compose -f {{COMPOSE}} logs --tail 50 {{SERVICE}}"
# ---- Zigbee ----
# Show zigbee2mqtt status
zb-status:
ssh {{RPI}} "docker logs zigbee2mqtt --tail 10 2>&1"
# Permit zigbee joining for 60 seconds
zb-permit:
ssh {{RPI}} "docker exec mosquitto mosquitto_pub -t zigbee2mqtt/bridge/request/permit_join -m '{\"value\":true,\"time\":60}'"
# Disable zigbee joining
zb-deny:
ssh {{RPI}} "docker exec mosquitto mosquitto_pub -t zigbee2mqtt/bridge/request/permit_join -m '{\"value\":false}'"
# List zigbee devices
zb-devices:
ssh {{RPI}} "docker exec mosquitto mosquitto_pub -t zigbee2mqtt/bridge/request/devices -m ''"
# ---- Node-RED ----
# Open Node-RED editor
nr-editor:
xdg-open http://192.168.9.147:1880 2>/dev/null || open http://192.168.9.147:1880 2>/dev/null
# Open Node-RED dashboard
nr-dashboard:
xdg-open http://192.168.9.147:1880/ui 2>/dev/null || open http://192.168.9.147:1880/ui 2>/dev/null
# ---- Maintenance ----
# Sync compose.yaml and configs to RPi
sync:
scp compose.yaml {{RPI}}:/root/compose.yaml
scp mosquitto.conf {{RPI}}:/root/mosquitto/config/mosquitto.conf
scp zigbee2mqtt.yaml {{RPI}}:/root/zigbee2mqtt/configuration.yaml
@echo "Configs synced to RPi. Run 'just restart' to apply."
# Full redeploy: sync configs + restart
redeploy: sync restart
# Show disk usage on RPi
df:
ssh {{RPI}} "df -h / /var/lib/docker"
# Show Docker disk usage
docker-df:
ssh {{RPI}} "docker system df"
# Prune unused Docker images/volumes
prune:
ssh {{RPI}} "docker system prune -f"
# ---- Snapshots ----
# Backup current RPi configs to local repo
backup:
ssh {{RPI}} "cat /root/compose.yaml" > compose.yaml
ssh {{RPI}} "cat /root/mosquitto/config/mosquitto.conf" > mosquitto.conf
ssh {{RPI}} "cat /root/zigbee2mqtt/configuration.yaml" > zigbee2mqtt.yaml
@echo "Backed up. Run git diff to see changes."
+6
View File
@@ -0,0 +1,6 @@
listener 1883
allow_anonymous true
persistence true
persistence_location /mosquitto/data
log_dest file /mosquitto/log/mosquitto.log
+6
View File
@@ -0,0 +1,6 @@
{
"name": "node-red-project",
"description": "A Node-RED Project",
"version": "0.0.1",
"private": true
}
+30
View File
@@ -0,0 +1,30 @@
/**
* This is the default settings file provided by Node-RED.
*
* It can contain any valid JavaScript code that will get run when Node-RED
* is started.
*
* Lines that start with // are commented out.
* Each entry should be separated from the entries above and below by a comma ','
*
* For more information about individual settings, refer to the documentation:
* https://nodered.org/docs/user-guide/runtime/configuration
*
* The settings are split into the following sections:
* - Flow File and User Directory Settings
* - Security
* - Server Settings
* - Runtime Settings
* - Editor Settings
* - Node Settings
*
**/
module.exports = {
/*******************************************************************************
* Flow File and User Directory Settings
* - flowFile
* - credentialSecret
* - flowFilePretty
* - userDir
+15
View File
@@ -0,0 +1,15 @@
version: 5
mqtt:
base_topic: zigbee2mqtt
server: mqtt://mosquitto:1883
serial:
port: /dev/ttyUSB0
adapter: blz
baudrate: 2000000
rtscts: false
advanced:
log_level: debug
frontend:
enabled: true
port: 8080
permit_join: true