Compare commits

...

2 Commits

Author SHA1 Message Date
david 97c30acfdd deploy: device port fix, entrypoint CMD, mosquitto healthcheck 2026-07-11 04:37:06 -07:00
david ba3e172dda fix: power outage auto-recovery improvements
Mosquitto:
- Change restart: always (was unless-stopped) to survive daemon restarts
- Add healthcheck (pub/sub ping) for depends_on conditions
- All downstream services use condition: service_healthy

Party-lock:
- Add MQTT connection retry loop (was crashing on DNS race after restart)

Zigbee2mqtt:
- Add entrypoint wrapper that auto-applies BLZ bridge patch at startup
- Bridge patch no longer needs manual 'just z2m-patch-bridge' after image pulls

Mopidy:
- Add python3-gi + python3-gi-cairo via apt (fixes 'No module named gi')
- Set PYTHONPATH to expose system gi module to Python 3.12
2026-07-09 18:56:36 -07:00
4 changed files with 40 additions and 7 deletions
+18 -5
View File
@@ -2,7 +2,7 @@ services:
mosquitto:
image: eclipse-mosquitto:latest
container_name: mosquitto
restart: unless-stopped
restart: always
user: "1883:1883"
ports:
- "1883:1883"
@@ -10,6 +10,12 @@ services:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
- ./mosquitto/log:/mosquitto/log
healthcheck:
test: ["CMD", "mosquitto_pub", "-p", "1883", "-t", "healthcheck", "-m", "ok", "-r", "--quiet"]
interval: 30s
timeout: 5s
retries: 3
start_period: 30s
zigbee2mqtt:
image: ghcr.io/pine64/zigbee2mqtt:latest-dev # BLZ fork, NOT koenkk
@@ -22,7 +28,11 @@ services:
volumes:
- ./zigbee2mqtt:/app/data
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
- source: /dev/serial/by-path/platform-3f980000.usb-usb-0:1.1.2:1.0-port0
target: /dev/ttyUSB0
permissions: rw
entrypoint: ["/app/data/scripts/entrypoint.sh"]
command: ["/sbin/tini", "--", "node", "index.js"]
environment:
TZ: America/Los_Angeles
@@ -43,7 +53,8 @@ services:
container_name: nodered
restart: unless-stopped
depends_on:
- mosquitto
mosquitto:
condition: service_healthy
user: "1000:1000"
ports:
- "1880:1880"
@@ -65,7 +76,8 @@ services:
container_name: doorbell-listener
restart: unless-stopped
depends_on:
- mosquitto
mosquitto:
condition: service_healthy
volumes:
- ./doorbell-listener/state:/data/doorbell-listener
environment:
@@ -146,7 +158,8 @@ services:
container_name: party-lock
restart: unless-stopped
depends_on:
- mosquitto
mosquitto:
condition: service_healthy
volumes:
- ./mosquitto/config:/mosquitto/config
- /var/run/docker.sock:/var/run/docker.sock
+9 -1
View File
@@ -14,12 +14,20 @@ RUN apt-get update \
libpango-1.0-0 \
libpangoft2-1.0-0 \
libgirepository-1.0-1 \
libgirepository1.0-dev \
gir1.2-glib-2.0 \
gir1.2-gstreamer-1.0 \
gir1.2-gst-plugins-base-1.0 \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
python3-gi \
python3-gi-cairo \
&& rm -rf /var/lib/apt/lists/*
# Expose the system Python's gi module to Python 3.12 (/usr/local).
ENV PYTHONPATH=/usr/lib/python3/dist-packages:${PYTHONPATH}
RUN pip install --no-cache-dir \
"setuptools<80" \
Mopidy==3.4.2 \
+7 -1
View File
@@ -51,7 +51,13 @@ def main():
rebuild_acl()
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.on_message = on_message
client.connect(MQTT_HOST, MQTT_PORT, 60)
while True:
try:
client.connect(MQTT_HOST, MQTT_PORT, 60)
break
except Exception as e:
print(f"mqtt connect failed: {e}; retrying in 5s", flush=True)
time.sleep(5)
client.subscribe("party-lock/set", qos=1)
client.loop_forever()
+6
View File
@@ -0,0 +1,6 @@
#!/bin/sh
set -e
cd /app && node /app/data/scripts/blz-bridge-patch.js
exec docker-entrypoint.sh "$@"