# Modul H – IoT-Praxis-Stack (Portainer)

## Inhalt
- `docker-compose-portainer.yml` – **empfohlen**: Mosquitto + Node-RED OHNE Host-Datei
  (die mosquitto.conf entsteht automatisch im Container). Ideal bei reiner Portainer-Weboberfläche.
- `docker-compose.yml` – Variante mit Host-Bind-Mount (für später, Modell 2 mit ACL/Passwörtern).
- `mosquitto.conf` – Broker-Konfiguration für die bind-mount-Variante.

## Schnellstart – Variante A (empfohlen, ohne Host-Zugriff)
1. Portainer → Umgebung **local** → **Stacks** → **Add stack** → Name z. B. `modulh-iot`.
2. Inhalt von `docker-compose-portainer.yml` in den **Web editor** einfügen.
3. **Deploy the stack**. Fertig – es ist KEINE Datei auf dem Host nötig.
4. Unter **Containers** prüfen: `mh-mosquitto` und `mh-nodered` laufen (grün).

## Schnellstart – Variante B (mit Host-Dateien, für Modell 2)
1. Auf dem Docker-Host:
   ```
   sudo mkdir -p /opt/iot/mosquitto/config /opt/iot/mosquitto/data
   sudo cp mosquitto.conf /opt/iot/mosquitto/config/mosquitto.conf
   ```
2. Portainer → Stacks → Add stack → Inhalt von `docker-compose.yml` einfügen → Deploy.

## Erreichbarkeit
- MQTT-Broker:  `<HOST-IP>:1883` (TCP)  /  `<HOST-IP>:9001` (WebSocket)
- Node-RED:     `http://<HOST-IP>:1880`   ·   Dashboard `http://<HOST-IP>:1880/dashboard` (Dashboard 2.0; bei Legacy-Paket node-red-dashboard: `/ui`)
- Host-IP = IP des Docker-Hosts (meist die Adresse, über die du Portainer aufrufst;
  sonst auf dem Host `hostname -I`). Firewall: eingehend 1883/9001/1880 aus dem LAN zulassen.

## Test (von einem LAN-Rechner)
```
# Terminal A – abonnieren:
mosquitto_sub -h <HOST-IP> -t "bfw/luebeck/#" -v
# Terminal B – senden:
mosquitto_pub -h <HOST-IP> -t "bfw/luebeck/gruppe01/temperatur" -m "23.5"
```

## Kursbetrieb – Modell 1 (gemeinsamer Broker)
- Der Stack wird **einmal zentral** bereitgestellt (z. B. vom Dozenten). Auf einem Docker-Host
  kann Port 1883/1880 nur einmal belegt werden – nicht jede Gruppe deployt einen eigenen Broker.
- Alle Gruppen verbinden sich als **Clients** gegen dieselbe `<HOST-IP>`.
- Trennung über die **Gruppennummer im Topic**: `bfw/luebeck/gruppeNN/...`.
- `mosquitto_pub/sub` und das Python-Skript laufen je Arbeitsplatz (kollidieren nicht);
  das **Node-RED-Dashboard** läuft als gemeinsame Demo (eine Instanz).
- Kein echter Zugriffsschutz: Jede Gruppe kann alle Topics mitlesen. Echte Trennung pro Gruppe
  (Benutzer/Passwort + ACL) folgt mit **Modell 2**.

## Sicherheitshinweis
`allow_anonymous true` ist NUR für die geschlossene Lab-Umgebung gedacht. Für Produktivbetrieb:
anonymen Zugriff abschalten, Benutzer/Passwort (`mosquitto_passwd`) anlegen und TLS aktivieren.
