Compare commits

..

8 Commits

Author SHA1 Message Date
Eric FELIXINE
e4c558c296 Dashboard v7: valeurs temps réel dans panneau stat + dropdown capteur
- Panneau Stat en haut: 7 métriques temps réel (temp, humidité, NO2, O3, CO, batterie, PM2.5)
- Dropdown avec includeAll + allValue '.*'
- Regex  dans toutes les queries Flux
- historique: 7j pour NO2 et PM2.5
- Refresh: 5s
2026-05-26 14:20:00 -04:00
Eric FELIXINE
65e2d42f63 Dashboard v5: variable capteur + tooltip details + coordonnees Sainte-Anne
- Ajout variable  pour filtrage par topic InfluxDB
- Tous les panels filtres par capteur selectionne
- Tooltip markersGeomap en mode details
- Coordonnees Sainte-Anne corrigees (deplacement ~300m sur terre)
- 1001 topics disponibles dans InfluxDB
2026-05-26 14:05:33 -04:00
Eric FELIXINE
a7716102fd Fix GeoMap dashboard v3 - temperature_celsius + Geomap layer config
Fixes:
- Temperature field: temperature_c (wrong) -> temperature_celsius (correct)
- Geomap panel: added explicit location config with lat/lon field mapping
- Added PM2.5 timeseries panel
- Dashboard UID: geomap-test-v1
2026-05-26 13:52:25 -04:00
Eric FELIXINE
7643d88ffb Add GeoMap dashboard + ChirpStack REST API config
- Grafana GeoMap dashboard (PostGIS + InfluxDB) for real-time sensor visualization
- Dashboard accessible at: https://grafana.digitribe.fr/d/geosmart-city-2026/smart-city-geomap-temps-reel
- PostGIS datasource added (user: grafana, network: smartcity-shared)
- InfluxDB-SmartCity-Correct datasource configured
- ChirpStack REST API: added --cors-origins flag
2026-05-26 13:14:01 -04:00
Eric FELIXINE
7df2f6798f feat: deploy Superset and Metabase behind Traefik
- Superset: docker-compose.superset.yml (app + postgres + redis)
  URL: https://superset.digitribe.fr
  Port: 8088 (internal), Traefik routes Host(superset.digitribe.fr)

- Metabase: docker-compose.metabase.yml (app + postgres)
  URL: https://metabase.digitribe.fr
  Port: 3000 (internal), Traefik routes Host(metabase.digitribe.fr)

- Traefik configs: 31-superset.yml, 32-metabase.yml
- Both services use smartcity-shared and traefik-public networks
- Both use letsencrypt TLS certificates

Verified:
- Superset: UP healthy, accessible via https://superset.digitribe.fr
- Metabase: UP healthy, accessible via https://metabase.digitribe.fr
2026-05-25 22:59:25 -04:00
Eric FELIXINE
943836f8fb feat: activate BunkerM MQTT broker + fix Telegraf
- BunkerM: recreated with port 1883 (external) -> 1900 (internal)
- BunkerM: disabled dynsec plugin, using password_file auth (bunker/bunker)
- Simulator: ENABLE_BUNKER=1, BUNKERM_PORT=1900
- Telegraf: reactivated BunkerM consumer on port 1900
- Telegraf: recreated container (3 MQTT consumers connected)
- Grafana: dashboard v4 with corrected Flux queries
- Grafana: datasource fixed (bucket=smartcity, token=my-super-token)

Verified:
- Simulator publishes to EMQX , Mosquitto , BunkerM 
- Telegraf receives from all 3 brokers 
- InfluxDB has data from all brokers 
- Grafana dashboard displays data 
2026-05-25 20:03:55 -04:00
Eric FELIXINE
5bbd5a6e5d fix: Grafana dashboard 'no data' — datasource + Flux queries
- Fix datasource: bucket=smartcity, token=my-super-token, org=digitribe
- Fix dashboard queries: filter by topic tag instead of _measurement
  (all data in measurement 'mqtt_consumer', type in tag 'topic')
- Fix field names: temperature_c→temperature_celsius, luminosity→brightness_lux
- Update dashboard to v3 with 15 panels (airquality, traffic, parking, weather, noise, light)
- Update TODO.md and session_resume

Tested: PM2.5 , Temperature , Vehicle Count  via Grafana API
2026-05-25 16:39:50 -04:00
Eric FELIXINE
6d1d9c8620 fix: telegraf containers names + openremote pg image + session snapshot 2026-05-25
- telegraf.conf: fix Mosquitto/BunkerM container names (hyphens not underscores)
- tegraf.conf: comment out BunkerM consumer (auth fails, simulator not sending)
- openremote/docker-compose.yml: switch PG image to timescaledb-ha:pg15 (fixes timescaledb_toolkit crash)
- Add session_resume + architecture snapshot 2026-05-25
- Update TODO.md with current status
2026-05-25 14:13:39 -04:00
29 changed files with 2957 additions and 228 deletions

View File

@@ -0,0 +1,31 @@
# Smart City Monitoring Report - 2026-05-22
**Timestamp:** 2026-05-22 00:50:30
## Summary
⚠️ **9 issue(s) detected** - Critical systems are partially unavailable
## Container Status
| Container | Status |
|-----------|--------|
| openremote_manager_1 | 🛑 DOWN |
| openremote_keycloak_1 | 🛑 DOWN |
| stellio-api-gateway | 🛑 DOWN |
| smart-city-prometheus-brokers | 🛑 DOWN |
## Endpoint Status
| Service | URL | Status |
|---------|-----|--------|
| OpenRemote | https://openremote.digitribe.fr | 🌐 DOWN (HTTP 502) |
| Orion-LD | http://fiware-gis-quickstart-orion-1:1026/version | 🌐 DOWN (HTTP 000) |
| Stellio | https://stellio.digitribe.fr | 🌐 DOWN (HTTP 502) |
| FROST | http://frost_http-web-1:8080/FROST-Server/core/v1.0/info | 🌐 DOWN (HTTP 000) |
## Network
- 🔌 Network issue: Traefik → OpenRemote
## Recommendations
1. Restart critical containers: `docker-compose up -d`
2. Check Traefik logs for routing issues
3. Verify network connectivity between services
4. Review container health checks

42
TODO.md
View File

@@ -1,6 +1,6 @@
# Smart City Digital Twin — TODO List
> Dernière mise à jour : 2026-05-20 04:15 (v3)
> Dernière mise à jour : 2026-05-26 23:00
## ✅ Complété
| ID | Tâche |
@@ -15,34 +15,52 @@
| or-agent | Agent MQTT créé dans OpenRemote |
| contexus-mqtt | Driver MQTT configuré et recevant des données |
| contexus-devices | 7 devices créés dans Contexus |
| telegraf-fix | Noms containers corrigés + BunkerM désactivé |
| or-pg-fix | Image PostgreSQL changée → timescaledb-ha:pg15 |
| grafana-fix | Dashboard "no data" corrigé — datasource + requêtes Flux |
| grafana-v4 | Dashboard v4 poussé avec 14 panels, données confirmées ✅ |
| bunkerm-activate | BunkerM activé dans simulateur + Telegraf |
| superset-deploy | Apache Superset déployé derrière Traefik ✅ |
| metabase-deploy | Metabase déployé derrière Traefik ✅ |
## 🔴 En cours
| ID | Tâche | Notes |
|----|-------|-------|
| p1-or-restart | Redémarrer OpenRemote | PG recréé, à relancer après reclonage répertoire |
## 🔴 Bloqué
| ID | Tâche | Raison |
|----|-------|--------|
| p1-or-map | Affichage des points sur la carte OpenRemote | Points ne s'affichent pas malgré assets + agentLink |
| p1-or-map | Affichage points carte OpenRemote | En attente restart |
| p4-ditto | Ditto.digitribe.fr | MongoDB localhost hardcodé |
| p1-prometheus | Prometheus + Grafana | Réseau interne inaccessible |
| p3-kepler | KeplerGL | Image Docker incomplète |
| p3-geomesa | GeoMesa | Installation complexe |
## ⏳ En attente
| ID | Tâche |
|----|-------|
| p1-contexus-60 | Configurer les 60 devices Contexus |
| p3-analyse | Analyse: GeoMesa + KeplerGL |
| p1-ngsi | NGSI-LD: validation pipeline (basse priorité) |
| p0-chirpstack | ChirpStack: login API gRPC-REST |
| p1-thingsboard | Relayer ThingsBoard (si CPU dispo) |
## 📝 Notes 2026-05-20
- **Contexus** : https://contexus.digitribe.fr — login: iotevadmin / Digitribe972
- **OpenRemote** : https://openremote.digitribe.fr/manager/
- **Agent MQTT** : mqtt-agent-1 créé dans OpenRemote (type: Agent)
- **Assets IOTSensor** : 5 créés avec agentLink → mqtt-agent-1
- **Contexus MQTT** : Driver EMQX connecté et recevant des données
- **Contexus Devices** : 7 devices créés (airquality, traffic, weather, parking, noise, light, waterquality)
- **Problème carte** : Les points ne s'affichent pas sur la carte OpenRemote malgré les assets et l'agentLink. Il faut peut-être redémarrer le Manager ou vérifier la configuration de l'agent MQTT.
## 📝 Notes 2026-05-26
- **Pipeline données** : Simulateur → EMQX/Mosquitto/BunkerM → Telegraf → InfluxDB → Grafana ✅
- **Grafana** : Dashboard smartcity-martinique-complete v4 — données confirmées ✅
- **Superset** : https://superset.digitribe.fr ✅ (UP, healthy)
- **Metabase** : https://metabase.digitribe.fr ✅ (UP, healthy)
- **BunkerM** : Port 1883→1900, dynsec désactivé, auth par password_file
- **BunkerM Traefik** : https://bunkerm.digitribe.fr (config 27-bunkerm-web.yml corrigée)
- **InfluxDB** : bucket `smartcity`, measurement `mqtt_consumer`, tag `topic` pour le type
- **OpenRemote** : Abandon pour l'instant, l'utilisateur va recloner le répertoire
## Credentials
- **Contexus**: iotevadmin / Digitribe972
- **OpenRemote**: admin / Digitribe972
- **PostgreSQL Contexus**: contexus / Digitribe972
- **Redis Contexus**: Digitribe972
- **Telegraf InfluxDB**: token=my-super-token, org=digitribe, bucket=smartcity
- **Grafana**: admin / Digitribe972
- **Superset**: admin / Digitribe972 (à configurer au premier accès)
- **Metabase**: admin@digitribe.fr / Digitribe972
- **BunkerM MQTT**: bunker / bunker

52
bemserver/Dockerfile Normal file
View File

@@ -0,0 +1,52 @@
# BEMServer - Building Energy Management Server
# Multi-component Dockerfile: core + api + ui + celery
# Based on Python 3.11 slim with TimescaleDB support
FROM python:3.11-slim AS base
# System dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
libpq-dev \
libffi-dev \
curl \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /opt/bemserver
# ---- Stage 1: Install bemserver-core ----
FROM base AS core
COPY bemserver/bemserver-core /tmp/bemserver-core
RUN pip install --no-cache-dir /tmp/bemserver-core
# ---- Stage 2: Install bemserver-api ----
FROM core AS api
COPY bemserver/bemserver-api /tmp/bemserver-api
RUN pip install --no-cache-dir /tmp/bemserver-api
# ---- Stage 3: Install bemserver-ui ----
FROM api AS ui
COPY bemserver/bemserver-ui /tmp/bemserver-ui
RUN pip install --no-cache-dir /tmp/bemserver-ui
# ---- Final stage ----
FROM ui AS final
# Create non-root user
RUN groupadd -r bemserver && useradd -r -g bemserver -d /opt/bemserver -s /sbin/nologin bemserver
# Create config directory
RUN mkdir -p /opt/bemserver/config /opt/bemserver/data \
&& chown -R bemserver:bemserver /opt/bemserver
# Copy entrypoint script
COPY bemserver/entrypoint.sh /opt/bemserver/entrypoint.sh
RUN chmod +x /opt/bemserver/entrypoint.sh
# Healthcheck
HEALTHCHECK --interval=30s --timeout=10s --retries=5 --start_period=60s \
CMD curl -f http://localhost:5000/healthz || exit 1
USER bemserver
ENTRYPOINT ["/opt/bemserver/entrypoint.sh"]

44
bemserver/entrypoint.sh Normal file
View File

@@ -0,0 +1,44 @@
#!/bin/bash
# BEMServer entrypoint - runs the specified component
set -e
COMPONENT=${BEMSERVER_COMPONENT:-api}
CONFIG_DIR="/opt/bemserver/config"
case "$COMPONENT" in
api)
echo "Starting BEMServer API on port 5000..."
exec flask --app bemserver_api.app create --config "${CONFIG_DIR}/api-settings.py"
;;
ui)
echo "Starting BEMServer UI on port 5001..."
exec flask --app bemserver_ui.app create --config "${CONFIG_DIR}/ui-settings.cfg"
;;
celery-worker)
echo "Starting BEMServer Celery worker..."
export BEMSERVER_CORE_SETTINGS_FILE="${CONFIG_DIR}/core-settings.py"
exec celery -A bemserver_core.celery_worker worker --loglevel=info
;;
celery-beat)
echo "Starting BEMServer Celery beat..."
export BEMSERVER_CORE_SETTINGS_FILE="${CONFIG_DIR}/core-settings.py"
exec celery -A bemserver_core.celery_worker beat --loglevel=info
;;
init-db)
echo "Initializing BEMServer database..."
export BEMSERVER_CORE_SETTINGS_FILE="${CONFIG_DIR}/core-settings.py"
bemserver_db_upgrade
echo "Database initialized."
;;
create-admin)
echo "Creating admin user..."
export BEMSERVER_CORE_SETTINGS_FILE="${CONFIG_DIR}/core-settings.py"
bemserver_create_user --name "${BEMSERVER_ADMIN_USER:-admin}" --email "${BEMSERVER_ADMIN_EMAIL:-admin@digitribe.fr}" --admin
echo "Admin user created."
;;
*)
echo "Unknown component: $COMPONENT"
echo "Valid components: api, ui, celery-worker, celery-beat, init-db, create-admin"
exit 1
;;
esac

View File

@@ -0,0 +1,35 @@
# BunkerM MQTT Broker - Smart City Digital Twin
version: '3.8'
networks:
smartcity-shared:
external: true
traefik-public:
external: true
volumes:
bunkerm_mosquitto_data:
external: true
services:
bunkerm:
image: bunkeriot/bunkerm:latest
container_name: bunkerm-bunkerm-1
restart: unless-stopped
networks:
- smartcity-shared
- traefik-public
ports:
- "1883:1900"
- "2000:2000"
environment:
- MQTT_PORT=1900
- CONFIG_API_PORT=2000
volumes:
- bunkerm_mosquitto_data:/var/lib/mosquitto
healthcheck:
test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/1900' || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s

View File

@@ -2,6 +2,7 @@ version: "3.8"
services:
chirpstack:
container_name: smart-city-chirpstack
image: chirpstack/chirpstack:latest
command: -c /etc/chirpstack
restart: unless-stopped
@@ -22,9 +23,10 @@ services:
- smartcity-shared
chirpstack-rest-api:
container_name: smart-city-chirpstack-rest-api
image: chirpstack/chirpstack-rest-api:4
restart: unless-stopped
command: --server chirpstack:8080 --bind 0.0.0.0:8090 --insecure
command: --server chirpstack:8080 --bind 0.0.0.0:8090 --insecure --cors-origins="*"
depends_on:
- chirpstack
labels:

View File

@@ -4,6 +4,7 @@
services:
pulsar-distribution:
container_name: smart-city-pulsar-distribution
environment:
- PULSAR_HOST=pulsar
- PULSAR_PORT=6650

View File

