Une installation IOTstack sur Raspberry Pi vous fournit Node-RED, InfluxDB et Grafana sous forme de conteneurs Docker que vous pouvez reconstruire, mettre à jour et sauvegarder en quelques commandes. Dans ce tutoriel, vous allez installer IOTstack, sélectionner les conteneurs dont vous avez besoin, connecter Node-RED à un broker MQTT externe plutôt qu'à un conteneur Mosquitto local, stocker les mesures dans InfluxDB et les représenter dans Grafana. À la fin, vous disposerez d'une stack reproductible et d'une idée claire de ce qui a sa place sur le Pi et de ce qui ne l'a pas.
Ce qu'est IOTstack et pourquoi c'est utile
IOTstack est un projet communautaire qui habille Docker Compose d'un menu. Vous choisissez des services dans une liste, il génère un docker-compose.yml avec des volumes et des ports cohérents, et vous démarrez le tout en une commande. Les avantages par rapport à l'installation native de chaque outil sont réels :
- Isolation. La version de Node.js de Node-RED ne peut entrer en conflit avec rien d'autre sur le Pi.
- Reproductibilité. Toute la stack est décrite dans un fichier plus un dossier
volumes. Copiez les deux sur un nouveau Pi et vous repartez immédiatement. - Mises à jour propres. Récupérez une image plus récente, recréez le conteneur, et revenez en arrière s'il se comporte mal.
Le menu propose aussi un conteneur Mosquitto, que beaucoup de guides installent par réflexe. Demandez-vous si vous en avez besoin. Un broker local ne sert que les appareils capables d'atteindre le Pi. Si vos capteurs sont répartis sur plusieurs sites, si vous voulez consulter vos données depuis votre téléphone sans ouvrir de ports, ou si vous ne voulez tout simplement pas gérer vous-même la sécurité du broker, un broker externe est le meilleur choix. Ici, nous utilisons le broker cloud ConnectMQ, et le Pi devient un pur nœud de traitement et de stockage, par exemple pour les capteurs de votre maison connectée.
| Service | Conteneur dans ce tutoriel | Port |
|---|---|---|
| Node-RED | Oui | 1880 |
| InfluxDB 1.8 | Oui | 8086 |
| Grafana | Oui | 3000 |
| Portainer CE | Facultatif | 9000 |
| Mosquitto | Non, remplacé par un broker cloud | n/a |
Installer IOTstack sur le Raspberry Pi
Partez de Raspberry Pi OS Lite ou Desktop, en 64 bits, entièrement à jour. L'installateur d'IOTstack configure Docker, le plugin Compose et le dossier IOTstack dans votre répertoire personnel :
sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://raw.githubusercontent.com/SensorsIot/IOTstack/master/install.sh | bash
Le script peut vous demander de redémarrer pour que votre utilisateur rejoigne le groupe docker. Après le redémarrage, vérifiez que Docker fonctionne sans sudo :
docker version
docker compose version
Lancez ensuite le menu :
cd ~/IOTstack
./menu.sh
Choisissez Build Stack, puis utilisez la barre d'espace pour sélectionner nodered, influxdb et grafana (et portainer-ce si vous aimez avoir une interface web pour les conteneurs). Lorsque vous sélectionnez Node-RED, le menu propose des nœuds complémentaires. Cochez node-red-contrib-influxdb et node-red-dashboard (ou le paquet plus récent Dashboard 2.0 s'il est listé). Laissez mosquitto décoché. Quittez le menu et démarrez la stack :
cd ~/IOTstack
docker compose up -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
Les trois conteneurs doivent afficher Up. Les données se trouvent sous ~/IOTstack/volumes/, avec un dossier par service.
Créer la base InfluxDB
Le service influxdb d'IOTstack est InfluxDB 1.8, qui utilise InfluxQL et n'a pas d'assistant de configuration. Créez une base de données et une politique de rétention depuis le conteneur :
docker exec -it influxdb influx
CREATE DATABASE sensors
CREATE RETENTION POLICY "ninety_days" ON "sensors" DURATION 90d REPLICATION 1 DEFAULT
SHOW DATABASES
exit
Les conteneurs d'un même projet Compose partagent un réseau et se joignent par leur nom de service. C'est pourquoi Node-RED et Grafana utiliseront http://influxdb:8086, et non localhost.
Connecter Node-RED à un broker MQTT externe
Ouvrez Node-RED sur http://<pi-ip>:1880. Faites glisser un nœud mqtt in sur le canevas et modifiez son serveur :
- Server :
broker.connectmq.com - Port :
1883pour les tests sur le broker public - Protocol : MQTT V5 (ou 3.1.1)
- Client ID : une valeur unique et non vide, par exemple
iotstack-nr-5d02e8 - Topic :
connectmq/demo/5d02e8/+/climate - Output : un objet JSON analysé
Le broker public ne demande aucun identifiant : vous pouvez tester tout de suite. N'oubliez pas que le serveur MQTT public gratuit est lisible par tout le monde et réservé aux tests, d'où le segment aléatoire dans le topic. Si vous découvrez les nœuds MQTT de Node-RED, le tutoriel Node-RED MQTT détaille le nœud de configuration.
Le flow Node-RED : de MQTT vers InfluxDB
Importez le flow ci-dessous via Menu, Import. Il s'abonne au topic climat de chaque pièce, extrait le nom de la pièce du topic et écrit un point dans InfluxDB.
[
{
"id": "mqttIn1",
"type": "mqtt in",
"name": "climate in",
"topic": "connectmq/demo/5d02e8/+/climate",
"qos": "1",
"datatype": "json",
"broker": "broker1",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 140, "y": 100,
"wires": [["toPoint1"]]
},
{
"id": "toPoint1",
"type": "function",
"name": "to InfluxDB point",
"func": "const room = msg.topic.split('/')[3];\nconst p = msg.payload;\nif (typeof p.t !== 'number') { return null; }\nmsg.measurement = 'climate';\nmsg.payload = [\n { temperature: p.t, humidity: p.rh },\n { room: room }\n];\nreturn msg;",
"outputs": 1,
"x": 360, "y": 100,
"wires": [["influxOut1"]]
},
{
"id": "influxOut1",
"type": "influxdb out",
"influxdb": "influxCfg1",
"name": "write sensors",
"measurement": "",
"precision": "",
"retentionPolicy": "",
"x": 580, "y": 100,
"wires": []
},
{
"id": "broker1",
"type": "mqtt-broker",
"name": "ConnectMQ public",
"broker": "broker.connectmq.com",
"port": "1883",
"clientid": "iotstack-nr-5d02e8",
"autoConnect": true,
"usetls": false,
"protocolVersion": "5",
"keepalive": "60",
"cleansession": true
},
{
"id": "influxCfg1",
"type": "influxdb",
"hostname": "influxdb",
"port": "8086",
"database": "sensors",
"name": "IOTstack InfluxDB",
"influxdbVersion": "1.x"
}
]
Le nœud function renvoie un tableau de deux objets, les champs d'abord et les tags ensuite, ce qui correspond au format attendu par node-red-contrib-influxdb pour un point unique avec tags. Déployez, puis publiez une mesure de test :
mosquitto_pub -h broker.connectmq.com -p 1883 -i tester-5d02e8 -q 1 \
-t connectmq/demo/5d02e8/office/climate -m '{"t":22.4,"rh":41}'
Vérifiez qu'elle est bien arrivée :
docker exec -it influxdb influx -database sensors \
-execute 'SELECT * FROM climate ORDER BY time DESC LIMIT 5'
Grafana sur l'IOTstack Raspberry Pi
Ouvrez Grafana sur http://<pi-ip>:3000, connectez-vous avec le compte admin par défaut et changez le mot de passe. Ajoutez une source de données :
- Connections, Data sources, Add, InfluxDB.
- Langage de requête : InfluxQL.
- URL :
http://influxdb:8086. - Base de données :
sensors. Aucun utilisateur ni mot de passe n'est nécessaire avec la configuration IOTstack par défaut. - Save and test.
Créez un tableau de bord avec un panneau Time series et cette requête :
SELECT mean("temperature") FROM "climate"
WHERE $timeFilter
GROUP BY time($__interval), "room" fill(none)
Saisissez $tag_room dans le champ ALIAS de l'éditeur de requête et vous obtenez une courbe clairement libellée par pièce. Si vous préférez InfluxDB 2 et Flux, IOTstack propose aussi un service influxdb2 ; le tutoriel Raspberry Pi Grafana InfluxDB présente la partie Flux en détail.
Production : identifiants de broker privé et TLS
Pour de vrais déploiements, remplacez le broker public par un broker privé. Sur un broker MQTT managé comme ConnectMQ, vous créez un broker dans le portail et recevez un nom d'utilisateur, un mot de passe et un client ID. Dans Node-RED, modifiez le nœud de configuration mqtt-broker :
- Port
8883, cochez Use TLS et ajoutez une configuration TLS avec Verify server certificate activé. ConnectMQ utilise un certificat Let's Encrypt : aucun fichier d'autorité de certification personnalisé n'est nécessaire. - Client ID :
YOUR_CLIENT_ID. ConnectMQ lie les client ID aux identifiants délivrés : utilisez exactement celui affiché dans le portail. - Onglet Security :
YOUR_USERNAMEetYOUR_PASSWORD.
Node-RED stocke les identifiants chiffrés dans flows_cred.json à l'intérieur de ~/IOTstack/volumes/nodered/data. Définissez un credentialSecret dans le settings.js du même dossier pour que la clé de chiffrement reste stable d'une reconstruction de conteneur à l'autre.
Sauvegardes et mises à jour
La force d'IOTstack est que tout ce qui compte se trouve à deux endroits : docker-compose.yml et volumes/. Une routine simple :
- Arrêtez brièvement la stack avec
docker compose stop(ou utilisez les scripts de sauvegarde d'IOTstack si vous les avez installés). - Archivez le dossier :
sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes. - Redémarrez avec
docker compose up -det copiez l'archive hors du Pi.
Pour mettre à jour les images :
cd ~/IOTstack
docker compose pull
docker compose up -d
docker image prune -f
Figez les tags d'image dans docker-compose.yml pour les services où une mise à niveau majeure inattendue ferait mal, InfluxDB en particulier.
Dépannage
| Symptôme | Cause | Solution |
|---|---|---|
| Le nœud MQTT de Node-RED reste sur « connecting » | Mauvais port ou réglage TLS | 1883 sans TLS, 8883 avec TLS |
| Node-RED affiche « disconnected » juste après la connexion | Client ID en double | Chaque client a besoin de son propre ID |
Erreur du nœud InfluxDB ENOTFOUND influxdb |
Hôte réglé sur localhost |
Utilisez le nom de service influxdb |
| Grafana « database not found » | Base de données non créée | Exécutez CREATE DATABASE sensors |
| Les conteneurs s'arrêtent après un redémarrage | Politique de redémarrage absente | IOTstack définit restart: unless-stopped, vérifiez le fichier |
Démarrer avec ConnectMQ
Laissez IOTstack se charger du traitement et un broker managé gérer les connexions. Créez un compte gratuit sur app.connectmq.com, choisissez l'offre Serverless sans carte bancaire et collez les identifiants générés dans votre nœud de configuration Node-RED. D'autres projets Pi sont rassemblés dans le tutoriel MQTT sur Raspberry Pi.
Questions fréquentes
Ai-je besoin du conteneur Mosquitto dans IOTstack ?
Seulement si tous les appareils sont sur le même réseau local et que vous voulez le broker sur le Pi. Avec un broker cloud externe, Node-RED s'abonne via Internet et vous évitez de gérer la sécurité du broker sur le Pi.
Quelle version d'InfluxDB IOTstack utilise-t-il ?
Le service influxdb correspond à InfluxDB 1.8 avec InfluxQL, et un service distinct influxdb2 fournit la version 2 avec Flux. Choisissez-en un et tenez-vous-y, car les réglages de Node-RED et de Grafana diffèrent.
Puis-je faire tourner IOTstack sur un Raspberry Pi OS 32 bits ?
Certaines images publient encore des versions 32 bits, mais leur prise en charge diminue. Un système 64 bits évite la plupart des problèmes de compatibilité d'images.
Comment déplacer IOTstack vers un nouveau Raspberry Pi ?
Installez IOTstack sur le nouveau Pi, arrêtez-le, puis restaurez votre docker-compose.yml et votre dossier volumes et lancez docker compose up -d.



