# πŸ“ Architecture MQTT pour IPWatch ## 1. Vue d'ensemble L'architecture MQTT d'IPWatch implΓ©mente un systΓ¨me de contrΓ΄le Γ  distance des Γ©quipements rΓ©seau basΓ© sur le protocole MQTT (Message Queuing Telemetry Transport). ### 1.1 Objectifs - **ContrΓ΄le centralisΓ©** : GΓ©rer shutdown/reboot depuis l'interface IPWatch - **LΓ©gΓ¨retΓ©** : Protocol MQTT lΓ©ger et performant - **FiabilitΓ©** : QoS MQTT pour garantir la livraison des messages - **ScalabilitΓ©** : Support de centaines d'Γ©quipements simultanΓ©ment - **IntΓ©gration** : Compatible Home Assistant et autres systΓ¨mes domotiques ### 1.2 Composants ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ IPWatch Ecosystem β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Web Interface │────────►│ Backend β”‚ β”‚ β”‚ β”‚ (Vue.js) β”‚ HTTP β”‚ (FastAPI) β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ API β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ paho-mqtt (publish) β”‚ β”‚ β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ MQTT Broker (Mosquitto) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Topics: β”‚ β”‚ β”‚ β”‚ β€’ ipwatch/device/{IP}/command β”‚ β”‚ β”‚ β”‚ β€’ ipwatch/device/{IP}/status β”‚ β”‚ β”‚ β”‚ β€’ ipwatch/device/{IP}/availability β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ MQTT (subscribe) β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β–Ό β–Ό β–Ό β–Ό β–Ό β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Agent 1 β”‚ β”‚ Agent 2 β”‚ β”‚ Agent 3 β”‚ β”‚ ... β”‚ β”‚ Agent N β”‚ β”‚ β”‚ β”‚ 10.0.0.1β”‚ β”‚ 10.0.0.2β”‚ β”‚ 10.0.0.3β”‚ β”‚ β”‚ β”‚ 10.0.0.Nβ”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Python β”‚ β”‚ Python β”‚ β”‚ Python β”‚ β”‚ Python β”‚ β”‚ Python β”‚ β”‚ β”‚ β”‚ systemd β”‚ β”‚ systemd β”‚ β”‚ systemd β”‚ β”‚ systemd β”‚ β”‚ systemd β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## 2. Topics MQTT ### 2.1 HiΓ©rarchie des Topics ``` ipwatch/ └── device/ └── {IP_ADDRESS}/ β”œβ”€β”€ command # Commandes envoyΓ©es par IPWatch β”œβ”€β”€ status # Statut publiΓ© par l'agent β”œβ”€β”€ availability # DisponibilitΓ© de l'agent (online/offline) └── response # RΓ©ponses/acquittements de l'agent ``` ### 2.2 DΓ©tail des Topics #### `ipwatch/device/{IP}/command` - **Direction** : IPWatch Backend β†’ Agent - **QoS** : 1 (at least once) - **Retain** : false - **Payload** : JSON - **Commandes supportΓ©es** : - `shutdown` : ArrΓͺt de la machine - `reboot` : RedΓ©marrage de la machine - `status` : Demande de statut **Exemple** : ```json { "command": "shutdown", "timestamp": "2025-12-23T10:30:00Z" } ``` #### `ipwatch/device/{IP}/status` - **Direction** : Agent β†’ IPWatch Backend - **QoS** : 1 - **Retain** : false - **Payload** : JSON avec mΓ©triques systΓ¨me **Exemple** : ```json { "hostname": "server-01", "ip": "10.0.0.100", "platform": "Linux", "platform_version": "5.15.0-91-generic", "uptime": 86400, "cpu_percent": 45.2, "memory_percent": 62.5, "disk_percent": 78.3, "timestamp": "2025-12-23T10:30:00Z" } ``` #### `ipwatch/device/{IP}/availability` - **Direction** : Agent β†’ Tous - **QoS** : 1 - **Retain** : true (important!) - **Payload** : Texte simple - **Valeurs** : `online` | `offline` #### `ipwatch/device/{IP}/response` - **Direction** : Agent β†’ IPWatch Backend - **QoS** : 1 - **Retain** : false - **Payload** : JSON avec rΓ©sultat de la commande **Exemple** : ```json { "success": true, "message": "Shutdown en cours...", "timestamp": "2025-12-23T10:30:05Z" } ``` ## 3. Flux de Communication ### 3.1 Shutdown/Reboot ```mermaid sequenceDiagram participant UI as IPWatch UI participant BE as Backend participant BR as MQTT Broker participant AG as Agent (10.0.0.100) UI->>BE: POST /api/tracking/shutdown/10.0.0.100 BE->>BR: PUBLISH ipwatch/device/10.0.0.100/command Note over BR: QoS 1 BR->>AG: {"command": "shutdown"} AG->>BR: PUBLISH ipwatch/device/10.0.0.100/response Note over AG: {"success": true, "message": "Shutdown en cours..."} AG->>BR: PUBLISH ipwatch/device/10.0.0.100/availability Note over AG: "offline" AG->>AG: sudo shutdown -h now BE-->>UI: 200 OK {"message": "Commande envoyΓ©e"} ``` ### 3.2 Wake-on-LAN ```mermaid sequenceDiagram participant UI as IPWatch UI participant BE as Backend participant AG as Agent (offline) UI->>BE: POST /api/tracking/wol/10.0.0.100 BE->>BE: send_magic_packet(MAC) Note over BE: Broadcast UDP BE-->>UI: 200 OK Note over AG: Machine dΓ©marre AG->>AG: Agent systemd dΓ©marre AG->>BR: CONNECT AG->>BR: PUBLISH availability "online" AG->>BR: PUBLISH status {...} ``` ### 3.3 Monitoring pΓ©riodique ```mermaid sequenceDiagram participant AG as Agent participant BR as MQTT Broker participant HA as Home Assistant loop Chaque 30 secondes AG->>BR: PUBLISH ipwatch/device/10.0.0.100/status Note over AG: CPU, RAM, Disk, Uptime BR->>HA: Forward status Note over HA: Update sensors end ``` ## 4. Gestion des Erreurs ### 4.1 Agent dΓ©connectΓ© **ProblΓ¨me** : L'agent perd la connexion MQTT **Solution** : - **Last Will Testament** : Message `offline` publiΓ© automatiquement sur `availability` - **Reconnexion automatique** : L'agent tente de se reconnecter (retry avec backoff) - **QoS 1** : Garantit la livraison du message d'offline ### 4.2 Commande non livrΓ©e **ProblΓ¨me** : La commande n'atteint pas l'agent **Solution** : - **QoS 1** : Le broker MQTT garantit au moins une livraison - **Timeout** : Le backend attend 5 secondes puis retourne une erreur - **Retry** : L'utilisateur peut retenter l'opΓ©ration ### 4.3 Agent en erreur **ProblΓ¨me** : L'agent reΓ§oit la commande mais ne peut l'exΓ©cuter **Solution** : - **Message de rΓ©ponse** : L'agent publie sur `response` avec `success: false` - **Logging** : Logs dΓ©taillΓ©s dans journalctl - **Notification** : L'UI affiche l'erreur Γ  l'utilisateur ## 5. SΓ©curitΓ© ### 5.1 Authentification ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MQTT Broker β”‚ β”‚ (Mosquitto) β”‚ β”‚ β”‚ β”‚ password_file: β”‚ β”‚ /etc/mosquitto/passwdβ”‚ β”‚ β”‚ β”‚ Users: β”‚ β”‚ β€’ ipwatch (backend) β”‚ β”‚ β€’ agent (clients) β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Configuration** : ```bash # CrΓ©er les utilisateurs mosquitto_passwd -c /etc/mosquitto/passwd ipwatch mosquitto_passwd /etc/mosquitto/passwd agent # Dans mosquitto.conf allow_anonymous false password_file /etc/mosquitto/passwd ``` ### 5.2 Chiffrement TLS/SSL ``` listener 8883 cafile /etc/mosquitto/ca.crt certfile /etc/mosquitto/server.crt keyfile /etc/mosquitto/server.key require_certificate false ``` ### 5.3 ACL (Access Control List) ``` # /etc/mosquitto/acl # Backend peut publier sur command user ipwatch topic write ipwatch/device/+/command # Agents peuvent publier sur status/response/availability user agent topic write ipwatch/device/+/status topic write ipwatch/device/+/response topic write ipwatch/device/+/availability topic read ipwatch/device/+/command ``` ## 6. Performance et ScalabilitΓ© ### 6.1 Dimensionnement | MΓ©trique | Valeur | Notes | |----------|--------|-------| | Agents max | 500 | LimitΓ© par le broker | | Messages/sec | 1000 | DΓ©pend du hardware | | Latence | <100ms | Sur rΓ©seau local | | Bande passante | ~10 KB/s par agent | Pour statut 30s | ### 6.2 Optimisations **Payload compression** : - JSON minifiΓ© (pas d'indentation) - Champs courts - Pas de donnΓ©es redondantes **Keep-alive** : - 60 secondes (dΓ©faut) - RΓ©duit le trafic rΓ©seau **QoS adaptatif** : - QoS 1 pour commandes critiques - QoS 0 pour statut non-critique ## 7. CompatibilitΓ© Home Assistant ### 7.1 MQTT Discovery L'agent publie automatiquement sa configuration pour Home Assistant : ```json { "name": "Server 01", "unique_id": "ipwatch_10_0_0_100", "state_topic": "ipwatch/device/10.0.0.100/status", "availability_topic": "ipwatch/device/10.0.0.100/availability", "json_attributes_topic": "ipwatch/device/10.0.0.100/status", "device": { "identifiers": ["ipwatch_10_0_0_100"], "name": "Server 01", "model": "IPWatch MQTT Agent", "manufacturer": "IPWatch" } } ``` **Topic Discovery** : ``` homeassistant/sensor/ipwatch_10_0_0_100/config ``` ### 7.2 EntitΓ©s créées Home Assistant crΓ©e automatiquement : - **Sensor** : CPU, RAM, Disk, Uptime - **Binary Sensor** : Availability (online/offline) - **Button** : Shutdown, Reboot ## 8. Monitoring et Logs ### 8.1 Logs Agent ```bash # Logs en temps rΓ©el sudo journalctl -u ipwatch-mqtt-agent -f # Logs des derniΓ¨res 24h sudo journalctl -u ipwatch-mqtt-agent --since "24 hours ago" # Recherche d'erreurs sudo journalctl -u ipwatch-mqtt-agent -p err ``` ### 8.2 Logs Broker ```bash # Logs Mosquitto sudo journalctl -u mosquitto -f # Activer le debug dans mosquitto.conf log_type all log_dest /var/log/mosquitto/mosquitto.log ``` ### 8.3 MΓ©triques **Collecte via MQTT** : - Nombre de clients connectΓ©s - Messages publiΓ©s/reΓ§us - Latence des messages **Grafana + Prometheus** (optionnel) : - Dashboard pour visualiser les mΓ©triques - Alertes sur dΓ©connexions ## 9. Diagrammes DΓ©taillΓ©s ### 9.1 Γ‰tat de l'Agent ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Start β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Load Config β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Connect MQTT │──┐ β”‚ Broker β”‚ β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ Retry β”‚ Success β”‚ on error β–Ό β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ Subscribe to β”‚ β”‚ β”‚ command topic β”‚ β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β–Ό β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ Publish β”‚β—„β”€β”˜ β”‚ availability β”‚ β”‚ "online" β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Main Loop β”‚ β”‚ β€’ Listen MQTT β”‚ β”‚ β€’ Publish statusβ”‚ β”‚ every 30s β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ Receive shutdown β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Publish β”‚ β”‚ "offline" β”‚ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Execute β”‚ β”‚ shutdown β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## 10. RΓ©fΓ©rences - **MQTT v3.1.1 Specification** : http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html - **Mosquitto Documentation** : https://mosquitto.org/documentation/ - **Paho MQTT Python** : https://github.com/eclipse/paho.mqtt.python - **Home Assistant MQTT Discovery** : https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery ## 11. TODO / AmΓ©liorations Futures - [ ] Support SSL/TLS par dΓ©faut - [ ] Compression des payloads (gzip) - [ ] Authentification par certificat client - [ ] MΓ©triques Prometheus - [ ] Dashboard Grafana - [ ] Support MQTT v5 - [ ] Broadcast pour commandes multi-Γ©quipements - [ ] Planification de shutdown/reboot (cron-like)