@@ -0,0 +1,71 @@
# Metabase - BI Dashboard for Smart City Digital Twin
# Usage: docker compose -f docker-compose.metabase.yml up -d
# Access: https://metabase.digitribe.fr
version: '3.8'
networks:
smartcity-shared:
external: true
traefik-public:
external: true
volumes:
metabase_data:
name: smart-city-metabase-data
services:
metabase-db:
image: postgres:15-alpine
container_name: metabase-postgres
restart: unless-stopped
networks:
- smartcity-shared
environment:
POSTGRES_DB: metabase
POSTGRES_USER: metabase
POSTGRES_PASSWORD: Digitribe972
volumes:
- metabase_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U metabase"]
interval: 10s
timeout: 5s
retries: 5
metabase:
image: metabase/metabase:latest
container_name: metabase-app
restart: unless-stopped
networks:
- smartcity-shared
- traefik-public
depends_on:
metabase-db:
condition: service_healthy
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: metabase
MB_DB_PORT: 5432
MB_DB_USER: metabase
MB_DB_PASS: Digitribe972
MB_DB_HOST: metabase-postgres
MB_SITE_NAME: "Smart City Martinique"
MB_SITE_URL: "https://metabase.digitribe.fr"
MB_APPLICATION_DB: "file:/metabase-data/metabase.db"
MB_ENABLE_PASSWORD_LOGIN: "true"
MB_ADMIN_EMAIL: admin@digitribe.fr
MB_ADMIN_PASSWORD: Digitribe972
MB_JETTY_PORT: 3000
labels:
- "traefik.enable=true"
- "traefik.http.routers.metabase.rule=Host(`metabase.digitribe.fr`)"
- "traefik.http.routers.metabase.entrypoints=websecure"
- "traefik.http.routers.metabase.tls.certresolver=letsencrypt"
- "traefik.http.services.metabase.loadbalancer.server.port=3000"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/api/health || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s

View File

@@ -0,0 +1,39 @@
# Apache Superset - Smart City Digital Twin
# Uses official apache/superset Docker Hub image
# Access: https://superset.digitribe.fr
networks:
smartcity-shared:
external: true
traefik-public:
external: true
volumes:
superset_home:
services:
superset:
image: apache/superset:latest
container_name: superset-app
restart: unless-stopped
networks:
- smartcity-shared
- traefik-public
environment:
# Use Superset's built-in SQLite for metadata (simplest setup)
# For production, replace with PostgreSQL
SUPERSET_SECRET_KEY: superset-secret-key-2024-change-me
volumes:
- superset_home:/app/superset_home
labels:
- "traefik.enable=true"
- "traefik.http.routers.superset.rule=Host(`superset.digitribe.fr`)"
- "traefik.http.routers.superset.entrypoints=websecure"
- "traefik.http.routers.superset.tls.certresolver=letsencrypt"
- "traefik.http.services.superset.loadbalancer.server.port=8088"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:8088/health || exit 1"]
interval: 30s
timeout: 15s
retries: 5
start_period: 120s

View File

@@ -11,6 +11,7 @@ version: "3.8"
services:
tts-postgres:
container_name: smart-city-tts-postgres
image: postgres:14
restart: unless-stopped
environment:
@@ -22,6 +23,7 @@ services:
networks:
- smartcity-shared
tts-redis:
container_name: smart-city-tts-redis
image: redis:7
command: redis-server --appendonly yes
restart: unless-stopped
@@ -30,6 +32,7 @@ services:
networks:
- smartcity-shared
tts-stack:
container_name: smart-city-tts-stack
image: thethingsnetwork/lorawan-stack:latest
entrypoint: ttn-lw-stack -c /config/ttn-lw-stack-docker.yml
command: start

View File

