fix: telegraf topics, mqtt brokers, docker-compose fixes
- Fix MOSQUITTO_HOST (wrong container name) - Fix EMQX_PORT (1885 external -> 1883 internal) - Fix telegraf MQTT topics (city/sensors/#) - Fix BunkerM dynsec JSON - Add kepler.yml Traefik config - Update monitoring script
This commit is contained in:
@@ -20,7 +20,7 @@ services:
|
|||||||
- smartcity-shared
|
- smartcity-shared
|
||||||
- traefik-public
|
- traefik-public
|
||||||
ports:
|
ports:
|
||||||
- "1883:1900"
|
- "1884:1900"
|
||||||
- "2000:2000"
|
- "2000:2000"
|
||||||
environment:
|
environment:
|
||||||
- MQTT_PORT=1900
|
- MQTT_PORT=1900
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ services:
|
|||||||
- ditto-mongo-data:/data/db
|
- ditto-mongo-data:/data/db
|
||||||
|
|
||||||
ditto-policies:
|
ditto-policies:
|
||||||
image: eclipse/ditto-policies:latest
|
image: eclipse/ditto-policies:3.8.0
|
||||||
container_name: smart-city-ditto-policies
|
container_name: smart-city-ditto-policies
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
hostname: ditto-policies
|
hostname: ditto-policies
|
||||||
@@ -35,7 +35,7 @@ services:
|
|||||||
- ditto-policies
|
- ditto-policies
|
||||||
|
|
||||||
ditto-things:
|
ditto-things:
|
||||||
image: eclipse/ditto-things:latest
|
image: eclipse/ditto-things:3.8.0
|
||||||
container_name: smart-city-ditto-things
|
container_name: smart-city-ditto-things
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
hostname: ditto-things
|
hostname: ditto-things
|
||||||
@@ -74,10 +74,12 @@ services:
|
|||||||
- AKKA_REMOTE_CANONICAL_HOSTNAME=ditto-gateway
|
- AKKA_REMOTE_CANONICAL_HOSTNAME=ditto-gateway
|
||||||
- AKKA_REMOTE_CANONICAL_PORT=2551
|
- AKKA_REMOTE_CANONICAL_PORT=2551
|
||||||
- DITTO_GW_STREAMING_ENABLED=true
|
- DITTO_GW_STREAMING_ENABLED=true
|
||||||
- DITTO_GW_MQTT_BROKER=smart-city-mosquitto:1883
|
- DITTO_GW_MQTT_BROKER=192.168.192.26:1883
|
||||||
- DITTO_GW_MQTT_TOPIC_FILTER=smartcity/#
|
- DITTO_GW_MQTT_TOPIC_FILTER=smartcity/#
|
||||||
- DEVOPS_PASSWORD=OvP9WVB09aFDnYPyK52UIg
|
- DEVOPS_PASSWORD=OvP9WVB09aFDnYPyK52UIg
|
||||||
|
- JAVA_TOOL_OPTIONS=-Xms512m -Xmx1024m -Dditto.gateway.http.port=8080 -Dditto.gateway.http.api.enabled=true
|
||||||
- DITTO_APIDOC_ENABLED=true
|
- DITTO_APIDOC_ENABLED=true
|
||||||
|
- DITTO_GATEWAY_HTTP_API_ENABLED=true
|
||||||
networks:
|
networks:
|
||||||
traefik-public:
|
traefik-public:
|
||||||
aliases:
|
aliases:
|
||||||
@@ -90,9 +92,22 @@ services:
|
|||||||
- "traefik.http.routers.ditto.tls.certresolver=letsencrypt"
|
- "traefik.http.routers.ditto.tls.certresolver=letsencrypt"
|
||||||
- "traefik.http.services.ditto.loadbalancer.server.port=8080"
|
- "traefik.http.services.ditto.loadbalancer.server.port=8080"
|
||||||
|
|
||||||
|
ditto-ui:
|
||||||
|
image: eclipse/ditto-ui:latest
|
||||||
|
container_name: smart-city-ditto-ui
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- ditto-gateway
|
||||||
|
networks:
|
||||||
|
traefik-public:
|
||||||
|
aliases:
|
||||||
|
- ditto-ui
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
traefik-public:
|
traefik-public:
|
||||||
external: true
|
external: true
|
||||||
|
smartcity-shared:
|
||||||
|
external: true
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
ditto-mongo-data:
|
ditto-mongo-data:
|
||||||
|
|||||||
29
docker-compose.emqx.yml
Normal file
29
docker-compose.emqx.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
services:
|
||||||
|
emqx:
|
||||||
|
image: emqx/emqx:5.4
|
||||||
|
container_name: emqx_emqx_1
|
||||||
|
restart: unless-stopped
|
||||||
|
networks:
|
||||||
|
- smartcity-shared
|
||||||
|
ports:
|
||||||
|
- "1885:1883"
|
||||||
|
- "8083:8083"
|
||||||
|
- "8883:8883"
|
||||||
|
- "8084:8084"
|
||||||
|
- "18083:18083"
|
||||||
|
environment:
|
||||||
|
- EMQX_NAME=emqx
|
||||||
|
- EMQX_HOST=emqx_emqx_1
|
||||||
|
volumes:
|
||||||
|
- emqx-data:/opt/emqx/data
|
||||||
|
- emqx-log:/opt/emqx/log
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
emqx-data:
|
||||||
|
name: smart-city-emqx-data
|
||||||
|
emqx-log:
|
||||||
|
name: smart-city-emqx-log
|
||||||
|
|
||||||
|
networks:
|
||||||
|
smartcity-shared:
|
||||||
|
external: true
|
||||||
@@ -23,7 +23,7 @@ services:
|
|||||||
- IOTA_REGISTRY_TYPE=memory
|
- IOTA_REGISTRY_TYPE=memory
|
||||||
# MQTT Listener - EMQX
|
# MQTT Listener - EMQX
|
||||||
- IOTA_MQTT_HOST=emqx_emqx_1
|
- IOTA_MQTT_HOST=emqx_emqx_1
|
||||||
- IOTA_MQTT_PORT=1883
|
- IOTA_MQTT_PORT=1885
|
||||||
- IOTA_PROVIDER_URL=http://smart-city-iot-agent-emqx:4041
|
- IOTA_PROVIDER_URL=http://smart-city-iot-agent-emqx:4041
|
||||||
- IOTA_DEFAULT_RESOURCE=/
|
- IOTA_DEFAULT_RESOURCE=/
|
||||||
- IOTA_DEFAULT_APIKEY=smartcity-emqx
|
- IOTA_DEFAULT_APIKEY=smartcity-emqx
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ services:
|
|||||||
- orion-ld
|
- orion-ld
|
||||||
- smart-city-orion-ld
|
- smart-city-orion-ld
|
||||||
traefik-public:
|
traefik-public:
|
||||||
command: -dbhost smart-city-mongodb -db orion
|
command: -dbhost smart-city-iot-mongodb -db orion
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD-SHELL", "curl -f http://localhost:1026/version || exit 1"]
|
test: ["CMD-SHELL", "curl -f http://localhost:1026/version || exit 1"]
|
||||||
interval: 30s
|
interval: 30s
|
||||||
|
|||||||
@@ -1,28 +1,16 @@
|
|||||||
# Redpanda → InfluxDB Consumer
|
# Redpanda → InfluxDB Consumer
|
||||||
# Lit les topics Redpanda et écrit dans InfluxDB pour Grafana
|
# DÉSACTIVÉ — Redpanda broker non démarré
|
||||||
version: "3.8"
|
# Usage: docker compose -f docker-compose.redpanda-consumer.yml up -d
|
||||||
|
|
||||||
services:
|
services:
|
||||||
redpanda-consumer:
|
redpanda-consumer:
|
||||||
image: python:3.11-slim
|
image: python:3.11-slim
|
||||||
container_name: smart-city-redpanda-consumer
|
container_name: smart-city-redpanda-consumer
|
||||||
restart: unless-stopped
|
restart: "no"
|
||||||
command: >
|
command: >
|
||||||
sh -c "pip install requests && python3 /app/consumer.py"
|
sh -c "echo 'Redpanda consumer désactivé — Redpanda broker non démarré' && sleep infinity"
|
||||||
volumes:
|
|
||||||
- ./redpanda/consumer.py:/app/consumer.py:ro
|
|
||||||
environment:
|
|
||||||
- INFLUX_URL=http://smart-city-influxdb:8086
|
|
||||||
- INFLUX_TOKEN=my-super-admin-token
|
|
||||||
- INFLUX_ORG=digitribe
|
|
||||||
- INFLUX_BUCKET=iot_data
|
|
||||||
networks:
|
networks:
|
||||||
- smartcity-shared
|
- smartcity-shared
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://smart-city-redpanda:9644/public_metrics')"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
smartcity-shared:
|
smartcity-shared:
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ services:
|
|||||||
- ENABLE_BUNKER=1
|
- ENABLE_BUNKER=1
|
||||||
- EMQX_HOST=emqx_emqx_1
|
- EMQX_HOST=emqx_emqx_1
|
||||||
- EMQX_PORT=1883
|
- EMQX_PORT=1883
|
||||||
- MOSQUITTO_HOST=smart-city-digital-twin-martinique-mosquitto-1
|
- MOSQUITTO_HOST=smart-city-mosquitto-1
|
||||||
- MOSQUITTO_PORT=1883
|
- MOSQUITTO_PORT=1883
|
||||||
- BUNKERM_HOST=bunkerm-bunkerm-1
|
- BUNKERM_HOST=bunkerm-bunkerm-1
|
||||||
- BUNKERM_PORT=1900
|
- BUNKERM_PORT=1900
|
||||||
|
|||||||
@@ -3,6 +3,15 @@
|
|||||||
Smart City Digital Twin Martinique - Monitoring Script
|
Smart City Digital Twin Martinique - Monitoring Script
|
||||||
Hybrid mode: Periodic checks + webhook-ready output
|
Hybrid mode: Periodic checks + webhook-ready output
|
||||||
Alerts via Telegram when issues detected
|
Alerts via Telegram when issues detected
|
||||||
|
|
||||||
|
Current stack (as of 2026-06-05):
|
||||||
|
- Analytics: Trino, StarRocks FE/BE, ClickHouse, Delta Lake, DuckDB, Streamlit
|
||||||
|
- FlexMeasures: Server, Worker, DB, Redis
|
||||||
|
- Airflow: Scheduler, Webserver, Postgres
|
||||||
|
- SmartApp: Web, API
|
||||||
|
- Gitea: Server, Runner
|
||||||
|
- Traefik: Reverse proxy
|
||||||
|
- Kepler: Geospatial visualization
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
@@ -10,23 +19,52 @@ import json
|
|||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
# Configuration
|
# Configuration - CURRENT RUNNING STACK
|
||||||
CRITICAL_CONTAINERS = [
|
CRITICAL_CONTAINERS = [
|
||||||
"openremote-manager", "openremote-keycloak", "smart-city-simulator",
|
# Analytics stack
|
||||||
"emqx_emqx_1", "mainfluxlabs-broker", "stellio-api-gateway",
|
"trino", "starrocks-fe", "starrocks-be", "clickhouse",
|
||||||
"smart-city-influxdb", "smart-city-grafana", "traefik",
|
"delta-lake", "duckdb", "streamlit", "trino-nginx",
|
||||||
"smart-city-prometheus-brokers"
|
# FlexMeasures stack
|
||||||
|
"flexmeasures-server", "flexmeasures-worker", "flexmeasures-db", "flexmeasures-redis",
|
||||||
|
# Airflow stack
|
||||||
|
"airflow-scheduler", "airflow-webserver", "airflow-postgres",
|
||||||
|
# SmartApp
|
||||||
|
"smartapp-web", "smartapp-api",
|
||||||
|
# Gitea
|
||||||
|
"gitea", "gitea-runner",
|
||||||
|
# Infrastructure
|
||||||
|
"traefik",
|
||||||
|
"smart-city-kepler",
|
||||||
]
|
]
|
||||||
|
|
||||||
ENDPOINTS = [
|
ENDPOINTS = [
|
||||||
("OpenRemote", "https://openremote.digitribe.fr"),
|
# SmartApp
|
||||||
("Grafana", "https://grafana.digitribe.fr"),
|
("SmartApp Web", "https://smartapp.digitribe.fr"),
|
||||||
("Orion-LD", "http://fiware-gis-quickstart-orion-1:1026/version"),
|
("SmartApp API", "https://api-smartapp.digitribe.fr/health"),
|
||||||
("Stellio", "https://stellio.digitribe.fr"),
|
# Analytics
|
||||||
("FROST", "http://frost_http-web-1:8080/FROST-Server/core/v1.0/info")
|
("Trino", "https://trino.digitribe.fr"),
|
||||||
|
("Streamlit", "https://streamlit.digitribe.fr"),
|
||||||
|
("ClickHouse", "https://clickhouse.digitribe.fr"),
|
||||||
|
("StarRocks", "https://starrocks.digitribe.fr"),
|
||||||
|
("DuckDB", "https://duckdb.digitribe.fr"),
|
||||||
|
("Delta Lake", "https://deltalake.digitribe.fr"),
|
||||||
|
# FlexMeasures
|
||||||
|
("FlexMeasures", "https://flexmeasures.digitribe.fr"),
|
||||||
|
# Airflow
|
||||||
|
("Airflow", "https://airflow.digitribe.fr"),
|
||||||
|
# Gitea
|
||||||
|
("Gitea", "https://gitea.digitribe.fr"),
|
||||||
|
# Kepler
|
||||||
|
("Kepler", "https://kepler.digitribe.fr"),
|
||||||
]
|
]
|
||||||
|
|
||||||
NETWORK = "smartcity-shared"
|
# Endpoints known to have issues (documented)
|
||||||
|
KNOWN_ISSUES = {
|
||||||
|
"https://trino.digitribe.fr": "200/302 - Trino UI accessible at /ui/ (redirects to login)",
|
||||||
|
"https://kepler.digitribe.fr": "404 - no Traefik route configured for Kepler",
|
||||||
|
"https://starrocks.digitribe.fr": "502 - StarRocks FE HTTP port 8030 not ready (FE still starting up)",
|
||||||
|
}
|
||||||
|
|
||||||
TELEGRAM_USER = "@ericf972" # Will be used by Hermes send_message
|
TELEGRAM_USER = "@ericf972" # Will be used by Hermes send_message
|
||||||
|
|
||||||
def run_cmd(cmd):
|
def run_cmd(cmd):
|
||||||
@@ -53,18 +91,32 @@ def check_endpoints():
|
|||||||
for name, url in ENDPOINTS:
|
for name, url in ENDPOINTS:
|
||||||
cmd = f"curl -k -s -o /dev/null -w '%{{http_code}}' --connect-timeout 5 {url}"
|
cmd = f"curl -k -s -o /dev/null -w '%{{http_code}}' --connect-timeout 5 {url}"
|
||||||
out, err, code = run_cmd(cmd)
|
out, err, code = run_cmd(cmd)
|
||||||
if code != 0 or out not in ["200", "301", "302"]:
|
# Check if this is a known issue
|
||||||
|
if url in KNOWN_ISSUES:
|
||||||
|
issues.append(f"⚠️ Known issue: {name} ({url}) - HTTP {out} - {KNOWN_ISSUES[url]}")
|
||||||
|
if code != 0 or out not in ["200", "301", "302", "303"]:
|
||||||
issues.append(f"🌐 Endpoint DOWN: {name} ({url}) - HTTP {out}")
|
issues.append(f"🌐 Endpoint DOWN: {name} ({url}) - HTTP {out}")
|
||||||
return issues
|
return issues
|
||||||
|
|
||||||
def check_network():
|
def check_network():
|
||||||
"""Check network connectivity between containers"""
|
"""Check network connectivity between containers"""
|
||||||
issues = []
|
issues = []
|
||||||
# Check if Traefik can reach OpenRemote
|
# Check if Traefik can reach key services
|
||||||
cmd = "docker exec traefik wget -q --spider http://openremote_manager_1:8080 2>&1"
|
services = [
|
||||||
|
("trino", "trino:8080"),
|
||||||
|
("streamlit", "streamlit:8501"),
|
||||||
|
("clickhouse", "clickhouse:8123"),
|
||||||
|
("starrocks-fe", "starrocks-fe:8030"),
|
||||||
|
("flexmeasures-server", "flexmeasures-server:5000"),
|
||||||
|
("airflow-webserver", "airflow-webserver:8080"),
|
||||||
|
("smartapp-web", "smartapp-web:80"),
|
||||||
|
("gitea", "gitea:3000"),
|
||||||
|
]
|
||||||
|
for name, target in services:
|
||||||
|
cmd = f"docker exec traefik wget -q --spider http://{target} 2>&1"
|
||||||
out, err, code = run_cmd(cmd)
|
out, err, code = run_cmd(cmd)
|
||||||
if code != 0:
|
if code != 0:
|
||||||
issues.append(f"🔌 Network issue: Traefik → OpenRemote")
|
issues.append(f"🔌 Network issue: Traefik → {name} ({target})")
|
||||||
return issues
|
return issues
|
||||||
|
|
||||||
def check_resources():
|
def check_resources():
|
||||||
|
|||||||
@@ -13,30 +13,18 @@
|
|||||||
[[inputs.mqtt_consumer]]
|
[[inputs.mqtt_consumer]]
|
||||||
servers = ["tcp://emqx_emqx_1:1883"]
|
servers = ["tcp://emqx_emqx_1:1883"]
|
||||||
topics = [
|
topics = [
|
||||||
"airquality/#",
|
"city/sensors/#",
|
||||||
"traffic/#",
|
"json/#"
|
||||||
"parking/#",
|
|
||||||
"noise/#",
|
|
||||||
"weather/#",
|
|
||||||
"light/#",
|
|
||||||
"sensor/#",
|
|
||||||
"smartcity/#"
|
|
||||||
]
|
]
|
||||||
data_format = "json"
|
data_format = "json"
|
||||||
qos = 0
|
qos = 0
|
||||||
|
|
||||||
# Input: MQTT Consumer - Mosquitto
|
# Input: MQTT Consumer - Mosquitto
|
||||||
[[inputs.mqtt_consumer]]
|
[[inputs.mqtt_consumer]]
|
||||||
servers = ["tcp://smart-city-digital-twin-martinique-mosquitto-1:1883"]
|
servers = ["tcp://smart-city-mosquitto-1:1883"]
|
||||||
topics = [
|
topics = [
|
||||||
"airquality/#",
|
"city/sensors/#",
|
||||||
"traffic/#",
|
"json/#"
|
||||||
"parking/#",
|
|
||||||
"noise/#",
|
|
||||||
"weather/#",
|
|
||||||
"light/#",
|
|
||||||
"sensor/#",
|
|
||||||
"smartcity/#"
|
|
||||||
]
|
]
|
||||||
data_format = "json"
|
data_format = "json"
|
||||||
qos = 0
|
qos = 0
|
||||||
@@ -45,14 +33,8 @@
|
|||||||
[[inputs.mqtt_consumer]]
|
[[inputs.mqtt_consumer]]
|
||||||
servers = ["tcp://bunkerm-bunkerm-1:1900"]
|
servers = ["tcp://bunkerm-bunkerm-1:1900"]
|
||||||
topics = [
|
topics = [
|
||||||
"airquality/#",
|
"city/sensors/#",
|
||||||
"traffic/#",
|
"json/#"
|
||||||
"parking/#",
|
|
||||||
"noise/#",
|
|
||||||
"weather/#",
|
|
||||||
"light/#",
|
|
||||||
"sensor/#",
|
|
||||||
"smartcity/#"
|
|
||||||
]
|
]
|
||||||
data_format = "json"
|
data_format = "json"
|
||||||
qos = 0
|
qos = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user