# Smart City Digital Twin - Cartographie Docker (Architecture & Réseaux)
**Date** : 05 mai 2026  
**Projet** : `smart-city-digital-twin-martinique`  
**Auteur** : Éric FELIXINE (via Hermes Agent)

---

## 1. Vue d'ensemble
Cette cartographie présente l'architecture Docker complète du jumeau numérique Smart City (Martinique), incluant les conteneurs, images, réseaux et ports exposés.

---

## 2. Liste des Conteneurs Actifs (Projet Smart City)

| Conteneur | Image | Réseaux | Ports |
|-----------|-------|----------|-------|
| `frost-api-8090` | `fraunhoferiosb/frost-server-http:latest` | `bridge`, `frost_http_default` | `0.0.0.0:8090→8080/tcp` |
| `stellio-api-exposed2` | `stellio-api-gateway:exposed` | `stellio-context-broker_default` | `0.0.0.0:8087→8080/tcp` |
| `mosquitto-exporter` | `sapcc/mosquitto-exporter:latest` | `smartcity-shared`, `traefik-public` | `0.0.0.0:9234→9234/tcp` |
| `prometheus-brokers` | `prom/prometheus:latest` | `smartcity-shared`, `traefik-public` | `9090/tcp` |
| `digital-twin-grafana` | `grafana/grafana:10.2.0` | `fiware-gis-quickstart_fiware`, `frost_http_default`, `smartcity-shared`, `traefik-public`, `digital-twin_digital-twin`, `docker_default` | `0.0.0.0:3001→3000/tcp` |
| `geoserver_stack-geoserver-1` | `oscarfonts/geoserver:2.25.2` | `frost_http_default`, `traefik-public` | `8080/tcp` |
| `grafana_stack-grafana-1` | `grafana/grafana:latest` | `frost_http_default`, `traefik-public` | `3000/tcp` |
| `frost_http-database-1` | `postgis/postgis:16-3.4-alpine` | `frost_http_default` | `5432/tcp` |
| `openremote-keycloak-1` | `openremote/keycloak:latest` | `openremote_default`, `smartcity-shared` | `8080/tcp`, `8443/tcp` |
| `openremote-manager-1` | `openremote/manager:latest` | `smartcity-shared`, `openremote_default` | `1883/tcp`, `8080/tcp`, `8443/tcp`, `127.0.0.1:8405→8405/tcp` |
| `openremote-postgresql-1` | `openremote/postgresql:latest-slim` | `openremote_default` | `5432/tcp`, `8008/tcp`, `8081/tcp` |
| `traefik` | `traefik:v3.0` | `openremote_default`, `traefik-public` | `0.0.0.0:80→80/tcp`, `0.0.0.0:443→443/tcp`, `0.0.0.0:1884→1884/tcp`, `127.0.0.1:9080→8080/tcp` |
| `mosquitto-traefik` | `eclipse-mosquitto:2.0` | `smartcity-shared`, `traefik-public` | `0.0.0.0:1883→1883/tcp`, `127.0.0.1:38084→8081/tcp`, `127.0.0.1:38884→8883/tcp` |
| `emqx_emqx_1` | `emqx/emqx:latest` | `emqx_default`, `smartcity-shared`, `traefik-public` | `4370/tcp`, `5369/tcp`, `8083-8084/tcp`, `0.0.0.0:11883→1883/tcp`, `0.0.0.0:18081→8081/tcp`, `0.0.0.0:18883→8883/tcp`, `0.0.0.0:38083→18083/tcp` |
| `stellio-search-service` | `stellio/stellio-search-service:latest-dev` | `stellio-context-broker_default`, `traefik-public`, `smartcity-shared` | `8083/tcp` |
| `stellio-subscription-service` | `stellio/stellio-subscription-service:latest-dev` | `smartcity-shared`, `stellio-context-broker_default`, `traefik-public` | `8084/tcp` |
| `stellio-kafka` | `confluentinc/cp-kafka:8.1.0` | `stellio-context-broker_default` | `9092/tcp`, `0.0.0.0:29092→29092/tcp` |
| `stellio-postgres` | `stellio/stellio-timescale-postgis:16-2.24.0-3.6` | `stellio-context-broker_default` | `5432/tcp` |
| `stellio-api-gateway` | `stellio/stellio-api-gateway:latest-dev` | `stellio-context-broker_default`, `traefik-public`, `smartcity-shared` | `8080/tcp` |
| `digital-twin-nodered` | `nodered/node-red:3.1` | `docker_default`, `smartcity-shared`, `traefik` | `0.0.0.0:1880→1880/tcp` |
| `digital-twin-postgis` | `postgis/postgis:15-3.4` | `digital-twin_digital-twin`, `docker_default`, `smartcity-shared` | `0.0.0.0:5433→5432/tcp` |
| `digital-twin-connector` | `python:3.11-slim` | `digital-twin_digital-twin` | - |
| `digital-twin-influxdb` | `influxdb:2.7-alpine` | `digital-twin_digital-twin`, `docker_default`, `smartcity-shared` | `0.0.0.0:8086→8086/tcp` |
| `fiware-gis-quickstart-orionproxy-1` | `fiware-gis-quickstart-orionproxy` | `fiware-gis-quickstart_fiware` | `127.0.0.1:1026→80/tcp` |
| `fiware-gis-quickstart-orion-1` | `quay.io/fiware/orion-ld` | `fiware-gis-quickstart_fiware`, `smartcity-shared`, `traefik-public` | `127.0.0.1:2026→1026/tcp` |
| `honcho-grafana-1` | `grafana/grafana:11.4.0` | `honcho_default` | `127.0.0.1:3088→3000/tcp` |
| `honcho-prometheus-1` | `prom/prometheus:v3.2.1` | `honcho_default` | `127.0.0.1:9091→9090/tcp` |