@@ -24,28 +24,34 @@ services:
- traefik-public
- openremote_default
environment:
# MQTT Brokers - ALL enabled
# MQTT Brokers
- ENABLE_EMQX=1
- ENABLE_MOSQUITTO=1
- ENABLE_BUNKER=1
- EMQX_HOST=emqx_emqx_1
- EMQX_PORT=1883
- MOSQUITTO_HOST=smart-city-digital-twin-martinique-mosquitto-1
- MOSQUITTO_PORT=1883
- BUNKERM_HOST=bunkerm-bunkerm-1
- BUNKERM_PORT=1900
# Context Brokers (DESACTIVE - tout passe par les IoT Agents via MQTT)
- ENABLE_ORION=false
- ENABLE_STELLIO=false
- ENABLE_FROST=false
# Databases
- ENABLE_INFLUX=true
# Databases (DESACTIVE - Telegraf s'occupe de InfluxDB)
- ENABLE_INFLUX=false
- INFLUX_URL=http://smart-city-influxdb:8086
# OpenRemote
- ENABLE_OPENREMOTE=1
- OR_URL=http://openremote_manager_1:8080
- ENABLE_OPENREMOTE=0
- OR_MQTT_USER=admin
- OR_MQTT_PASS=Digitribe972
- OR_URL=http://openremote-manager:8080
- OR_REALM=master
- OR_TOKEN_REALM=master
- OR_ADMIN_USER=admin
- OR_ADMIN_PASS=Digitribe972
- OR_CLIENT_SECRET=0oQjzTfiEELYmj5jFwT4iIuWUDtQDvVa
# Pulsar (Disabled for demo stability)
# Pulsar (Disabled for stability)
- ENABLE_PULSAR=false
# Redpanda (Disabled)
- ENABLE_REDPANDA=false
@@ -66,7 +72,7 @@ services:
- traefik-public
- openremote_default
environment:
- OR_URL=http://openremote_manager_1:8080
- OR_URL=http://openremote-manager:8080
- OR_ADMIN_USER=admin
- OR_ADMIN_PASS=Digitribe972
- OR_REALM=master

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,5 @@
{
"annotations": {
"list": []
},
"annotations": {"list": []},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
@@ -9,135 +7,166 @@
"links": [],
"panels": [
{
"title": "Air Quality (PM2.5)",
"title": "Air Quality PM2.5 (µg/m³)",
"type": "timeseries",
"datasource": {
"type": "influxdb",
"uid": "influxdb-smartcity"
},
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"airquality\") |> filter(fn: (r) => r[\"_field\"] == \"pm25_ugm3\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: \"mean\")"
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/airquality/)\n |> filter(fn: (r) => r[\"_field\"] == \"pm25_ugm3\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 0
}
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
},
{
"title": "Traffic Flow (Vehicles)",
"title": "Air Quality — NO2 (µg/m³)",
"type": "timeseries",
"datasource": {
"type": "influxdb",
"uid": "influxdb-smartcity"
},
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"traffic\") |> filter(fn: (r) => r[\"_field\"] == \"vehicle_count\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: \"mean\")"
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/airquality/)\n |> filter(fn: (r) => r[\"_field\"] == \"no2_ugm3\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
}
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 0}
},
{
"title": "Parking Occupancy (%)",
"title": "Temperature (°C)",
"type": "timeseries",
"datasource": {
"type": "influxdb",
"uid": "influxdb-smartcity"
},
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"parking\") |> filter(fn: (r) => r[\"_field\"] == \"occupancy_percent\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: \"mean\")"
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"temperature_celsius\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 8
}
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 8}
},
{
"title": "Noise Levels (dB)",
"title": "Humidity (%)",
"type": "timeseries",
"datasource": {
"type": "influxdb",
"uid": "influxdb-smartcity"
},
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"noise\") |> filter(fn: (r) => r[\"_field\"] == \"noise_level_db\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: \"mean\")"
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"humidity_percent\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 8
}
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 8}
},
{
"title": "Weather (Temperature \u00b0C)",
"title": "Wind Speed (km/h)",
"type": "timeseries",
"datasource": {
"type": "influxdb",
"uid": "influxdb-smartcity"
},
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"weather\") |> filter(fn: (r) => r[\"_field\"] == \"temperature_c\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: \"mean\")"
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"wind_speed_kmh\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {
"h": 8,
"w": 12,
"x": 0,
"y": 16
}
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 16}
},
{
"title": "Light Levels",
"title": "Rain (mm)",
"type": "timeseries",
"datasource": {
"type": "influxdb",
"uid": "influxdb-smartcity"
},
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r[\"_measurement\"] == \"light\") |> filter(fn: (r) => r[\"_field\"] == \"luminosity\") |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: \"mean\")"
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"rain_mm\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 16
}
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 16}
},
{
"title": "Traffic — Vehicle Count",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/traffic/)\n |> filter(fn: (r) => r[\"_field\"] == \"vehicle_count\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 24}
},
{
"title": "Traffic — Avg Speed (km/h)",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/traffic/)\n |> filter(fn: (r) => r[\"_field\"] == \"average_speed_kmh\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 24}
},
{
"title": "Parking — Available Spots",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/parking/)\n |> filter(fn: (r) => r[\"_field\"] == \"available_spots\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 32}
},
{
"title": "Parking — Occupancy (%)",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/parking/)\n |> filter(fn: (r) => r[\"_field\"] == \"occupancy_percent\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 32}
},
{
"title": "Noise Level (dB)",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/noise/)\n |> filter(fn: (r) => r[\"_field\"] == \"noise_level_db\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 40}
},
{
"title": "Light — Brightness (lux)",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/light/)\n |> filter(fn: (r) => r[\"_field\"] == \"brightness_lux\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 40}
},
{
"title": "UV Index",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"uv_index\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 48}
},
{
"title": "Pressure (hPa)",
"type": "timeseries",
"datasource": {"type": "influxdb", "uid": "influxdb-smartcity"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"pressure_hpa\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 48}
}
],
"schemaVersion": 36,
"style": "dark",
"tags": [
"smartcity",
"martinique",
"iot"
],
"templating": {
"list": []
},
"time": {
"from": "now-1h",
"to": "now"
},
"title": "Smart City Digital Twin - Martinique",
"tags": ["smartcity", "martinique", "iot"],
"templating": {"list": []},
"time": {"from": "now-1h", "to": "now"},
"title": "Smart City Digital Twin — Martinique",
"uid": "smartcity-martinique-v2",
"version": 1
}
"version": 2
}

View File

@@ -2,13 +2,18 @@
apiVersion: 1
datasources:
- name: InfluxDB
- name: influxdb-smartcity
type: influxdb
access: proxy
url: http://docker-influxdb-1:8086
database: iot_data
user: admin
password: digitribe972
url: http://smart-city-influxdb:8086
database: smartcity
jsonData:
version: Flux
organization: digitribe
defaultBucket: smartcity
tlsSkipVerify: true
secureJsonData:
token: my-super-token
isDefault: true
readOnly: false

View File

@@ -1,16 +0,0 @@
{
"annotations": {"list": []},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"links": [],
"panels": [],
"schemaVersion": 36,
"style": "dark",
"tags": ["smart-city"],
"templating": {"list": []},
"time": {"from": "now-24h", "to": "now"},
"title": "Smart City Dashboards",
"timezone": "Americas/Martinique",
"uid": "smart-city-dashboards"
}

View File

@@ -0,0 +1,172 @@
{
"annotations": {"list": []},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": null,
"links": [],
"panels": [
{
"title": "Air Quality — PM2.5 (µg/m³)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/airquality/)\n |> filter(fn: (r) => r[\"_field\"] == \"pm25_ugm3\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
},
{
"title": "Air Quality — NO2 (µg/m³)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/airquality/)\n |> filter(fn: (r) => r[\"_field\"] == \"no2_ugm3\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 0}
},
{
"title": "Temperature (°C)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"temperature_celsius\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 8}
},
{
"title": "Humidity (%)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"humidity_percent\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 8}
},
{
"title": "Wind Speed (km/h)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"wind_speed_kmh\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 16}
},
{
"title": "Rain (mm)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"rain_mm\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 16}
},
{
"title": "Traffic — Vehicle Count",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/traffic/)\n |> filter(fn: (r) => r[\"_field\"] == \"vehicle_count\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 24}
},
{
"title": "Traffic — Avg Speed (km/h)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/traffic/)\n |> filter(fn: (r) => r[\"_field\"] == \"average_speed_kmh\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 24}
},
{
"title": "Parking — Available Spots",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/parking/)\n |> filter(fn: (r) => r[\"_field\"] == \"available_spots\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 32}
},
{
"title": "Parking — Occupancy (%)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/parking/)\n |> filter(fn: (r) => r[\"_field\"] == \"occupancy_percent\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 32}
},
{
"title": "Noise Level (dB)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/noise/)\n |> filter(fn: (r) => r[\"_field\"] == \"noise_level_db\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 40}
},
{
"title": "Light — Brightness (lux)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/light/)\n |> filter(fn: (r) => r[\"_field\"] == \"brightness_lux\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 40}
},
{
"title": "UV Index",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"uv_index\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 48}
},
{
"title": "Pressure (hPa)",
"type": "timeseries",
"datasource": {"type": "influxdb", "name": "Influxdb-v2"},
"targets": [
{
"query": "from(bucket:\"smartcity\")\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"topic\"] =~ /smartcity\\/weather/)\n |> filter(fn: (r) => r[\"_field\"] == \"pressure_hpa\")\n |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)\n |> yield(name: \"mean\")"
}
],
"gridPos": {"h": 8, "w": 12, "x": 12, "y": 48}
}
],
"schemaVersion": 36,
"style": "dark",
"tags": ["smartcity", "martinique", "iot"],
"templating": {"list": []},
"time": {"from": "now-1h", "to": "now"},
"title": "Smart City Digital Twin — Martinique",
"uid": "smartcity-martinique-v2",
"version": 2
}

View File

@@ -1,9 +1,8 @@
# Grafana datasources - Smart City Digital Twin Martinique
# Each datasource is editable and uses the container DNS name in smartcity-shared network
apiVersion: 1
datasources:
# ── InfluxDB v2 (time-series IoT data) ──────────────────────────────────────
# InfluxDB v2 (time-series IoT data)
- name: InfluxDB-v2
type: influxdb
access: proxy
@@ -13,12 +12,12 @@ datasources:
jsonData:
version: Flux
organization: digitribe
defaultBucket: iot_data
defaultBucket: smartcity
tlsSkipVerify: true
secureJsonData:
token: my-super-secret-admin-token
token: my-super-token
# ── FIWARE Orion-LD (NGSI-LD context broker) ────────────────────────────────
# Requires grafana-simple-json-datasource plugin
# FIWARE Orion-LD
- name: FIWARE Orion
type: grafana-simple-json-datasource
access: proxy
@@ -28,8 +27,7 @@ datasources:
queryURLTemplate: "/ngsi-ld/v1/entities?type={{type}}"
method: GET
# ── GeoServer WMS (spatial data) ────────────────────────────────────────────
# GeoServer is an external service reachable via its container name
# GeoServer WMS
- name: GeoServer WMS
type: grafana-simple-json-datasource
access: proxy
@@ -39,8 +37,7 @@ datasources:
queryURLTemplate: "/geoserver/wfs?service=WFS&version=2.0&request=GetFeature&typeName={{type}}"
method: GET
# ── FROST-Server (SensorThings API) ──────────────────────────────────────────
# Requires grafana-simple-json-datasource plugin
# FROST-Server
- name: FROST-Server
type: grafana-simple-json-datasource
access: proxy

14
scripts/bunkerm-init.sh Executable file
View File

@@ -0,0 +1,14 @@
#!/bin/bash
# BunkerM init script - create MQTT user and start services
set -e
# Create MQTT user if password file is empty or doesn't exist
if [ ! -s /etc/mosquitto/mosquitto_passwd ]; then
echo "Creating bunker MQTT user..."
mosquitto_passwd -b /etc/mosquitto/mosquitto_passwd bunker bunker 2>/dev/null || true
chown root:root /etc/mosquitto/mosquitto_passwd 2>/dev/null || true
chmod 0700 /etc/mosquitto/mosquitto_passwd 2>/dev/null || true
fi
# Execute the original entrypoint
exec /bin/sh -c '/docker-entrypoint.sh'

View File

@@ -0,0 +1,48 @@
# Session Resume - 2026-05-25
## Objectifs
Diagnostiquer et corriger : OpenRemote Bad Gateway + Grafana dashboard sans données.
## Diagnostic effectué
### Problème 1 : OpenRemote Bad Gateway (CRITIQUE)
- **Cause** : `timescaledb_toolkit` extension PostgreSQL manquante
- Image `timescale/timescaledb:latest-pg15` (Alpine) n'inclut PAS `timescaledb_toolkit`
- Flyway tente de créer l'extension au démarrage → échoue → Manager crash en boucle
- **Action** : Changement d'image PostgreSQL → `timescale/timescaledb-ha:pg15` (Debian, inclut timescaledb_toolkit)
- **Statut** : Image téléchargée (2.25GB), container PG recréé (volume supprimé et recréé)
- **À reprendre** : `cd /home/eric/openremote && docker-compose up -d postgresql` puis `docker-compose up -d`
### Problème 2 : Telegraf crash en boucle (CORRIGÉ)
- **Cause 1** : Noms de containers incorrects dans `telegraf.conf`
- `smart-city-mosquitto` → devrait être `smart-city-digital-twin-martinique-mosquitto-1`
- `bunkerm_bunkerm_1` → devrait être `bunkerm-bunkerm-1`
- **Cause 2** : Consumer BunkerM avec auth bloquait tout Telegraf ("not Authorized")
- **Correction** : Modifié `telegraf.conf` (noms corrigés + BunkerM commenté)
- **Statut** : Telegraf UP, consumers EMQX + Mosquitto connectés sans erreur
### Problème 3 : Dashboard Grafana sans données
- Le simulateur envoie bien les données vers EMQX (logs confirment)
- Le Mosquitto du projet est en fait celui de ChirpStack (même réseau, même config)
- Telegraf fixé mais pas encore vérifié l'écriture réussie dans InfluxDB
- Pipeline : Simulateur → MQTT (EMQX + Mosquitto) → Telegraf → InfluxDB → Grafana
## Fichiers modifiés
- `/home/eric/smart-city-digital-twin-martinique/telegraf.conf` — noms containers corrigés + BunkerM commenté
- `/home/eric/openremote/docker-compose.yml` — image PG changée pour timescaledb-ha:pg15
- `/home/eric/TODO.md` — à mettre à jour
- `/home/eric/smart-city-digital-twin-martinique/TODO.md` — à mettre à jour
## Containers critiques actuels
- `openremote-postgresql` — RECREÉ avec image timescaledb-ha:pg15 (health: starting)
- `openremote-keycloak` — Up 25h (healthy)
- `openremote-manager` — Up mais health: starting (attendre PG ready)
- `smart-city-telegraf` — UP, connecté à EMQX + Mosquitto
- `smart-city-simulator` — UP, publie 60 capteurs (MQTT OK: 1/2)
## Prochaines étapes
1. Reprendre OpenRemote : vérifier que le PG est healthy puis le Manager
2. Vérifier Telegraf → InfluxDB : `docker exec smart-city-influxdb influx query 'from(bucket:"smartcity") |> range(start:-5m) |> limit(n:5)' --token my-super-token --org digitribe`
3. Vérifier Grafana dashboard smart city
4. BunkerM : vérifier le port (1883 vs 1900) et réactiver dans Telegraf
5. Commit Gitea + push

View File

@@ -0,0 +1,68 @@
# Session Resume - 2026-05-26
## Résumé de la session
### Problème initial
- La gateway avait planté, reprise du projet Smart City Digital Twin Martinique
### Tâches réalisées
#### 1. Dashboard Grafana GeoMap en temps réel ✅
- **URL** : `https://grafana-sct.digitribe.fr/d/geosmart-city-2026/smart-city-geomap-temps-reel`
- **Dashboard UID** : `geosmart-city-2026`
- **Composants** :
- Panel **Geomap** (carte des capteurs Martinique) via PostGIS
- Panel **Time-series** NO₂ et humidité via InfluxDB
- Panels **Gauge** pour batterie, température, O₃, CO
- Rafraîchissement : 10s
#### 2. Sources de données Grafana configurées ✅
- **PostGIS-SmartCity** (ID=30, UID=`a9b60854-60c5-4c86-bb0b-d98852df0c89`)
- Hôte : `postgis-smartcity:5432`
- Base : `smartcity`
- User : `grafana` (accès SELECT uniquement, trust auth depuis réseau Docker)
- Connecté au réseau `smartcity-shared`
- **InfluxDB-SmartCity-Correct** (UID=`dd1bfc24-de9d-4c23-8a3c-151d153f8169`)
- Bucket : `smartcity`, Org : `digitribe`
- Données : `mqtt_consumer` mesure avec champs `no2_ugm3`, `co_mgm3`, `humidity_percent`, `o3_ugm3`, `battery_level`, `temperature_c`
- Topics : `smartcity/airquality/1` à `smartcity/airquality/10`
#### 3. PostGIS - Configuration ✅
- Utilisateur `grafana` créé avec accès SELECT sur toutes les tables
- `pg_hba.conf` modifié pour accepter les connexions `trust` depuis les réseaux Docker
- Réseau `connecté au container Grafana (`docker network connect smartcity-shared grafana_stack-grafana-1`)
- Table `public.sensors` contient 30+ capteurs avec coordonnées (lat/lon en SRID 4326)
#### 4. Geomap Plugin ✅
- Plugin `geomap` déjà installé et activé dans Grafana
- Carte centrée sur Fort-de-France (lat=14.6164, lon=-61.07, zoom=12)
#### 5. ChirpStack - Préparation ⚠️
- REST API : ajouté flag `--cors-origins="*"` dans docker-compose
- Broker MQTT de ChirpStack (`chirpstack-mosquitto-1:1883`) accessible depuis le simulateur
- **À faire** : Créer application/devices via UI ChirpStack + configurer le simulateur
#### 6. Git ✅
- Commit `7643d88` : "Add GeoMap dashboard + ChirpStack REST API config"
- Push en attente (Gitea 502)
### Prochaines étapes
1. **ChirpStack** : Créer application et devices via UI (`https://chirpstack.digitribe.fr`)
2. **Simulateur** : Configurer l'envoi de données vers ChirpStack (MQTT ou API REST)
3. **Gitea** : Pusher le commit quand le serveur sera accessible
4. **BemServer** : Déployer via docker-compose (repo déjà cloné dans `~/smart-city-digital-twin-martinique/bemserver/`)
### Commandes utiles
```bash
# Accéder au dashboard Grafana
open https://grafana-sct.digitribe.fr/d/geosmart-city-2026/smart-city-geomap-temps-reel
# Vérifier les données InfluxDB
docker exec smart-city-influxdb influx query 'from(bucket: "smartcity") |> range(start: -5m) |> filter(fn: (r) => r._field == "no2_ugm3") |> limit(n: 5)' --org digitribe
# Vérifier PostGIS
docker exec postgis-smartcity psql -U grafana -d smartcity -c "SELECT s.name, ST_Y(s.location::geometry), ST_X(s.location::geometry) FROM public.sensors s LIMIT 5;"
# Pousser le commit quand Gitea est up
cd ~/smart-city-digital-twin-martinique && git push
```

View File

@@ -646,7 +646,7 @@ def publish_bunkerm(sid: str, sensor: dict, values: dict) -> bool:
import base64, http.cookiejar, urllib.request, json
from datetime import datetime, timezone
host = "bunkerm_bunkerm_1:2000"
host = "bunkerm-bunkerm-1:2000"
login_url = f"http://{host}/login"
data_url = f"http://{host}/api/sensors/data"
@@ -1083,8 +1083,9 @@ def main():
print("║ Smart City Simulator — Martinique ║")
print("╚══════════════════════════════════════════════════╝")
print(f"[CFG] Capteurs: {len(SENSORS)} | Intervalle: {INTERVAL}s")
# print(f"[CFG] Orion-LD: {ENABLE_ORION} | Stellio: {ENABLE_STELLIO} | FROST: {ENABLE_FROST}")
print(f"[CFG] InfluxDB: {ENABLE_INFLUX} | Pulsar: {ENABLE_PULSAR} | Redpanda: {ENABLE_REDPANDA}")
print(f"[CFG] FROST: {ENABLE_FROST} | OpenRemote: {ENABLE_OPENREMOTE}")
print(f"[CFG] MQTT brokers: EMQX={os.getenv('ENABLE_EMQX','1')} Mosquitto={os.getenv('ENABLE_MOSQUITTO','1')}")
# --- Démarrer le serveur Prometheus ---
_start_metrics_server()
@@ -1094,16 +1095,17 @@ def main():
sensors_total.labels(sensor_type=stype).set(count)
up.set(1)
# Init connectivity checks
# Init connectivity checks (only if enabled)
if ENABLE_PULSAR:
_init_pulsar()
# Test immédiat
print(f" 🌪️ DEBUG: Test Pulsar direct...", flush=True)
test_payload = {"type": "test", "value": 123}
test_result = publish_pulsar("test_001", {"type": "air-quality"}, test_payload)
print(f" 🌪️ DEBUG: Test Pulsar result: {test_result}", flush=True)
try:
_init_pulsar()
except Exception as e:
print(f"[PULSAR] ⚠️ Init failed: {e}")
if ENABLE_REDPANDA:
_init_redpanda()
try:
_init_redpanda()
except Exception as e:
print(f"[REDPANDA] ⚠️ Init failed: {e}")
mqtt_client = MultiMQTT()
@@ -1124,19 +1126,13 @@ def main():
for sid, sensor in SENSORS.items():
stype = sensor["type"]
# Utiliser l'index du capteur dans FIXED_LOCATIONS (1-5) pour correspondre aux agents OpenRemote
# Le sid est formaté comme {stype}_{counter:03d} avec counter global
# On extrait l'index du capteur depuis le sid (derniers chiffres)
sensor_num = int(sid.split("_")[1])
# Calculer l'index 1-5 basé sur la position dans le type
# traffic: 0-9, airquality: 10-19, parking: 20-29, noise: 30-39, weather: 40-49, light: 50-59
type_offsets = {"traffic": 0, "airquality": 10, "parking": 20, "noise": 30, "weather": 40, "light": 50}
type_offset = type_offsets.get(stype, 0)
sensor_index = sensor_num - type_offset + 1 # 1-indexed
sensor_index = sensor_num - type_offset + 1
topic = f"smartcity/{stype}/{sensor_index}"
# --- Payload MQTT (ATTRIBUTES ONLY - pas de id/type/lat/lon !)
# # L'IoT Agent n'attend que les readings, pas le body complet
# --- Payload MQTT ---
ranges = SENSOR_RANGES.get(stype, {})
payload_mqtt = {
"timestamp": datetime.now(timezone.utc).isoformat(),
@@ -1158,77 +1154,19 @@ def main():
if ok_mqtt:
print(f" 📤 {topic}{','.join(ok_mqtt)}")
# # --- IoT-Agent (via EMQX) ---
# if ENABLE_IOT_AGENT:
# ok_iot = mqtt_client.publish_iot_agent(sid, payload_mqtt, sensor_type=stype)
# print(f" 🤖 IoT-Agent: {'✅' if ok_iot else '❌'}")
# Extraire les valeurs pour OpenRemote
or_values = {}
for field, val_range in ranges.items():
if isinstance(val_range, tuple) and len(val_range) == 2:
lo, hi = val_range
if isinstance(lo, (int, float)):
or_values[field] = round(random.uniform(lo, hi), 1)
# --- OpenRemote REST (round-robin: seulement quelques assets/itération) ---
# --- OpenRemote REST (round-robin) ---
if ENABLE_OPENREMOTE:
# Mettre à jour seulement ~5 assets par itération pour éviter timeups
# sensor_num % 12 == iteration % 12 → chaque asset est mis à jour toutes les ~60s
if sensor_num % 12 == iteration % 12:
or_values = {}
for field, val_range in ranges.items():
if isinstance(val_range, tuple) and len(val_range) == 2:
lo, hi = val_range
if isinstance(lo, (int, float)):
or_values[field] = round(random.uniform(lo, hi), 1)
ok_or = publish_openremote(sid, sensor, or_values)
print(f" 🏠 OpenRemote: {'' if ok_or else '⚠️ skipped'}")
# else: skip OR update this iteration (asset updated in previous cycle)
# # --- Orion-LD --- (DÉSACTIVÉ: tout passe par les IoT-Agents MQTT)
# # if ENABLE_ORION:
# # ok_or = publish_orion(sid, sensor)
# # print(f" 🌐 Orion-LD: {'✅' if ok_or else '⚠️ skipped'}")
# # --- Stellio --- (DÉSACTIVÉ: tout passe par les IoT-Agents MQTT)
# # if ENABLE_STELLIO:
# # ok_st = publish_stellio(sid, sensor)
# # print(f" 🏢 Stellio: {'✅' if ok_st else '❌'}")
# --- FROST ---
if ENABLE_FROST:
ranges2 = SENSOR_RANGES.get(stype, {})
for field, val_range in ranges2.items():
if isinstance(val_range, tuple) and len(val_range) == 2:
lo, hi = val_range
if isinstance(lo, (int, float)):
val = round(random.uniform(lo, hi), 1)
ok_fr = publish_frost(sid, sensor, field, val)
print(f" 📊 FROST: {'' if ok_fr else ''}")
# --- InfluxDB ---
if ENABLE_INFLUX:
influx_vals = {}
for field, val_range in ranges.items():
if isinstance(val_range, tuple) and len(val_range) == 2:
lo, hi = val_range
if isinstance(lo, (int, float)):
influx_vals[field] = round(random.uniform(lo, hi), 1)
ok_influx = publish_influx(sid, sensor, influx_vals)
print(f" 📈 InfluxDB: {'' if ok_influx else ''}")
# --- Pulsar (HTTP REST) ---
if ENABLE_PULSAR:
print(f" 🌪️ DEBUG: calling publish_pulsar for {sid}, payload_mqtt exists: {bool(locals().get('payload_mqtt'))}", flush=True)
ok_pulsar = publish_pulsar(sid, sensor, payload_mqtt)
print(f" 🌪️ Pulsar: {'' if ok_pulsar else ''}")
# --- Redpanda (Kafka REST Proxy) ---
if ENABLE_REDPANDA:
ok_redpanda = publish_redpanda(sid, sensor, payload_mqtt)
print(f" 🐟 Redpanda: {'' if ok_redpanda else ''}")
# --- BunkerM HTTP ---
if os.getenv("BUNKERM_HTTP", "0") == "1":
ok_bunkerm = publish_bunkerm(sid, sensor, payload_mqtt)
print(f" 📦 BunkerM: {'' if ok_bunkerm else ''}")
print(f"[SIM] ✅ {len(SENSORS)} capteurs | MQTT OK: {sum(mqtt_client.ok.values())}/{len(mqtt_client.clients)} | OR: {ENABLE_OPENREMOTE}")
print(f"[SIM] ✅ {len(SENSORS)} capteurs | MQTT OK: {sum(mqtt_client.ok.values())}/{len(mqtt_client.clients)}")
try:
time.sleep(INTERVAL)

View File

@@ -0,0 +1,264 @@
# Smart City Digital Twin Martinique — Architecture des Stacks
> Snapshot: 2026-05-23 12:00
> Total: 117 containers / 26 stacks
## 🌐 Infrastructure Réseau
| Réseau | Driver | Usage |
|--------|--------|-------|
| traefik | bridge | Reverse proxy principal |
| traefik-public | bridge |Services exposés |
| smartcity-shared | bridge | Réseau partagé smart city |
| mainflux-network | bridge | Stack Mainflux |
| emqx_default | bridge | Broker EMQX |
| contexus-iot-network | bridge | Stack Contexus |
| fiware-gis-quickstart_fiware | bridge | FIWARE |
| mapstore2_mapstore-network | bridge | MapStore |
| honcho_default | bridge | Honcho |
| digital-twin_digital-twin | bridge | NodeRed + Connector |
| openremote_default | bridge | OpenRemote (actuellement DOWN) |
| docker_default | bridge | Stack principale |
| bridge | bridge | Défaut Docker |
---
## 📦 Stacks Détaillées
### 1. TRAFICKO (1 container)
| Service | Image | Ports |
|---------|-------|-------|
| traefik | traefik:v3.1 | 80, 443, 8404 |
### 2. SMART-CITY-CORE (17 containers) ⚠️ 7 issues
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| smart-city-simulator | smart-city-digital-twin-martinique-simulator | 🔴 CRASH (exit 137, 896 restarts) | 8081 |
| smart-city-telegraf | telegraf:1.28 | 🔴 Restart boucle | - |
| smart-city-influxdb | influxdb:2.7-alpine | ✅ Healthy | 8086 |
| smart-city-grafana | grafana/grafana:10.2.0 | ✅ Up | 3001 |
| smart-city-loki | grafana/loki:latest | ✅ Up | 3100 |
| smart-city-promtail | grafana/promtail:latest | ✅ Up | - |
| smart-city-kepler | smart-city-kepler:latest | ✅ Up | 80, 8080 |
| smart-city-redpanda-console | redpandadata/console:v2.5.0 | ❌ Restart | - |
### 3. SMART-CITY-IOT (5 containers)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| smart-city-ditto-gateway | eclipse/ditto-gateway:latest | ✅ Up | 8080 |
| smart-city-ditto-policies | eclipse/ditto-policies:latest | ✅ Up | 8080 |
| smart-city-ditto-mongodb | mongo:6 | ✅ Up | 27017 |
| smart-city-digital-twin-martinique-mosquitto-1 | eclipse-mosquitto:2 | ✅ Up | 1883 |
| smart-city-digital-twin-martinique-redis-1 | redis:7-alpine | ✅ Up | 6379 |
### 4. MAINFLUX (39 containers) ⚠️ 1 issue
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| mainfluxlabs-ui | mainfluxlabs/ui:v0.36.1 | ✅ Up | 3000 |
| mainfluxlabs-users | mainfluxlabs/users:v0.36.1 | ✅ Up | 8180, 8184 |
| mainfluxlabs-auth | mainfluxlabs/auth:v0.36.1 | ✅ Up | 8181, 8189 |
| mainfluxlabs-things | mainfluxlabs/things:v0.36.1 | ✅ Up | 8182-8183, 8989 |
| mainfluxlabs-mqtt | mainfluxlabs/mqtt:v0.36.1 | ✅ Up | - |
| mainfluxlabs-http | mainfluxlabs/http:v0.36.1 | ✅ Up | 8185 |
| mainfluxlabs-ws | mainfluxlabs/ws:v0.36.1 | ✅ Up | 8190 |
| mainfluxlabs-coap | mainfluxlabs/coap:v0.36.1 | ✅ Up | 5683 |
| mainfluxlabs-modbus | mainfluxlabs/modbus:v0.36.1 | ✅ Up | 9028 |
| mainfluxlabs-broker | nats:2.2.4-alpine | ✅ Up | 4222, 8222 |
| mainfluxlabs-mosquitto | eclipse-mosquitto:2.0 | ✅ Up | 1883 |
| + 28 autres services DB/writer/reader/notifier | | ✅ Up | |
### 5. THINGSBOARD (14 containers) ⚠️ 7 issues
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| docker_tb-web-ui1_1 | thingsboard/tb-web-ui:latest | ✅ Up | 32769→8080 |
| docker_tb-web-ui2_1 | thingsboard/tb-web-ui:latest | ✅ Up | 32770→8080 |
| docker_tb-js-executor_1-10 | thingsboard/tb-js-executor:latest | ⚠️ Redémarrages | - |
| docker_zookeeper_1 | zookeeper:3.8.1 | ✅ Up | 2181, 32768 |
| docker_tb-rule-engine1_1 | - | ⚠️ Created (pas démarré) | - |
| docker_tb-rule-engine2_1 | - | ⚠️ Created (pas démarré) | - |
| thingsboard-rabbitmq | rabbitmq:3.12-management | ✅ Healthy | 4369, 5671-5672 |
| thingsboard-postgres | postgres:15-alpine | ✅ Healthy | 5432 |
### 6. MAPSTORE (3 containers) ⚠️ 502 via Traefik
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| mapstore-proxy | nginx | ✅ Up | 80 |
| mapstore-app | geosolutionsit/mapstore2:latest | ✅ Up | 8080 |
| mapstore-postgres | geosolutions-mapstore/postgis | ✅ Healthy | 5432 |
### 7. GEOSERVER (1 container)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| geoserver_stack-geoserver-1 | oscarfonts/geoserver:2.25.2 | ✅ Healthy | 8080 |
PostGIS dédié :
| postgis-smartcity | postgis/postgis:15-3.4 | ✅ Healthy | 5433 |
### 8. CONTXUS (3 containers) ⚠️ unhealthy
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| contexus-app | contexusio/contexus:latest | ⚠️ Unhealthy | 15000 |
| contexus-postgres | postgres:16 | ✅ Healthy | 5432 |
| contexus-redis | redis:7-alpine | ✅ Healthy | 6379 |
### 9. CHIRPSTACK (3 containers)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| smart-city-digital-twin-martinique-chirpstack-1 | chirpstack/chirpstack:latest | ✅ Up | - |
| chirpstack/chirpstack-rest-api:4 | chirpstack/chirpstack-rest-api:4 | ✅ Up | - |
| chirpstack/chirpstack-gateway-bridge:4 | chirpstack/chirpstack-gateway-bridge:4 | ✅ Up | 1700/udp |
| chirpstack-mosquitto | eclipse-mosquitto:2 | ✅ Up | 1883 |
| chirpstack-redis | redis:7-alpine | ✅ Up | 6379 |
| chirpstack-postgres | postgres:14-alpine | ✅ Up | 5432 |
### 10. FIWARE (3 containers)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| fiware-gis-quickstart-orion-1 | quay.io/fiware/orion-ld | ✅ Healthy | 2026→1026 |
| fiware-gis-quickstart-orionproxy-1 | fiware-gis-quickstart-orionproxy | ✅ Up | 1026→80 |
| fiware-gis-quickstart-mongo-db-1 | mongo:4.2 | ✅ Up | 27017 |
### 11. FROST (2 containers)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| frost_allinone-web-1 | fraunhoferiosb/frost-server:latest | ✅ Up | 1883, 8089, 8090→8080 |
| frost_http-web-1 | fraunhoferiosb/frost-server-http:latest | ✅ Up | 8080 |
### 12. EMQX (1 container)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| emqx_emqx_1 | emqx/emqx:latest | ✅ Up | 1883, 8883, 18083, 8081, 8083-8084, 11883, 38083 |
### 13. STELLIO (5 containers) ⚠️ 4 down
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| stellio-api-gateway | stellio/stellio-api-gateway:latest-dev | ✅ Up | 8080 |
| stellio-search-service | - | ❌ Exited | - |
| stellio-subscription-service | - | ❌ Exited | - |
| stellio-kafka | - | ❌ Exited | - |
| stellio-postgres | - | ❌ Exited | - |
### 14. DIGITAL-TWIN (2 containers)
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| digital-twin-nodered | nodered/node-red:3.1 | ✅ Healthy | 1880 |
| digital-twin-connector | python:3.11-slim | ✅ Up | - |
### 15. HONCHO (4 containers) ⚠️ API restart
| Service | Image | Status | Ports |
|---------|-------|--------|-------|
| honcho-api-1 | honcho:latest | ⚠️ Restart | - |
| honcho-deriver-1 | honcho-deriver | ✅ Healthy | 8000 |
| honcho-grafana-1 | grafana/grafana:11.4.0 | ✅ Healthy | 3088 |
| honcho-prometheus-1 | prom/prometheus:v3.2.1 | ✅ Healthy | 9091 |
### 16. Autres stacks
| Stack | Containers | Statut |
|-------|------------|--------|
| bunkerm | 1 | ⚠️ Unhealthy |
| phpipam | 2 | ✅ Up |
| gitea | 1 | ✅ Up |
| localai | 2 | ⚠️ Orphaned duplicate |
| agent-gateway | 1 | ✅ Up |
| yaade | 1 | ✅ Up |
| community-tools (docker-exporter) | 1 | ✅ Up |
---
## 🔌 Brokers MQTT (identifiés)
| Broker | Container | Port | Stack |
|--------|-----------|------|-------|
| Mosquitto (principal) | smart-city-digital-twin-martinique-mosquitto-1 | 1883 | smart-city-iot |
| Mosquitto (ChirpStack) | chirpstack-mosquitto-1 | 1883 | chirpstack |
| Mosquitto (Mainflux) | mainfluxlabs-mosquitto | 1883 | mainflux |
| MQTT Bridge (Mainflux) | mainfluxlabs-mqtt | - | mainflux |
| EMQX | emqx_emqx_1 | 1883, 8883, 11883 | emqx |
| RabbitMQ | thingsboard-rabbitmq | 5672 | thingsboard |
| RabbitMQ (OpenRemote) | (dans stack openremote - DOWN) | 5672 | openremote |
| NATS | mainfluxlabs-broker | 4222 | mainflux |
---
## 🔄 Flux de Données Validés
```
Simulateur IoT
├──► Mosquitto (principal:1883)
│ │
│ ├──► Telegraf ──► InfluxDB (8086) ──► Grafana (3001)
│ │
│ ├──► Mainflux MQTT ──► Mainflux Broker (NATS) ──► Things/Users/Auth
│ │
│ └──► IoT-Agent FIWARE ──► Orion-LD (1026) ──► QuantumLeap ──► CrateDB
│ │
│ ▼
│ Grafana
├──► EMQX (1883)
│ │
│ └──► Contexus MQTT Driver ──► Contexus Devices
└──► ChirpStack Mosquitto (1883)
└──► ChirpStack ──► ChirpStack REST API
OpenRemote Internal Artemis MQTT
└──► Agent MQTT ──► Assets (sensors) ──► Map Display
```
---
## ⚠️ Problèmes Connus (2026-05-23)
| Priorité | Problème | Impact |
|----------|----------|--------|
| 🔴 CRITIQUE | Simulator crash boucle (exit 137, 896 restarts) | Plus de données IoT |
| 🔴 CRITIQUE | OpenRemote Manager 502 | Pas de carte |
| 🟠 HAUTE | Telegraf restart boucle | Pas de données InfluxDB |
| 🟠 HAUTE | ThingsBoard executors instables | TB partiellement fonctionnel |
| 🟠 HAUTE | MapStore 502 via Traefik | Pas d'accès web |
| 🟡 MOYENNE | Contexus unhealthy | API fonctionnelle mais healthcheck KO |
| 🟡 MOYENNE | Stellio 4 services arrêtés | Search/Sub/Kafka/Postgres down |
| 🟡 MOYENNE | Ditto gateway UP mais pas de HTTP | API inaccessible |
| 🟡 MOYENNE | Bunkerm unhealthy | Monitoring down |
| 🔵 BASSE | Honcho API restartant | Mémoire/agentiel intermittent |
| 🔵 BASSE | Redpanda console restart | Console indisponible |
---
## 📝 Snapshots & Restauration
### Créer un snapshot
```bash
# État des containers
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}" > snapshots/DATE/containers-state.txt
# Sauvegarder les images d'une stack
docker save -o snapshots/DATE/simulator.tar smart-city-digital-twin-martinique-simulator
docker save -o snapshots/DATE/openremote-manager.tar openremote/manager
# Sauvegarder les volumes
docker run --rm -v smart-city_simulator_data:/data -v $(pwd)/snapshots/DATE:/backup alpine tar czf /backup/simulator-data.tar.gz -C /data .
```
### Restaurer un snapshot
```bash
# Restaurer une image
docker load -i snapshots/DATE/simulator.tar
# Redémarrer une stack
docker-compose up -d --force-recreate simulator
# Restaurer un volume
docker run --rm -v smart-city_simulator_data:/data -v $(pwd)/snapshots/DATE:/backup alpine tar xzf /backup/simulator-data.tar.gz -C /data
```
### Stables stacks à snapshoter en priorité
1. **smart-city-core** (simulator, telegraf, influxdb)
2. **openremote** (manager, keycloak, artemis, postgres)
3. **mapstore** (proxy, app, postgres)
4. **geoserver** (geoserver, postgis)
5. **mainflux** (ensemble de la stack)

View File

@@ -0,0 +1,105 @@
NAMES IMAGE STATUS PORTS
traefik traefik:v3.1 Up 33 hours 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:8404->8404/tcp, [::]:8404->8404/tcp
smart-city-simulator smart-city-digital-twin-martinique-simulator Up 59 seconds 8081/tcp
smart-city-loki grafana/loki:latest Up 2 days 0.0.0.0:3100->3100/tcp, [::]:3100->3100/tcp
smart-city-promtail grafana/promtail:latest Up 2 days
localai-api localai/localai:latest Up 2 days (healthy) 8080/tcp
mainfluxlabs-mqtt mainfluxlabs/mqtt:v0.36.1 Up 2 days
docker_tb-js-executor_10 thingsboard/tb-js-executor:latest Up 26 seconds
docker_tb-js-executor_8 thingsboard/tb-js-executor:latest Restarting (0) 5 seconds ago
docker_tb-js-executor_9 thingsboard/tb-js-executor:latest Up 30 seconds
docker_tb-web-ui1_1 thingsboard/tb-web-ui:latest Up 2 days 0.0.0.0:32769->8080/tcp, [::]:32769->8080/tcp
docker_tb-js-executor_6 thingsboard/tb-js-executor:latest Up 24 seconds
docker_zookeeper_1 zookeeper:3.8.1 Up 2 days 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, [::]:2181->2181/tcp, 8080/tcp, 0.0.0.0:32768->2181/tcp, [::]:32768->2181/tcp
docker_tb-js-executor_7 thingsboard/tb-js-executor:latest Up 21 seconds
docker_tb-js-executor_4 thingsboard/tb-js-executor:latest Up 26 seconds
docker_tb-js-executor_5 thingsboard/tb-js-executor:latest Up 20 seconds
docker_tb-js-executor_2 thingsboard/tb-js-executor:latest Restarting (0) 8 seconds ago
docker_tb-js-executor_1 thingsboard/tb-js-executor:latest Restarting (0) 9 seconds ago
docker_tb-js-executor_3 thingsboard/tb-js-executor:latest Restarting (137) 20 seconds ago
docker_tb-web-ui2_1 thingsboard/tb-web-ui:latest Up 2 days 0.0.0.0:32770->8080/tcp, [::]:32770->8080/tcp
contexus-app contexusio/contexus:latest Up 19 hours (unhealthy) 15000/tcp
contexus-postgres postgres:16 Up 2 days (healthy) 5432/tcp
contexus-redis redis:7-alpine Up 2 days (healthy) 6379/tcp
smart-city-kepler smart-city-kepler:latest Up 2 days 80/tcp, 8080/tcp
postgis-smartcity postgis/postgis:15-3.4 Up 2 days (healthy) 0.0.0.0:5433->5432/tcp, [::]:5433->5432/tcp
smart-city-ditto-policies eclipse/ditto-policies:latest Up 2 days 8080/tcp
smart-city-ditto-gateway eclipse/ditto-gateway:latest Up 19 hours 8080/tcp
smart-city-ditto-mongodb mongo:6 Up 2 days 27017/tcp
smart-city-digital-twin-martinique-chirpstack-rest-api-1 chirpstack/chirpstack-rest-api:4 Up 2 days
smart-city-digital-twin-martinique-chirpstack-1 chirpstack/chirpstack:latest Up 2 days
agentgateway cr.agentgateway.dev/agentgateway:latest Up 2 days 3000/tcp, 15000/tcp
smart-city-digital-twin-martinique-chirpstack-gateway-bridge-basicstation-1 chirpstack/chirpstack-gateway-bridge:4 Up 2 days
smart-city-digital-twin-martinique-chirpstack-gateway-bridge-1 chirpstack/chirpstack-gateway-bridge:4 Up 2 days 0.0.0.0:1700->1700/udp, [::]:1700->1700/udp
smart-city-digital-twin-martinique-mosquitto-1 eclipse-mosquitto:2 Up 2 days 1883/tcp
smart-city-digital-twin-martinique-redis-1 redis:7-alpine Up 2 days 6379/tcp
bunkerm-bunkerm-1 bunkeriot/bunkerm:latest Up 2 days (unhealthy) 0.0.0.0:1900->1900/tcp, [::]:1900->1900/tcp, 0.0.0.0:2000->2000/tcp, [::]:2000->2000/tcp
chirpstack-redis-1 redis:7-alpine Up 2 days 6379/tcp
chirpstack-mosquitto-1 eclipse-mosquitto:2 Up 2 days 1883/tcp
chirpstack-postgres-1 postgres:14-alpine Up 2 days 5432/tcp
fiware-gis-quickstart-orionproxy-1 fiware-gis-quickstart-orionproxy Up 2 days 127.0.0.1:1026->80/tcp
fiware-gis-quickstart-orion-1 quay.io/fiware/orion-ld Up 2 days (healthy) 127.0.0.1:2026->1026/tcp
fiware-gis-quickstart-mongo-db-1 mongo:4.2 Up 2 days 127.0.0.1:27017->27017/tcp
smart-city-influxdb influxdb:2.7-alpine Up 2 days (healthy) 0.0.0.0:8086->8086/tcp, [::]:8086->8086/tcp
smart-city-telegraf telegraf:1.28 Restarting (1) 11 seconds ago
smart-city-grafana grafana/grafana:10.2.0 Up 2 days 0.0.0.0:3001->3000/tcp, [::]:3001->3000/tcp
docker-exporter docker-exporter:latest Up 2 days 0.0.0.0:8005->8005/tcp, [::]:8005->8005/tcp
mainfluxlabs-http mainfluxlabs/http:v0.36.1 Up 2 days 0.0.0.0:8185->8185/tcp, [::]:8185->8185/tcp
mainfluxlabs-rules mainfluxlabs/rules:v0.36.1 Up 2 days 0.0.0.0:9027->9027/tcp, [::]:9027->9027/tcp
mainfluxlabs-converters mainfluxlabs/converters:v0.36.1 Up 2 days 0.0.0.0:8195->8195/tcp, [::]:8195->8195/tcp
mainfluxlabs-smtp-notifier mainfluxlabs/smtp-notifier:v0.36.1 Up 2 days 0.0.0.0:9023->9023/tcp, [::]:9023->9023/tcp
mainfluxlabs-modbus mainfluxlabs/modbus:v0.36.1 Up 2 days 0.0.0.0:9028->9028/tcp, [::]:9028->9028/tcp
mainfluxlabs-ws mainfluxlabs/ws:v0.36.1 Up 2 days 0.0.0.0:8190->8190/tcp, [::]:8190->8190/tcp
mainfluxlabs-webhooks mainfluxlabs/webhooks:v0.36.1 Up 2 days 0.0.0.0:9021->9021/tcp, [::]:9021->9021/tcp
mainfluxlabs-downlinks mainfluxlabs/downlinks:v0.36.1 Up 2 days 0.0.0.0:9025->9025/tcp, [::]:9025->9025/tcp
mainfluxlabs-alarms mainfluxlabs/alarms:v0.36.1 Up 2 days 0.0.0.0:9026->9026/tcp, [::]:9026->9026/tcp
mainfluxlabs-filestore mainfluxlabs/filestore:v0.36.1 Up 2 days 0.0.0.0:9022->9022/tcp, [::]:9022->9022/tcp
mainfluxlabs-coap mainfluxlabs/coap:v0.36.1 Up 2 days 0.0.0.0:5683->5683/tcp, 0.0.0.0:5683->5683/udp, [::]:5683->5683/tcp, [::]:5683->5683/udp
mainfluxlabs-things mainfluxlabs/things:v0.36.1 Up 2 days 0.0.0.0:8182-8183->8182-8183/tcp, [::]:8182-8183->8182-8183/tcp, 0.0.0.0:8989->8989/tcp, [::]:8989->8989/tcp
mainfluxlabs-users mainfluxlabs/users:v0.36.1 Up 2 days 0.0.0.0:8180->8180/tcp, [::]:8180->8180/tcp, 0.0.0.0:8184->8184/tcp, [::]:8184->8184/tcp
mainfluxlabs-auth mainfluxlabs/auth:v0.36.1 Up 2 days 0.0.0.0:8181->8181/tcp, [::]:8181->8181/tcp, 0.0.0.0:8189->8189/tcp, [::]:8189->8189/tcp
mainfluxlabs-certs mainfluxlabs/certs:v0.36.1 Up 2 days 0.0.0.0:8204->8204/tcp, [::]:8204->8204/tcp
mainfluxlabs-postgres-writer mainfluxlabs/postgres-writer:v0.36.1 Up 2 days 0.0.0.0:8900->8900/tcp, [::]:8900->8900/tcp
mainfluxlabs-uiconfigs mainfluxlabs/uiconfigs:v0.36.1 Up 2 days 0.0.0.0:9029->9029/tcp, [::]:9029->9029/tcp
mainfluxlabs-mqtt-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-es-redis redis:6.2.2-alpine Up 2 days 6379/tcp
mainfluxlabs-downlinks-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-things-db postgres:13.3-alpine Up 2 days (healthy) 5432/tcp
mainfluxlabs-rules-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-filestore-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-users-db postgres:13.3-alpine Up 2 days (healthy) 5432/tcp
mainfluxlabs-mosquitto eclipse-mosquitto:2.0 Up 2 days 1883/tcp
mainfluxlabs-alarms-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-auth-redis redis:6.2.2-alpine Up 2 days 6379/tcp
mainfluxlabs-modbus-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-broker nats:2.2.4-alpine Up 2 days 6222/tcp, 0.0.0.0:4222->4222/tcp, [::]:4222->4222/tcp, 8222/tcp
mainfluxlabs-webhooks-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-postgres postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-smtp-notifier-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-certs-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-postgres-reader mainfluxlabs/postgres-reader:v0.36.1 Up 2 days 0.0.0.0:8905->8905/tcp, [::]:8905->8905/tcp
mainfluxlabs-auth-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-uiconfigs-db postgres:13.3-alpine Up 2 days 5432/tcp
mainfluxlabs-ui mainfluxlabs/ui:v0.36.1 Up 2 days 80/tcp, 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp
thingsboard-rabbitmq rabbitmq:3.12-management Up 2 days (healthy) 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 25672/tcp
thingsboard-postgres postgres:15-alpine Up 2 days (healthy) 5432/tcp
mapstore-proxy nginx Up 2 days 80/tcp
mapstore-app geosolutionsit/mapstore2:latest Up 2 days 8080/tcp
mapstore-postgres geosolutions-mapstore/postgis Up 2 days (healthy) 5432/tcp
emqx_emqx_1 emqx/emqx:latest Up 2 days 4370/tcp, 5369/tcp, 8083-8084/tcp, 0.0.0.0:11883->1883/tcp, [::]:11883->1883/tcp, 0.0.0.0:18081->8081/tcp, [::]:18081->8081/tcp, 0.0.0.0:18883->8883/tcp, [::]:18883->8883/tcp, 0.0.0.0:38083->18083/tcp, [::]:38083->18083/tcp
smart-city-redpanda-console docker.redpanda.com/redpandadata/console:v2.5.0 Restarting (1) 1 second ago
stellio-api-gateway stellio/stellio-api-gateway:latest-dev Up 13 hours 8080/tcp
frost_allinone-web-1 fraunhoferiosb/frost-server:latest Up 2 days 1883/tcp, 8089/tcp, 127.0.0.1:8090->8080/tcp
geoserver_stack-geoserver-1 oscarfonts/geoserver:2.25.2 Up 2 days (healthy) 8080/tcp
grafana_stack-grafana-1 grafana/grafana:latest Up 2 days 3000/tcp
frost_http-web-1 fraunhoferiosb/frost-server-http:latest Up 2 days 8080/tcp
esperotech esperotech/yaade:latest Up 2 days 0.0.0.0:9339->9339/tcp, [::]:9339->9339/tcp
digital-twin-nodered nodered/node-red:3.1 Up 2 days (healthy) 0.0.0.0:1880->1880/tcp, [::]:1880->1880/tcp
digital-twin-connector python:3.11-slim Up About an hour
gitea gitea/gitea:latest Up 2 days 22/tcp, 3000/tcp
honcho-grafana-1 grafana/grafana:11.4.0 Up 2 days (healthy) 127.0.0.1:3088->3000/tcp
honcho-prometheus-1 prom/prometheus:v3.2.1 Up 2 days (healthy) 127.0.0.1:9091->9090/tcp
honcho-api-1 honcho:latest Restarting (1) 12 seconds ago
honcho-deriver-1 honcho-deriver Up 2 days (healthy) 8000/tcp
phpipam-phpipam-web-1 phpipam/phpipam-www:latest Up 2 days 127.0.0.1:8085->80/tcp
phpipam-phpipam-cron-1 phpipam/phpipam-cron:latest Up 2 days 80/tcp

View File

@@ -0,0 +1,762 @@
{
"timestamp": "2026-05-23T08:23:31.144199",
"total": 117,
"stacks": {
"agent-gateway": [
{
"name": "agentgateway",
"image": "cr.agentgateway.dev/agentgateway:latest",
"status": "Up 2 days",
"ports": "3000/tcp, 15000/tcp"
}
],
"bunkerm": [
{
"name": "bunkerm-bunkerm-1",
"image": "bunkeriot/bunkerm:latest",
"status": "Up 2 days (unhealthy)",
"ports": "0.0.0.0:1900->1900/tcp, [::]:1900->1900/tcp, 0.0.0.0:2000->2000/tcp, [::]:2000->2000/tcp"
}
],
"chirpstack": [
{
"name": "chirpstack-mosquitto-1",
"image": "eclipse-mosquitto:2",
"status": "Up 2 days",
"ports": "1883/tcp"
},
{
"name": "chirpstack-postgres-1",
"image": "postgres:14-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "chirpstack-redis-1",
"image": "redis:7-alpine",
"status": "Up 2 days",
"ports": "6379/tcp"
}
],
"community-tools": [
{
"name": "docker-exporter",
"image": "docker-exporter:latest",
"status": "Up 2 days",
"ports": "0.0.0.0:8005->8005/tcp, [::]:8005->8005/tcp"
}
],
"contexus": [
{
"name": "contexus-app",
"image": "contexusio/contexus:latest",
"status": "Up 19 hours (unhealthy)",
"ports": "15000/tcp"
},
{
"name": "contexus-postgres",
"image": "postgres:16",
"status": "Up 2 days (healthy)",
"ports": "5432/tcp"
},
{
"name": "contexus-redis",
"image": "redis:7-alpine",
"status": "Up 2 days (healthy)",
"ports": "6379/tcp"
}
],
"digital-twin": [
{
"name": "digital-twin-connector",
"image": "python:3.11-slim",
"status": "Up About an hour",
"ports": ""
},
{
"name": "digital-twin-nodered",
"image": "nodered/node-red:3.1",
"status": "Up 2 days (healthy)",
"ports": "0.0.0.0:1880->1880/tcp, [::]:1880->1880/tcp"
}
],
"docker_zookeeper_1": [
{
"name": "docker_zookeeper_1",
"image": "zookeeper:3.8.1",
"status": "Up 2 days",
"ports": "2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, [::]:2181->2181/tcp, 8080/tcp, 0.0.0.0:32768->2181/tcp, [::]:32768->2181/tcp"
}
],
"emqx": [
{
"name": "emqx_emqx_1",
"image": "emqx/emqx:latest",
"status": "Up 2 days",
"ports": "4370/tcp, 5369/tcp, 8083-8084/tcp, 0.0.0.0:11883->1883/tcp, [::]:11883->1883/tcp, 0.0.0.0:18081->8081/tcp, [::]:18081->8081/tcp, 0.0.0.0:18883->8883/tcp, [::]:18883->8883/tcp, 0.0.0.0:38083->18083/tcp, [::]:38083->18083/tcp"
}
],
"fiware": [
{
"name": "fiware-gis-quickstart-mongo-db-1",
"image": "mongo:4.2",
"status": "Up 2 days",
"ports": "127.0.0.1:27017->27017/tcp"
},
{
"name": "fiware-gis-quickstart-orion-1",
"image": "quay.io/fiware/orion-ld",
"status": "Up 2 days (healthy)",
"ports": "127.0.0.1:2026->1026/tcp"
},
{
"name": "fiware-gis-quickstart-orionproxy-1",
"image": "fiware-gis-quickstart-orionproxy",
"status": "Up 2 days",
"ports": "127.0.0.1:1026->80/tcp"
}
],
"frost": [
{
"name": "frost_allinone-web-1",
"image": "fraunhoferiosb/frost-server:latest",
"status": "Up 2 days",
"ports": "1883/tcp, 8089/tcp, 127.0.0.1:8090->8080/tcp"
},
{
"name": "frost_http-web-1",
"image": "fraunhoferiosb/frost-server-http:latest",
"status": "Up 2 days",
"ports": "8080/tcp"
}
],
"geoserver": [
{
"name": "geoserver_stack-geoserver-1",
"image": "oscarfonts/geoserver:2.25.2",
"status": "Up 2 days (healthy)",
"ports": "8080/tcp"
}
],
"gitea": [
{
"name": "gitea",
"image": "gitea/gitea:latest",
"status": "Up 2 days",
"ports": "22/tcp, 3000/tcp"
}
],
"grafana-stack": [
{
"name": "grafana_stack-grafana-1",
"image": "grafana/grafana:latest",
"status": "Up 2 days",
"ports": "3000/tcp"
}
],
"honcho": [
{
"name": "honcho-api-1",
"image": "honcho:latest",
"status": "Restarting (1) 12 seconds ago",
"ports": ""
},
{
"name": "honcho-deriver-1",
"image": "honcho-deriver",
"status": "Up 2 days (healthy)",
"ports": "8000/tcp"
},
{
"name": "honcho-grafana-1",
"image": "grafana/grafana:11.4.0",
"status": "Up 2 days (healthy)",
"ports": "127.0.0.1:3088->3000/tcp"
},
{
"name": "honcho-prometheus-1",
"image": "prom/prometheus:v3.2.1",
"status": "Up 2 days (healthy)",
"ports": "127.0.0.1:9091->9090/tcp"
}
],
"localai": [
{
"name": "8a0cce6d1940_localai-api-1",
"image": "localai/localai:latest",
"status": "Exited (0) 2 days ago",
"ports": ""
},
{
"name": "localai-api",
"image": "localai/localai:latest",
"status": "Up 2 days (healthy)",
"ports": "8080/tcp"
}
],
"mainflux": [
{
"name": "mainfluxlabs-alarms-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-alarms",
"image": "mainfluxlabs/alarms:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9026->9026/tcp, [::]:9026->9026/tcp"
},
{
"name": "mainfluxlabs-auth-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-auth-redis",
"image": "redis:6.2.2-alpine",
"status": "Up 2 days",
"ports": "6379/tcp"
},
{
"name": "mainfluxlabs-auth",
"image": "mainfluxlabs/auth:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8181->8181/tcp, [::]:8181->8181/tcp, 0.0.0.0:8189->8189/tcp, [::]:8189->8189/tcp"
},
{
"name": "mainfluxlabs-broker",
"image": "nats:2.2.4-alpine",
"status": "Up 2 days",
"ports": "6222/tcp, 0.0.0.0:4222->4222/tcp, [::]:4222->4222/tcp, 8222/tcp"
},
{
"name": "mainfluxlabs-certs-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-certs",
"image": "mainfluxlabs/certs:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8204->8204/tcp, [::]:8204->8204/tcp"
},
{
"name": "mainfluxlabs-coap",
"image": "mainfluxlabs/coap:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:5683->5683/tcp, 0.0.0.0:5683->5683/udp, [::]:5683->5683/tcp, [::]:5683->5683/udp"
},
{
"name": "mainfluxlabs-converters",
"image": "mainfluxlabs/converters:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8195->8195/tcp, [::]:8195->8195/tcp"
},
{
"name": "mainfluxlabs-downlinks-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-downlinks",
"image": "mainfluxlabs/downlinks:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9025->9025/tcp, [::]:9025->9025/tcp"
},
{
"name": "mainfluxlabs-es-redis",
"image": "redis:6.2.2-alpine",
"status": "Up 2 days",
"ports": "6379/tcp"
},
{
"name": "mainfluxlabs-filestore-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-filestore",
"image": "mainfluxlabs/filestore:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9022->9022/tcp, [::]:9022->9022/tcp"
},
{
"name": "mainfluxlabs-http",
"image": "mainfluxlabs/http:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8185->8185/tcp, [::]:8185->8185/tcp"
},
{
"name": "mainfluxlabs-jaeger",
"image": "jaegertracing/all-in-one:1.53",
"status": "Exited (255) 2 days ago",
"ports": "5775/udp, 4317-4318/tcp, 9411/tcp, 0.0.0.0:5778->5778/tcp, [::]:5778->5778/tcp, 0.0.0.0:14268->14268/tcp, [::]:14268->14268/tcp, 14250/tcp, 6832/udp, 0.0.0.0:16686->16686/tcp, [::]:16686->16686/tcp, 0.0.0.0:6831->6831/udp, [::]:6831->6831/udp"
},
{
"name": "mainfluxlabs-modbus-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-modbus",
"image": "mainfluxlabs/modbus:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9028->9028/tcp, [::]:9028->9028/tcp"
},
{
"name": "mainfluxlabs-mosquitto",
"image": "eclipse-mosquitto:2.0",
"status": "Up 2 days",
"ports": "1883/tcp"
},
{
"name": "mainfluxlabs-mqtt-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-mqtt",
"image": "mainfluxlabs/mqtt:v0.36.1",
"status": "Up 2 days",
"ports": ""
},
{
"name": "mainfluxlabs-postgres-reader",
"image": "mainfluxlabs/postgres-reader:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8905->8905/tcp, [::]:8905->8905/tcp"
},
{
"name": "mainfluxlabs-postgres-writer",
"image": "mainfluxlabs/postgres-writer:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8900->8900/tcp, [::]:8900->8900/tcp"
},
{
"name": "mainfluxlabs-postgres",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-rules-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-rules",
"image": "mainfluxlabs/rules:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9027->9027/tcp, [::]:9027->9027/tcp"
},
{
"name": "mainfluxlabs-smtp-notifier-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-smtp-notifier",
"image": "mainfluxlabs/smtp-notifier:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9023->9023/tcp, [::]:9023->9023/tcp"
},
{
"name": "mainfluxlabs-things-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days (healthy)",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-things",
"image": "mainfluxlabs/things:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8182-8183->8182-8183/tcp, [::]:8182-8183->8182-8183/tcp, 0.0.0.0:8989->8989/tcp, [::]:8989->8989/tcp"
},
{
"name": "mainfluxlabs-uiconfigs-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-uiconfigs",
"image": "mainfluxlabs/uiconfigs:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9029->9029/tcp, [::]:9029->9029/tcp"
},
{
"name": "mainfluxlabs-ui",
"image": "mainfluxlabs/ui:v0.36.1",
"status": "Up 2 days",
"ports": "80/tcp, 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp"
},
{
"name": "mainfluxlabs-users-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days (healthy)",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-users",
"image": "mainfluxlabs/users:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8180->8180/tcp, [::]:8180->8180/tcp, 0.0.0.0:8184->8184/tcp, [::]:8184->8184/tcp"
},
{
"name": "mainfluxlabs-webhooks-db",
"image": "postgres:13.3-alpine",
"status": "Up 2 days",
"ports": "5432/tcp"
},
{
"name": "mainfluxlabs-webhooks",
"image": "mainfluxlabs/webhooks:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:9021->9021/tcp, [::]:9021->9021/tcp"
},
{
"name": "mainfluxlabs-ws",
"image": "mainfluxlabs/ws:v0.36.1",
"status": "Up 2 days",
"ports": "0.0.0.0:8190->8190/tcp, [::]:8190->8190/tcp"
}
],
"mapstore": [
{
"name": "mapstore-app",
"image": "geosolutionsit/mapstore2:latest",
"status": "Up 2 days",
"ports": "8080/tcp"
},
{
"name": "mapstore-postgres",
"image": "geosolutions-mapstore/postgis",
"status": "Up 2 days (healthy)",
"ports": "5432/tcp"
},
{
"name": "mapstore-proxy",
"image": "nginx",
"status": "Up 2 days",
"ports": "80/tcp"
}
],
"phpipam": [
{
"name": "phpipam-phpipam-cron-1",
"image": "phpipam/phpipam-cron:latest",
"status": "Up 2 days",
"ports": "80/tcp"
},
{
"name": "phpipam-phpipam-web-1",
"image": "phpipam/phpipam-www:latest",
"status": "Up 2 days",
"ports": "127.0.0.1:8085->80/tcp"
}
],
"postgis-smartcity": [
{
"name": "postgis-smartcity",
"image": "postgis/postgis:15-3.4",
"status": "Up 2 days (healthy)",
"ports": "0.0.0.0:5433->5432/tcp, [::]:5433->5432/tcp"
}
],
"smart-city-core": [
{
"name": "smart-city-digital-twin-martinique-chirpstack-1",
"image": "chirpstack/chirpstack:latest",
"status": "Up 2 days",
"ports": ""
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-gateway-bridge-1",
"image": "chirpstack/chirpstack-gateway-bridge:4",
"status": "Up 2 days",
"ports": "0.0.0.0:1700->1700/udp, [::]:1700->1700/udp"
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-gateway-bridge-basicstation-1",
"image": "chirpstack/chirpstack-gateway-bridge:4",
"status": "Up 2 days",
"ports": ""
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-rest-api-1",
"image": "chirpstack/chirpstack-rest-api:4",
"status": "Up 2 days",
"ports": ""
},
{
"name": "smart-city-grafana",
"image": "grafana/grafana:10.2.0",
"status": "Up 2 days",
"ports": "0.0.0.0:3001->3000/tcp, [::]:3001->3000/tcp"
},
{
"name": "smart-city-influxdb",
"image": "influxdb:2.7-alpine",
"status": "Up 2 days (healthy)",
"ports": "0.0.0.0:8086->8086/tcp, [::]:8086->8086/tcp"
},
{
"name": "smart-city-kepler",
"image": "smart-city-kepler:latest",
"status": "Up 2 days",
"ports": "80/tcp, 8080/tcp"
},
{
"name": "smart-city-loki",
"image": "grafana/loki:latest",
"status": "Up 2 days",
"ports": "0.0.0.0:3100->3100/tcp, [::]:3100->3100/tcp"
},
{
"name": "smart-city-prometheus-brokers",
"image": "prom/prometheus:latest",
"status": "Exited (255) 2 days ago",
"ports": ""
},
{
"name": "smart-city-promtail",
"image": "grafana/promtail:latest",
"status": "Up 2 days",
"ports": ""
},
{
"name": "smart-city-pulsar-manager-db",
"image": "postgres:15-alpine",
"status": "Exited (0) 2 days ago",
"ports": ""
},
{
"name": "smart-city-pulsar-manager",
"image": "apachepulsar/pulsar-manager:v0.2.0",
"status": "Exited (137) 2 days ago",
"ports": ""
},
{
"name": "smart-city-pulsar",
"image": "apachepulsar/pulsar:3.2.0",
"status": "Exited (137) 2 days ago",
"ports": ""
},
{
"name": "smart-city-redpanda-console",
"image": "docker.redpanda.com/redpandadata/console:v2.5.0",
"status": "Restarting (1) 9 seconds ago",
"ports": ""
},
{
"name": "smart-city-redpanda",
"image": "redpandadata/redpanda:v24.3.14",
"status": "Exited (255) 2 days ago",
"ports": "8081/tcp, 127.0.0.1:8082->8082/tcp, 0.0.0.0:19092->9092/tcp, [::]:19092->9092/tcp, 0.0.0.0:19644->9644/tcp, [::]:19644->9644/tcp"
},
{
"name": "smart-city-simulator",
"image": "smart-city-digital-twin-martinique-simulator",
"status": "Up 55 seconds",
"ports": "8081/tcp"
},
{
"name": "smart-city-telegraf",
"image": "telegraf:1.28",
"status": "Restarting (1) 6 seconds ago",
"ports": ""
}
],
"smart-city-iot": [
{
"name": "smart-city-digital-twin-martinique-mosquitto-1",
"image": "eclipse-mosquitto:2",
"status": "Up 2 days",
"ports": "1883/tcp"
},
{
"name": "smart-city-digital-twin-martinique-redis-1",
"image": "redis:7-alpine",
"status": "Up 2 days",
"ports": "6379/tcp"
},
{
"name": "smart-city-ditto-gateway",
"image": "eclipse/ditto-gateway:latest",
"status": "Up 20 hours",
"ports": "8080/tcp"
},
{
"name": "smart-city-ditto-mongodb",
"image": "mongo:6",
"status": "Up 2 days",
"ports": "27017/tcp"
},
{
"name": "smart-city-ditto-policies",
"image": "eclipse/ditto-policies:latest",
"status": "Up 2 days",
"ports": "8080/tcp"
}
],
"stellio": [
{
"name": "stellio-api-gateway",
"image": "stellio/stellio-api-gateway:latest-dev",
"status": "Up 13 hours",
"ports": "8080/tcp"
},
{
"name": "stellio-kafka",
"image": "confluentinc/cp-kafka:8.1.0",
"status": "Exited (255) 2 days ago",
"ports": "9092/tcp, 0.0.0.0:29092->29092/tcp, [::]:29092->29092/tcp"
},
{
"name": "stellio-postgres",
"image": "stellio/stellio-timescale-postgis:16-2.24.0-3.6",
"status": "Exited (255) 2 days ago",
"ports": "5432/tcp"
},
{
"name": "stellio-search-service",
"image": "stellio/stellio-search-service:latest-dev",
"status": "Exited (255) 2 days ago",
"ports": "8083/tcp"
},
{
"name": "stellio-subscription-service",
"image": "stellio/stellio-subscription-service:latest-dev",
"status": "Exited (255) 2 days ago",
"ports": "8084/tcp"
}
],
"thingsboard": [
{
"name": "docker_tb-js-executor_10",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 15 seconds ago",
"ports": ""
},
{
"name": "docker_tb-js-executor_1",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 24 seconds",
"ports": ""
},
{
"name": "docker_tb-js-executor_2",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 23 seconds ago",
"ports": ""
},
{
"name": "docker_tb-js-executor_3",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 23 seconds ago",
"ports": ""
},
{
"name": "docker_tb-js-executor_4",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (137) 15 seconds ago",
"ports": ""
},
{
"name": "docker_tb-js-executor_5",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 26 seconds",
"ports": ""
},
{
"name": "docker_tb-js-executor_6",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) Less than a second ago",
"ports": ""
},
{
"name": "docker_tb-js-executor_7",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 29 seconds",
"ports": ""
},
{
"name": "docker_tb-js-executor_8",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 22 seconds ago",
"ports": ""
},
{
"name": "docker_tb-js-executor_9",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (137) 13 seconds ago",
"ports": ""
},
{
"name": "docker_tb-rule-engine1_1",
"image": "thingsboard/tb-node:latest",
"status": "Created",
"ports": ""
},
{
"name": "docker_tb-rule-engine2_1",
"image": "thingsboard/tb-node:latest",
"status": "Created",
"ports": ""
},
{
"name": "docker_tb-web-ui1_1",
"image": "thingsboard/tb-web-ui:latest",
"status": "Up 2 days",
"ports": "0.0.0.0:32769->8080/tcp, [::]:32769->8080/tcp"
},
{
"name": "docker_tb-web-ui2_1",
"image": "thingsboard/tb-web-ui:latest",
"status": "Up 2 days",
"ports": "0.0.0.0:32770->8080/tcp, [::]:32770->8080/tcp"
}
],
"thingsboard-postgres": [
{
"name": "thingsboard-postgres",
"image": "postgres:15-alpine",
"status": "Up 2 days (healthy)",
"ports": "5432/tcp"
}
],
"thingsboard-rabbitmq": [
{
"name": "thingsboard-rabbitmq",
"image": "rabbitmq:3.12-management",
"status": "Up 2 days (healthy)",
"ports": "4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 25672/tcp"
}
],
"traefik": [
{
"name": "traefik",
"image": "traefik:v3.1",
"status": "Up 33 hours",
"ports": "0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:8404->8404/tcp, [::]:8404->8404/tcp"
}
],
"yaade": [
{
"name": "esperotech",
"image": "esperotech/yaade:latest",
"status": "Up 2 days",
"ports": "0.0.0.0:9339->9339/tcp, [::]:9339->9339/tcp"
}
]
}
}

View File

@@ -0,0 +1,49 @@
# Smart City Digital Twin — Architecture État Actuel (snapshot)
> **Date**: 2026-05-25 ~18:45 UTC
> **Total containers**: 117
## 📡 Pipeline Données (IOT → Stockage → Visualisation)
```
┌──────────────┐ MQTT topics: ┌──────────┐ ┌───────────┐ ┌────────────┐
│ Simulator │──── smartcity/●/● ──▶│ EMQX │────▶│ Telegraf ────▶│ InfluxDB │
│ (60 sensors)│ " │ (v5.0) │ │ (mqtt_ │ │ (v2.7) │
│ │──── smartcity/●/● ──▶│ │ │ consumer)│ │ │
│ ENABLE_BUNKER│ " │ │ │ influxdb │────▶│ bucket: │
│ =0 (off) │ │ │ │ _v2) │ │ "smartcity"│
└──────────────┘ └──────────┘ └───────────┘ └─────┬──────┘
Mosquitto (chirpstack) ◀── allow_anonymous=true ── config mosquitto.conf │
(no data visible in logs yet) │
┌────────────┐
│ Grafana │
│ Dashboard │
│ Smart City │
└────────────┘
```
## 🏗️ Stacks actives (principales)
| Stack | Containers | État | Réseau |
|-------|-----------|------|--------|
| **OpenRemote** | postgresql (timescaledb-ha), keycloak, manager | PG: starting, KC: healthy, Manager: starting | smartcity-shared + openremote_default |
| **Smart City Core** | simulator, telegraf, grafana, influxdb, prometheus | UP | smartcity-shared |
| **FIWARE GIS** | orion-ld, orionproxy | healthy | smartcity-shared |
| **ChirpStack** | chirpstack, mosquitto, postgres, redis | UP | dédié + smartcity-shared |
| **Ditto** | gateway, policies, mongodb | UP/restarting | dédié |
| **Contexus** | app (unhealthy), postgres (healthy), redis (healthy) | mixed | smartcity-shared |
| **Mainflux** | 15+ microservices, mqtt, jaeger (exited) | mixed | dédié |
| **Stellio** | api-gateway (UP), search+subscription+kafka+postgres (exited) | broken | dédié |
| **Traefik** | traefik:v3.1 | UP | traefik-public |
## ⚠️ Points connus
- **OpenRemote** : crash loop corrigé (image PG changée), à redémarrer
- **Telegraf** : fixé (noms containers + BunkerM désactivé)
- **Stellio** : cassé (kafka + postgres exited) — NGSI-LD lowest priority
- **Contexus** : app unhealthy
- **Pulsar/Redpanda** : arrêtés (stabilité CPU)
- **BunkerM** : unhealthy, port 1900 (port MQTT originel)
- **Simulator** : MQTT OK 1/2 — un seul broker sur deux (Mosquitto?)

View File

@@ -0,0 +1,825 @@
{
"timestamp": "2026-05-25T18:09:53.673741+00:00",
"total": 117,
"containers": [
{
"name": "openremote-postgresql",
"image": "timescale/timescaledb-ha:pg15",
"status": "Created",
"ports": "",
"networks": "smartcity-shared"
},
{
"name": "openremote-manager",
"image": "openremote/manager:latest",
"status": "Up 3 minutes (health: starting)",
"ports": "1883/tcp, 8080/tcp, 8443/tcp",
"networks": "smartcity-shared"
},
{
"name": "openremote-keycloak",
"image": "quay.io/keycloak/keycloak:24.0",
"status": "Up 27 hours (healthy)",
"ports": "8080/tcp, 8443/tcp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-simulator",
"image": "smart-city-simulator",
"status": "Up 2 days",
"ports": "8081/tcp",
"networks": "traefik-public,openremote_default,smartcity-shared"
},
{
"name": "traefik",
"image": "traefik:v3.1",
"status": "Up 3 days",
"ports": "0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:8404->8404/tcp, [::]:8404->8404/tcp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-loki",
"image": "grafana/loki:latest",
"status": "Up 4 days",
"ports": "0.0.0.0:3100->3100/tcp, [::]:3100->3100/tcp",
"networks": "traefik-public,smartcity-shared"
},
{
"name": "smart-city-promtail",
"image": "grafana/promtail:latest",
"status": "Up 4 days",
"ports": "",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "localai-api",
"image": "localai/localai:latest",
"status": "Up 5 days (healthy)",
"ports": "8080/tcp",
"networks": "traefik-public"
},
{
"name": "mainfluxlabs-mqtt",
"image": "mainfluxlabs/mqtt:v0.36.1",
"status": "Up 5 days",
"ports": "",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "docker_tb-js-executor_10",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 36 seconds",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_8",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 30 seconds",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_9",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 9 seconds ago",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-web-ui1_1",
"image": "thingsboard/tb-web-ui:latest",
"status": "Up 5 days",
"ports": "0.0.0.0:32769->8080/tcp, [::]:32769->8080/tcp",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_6",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 19 seconds",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_zookeeper_1",
"image": "zookeeper:3.8.1",
"status": "Up 5 days",
"ports": "2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, [::]:2181->2181/tcp, 8080/tcp, 0.0.0.0:32768->2181/tcp, [::]:32768->2181/tcp",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_7",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 10 seconds",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_4",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 1 second ago",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_5",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 11 seconds ago",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_2",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 15 seconds",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_1",
"image": "thingsboard/tb-js-executor:latest",
"status": "Up 22 seconds",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-js-executor_3",
"image": "thingsboard/tb-js-executor:latest",
"status": "Restarting (0) 6 seconds ago",
"ports": "",
"networks": "docker_default"
},
{
"name": "docker_tb-web-ui2_1",
"image": "thingsboard/tb-web-ui:latest",
"status": "Up 5 days",
"ports": "0.0.0.0:32770->8080/tcp, [::]:32770->8080/tcp",
"networks": "docker_default"
},
{
"name": "contexus-app",
"image": "contexusio/contexus:latest",
"status": "Up 3 days (unhealthy)",
"ports": "15000/tcp",
"networks": "contexus-iot-network,smartcity-shared,traefik-public"
},
{
"name": "contexus-postgres",
"image": "postgres:16",
"status": "Up 5 days (healthy)",
"ports": "5432/tcp",
"networks": "contexus-iot-network"
},
{
"name": "contexus-redis",
"image": "redis:7-alpine",
"status": "Up 5 days (healthy)",
"ports": "6379/tcp",
"networks": "contexus-iot-network"
},
{
"name": "smart-city-kepler",
"image": "smart-city-kepler:latest",
"status": "Up 5 days",
"ports": "80/tcp, 8080/tcp",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "postgis-smartcity",
"image": "postgis/postgis:15-3.4",
"status": "Up 5 days (healthy)",
"ports": "0.0.0.0:5433->5432/tcp, [::]:5433->5432/tcp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-ditto-policies",
"image": "eclipse/ditto-policies:latest",
"status": "Up 5 days",
"ports": "8080/tcp",
"networks": "traefik-public"
},
{
"name": "smart-city-ditto-gateway",
"image": "eclipse/ditto-gateway:latest",
"status": "Up 3 days",
"ports": "8080/tcp",
"networks": "traefik-public"
},
{
"name": "smart-city-ditto-mongodb",
"image": "mongo:6",
"status": "Up 5 days",
"ports": "27017/tcp",
"networks": "traefik-public"
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-rest-api-1",
"image": "chirpstack/chirpstack-rest-api:4",
"status": "Up 5 days",
"ports": "",
"networks": "smartcity-shared"
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-1",
"image": "chirpstack/chirpstack:latest",
"status": "Up 5 days",
"ports": "",
"networks": "smartcity-shared"
},
{
"name": "agentgateway",
"image": "cr.agentgateway.dev/agentgateway:latest",
"status": "Up 5 days",
"ports": "3000/tcp, 15000/tcp",
"networks": "traefik-public"
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-gateway-bridge-basicstation-1",
"image": "chirpstack/chirpstack-gateway-bridge:4",
"status": "Up 5 days",
"ports": "",
"networks": "traefik-public,smartcity-shared"
},
{
"name": "smart-city-digital-twin-martinique-chirpstack-gateway-bridge-1",
"image": "chirpstack/chirpstack-gateway-bridge:4",
"status": "Up 5 days",
"ports": "0.0.0.0:1700->1700/udp, [::]:1700->1700/udp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-digital-twin-martinique-mosquitto-1",
"image": "eclipse-mosquitto:2",
"status": "Up 5 days",
"ports": "1883/tcp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-digital-twin-martinique-redis-1",
"image": "redis:7-alpine",
"status": "Up 5 days",
"ports": "6379/tcp",
"networks": "smartcity-shared"
},
{
"name": "bunkerm-bunkerm-1",
"image": "bunkeriot/bunkerm:latest",
"status": "Up 5 days (unhealthy)",
"ports": "0.0.0.0:1900->1900/tcp, [::]:1900->1900/tcp, 0.0.0.0:2000->2000/tcp, [::]:2000->2000/tcp",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "chirpstack-redis-1",
"image": "redis:7-alpine",
"status": "Up 5 days",
"ports": "6379/tcp",
"networks": "smartcity-shared"
},
{
"name": "chirpstack-mosquitto-1",
"image": "eclipse-mosquitto:2",
"status": "Up 5 days",
"ports": "1883/tcp",
"networks": "smartcity-shared"
},
{
"name": "chirpstack-postgres-1",
"image": "postgres:14-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-prometheus-brokers",
"image": "prom/prometheus:latest",
"status": "Up 14 hours",
"ports": "",
"networks": ""
},
{
"name": "fiware-gis-quickstart-orionproxy-1",
"image": "fiware-gis-quickstart-orionproxy",
"status": "Up 5 days",
"ports": "127.0.0.1:1026->80/tcp",
"networks": "fiware-gis-quickstart_fiware"
},
{
"name": "fiware-gis-quickstart-orion-1",
"image": "quay.io/fiware/orion-ld",
"status": "Up 5 days (healthy)",
"ports": "127.0.0.1:2026->1026/tcp",
"networks": "fiware-gis-quickstart_fiware,traefik-public"
},
{
"name": "fiware-gis-quickstart-mongo-db-1",
"image": "mongo:4.2",
"status": "Up 5 days",
"ports": "127.0.0.1:27017->27017/tcp",
"networks": "fiware-gis-quickstart_fiware"
},
{
"name": "smart-city-influxdb",
"image": "influxdb:2.7-alpine",
"status": "Up 5 days (healthy)",
"ports": "0.0.0.0:8086->8086/tcp, [::]:8086->8086/tcp",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "smart-city-telegraf",
"image": "telegraf:1.28",
"status": "Up 2 hours",
"ports": "8092/udp, 8125/udp, 8094/tcp",
"networks": "smartcity-shared"
},
{
"name": "smart-city-grafana",
"image": "grafana/grafana:10.2.0",
"status": "Up 5 days",
"ports": "0.0.0.0:3001->3000/tcp, [::]:3001->3000/tcp",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "docker-exporter",
"image": "docker-exporter:latest",
"status": "Up 5 days",
"ports": "0.0.0.0:8005->8005/tcp, [::]:8005->8005/tcp",
"networks": "bridge"
},
{
"name": "mainfluxlabs-http",
"image": "mainfluxlabs/http:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8185->8185/tcp, [::]:8185->8185/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "mainfluxlabs-rules",
"image": "mainfluxlabs/rules:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9027->9027/tcp, [::]:9027->9027/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-converters",
"image": "mainfluxlabs/converters:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8195->8195/tcp, [::]:8195->8195/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-smtp-notifier",
"image": "mainfluxlabs/smtp-notifier:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9023->9023/tcp, [::]:9023->9023/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-modbus",
"image": "mainfluxlabs/modbus:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9028->9028/tcp, [::]:9028->9028/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-ws",
"image": "mainfluxlabs/ws:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8190->8190/tcp, [::]:8190->8190/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-webhooks",
"image": "mainfluxlabs/webhooks:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9021->9021/tcp, [::]:9021->9021/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-downlinks",
"image": "mainfluxlabs/downlinks:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9025->9025/tcp, [::]:9025->9025/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-alarms",
"image": "mainfluxlabs/alarms:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9026->9026/tcp, [::]:9026->9026/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-filestore",
"image": "mainfluxlabs/filestore:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9022->9022/tcp, [::]:9022->9022/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-coap",
"image": "mainfluxlabs/coap:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:5683->5683/tcp, 0.0.0.0:5683->5683/udp, [::]:5683->5683/tcp, [::]:5683->5683/udp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-things",
"image": "mainfluxlabs/things:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8182-8183->8182-8183/tcp, [::]:8182-8183->8182-8183/tcp, 0.0.0.0:8989->8989/tcp, [::]:8989->8989/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "mainfluxlabs-users",
"image": "mainfluxlabs/users:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8180->8180/tcp, [::]:8180->8180/tcp, 0.0.0.0:8184->8184/tcp, [::]:8184->8184/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "mainfluxlabs-auth",
"image": "mainfluxlabs/auth:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8181->8181/tcp, [::]:8181->8181/tcp, 0.0.0.0:8189->8189/tcp, [::]:8189->8189/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "mainfluxlabs-certs",
"image": "mainfluxlabs/certs:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8204->8204/tcp, [::]:8204->8204/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-postgres-writer",
"image": "mainfluxlabs/postgres-writer:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8900->8900/tcp, [::]:8900->8900/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-uiconfigs",
"image": "mainfluxlabs/uiconfigs:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:9029->9029/tcp, [::]:9029->9029/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-mqtt-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-es-redis",
"image": "redis:6.2.2-alpine",
"status": "Up 5 days",
"ports": "6379/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-downlinks-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-things-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days (healthy)",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-rules-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-filestore-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-users-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days (healthy)",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-jaeger",
"image": "jaegertracing/all-in-one:1.53",
"status": "Exited (255) 5 days ago",
"ports": "5775/udp, 4317-4318/tcp, 9411/tcp, 0.0.0.0:5778->5778/tcp, [::]:5778->5778/tcp, 0.0.0.0:14268->14268/tcp, [::]:14268->14268/tcp, 14250/tcp, 6832/udp, 0.0.0.0:16686->16686/tcp, [::]:16686->16686/tcp, 0.0.0.0:6831->6831/udp, [::]:6831->6831/udp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-mosquitto",
"image": "eclipse-mosquitto:2.0",
"status": "Up 5 days",
"ports": "1883/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "mainfluxlabs-alarms-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-auth-redis",
"image": "redis:6.2.2-alpine",
"status": "Up 5 days",
"ports": "6379/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-modbus-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-broker",
"image": "nats:2.2.4-alpine",
"status": "Up 5 days",
"ports": "6222/tcp, 0.0.0.0:4222->4222/tcp, [::]:4222->4222/tcp, 8222/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "mainfluxlabs-webhooks-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-postgres",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-smtp-notifier-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-certs-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-postgres-reader",
"image": "mainfluxlabs/postgres-reader:v0.36.1",
"status": "Up 5 days",
"ports": "0.0.0.0:8905->8905/tcp, [::]:8905->8905/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-auth-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-uiconfigs-db",
"image": "postgres:13.3-alpine",
"status": "Up 5 days",
"ports": "5432/tcp",
"networks": "mainflux-network"
},
{
"name": "mainfluxlabs-ui",
"image": "mainfluxlabs/ui:v0.36.1",
"status": "Up 5 days",
"ports": "80/tcp, 0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp",
"networks": "mainflux-network,smartcity-shared"
},
{
"name": "smart-city-pulsar-manager",
"image": "apachepulsar/pulsar-manager:v0.2.0",
"status": "Exited (137) 5 days ago",
"ports": "",
"networks": "smartcity-shared,traefik-public,pulsar-manager-net"
},
{
"name": "smart-city-pulsar-manager-db",
"image": "postgres:15-alpine",
"status": "Exited (0) 5 days ago",
"ports": "",
"networks": "pulsar-manager-net"
},
{
"name": "thingsboard-rabbitmq",
"image": "rabbitmq:3.12-management",
"status": "Up 5 days (healthy)",
"ports": "4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 15691-15692/tcp, 25672/tcp",
"networks": "smartcity-shared"
},
{
"name": "thingsboard-postgres",
"image": "postgres:15-alpine",
"status": "Up 5 days (healthy)",
"ports": "5432/tcp",
"networks": "smartcity-shared"
},
{
"name": "mapstore-proxy",
"image": "nginx",
"status": "Up 5 days",
"ports": "80/tcp",
"networks": "mapstore2_mapstore-network,traefik-public"
},
{
"name": "mapstore-app",
"image": "geosolutionsit/mapstore2:latest",
"status": "Up 5 days",
"ports": "8080/tcp",
"networks": "mapstore2_mapstore-network,smartcity-shared,traefik-public"
},
{
"name": "mapstore-postgres",
"image": "geosolutions-mapstore/postgis",
"status": "Up 5 days (healthy)",
"ports": "5432/tcp",
"networks": "mapstore2_mapstore-network"
},
{
"name": "emqx_emqx_1",
"image": "emqx/emqx:latest",
"status": "Up 5 days",
"ports": "4370/tcp, 5369/tcp, 8083-8084/tcp, 0.0.0.0:11883->1883/tcp, [::]:11883->1883/tcp, 0.0.0.0:18081->8081/tcp, [::]:18081->8081/tcp, 0.0.0.0:18883->8883/tcp, [::]:18883->8883/tcp, 0.0.0.0:38083->18083/tcp, [::]:38083->18083/tcp",
"networks": "emqx_default,smartcity-shared,traefik-public"
},
{
"name": "smart-city-pulsar",
"image": "apachepulsar/pulsar:3.2.0",
"status": "Exited (137) 5 days ago",
"ports": "",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "smart-city-redpanda",
"image": "redpandadata/redpanda:v24.3.14",
"status": "Exited (255) 5 days ago",
"ports": "8081/tcp, 127.0.0.1:8082->8082/tcp, 0.0.0.0:19092->9092/tcp, [::]:19092->9092/tcp, 0.0.0.0:19644->9644/tcp, [::]:19644->9644/tcp",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "smart-city-redpanda-console",
"image": "docker.redpanda.com/redpandadata/console:v2.5.0",
"status": "Up 46 seconds (health: starting)",
"ports": "0.0.0.0:28080->8080/tcp, [::]:28080->8080/tcp",
"networks": "smartcity-shared,traefik-public"
},
{
"name": "stellio-api-gateway",
"image": "stellio/stellio-api-gateway:latest-dev",
"status": "Up 2 days",
"ports": "8080/tcp",
"networks": "stellio-context-broker_default,traefik-public,smartcity-shared"
},
{
"name": "frost_allinone-web-1",
"image": "fraunhoferiosb/frost-server:latest",
"status": "Up 5 days",
"ports": "1883/tcp, 8089/tcp, 127.0.0.1:8090->8080/tcp",
"networks": "frost_allinone_default,smartcity-shared"
},
{
"name": "geoserver_stack-geoserver-1",
"image": "oscarfonts/geoserver:2.25.2",
"status": "Up 5 days (healthy)",
"ports": "8080/tcp",
"networks": "frost_http_default,smartcity-shared,traefik-public"
},
{
"name": "grafana_stack-grafana-1",
"image": "grafana/grafana:latest",
"status": "Up 5 days",
"ports": "3000/tcp",
"networks": "traefik-public,frost_http_default"
},
{
"name": "frost_http-web-1",
"image": "fraunhoferiosb/frost-server-http:latest",
"status": "Up 5 days",
"ports": "8080/tcp",
"networks": "frost_http_default,smartcity-shared"
},
{
"name": "esperotech",
"image": "esperotech/yaade:latest",
"status": "Up 5 days",
"ports": "0.0.0.0:9339->9339/tcp, [::]:9339->9339/tcp",
"networks": "yaade_default"
},
{
"name": "stellio-search-service",
"image": "stellio/stellio-search-service:latest-dev",
"status": "Exited (255) 5 days ago",
"ports": "8083/tcp",
"networks": "traefik-public,smartcity-shared,stellio-context-broker_default"
},
{
"name": "stellio-subscription-service",
"image": "stellio/stellio-subscription-service:latest-dev",
"status": "Exited (255) 5 days ago",
"ports": "8084/tcp",
"networks": "smartcity-shared,stellio-context-broker_default,traefik-public"
},
{
"name": "stellio-kafka",
"image": "confluentinc/cp-kafka:8.1.0",
"status": "Exited (255) 5 days ago",
"ports": "9092/tcp, 0.0.0.0:29092->29092/tcp, [::]:29092->29092/tcp",
"networks": "smartcity-shared,stellio-context-broker_default"
},
{
"name": "stellio-postgres",
"image": "stellio/stellio-timescale-postgis:16-2.24.0-3.6",
"status": "Exited (255) 5 days ago",
"ports": "5432/tcp",
"networks": "smartcity-shared,stellio-context-broker_default"
},
{
"name": "digital-twin-nodered",
"image": "nodered/node-red:3.1",
"status": "Up 5 days (healthy)",
"ports": "0.0.0.0:1880->1880/tcp, [::]:1880->1880/tcp",
"networks": "traefik,smartcity-shared"
},
{
"name": "digital-twin-connector",
"image": "python:3.11-slim",
"status": "Up 30 minutes",
"ports": "",
"networks": "digital-twin_digital-twin,smartcity-shared"
},
{
"name": "gitea",
"image": "gitea/gitea:latest",
"status": "Up 5 days",
"ports": "22/tcp, 3000/tcp",
"networks": "gitea_default,traefik,traefik-public"
},
{
"name": "honcho-grafana-1",
"image": "grafana/grafana:11.4.0",
"status": "Up 5 days (healthy)",
"ports": "127.0.0.1:3088->3000/tcp",
"networks": "honcho_default"
},
{
"name": "honcho-prometheus-1",
"image": "prom/prometheus:v3.2.1",
"status": "Up 5 days (healthy)",
"ports": "127.0.0.1:9091->9090/tcp",
"networks": "honcho_default,smartcity-shared"
},
{
"name": "honcho-api-1",
"image": "honcho:latest",
"status": "Up 31 seconds (health: starting)",
"ports": "127.0.0.1:8088->8000/tcp",
"networks": "traefik-public,honcho_default"
},
{
"name": "honcho-deriver-1",
"image": "honcho-deriver",
"status": "Up 5 days (healthy)",
"ports": "8000/tcp",
"networks": "honcho_default"
},
{
"name": "phpipam-phpipam-web-1",
"image": "phpipam/phpipam-www:latest",
"status": "Up 5 days",
"ports": "127.0.0.1:8085->80/tcp",
"networks": "phpipam_default,traefik-public"
},
{
"name": "phpipam-phpipam-cron-1",
"image": "phpipam/phpipam-cron:latest",
"status": "Up 5 days",
"ports": "80/tcp",
"networks": "phpipam_default"
}
]
}

View File

@@ -0,0 +1,57 @@
# Snapshot 2026-05-26 — Smart City Digital Twin Martinique
## État des services
### Pipeline de données ✅ FONCTIONNEL
```
Simulateur (60 capteurs) → EMQX + Mosquitto → Telegraf → InfluxDB → Grafana
```
### Containers UP
| Container | Status | Notes |
|-----------|--------|-------|
| smart-city-simulator | ✅ Up 2j | 60 capteurs, MQTT OK |
| smart-city-telegraf | ✅ Up | Connecté EMQX + Mosquitto |
| smart-city-influxdb | ✅ Up healthy | Bucket `smartcity` with data |
| smart-city-grafana | ✅ Up | Dashboard v3, datasource corrigé |
| openremote-postgresql | ✅ Up healthy | timescaledb-ha:pg15 |
| openremote-keycloak | ✅ Up | Recréé manuellement |
| openremote-manager | ❌ Crash loop | Flyway corrigé mais PG recréé |
| contexus-app | ⚠️ Unhealthy | Postgres/Redis OK |
| contexus-postgres | ✅ Up healthy | |
| contexus-redis | ✅ Up healthy | |
### Containers DOWN (intentionnel pour CPU)
- ThingsBoard, Pulsar, Redpanda, FROST, Stellio, Orion-LD
## Données InfluxDB confirmées
- Bucket: `smartcity`
- Measurement: `mqtt_consumer`
- Tag `topic`: `smartcity/{type}/{id}` (ex: `smartcity/airquality/1`)
- Types: airquality(20), parking(20), traffic(10), weather(10), light(5), noise(5)
## Grafana Dashboard
- UID: `smartcity-martinique-complete`
- URL: https://grafana.digitribe.fr/d/smartcity-martinique-complete/smart-city-digital-twin-martinique-complet
- Version: 3 (15 panels, requêtes Flux corrigées)
- Datasource: InfluxDB-SmartCity-Correct (uid: dd1bfc24-...)
## Fichiers modifiés cette session
- `grafana-datasources.yml`
- `grafana-dashboard-smartcity.json`
- `grafana/provisioning/dashboards/smart-city-dashboards.json`
- `grafana/provisioning/datasources/datasources.yml`
- `openremote/docker-compose.yml` (OR_SETUP_TYPE: "default")
- `TODO.md` (home + projet)
- `session_resume_2026-05-26.md` (nouveau)
## Commit
- `5bbd5a6` — "fix: Grafana dashboard 'no data' — datasource + Flux queries"
- Push Gitea: ❌ (502 Bad Gateway)
## Prochaines étapes
1. Recloner le répertoire (décision utilisateur)
2. Relancer OpenRemote après reclonage
3. Push Gitea quand le serveur sera accessible
4. Configurer les 60 devices Contexus
5. Activer BunkerM dans Telegraf

View File

@@ -0,0 +1,109 @@
metabase-app metabase/metabase:latest Up 15 hours (healthy)
metabase-postgres postgres:15-alpine Up 15 hours (healthy)
smart-city-telegraf telegraf:1.28 Up 17 hours
smart-city-simulator smart-city-simulator Up 17 hours
bunkerm-bunkerm-1 bunkeriot/bunkerm:latest Up 18 hours (healthy)
openremote-keycloak quay.io/keycloak/keycloak:24.0 Up 21 hours
gracious_mestorf openremote/manager:latest Up 22 hours (unhealthy)
traefik traefik:v3.1 Up 4 days
smart-city-loki grafana/loki:latest Up 5 days
smart-city-promtail grafana/promtail:latest Up 5 days
localai-api localai/localai:latest Up 6 days (healthy)
mainfluxlabs-mqtt mainfluxlabs/mqtt:v0.36.1 Up 6 days
docker_tb-js-executor_10 thingsboard/tb-js-executor:latest Restarting (0) 1 second ago
docker_tb-js-executor_8 thingsboard/tb-js-executor:latest Restarting (0) 1 second ago
docker_tb-js-executor_9 thingsboard/tb-js-executor:latest Up 28 seconds
docker_tb-web-ui1_1 thingsboard/tb-web-ui:latest Up 6 days
docker_tb-js-executor_6 thingsboard/tb-js-executor:latest Restarting (0) 11 seconds ago
docker_zookeeper_1 zookeeper:3.8.1 Up 6 days
docker_tb-js-executor_7 thingsboard/tb-js-executor:latest Up 24 seconds
docker_tb-js-executor_4 thingsboard/tb-js-executor:latest Restarting (0) 20 seconds ago
docker_tb-js-executor_5 thingsboard/tb-js-executor:latest Up 33 seconds
docker_tb-js-executor_2 thingsboard/tb-js-executor:latest Up 27 seconds
docker_tb-js-executor_1 thingsboard/tb-js-executor:latest Up 28 seconds
docker_tb-js-executor_3 thingsboard/tb-js-executor:latest Up 34 seconds
docker_tb-web-ui2_1 thingsboard/tb-web-ui:latest Up 6 days
contexus-app contexusio/contexus:latest Up 4 days (unhealthy)
contexus-postgres postgres:16 Up 6 days (healthy)
contexus-redis redis:7-alpine Up 6 days (healthy)
smart-city-kepler smart-city-kepler:latest Up 6 days
postgis-smartcity postgis/postgis:15-3.4 Up 6 days (healthy)
smart-city-ditto-policies eclipse/ditto-policies:latest Up 6 days
smart-city-ditto-gateway eclipse/ditto-gateway:latest Up 4 days
smart-city-ditto-mongodb mongo:6 Up 6 days
smart-city-digital-twin-martinique-chirpstack-rest-api-1 chirpstack/chirpstack-rest-api:4 Up 6 days
smart-city-digital-twin-martinique-chirpstack-1 chirpstack/chirpstack:latest Up 6 days
agentgateway cr.agentgateway.dev/agentgateway:latest Up 6 days
smart-city-digital-twin-martinique-chirpstack-gateway-bridge-basicstation-1 chirpstack/chirpstack-gateway-bridge:4 Up 6 days
smart-city-digital-twin-martinique-chirpstack-gateway-bridge-1 chirpstack/chirpstack-gateway-bridge:4 Up 6 days
smart-city-digital-twin-martinique-mosquitto-1 eclipse-mosquitto:2 Up 6 days
smart-city-digital-twin-martinique-redis-1 redis:7-alpine Up 6 days
chirpstack-redis-1 redis:7-alpine Up 6 days
chirpstack-mosquitto-1 eclipse-mosquitto:2 Up 6 days
chirpstack-postgres-1 postgres:14-alpine Up 6 days
smart-city-prometheus-brokers prom/prometheus:latest Up 37 hours
fiware-gis-quickstart-orionproxy-1 fiware-gis-quickstart-orionproxy Up 6 days
fiware-gis-quickstart-orion-1 quay.io/fiware/orion-ld Up 6 days (healthy)
fiware-gis-quickstart-mongo-db-1 mongo:4.2 Up 6 days
smart-city-influxdb influxdb:2.7-alpine Up 6 days (healthy)
smart-city-grafana grafana/grafana:10.2.0 Up 21 hours
docker-exporter docker-exporter:latest Up 5 days
mainfluxlabs-http mainfluxlabs/http:v0.36.1 Up 6 days
mainfluxlabs-rules mainfluxlabs/rules:v0.36.1 Up 6 days
mainfluxlabs-converters mainfluxlabs/converters:v0.36.1 Up 6 days
mainfluxlabs-smtp-notifier mainfluxlabs/smtp-notifier:v0.36.1 Up 6 days
mainfluxlabs-modbus mainfluxlabs/modbus:v0.36.1 Up 6 days
mainfluxlabs-ws mainfluxlabs/ws:v0.36.1 Up 6 days
mainfluxlabs-webhooks mainfluxlabs/webhooks:v0.36.1 Up 6 days
mainfluxlabs-downlinks mainfluxlabs/downlinks:v0.36.1 Up 6 days
mainfluxlabs-alarms mainfluxlabs/alarms:v0.36.1 Up 6 days
mainfluxlabs-filestore mainfluxlabs/filestore:v0.36.1 Up 6 days
mainfluxlabs-coap mainfluxlabs/coap:v0.36.1 Up 6 days
mainfluxlabs-things mainfluxlabs/things:v0.36.1 Up 6 days
mainfluxlabs-users mainfluxlabs/users:v0.36.1 Up 6 days
mainfluxlabs-auth mainfluxlabs/auth:v0.36.1 Up 6 days
mainfluxlabs-certs mainfluxlabs/certs:v0.36.1 Up 6 days
mainfluxlabs-postgres-writer mainfluxlabs/postgres-writer:v0.36.1 Up 6 days
mainfluxlabs-uiconfigs mainfluxlabs/uiconfigs:v0.36.1 Up 6 days
mainfluxlabs-mqtt-db postgres:13.3-alpine Up 6 days
mainfluxlabs-es-redis redis:6.2.2-alpine Up 6 days
mainfluxlabs-downlinks-db postgres:13.3-alpine Up 6 days
mainfluxlabs-things-db postgres:13.3-alpine Up 6 days (healthy)
mainfluxlabs-rules-db postgres:13.3-alpine Up 6 days
mainfluxlabs-filestore-db postgres:13.3-alpine Up 6 days
mainfluxlabs-users-db postgres:13.3-alpine Up 6 days (healthy)
mainfluxlabs-mosquitto eclipse-mosquitto:2.0 Up 6 days
mainfluxlabs-alarms-db postgres:13.3-alpine Up 6 days
mainfluxlabs-auth-redis redis:6.2.2-alpine Up 6 days
mainfluxlabs-modbus-db postgres:13.3-alpine Up 6 days
mainfluxlabs-broker nats:2.2.4-alpine Up 6 days
mainfluxlabs-webhooks-db postgres:13.3-alpine Up 6 days
mainfluxlabs-postgres postgres:13.3-alpine Up 6 days
mainfluxlabs-smtp-notifier-db postgres:13.3-alpine Up 6 days
mainfluxlabs-certs-db postgres:13.3-alpine Up 6 days
mainfluxlabs-postgres-reader mainfluxlabs/postgres-reader:v0.36.1 Up 6 days
mainfluxlabs-auth-db postgres:13.3-alpine Up 6 days
mainfluxlabs-uiconfigs-db postgres:13.3-alpine Up 6 days
mainfluxlabs-ui mainfluxlabs/ui:v0.36.1 Up 6 days
thingsboard-rabbitmq rabbitmq:3.12-management Up 6 days (healthy)
thingsboard-postgres postgres:15-alpine Up 6 days (healthy)
mapstore-proxy nginx Up 6 days
mapstore-app geosolutionsit/mapstore2:latest Up 6 days
mapstore-postgres geosolutions-mapstore/postgis Up 6 days (healthy)
emqx_emqx_1 emqx/emqx:latest Up 6 days
smart-city-redpanda-console docker.redpanda.com/redpandadata/console:v2.5.0 Up About a minute (health: starting)
stellio-api-gateway stellio/stellio-api-gateway:latest-dev Up 3 days
frost_allinone-web-1 fraunhoferiosb/frost-server:latest Up 6 days
geoserver_stack-geoserver-1 oscarfonts/geoserver:2.25.2 Up 6 days (healthy)
grafana_stack-grafana-1 grafana/grafana:latest Up 6 days
frost_http-web-1 fraunhoferiosb/frost-server-http:latest Up 6 days
esperotech esperotech/yaade:latest Up 6 days
digital-twin-nodered nodered/node-red:3.1 Up 6 days (healthy)
digital-twin-connector python:3.11-slim Up About an hour
gitea gitea/gitea:latest Up 6 days
honcho-grafana-1 grafana/grafana:11.4.0 Up 6 days (healthy)
honcho-prometheus-1 prom/prometheus:v3.2.1 Up 5 days (healthy)
honcho-api-1 honcho:latest Restarting (1) 11 seconds ago
honcho-deriver-1 honcho-deriver Up 6 days (healthy)
phpipam-phpipam-web-1 phpipam/phpipam-www:latest Up 6 days
phpipam-phpipam-cron-1 phpipam/phpipam-cron:latest Up 6 days

View File

@@ -27,7 +27,7 @@
# Input: MQTT Consumer - Mosquitto
[[inputs.mqtt_consumer]]
servers = ["tcp://smart-city-mosquitto:1883"]
servers = ["tcp://smart-city-digital-twin-martinique-mosquitto-1:1883"]
topics = [
"airquality/#",
"traffic/#",
@@ -41,9 +41,9 @@
data_format = "json"
qos = 0
# Input: MQTT Consumer - BunkerM (with auth)
# Input: MQTT Consumer - BunkerM
[[inputs.mqtt_consumer]]
servers = ["tcp://bunkerm_bunkerm_1:1900"]
servers = ["tcp://bunkerm-bunkerm-1:1900"]
topics = [
"airquality/#",
"traffic/#",