chore(k8s): migrate Zigbee2MQTT to helm in zigbee namespace
This commit is contained in:
parent
44508e865c
commit
b4cf4c0961
|
|
@ -826,3 +826,18 @@ An autonomous AI agent platform.
|
||||||
* **Encrypt**: Ensure the file is encrypted with `git crypt` before committing!
|
* **Encrypt**: Ensure the file is encrypted with `git crypt` before committing!
|
||||||
3. **Deploy**: `kubectl apply -f openclaw/openclaw.secret.yaml`
|
3. **Deploy**: `kubectl apply -f openclaw/openclaw.secret.yaml`
|
||||||
4. **Access**: `https://openclaw.haumdaucher.de` (Authentication required)
|
4. **Access**: `https://openclaw.haumdaucher.de` (Authentication required)
|
||||||
|
|
||||||
|
## Zigbee2MQTT
|
||||||
|
|
||||||
|
Zigbee2MQTT manages Zigbee devices via the SLZB-MR1U coordinator. It is deployed via the official Helm chart in the `zigbee` namespace.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add zigbee2mqtt https://charts.zigbee2mqtt.io
|
||||||
|
helm repo update
|
||||||
|
# Apply the secrets first for the Traefik basic auth middleware
|
||||||
|
kubectl apply -f zigbee/zigbee2mqtt.secret.yaml
|
||||||
|
# Install or upgrade the release
|
||||||
|
helm upgrade --install zigbee2mqtt zigbee2mqtt/zigbee2mqtt --create-namespace -n zigbee -f zigbee/zigbee2mqtt.secret.values.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
To modify configurations (like `devices`, `throttle`, or `mqtt`), edit `zigbee/zigbee2mqtt.secret.values.yaml` and re-run the `helm upgrade` command. The chart automatically handles merging these values into the persistent volume on startup.
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,206 +0,0 @@
|
||||||
apiVersion: v1
|
|
||||||
kind: PersistentVolumeClaim
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt-pvc
|
|
||||||
namespace: monitoring
|
|
||||||
spec:
|
|
||||||
accessModes:
|
|
||||||
- ReadWriteOnce
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
storage: 1Gi
|
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: ConfigMap
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt-config-template
|
|
||||||
namespace: monitoring
|
|
||||||
data:
|
|
||||||
configuration.yaml: |
|
|
||||||
homeassistant: true
|
|
||||||
availability:
|
|
||||||
active:
|
|
||||||
timeout: 10
|
|
||||||
permit_join: false
|
|
||||||
mqtt:
|
|
||||||
base_topic: zigbee2mqtt
|
|
||||||
server: mqtt://mosquitto.datalab.svc.cluster.local:1883
|
|
||||||
user: sender
|
|
||||||
serial:
|
|
||||||
port: tcp://192.168.10.10:7638
|
|
||||||
frontend:
|
|
||||||
port: 8080
|
|
||||||
host: 0.0.0.0
|
|
||||||
advanced:
|
|
||||||
network_key: GENERATE
|
|
||||||
---
|
|
||||||
apiVersion: apps/v1
|
|
||||||
kind: Deployment
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt
|
|
||||||
namespace: monitoring
|
|
||||||
labels:
|
|
||||||
app: zigbee2mqtt
|
|
||||||
spec:
|
|
||||||
replicas: 1
|
|
||||||
selector:
|
|
||||||
matchLabels:
|
|
||||||
app: zigbee2mqtt
|
|
||||||
template:
|
|
||||||
metadata:
|
|
||||||
labels:
|
|
||||||
app: zigbee2mqtt
|
|
||||||
spec:
|
|
||||||
securityContext:
|
|
||||||
fsGroup: 1000
|
|
||||||
runAsUser: 1000
|
|
||||||
initContainers:
|
|
||||||
- name: init-config
|
|
||||||
image: busybox:latest
|
|
||||||
command:
|
|
||||||
- sh
|
|
||||||
- -c
|
|
||||||
- |
|
|
||||||
if [ ! -f /app/data/configuration.yaml ]; then
|
|
||||||
echo "Initializing configuration.yaml..."
|
|
||||||
cp /tmp/config/configuration.yaml /app/data/configuration.yaml
|
|
||||||
chmod 600 /app/data/configuration.yaml
|
|
||||||
else
|
|
||||||
echo "configuration.yaml already exists. Skipping initialization."
|
|
||||||
fi
|
|
||||||
securityContext:
|
|
||||||
runAsUser: 1000
|
|
||||||
volumeMounts:
|
|
||||||
- name: data
|
|
||||||
mountPath: /app/data
|
|
||||||
- name: config-template
|
|
||||||
mountPath: /tmp/config
|
|
||||||
containers:
|
|
||||||
- name: zigbee2mqtt
|
|
||||||
image: koenkk/zigbee2mqtt:latest
|
|
||||||
env:
|
|
||||||
# Override MQTT credentials/settings using environment variables
|
|
||||||
- name: ZIGBEE2MQTT_CONFIG_MQTT_SERVER
|
|
||||||
value: "mqtt://mosquitto.datalab.svc.cluster.local:1883"
|
|
||||||
- name: ZIGBEE2MQTT_CONFIG_MQTT_USER
|
|
||||||
value: "sender"
|
|
||||||
- name: ZIGBEE2MQTT_CONFIG_MQTT_PASSWORD
|
|
||||||
valueFrom:
|
|
||||||
secretKeyRef:
|
|
||||||
name: zigbee2mqtt-secret
|
|
||||||
key: mqtt-password
|
|
||||||
# Override Zigbee Coordinator settings using environment variables
|
|
||||||
- name: ZIGBEE2MQTT_CONFIG_SERIAL_PORT
|
|
||||||
value: "tcp://192.168.10.10:7638"
|
|
||||||
- name: ZIGBEE2MQTT_CONFIG_SERIAL_ADAPTER
|
|
||||||
value: "zstack"
|
|
||||||
ports:
|
|
||||||
- name: http-frontend
|
|
||||||
containerPort: 8080
|
|
||||||
resources:
|
|
||||||
requests:
|
|
||||||
cpu: 10m
|
|
||||||
memory: 64Mi
|
|
||||||
limits:
|
|
||||||
cpu: 200m
|
|
||||||
memory: 256Mi
|
|
||||||
volumeMounts:
|
|
||||||
- name: data
|
|
||||||
mountPath: /app/data
|
|
||||||
volumes:
|
|
||||||
- name: data
|
|
||||||
persistentVolumeClaim:
|
|
||||||
claimName: zigbee2mqtt-pvc
|
|
||||||
- name: config-template
|
|
||||||
configMap:
|
|
||||||
name: zigbee2mqtt-config-template
|
|
||||||
---
|
|
||||||
apiVersion: v1
|
|
||||||
kind: Service
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt
|
|
||||||
namespace: monitoring
|
|
||||||
labels:
|
|
||||||
app: zigbee2mqtt
|
|
||||||
spec:
|
|
||||||
ports:
|
|
||||||
- name: http-frontend
|
|
||||||
port: 8080
|
|
||||||
targetPort: 8080
|
|
||||||
protocol: TCP
|
|
||||||
selector:
|
|
||||||
app: zigbee2mqtt
|
|
||||||
---
|
|
||||||
apiVersion: traefik.io/v1alpha1
|
|
||||||
kind: Middleware
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt-auth
|
|
||||||
namespace: monitoring
|
|
||||||
spec:
|
|
||||||
basicAuth:
|
|
||||||
secret: zigbee2mqtt-auth-secret
|
|
||||||
removeHeader: true
|
|
||||||
---
|
|
||||||
apiVersion: networking.k8s.io/v1
|
|
||||||
kind: Ingress
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt
|
|
||||||
namespace: monitoring
|
|
||||||
annotations:
|
|
||||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
|
||||||
traefik.ingress.kubernetes.io/router.middlewares: monitoring-zigbee2mqtt-auth@kubernetescrd
|
|
||||||
spec:
|
|
||||||
ingressClassName: traefik
|
|
||||||
rules:
|
|
||||||
- host: zigbee2mqtt.moritzgraf.de
|
|
||||||
http:
|
|
||||||
paths:
|
|
||||||
- path: /
|
|
||||||
pathType: ImplementationSpecific
|
|
||||||
backend:
|
|
||||||
service:
|
|
||||||
name: zigbee2mqtt
|
|
||||||
port:
|
|
||||||
number: 8080
|
|
||||||
tls:
|
|
||||||
- hosts:
|
|
||||||
- "zigbee2mqtt.moritzgraf.de"
|
|
||||||
secretName: zigbee2mqtt-tls
|
|
||||||
---
|
|
||||||
apiVersion: monitoring.coreos.com/v1
|
|
||||||
kind: PrometheusRule
|
|
||||||
metadata:
|
|
||||||
name: zigbee2mqtt-alerts
|
|
||||||
namespace: monitoring
|
|
||||||
labels:
|
|
||||||
release: prometheus-operator
|
|
||||||
spec:
|
|
||||||
groups:
|
|
||||||
- name: zigbee2mqtt.rules
|
|
||||||
rules:
|
|
||||||
- alert: Zigbee2MQTTDown
|
|
||||||
expr: kube_pod_container_status_ready{container="zigbee2mqtt", namespace="monitoring"} == 0
|
|
||||||
for: 1h
|
|
||||||
labels:
|
|
||||||
severity: critical
|
|
||||||
annotations:
|
|
||||||
summary: "Zigbee2MQTT is down"
|
|
||||||
description: "The Zigbee2MQTT pod is not ready. This typically indicates a connection failure to the SLZB-MR1U coordinator host at 192.168.10.10:7638, or a crash within the Z2M application."
|
|
||||||
- alert: Zigbee2MQTTBridgeOffline
|
|
||||||
expr: homeassistant_binary_sensor_state{entity="binary_sensor.zigbee2mqtt_bridge_connection_state"} == 0
|
|
||||||
for: 1h
|
|
||||||
labels:
|
|
||||||
severity: critical
|
|
||||||
annotations:
|
|
||||||
summary: "Zigbee2MQTT Bridge Connection Offline"
|
|
||||||
description: "The Zigbee2MQTT bridge connection is reported as offline. The bridge has lost communication with the MQTT broker or the Zigbee coordinator."
|
|
||||||
- alert: ShellyWS90MetricsStale
|
|
||||||
expr: absent(homeassistant_sensor_temperature_celsius{entity="sensor.shelly_ws90_temperatur"}) or (time() - homeassistant_last_updated_time_seconds{entity="sensor.shelly_ws90_temperatur"} > 0)
|
|
||||||
for: 1h
|
|
||||||
labels:
|
|
||||||
severity: warning
|
|
||||||
annotations:
|
|
||||||
summary: "Shelly WS90 Weather Station metrics are stale"
|
|
||||||
description: "No new metrics have been received from the Shelly WS90 weather station (sensor.shelly_ws90_temperatur) for over 1 hour. The device may be offline, out of range, or batteries might be depleted."
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,121 @@
|
||||||
|
configmap:
|
||||||
|
enabled: true
|
||||||
|
devices:
|
||||||
|
'0xfc4d6afffe246794':
|
||||||
|
friendly_name: Shelly WS90
|
||||||
|
throttle: 30
|
||||||
|
retain: true
|
||||||
|
qos: 1
|
||||||
|
|
||||||
|
statefulset:
|
||||||
|
storage:
|
||||||
|
enabled: true
|
||||||
|
size: 1Gi
|
||||||
|
storageClassName: openebs-hostpath
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
ingressClassName: traefik
|
||||||
|
annotations:
|
||||||
|
kubernetes.io/ingress.class: "traefik"
|
||||||
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||||
|
kubernetes.io/tls-acme: "true"
|
||||||
|
nginx.ingress.kubernetes.io/proxy-body-size: "0"
|
||||||
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||||
|
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||||
|
traefik.ingress.kubernetes.io/router.middlewares: zigbee-zigbee2mqtt-auth@kubernetescrd
|
||||||
|
hosts:
|
||||||
|
- host: zigbee2mqtt.moritzgraf.de
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
tls:
|
||||||
|
- secretName: zigbee2mqtt-moritzgraf-de
|
||||||
|
hosts:
|
||||||
|
- zigbee2mqtt.moritzgraf.de
|
||||||
|
|
||||||
|
zigbee2mqtt:
|
||||||
|
homeassistant:
|
||||||
|
enabled: true
|
||||||
|
mqtt:
|
||||||
|
base_topic: zigbee2mqtt
|
||||||
|
server: mqtt://mosquitto.datalab.svc.cluster.local:1883
|
||||||
|
user: sender
|
||||||
|
password: ahQueteiRietufeko8do
|
||||||
|
serial:
|
||||||
|
port: tcp://192.168.10.10:7638
|
||||||
|
adapter: zstack
|
||||||
|
frontend:
|
||||||
|
enabled: true
|
||||||
|
port: 8080
|
||||||
|
host: 0.0.0.0
|
||||||
|
advanced:
|
||||||
|
network_key:
|
||||||
|
- 177
|
||||||
|
- 180
|
||||||
|
- 148
|
||||||
|
- 63
|
||||||
|
- 174
|
||||||
|
- 86
|
||||||
|
- 166
|
||||||
|
- 83
|
||||||
|
- 119
|
||||||
|
- 36
|
||||||
|
- 123
|
||||||
|
- 147
|
||||||
|
- 245
|
||||||
|
- 85
|
||||||
|
- 166
|
||||||
|
- 74
|
||||||
|
log_level: debug
|
||||||
|
log_directories_to_keep: 100
|
||||||
|
adapter_concurrent: 8
|
||||||
|
adapter_delay: 100
|
||||||
|
transmit_power: 20
|
||||||
|
device_options: {}
|
||||||
|
|
||||||
|
extraResources:
|
||||||
|
- apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: Middleware
|
||||||
|
metadata:
|
||||||
|
name: zigbee2mqtt-auth
|
||||||
|
namespace: zigbee
|
||||||
|
spec:
|
||||||
|
basicAuth:
|
||||||
|
secret: zigbee2mqtt-auth-secret
|
||||||
|
removeHeader: true
|
||||||
|
- apiVersion: monitoring.coreos.com/v1
|
||||||
|
kind: PrometheusRule
|
||||||
|
metadata:
|
||||||
|
name: zigbee2mqtt-alerts
|
||||||
|
namespace: zigbee
|
||||||
|
labels:
|
||||||
|
release: prometheus-operator
|
||||||
|
spec:
|
||||||
|
groups:
|
||||||
|
- name: zigbee2mqtt.rules
|
||||||
|
rules:
|
||||||
|
- alert: Zigbee2MQTTDown
|
||||||
|
expr: kube_pod_container_status_ready{container="zigbee2mqtt", namespace="zigbee"} == 0
|
||||||
|
for: 1h
|
||||||
|
labels:
|
||||||
|
severity: critical
|
||||||
|
annotations:
|
||||||
|
summary: "Zigbee2MQTT is down"
|
||||||
|
description: "The Zigbee2MQTT pod is not ready. This typically indicates a connection failure to the SLZB-MR1U coordinator host at 192.168.10.10:7638, or a crash within the Z2M application."
|
||||||
|
- alert: Zigbee2MQTTBridgeOffline
|
||||||
|
expr: homeassistant_binary_sensor_state{entity="binary_sensor.zigbee2mqtt_bridge_connection_state"} == 0
|
||||||
|
for: 1h
|
||||||
|
labels:
|
||||||
|
severity: critical
|
||||||
|
annotations:
|
||||||
|
summary: "Zigbee2MQTT Bridge Connection Offline"
|
||||||
|
description: "The Zigbee2MQTT bridge connection is reported as offline. The bridge has lost communication with the MQTT broker or the Zigbee coordinator."
|
||||||
|
- alert: ShellyWS90MetricsStale
|
||||||
|
expr: absent(homeassistant_sensor_temperature_celsius{entity="sensor.shelly_ws90_temperatur"}) or (time() - max(homeassistant_last_updated_time_seconds{entity=~"sensor.shelly_ws90_.*"}) > 3600)
|
||||||
|
for: 1h
|
||||||
|
labels:
|
||||||
|
severity: warning
|
||||||
|
annotations:
|
||||||
|
summary: "Shelly WS90 Weather Station metrics are stale"
|
||||||
|
description: "No new metrics have been received from the Shelly WS90 weather station (sensor.shelly_ws90_temperatur) for over 1 hour. The device may be offline, out of range, or batteries might be depleted."
|
||||||
Binary file not shown.
Loading…
Reference in New Issue