---

## 3. Liste des Réseaux Docker (Projet)

| Réseau | Conteneurs Connectés |
|---------|----------------------|
| `smartcity-shared` | `digital-twin-grafana`, `mosquitto-exporter`, `prometheus-brokers`, `openremote-keycloak-1`, `openremote-manager-1`, `stellio-search-service`, `stellio-subscription-service`, `stellio-api-gateway`, `digital-twin-nodered`, `digital-twin-postgis`, `digital-twin-influxdb`, `emqx_emqx_1`, `fiware-gis-quickstart-orion-1` |
| `frost_http_default` | `frost-api-8090`, `geoserver_stack-geoserver-1`, `grafana_stack-grafana-1`, `digital-twin-grafana`, `frost_http-database-1` |
| `stellio-context-broker_default` | `stellio-api-exposed2`, `stellio-search-service`, `stellio-subscription-service`, `stellio-kafka`, `stellio-postgres`, `stellio-api-gateway` |
| `traefik-public` | `digital-twin-grafana`, `mosquitto-exporter`, `prometheus-brokers`, `geoserver_stack-geoserver-1`, `stellio-search-service`, `stellio-subscription-service`, `stellio-api-gateway`, `emqx_emqx_1`, `digital-twin-nodered`, `traefik` |
| `digital-twin_digital-twin` | `digital-twin-grafana`, `digital-twin-postgis`, `digital-twin-connector`, `digital-twin-influxdb` |
| `docker_default` | `digital-twin-grafana`, `digital-twin-postgis`, `digital-twin-influxdb`, `digital-twin-nodered` |
| `fiware-gis-quickstart_fiware` | `fiware-gis-quickstart-orionproxy-1`, `fiware-gis-quickstart-orion-1`, `digital-twin-grafana` |
| `openremote_default` | `openremote-keycloak-1`, `openremote-manager-1`, `openremote-postgresql-1`, `traefik` |
| `emqx_default` | `emqx_emqx_1` |
| `honcho_default` | `honcho-grafana-1`, `honcho-prometheus-1` |
| `bridge` | `frost-api-8090` |

---

## 4. Diagramme d'Architecture (Mermaid)

```mermaid
graph TD
    subgraph Traefik_Public [Traefik Public Network]
        TR[Traefik\n:80/:443] --- DG[digital-twin-grafana\n:3001]
        TR --- MO[mosquitto-exporter\n:9234]
        TR --- PR[prometheus-brokers\n:9090]
        TR --- GE[geoserver\n:8080]
        TR --- SG[stellio-search\n:8083]
        TR --- SS[stellio-subscription\n:8084]
        TR --- AG[stellio-api-gateway\n:8087]
        TR --- EM[emqx\n:11883/:18883]
        TR --- NR[digital-twin-nodered\n:1880]
    end

    subgraph SmartCity_Shared [SmartCity Shared Network]
        DG --- IF[digital-twin-influxdb\n:8086]
        DG --- PG[digital-twin-postgis\n:5433]
        DG --- ORK[openremote-keycloak\n:8080]
        DG --- ORM[openremote-manager\n:8405]
        DG --- ST[stellio-services]
        DG --- EM
    end

    subgraph FROST_Network [FROST Default Network]
        FR[frost-api-8090\n:8090] --- FD[frost-http-database\n:5432]
        FR --- GE
        FR --- DG
    end

    subgraph Stellio_Network [Stellio Context Broker Network]
        ST[stellio-services] --- SA[stellio-api-exposed2\n:8087]
        ST --- SK[stellio-kafka\n:29092]
        ST --- SP[stellio-postgres\n:5432]
    end

    subgraph Orion_Network [FIWARE Orion Network]
        OR[fw-orion-1\n:2026] --- OP[fw-orion-proxy-1\n:1026]
        OP --- DG
    end

    subgraph OpenRemote_Network [OpenRemote Default Network]
        ORK --- ORM
        ORM --- ODB[openremote-postgresql\n:5432]
        ORK --- TR
    end

    subgraph DigitalTwin_Network [Digital Twin Custom Network]
        DG --- IF
        DG --- PG
        DG --- DC[digital-twin-connector]
    end

    %% NOUVEAU : Message Broker Network
    subgraph Message_Broker_Network [Message Broker (Pulsar/Redpanda)]
        MB[Message Broker\n(Pulsar :6650 / Redpanda :9092)]
        MB --- SK  %% Kafka-compatibilité (Stellio Kafka)
    end

    %% Flux de données avec Message Broker
    EM -->|MQTT| MB
    MO -->|Metrics| MB
    MB -->|Topics| OR
    MB -->|Topics| ST
    MB -->|Metrics| PR
    MB -->|Topics| IF
    OR -->|NGSI-LD| FR
    OR -->|NGSI-LD| ST
    IF -->|InfluxDB| DG
    DG -->|Grafana Dashboards| User[Utilisateur]

    %% Note Scorpio integration
    SC[Scorpio (FIWARE)\n:Kafka native] -.->|Kafka| MB
```

---

## 5. Message Broker (Pulsar/Redpanda) - NOUVEAU

Pour faciliter l'ingestion et le routage des données vers plusieurs backends (Prometheus, Context Brokers, etc.), un **message broker** sera ajouté entre les brokers MQTT et les services en aval.

### Options préférées :
- **Apache Pulsar** : Alternative cloud-native à Kafka, avec support natif des topics persistants et de la messagerie multi-tenant.
- **Redpanda** : Compatible Kafka, mais sans dépendance ZooKeeper, plus simple à déployer.

### Intégration avec FIWARE Scorpio :
- **Scorpio** (Context Broker FIWARE) intègre nativement **Kafka**, ce qui facilitera l'interconnexion avec le message broker.

### Nouveau flux de données :
```
MQTT Brokers (EMQX, Mosquitto, BunkerM)
    ↓
Message Broker (Pulsar/Redpanda)
    ↓ ↓ ↓
├─→ Context Brokers (Orion-LD, Stellio, Scorpio)
├─→ Prometheus (via exporter)
├─→ Time-Series DB (InfluxDB, CrateDB)
└─→ autres backends (OpenRemote, GeoServer, etc.)
```

## 6. Connexions Clés

1. **Traefik** (`:80`/`:443`) : Reverse proxy pour tous les services exposés à l'hôte.
2. **Brokers MQTT** (Mosquitto `:1883`, EMQX `:11883`) : Réception des données du simulateur et des capteurs IoT.
3. **Message Broker** (Pulsar `:6650`/Redpanda `:9092`) : **NOUVEAU** - Ingest et routage vers les backends.
4. **Context Brokers** (Orion-LD `:2026`, Stellio `:8087`, Scorpio `:?`) : Reçoivent les données NGSI-LD (Scorpio via Kafka natif).
5. **FROST-Server** (`:8090`) : Stockage des données OGC SensorThings, connecté à PostgreSQL (`frost_http-database-1`).
6. **Grafana** (`:3001`) : Visualisation des données depuis InfluxDB, Prometheus, et (via adaptateurs) Orion-LD/Stellio.
7. **OpenRemote** (`:8080`) : Gestion des assets IoT, authentification via Keycloak, proxyé par Traefik.
8. **GeoServer** (`:8080`) : Serveur de tuiles cartographiques, connecté au réseau FROST.
9. **Node-RED** (`:1880`) : Alternative possible pour le simulateur IoT (projeté).

---

## 6. Références
- **Projet** : `~/smart-city-digital-twin-martinique/`
- **Skills** : `postman-fiware`, `smart-city-traceability-setup`, `openremote-map-configuration`
- **Session Resume** : `session_resume_2026-05-04.md`
- **Documentation Grafana** : `GRAFANA-STATUS-FINAL.md`

---

*Cartographie générée automatiquement le 05 mai 2026 à 14:30 (UTC-4) par Hermes Agent.*