Una instalación de IOTstack en Raspberry Pi te da Node-RED, InfluxDB y Grafana como contenedores Docker que puedes reconstruir, actualizar y respaldar con unos pocos comandos. En este tutorial instalarás IOTstack, seleccionarás los contenedores que necesitas, conectarás Node-RED a un broker MQTT externo en lugar de a un contenedor local de Mosquitto, guardarás las lecturas en InfluxDB y las graficarás en Grafana. Al final tendrás un stack reproducible y una idea clara de qué debe estar en la Pi y qué no.
Qué es IOTstack y por qué ayuda
IOTstack es un proyecto comunitario que envuelve Docker Compose en un menú. Eliges servicios de una lista, genera un docker-compose.yml con volúmenes y puertos sensatos y lo arrancas todo con un solo comando. Las ventajas frente a instalar cada herramienta de forma nativa son reales:
- Aislamiento. La versión de Node.js de Node-RED no puede entrar en conflicto con nada más en la Pi.
- Reproducibilidad. Todo el stack se describe en un archivo más una carpeta
volumes. Copia ambos a una Pi nueva y vuelves a estar en marcha. - Actualizaciones limpias. Descarga una imagen más reciente, recrea el contenedor y vuelve atrás si algo falla.
El menú también ofrece un contenedor de Mosquitto, y muchas guías lo instalan por inercia. Piensa si lo necesitas. Un broker local solo sirve a los dispositivos que pueden llegar a la Pi. Si tus sensores están en más de un lugar, si quieres acceder a los datos desde el móvil sin abrir puertos o si simplemente no quieres mantener tú mismo la seguridad del broker, un broker externo es mejor opción. Aquí usamos el broker en la nube de ConnectMQ, y la Pi se convierte en un nodo puro de procesamiento y almacenamiento.
| Servicio | Contenedor en este tutorial | Puerto |
|---|---|---|
| Node-RED | Sí | 1880 |
| InfluxDB 1.8 | Sí | 8086 |
| Grafana | Sí | 3000 |
| Portainer CE | Opcional | 9000 |
| Mosquitto | No, se sustituye por un broker en la nube | n/a |
Instalar IOTstack en la Raspberry Pi
Parte de Raspberry Pi OS Lite o Desktop, de 64 bits y totalmente actualizado. El instalador de IOTstack configura Docker, el plugin de Compose y la carpeta de IOTstack en tu directorio personal:
sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://raw.githubusercontent.com/SensorsIot/IOTstack/master/install.sh | bash
El script puede pedirte que reinicies para que tu usuario se una al grupo docker. Tras reiniciar, comprueba que Docker funciona sin sudo:
docker version
docker compose version
Después abre el menú:
cd ~/IOTstack
./menu.sh
Elige Build Stack y usa la barra espaciadora para seleccionar nodered, influxdb y grafana (y portainer-ce si te gusta tener una interfaz web para los contenedores). Al seleccionar Node-RED, el menú ofrece nodos adicionales. Marca node-red-contrib-influxdb y node-red-dashboard (o el paquete más reciente Dashboard 2.0 si aparece). Deja mosquitto sin seleccionar. Sal del menú y arranca el stack:
cd ~/IOTstack
docker compose up -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
Los tres contenedores deberían mostrar Up. Los datos se guardan en ~/IOTstack/volumes/, una carpeta por servicio.
Crear la base de datos de InfluxDB
El servicio influxdb de IOTstack es InfluxDB 1.8, que usa InfluxQL y no tiene asistente de configuración. Crea una base de datos y una política de retención desde dentro del contenedor:
docker exec -it influxdb influx
CREATE DATABASE sensors
CREATE RETENTION POLICY "ninety_days" ON "sensors" DURATION 90d REPLICATION 1 DEFAULT
SHOW DATABASES
exit
Los contenedores del mismo proyecto Compose comparten una red y se alcanzan entre sí por nombre de servicio. Por eso Node-RED y Grafana usarán http://influxdb:8086 y no localhost.
Conectar Node-RED a un broker MQTT externo
Abre Node-RED en http://<pi-ip>:1880. Arrastra un nodo mqtt in al lienzo y edita su servidor:
- Server:
broker.connectmq.com - Port:
1883para probar en el servidor público - Protocol: MQTT V5 (o 3.1.1)
- Client ID: algo único y no vacío, por ejemplo
iotstack-nr-5d02e8 - Topic:
connectmq/demo/5d02e8/+/climate - Output: un objeto JSON ya interpretado
El servidor público no necesita credenciales, así que puedes probar de inmediato. Recuerda que cualquiera puede leer el servidor MQTT público gratuito, pensado para pruebas y no para datos de producción; por eso el topic contiene un segmento aleatorio. Si eres nuevo con los nodos MQTT de Node-RED, el tutorial de Node-RED y MQTT explica a fondo el nodo de configuración.
El flujo de Node-RED: de MQTT a InfluxDB
Importa el flujo siguiente con Menu, Import. Se suscribe al topic de clima de cada habitación, extrae el nombre de la habitación del topic y escribe un punto en 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"
}
]
El nodo function devuelve un array de dos objetos, primero los campos y después las etiquetas, que es el formato que node-red-contrib-influxdb espera para un único punto con etiquetas. Haz Deploy y publica una lectura de prueba:
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}'
Comprueba que ha llegado:
docker exec -it influxdb influx -database sensors \
-execute 'SELECT * FROM climate ORDER BY time DESC LIMIT 5'
Grafana con IOTstack en Raspberry Pi
Abre Grafana en http://<pi-ip>:3000, inicia sesión con la cuenta admin predeterminada y cambia la contraseña. Añade una fuente de datos:
- Connections, Data sources, Add, InfluxDB.
- Lenguaje de consulta: InfluxQL.
- URL:
http://influxdb:8086. - Database:
sensors. No hace falta usuario ni contraseña con la configuración predeterminada de IOTstack. - Save and test.
Crea un dashboard con un panel Time series y esta consulta:
SELECT mean("temperature") FROM "climate"
WHERE $timeFilter
GROUP BY time($__interval), "room" fill(none)
Escribe $tag_room en el campo ALIAS del editor de consultas y obtendrás una línea claramente etiquetada por habitación. Si prefieres InfluxDB 2 y Flux, IOTstack también ofrece un servicio influxdb2; el tutorial de Grafana e InfluxDB en Raspberry Pi muestra en detalle la parte de Flux.
Producción: credenciales de broker privado y TLS
Para despliegues reales, sustituye el servidor público por un broker privado. En un broker MQTT gestionado como ConnectMQ, creas un broker en el portal y recibes un usuario, una contraseña y un client ID. En Node-RED, edita el nodo de configuración mqtt-broker:
- Puerto
8883, marca Use TLS y añade una configuración TLS con Verify server certificate activado. ConnectMQ usa un certificado de Let's Encrypt, así que no necesitas ningún archivo de CA personalizado. - Client ID:
YOUR_CLIENT_ID. ConnectMQ vincula los client ID a las credenciales emitidas, así que usa exactamente el que muestra el portal. - Pestaña Security:
YOUR_USERNAMEyYOUR_PASSWORD.
Node-RED guarda las credenciales cifradas en flows_cred.json dentro de ~/IOTstack/volumes/nodered/data. Define un credentialSecret en settings.js, en la misma carpeta, para que la clave de cifrado se mantenga estable al reconstruir el contenedor.
Copias de seguridad y actualizaciones
La fortaleza de IOTstack es que todo lo que te importa está en dos sitios: docker-compose.yml y volumes/. Una rutina sencilla:
- Detén el stack brevemente con
docker compose stop(o usa los scripts de copia de seguridad de IOTstack si los instalaste). - Archiva la carpeta:
sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes. - Vuelve a arrancar con
docker compose up -dy copia el archivo fuera de la Pi.
Para actualizar las imágenes:
cd ~/IOTstack
docker compose pull
docker compose up -d
docker image prune -f
Fija las etiquetas de imagen en docker-compose.yml para los servicios en los que una actualización mayor inesperada haría daño, sobre todo InfluxDB.
Solución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| El nodo MQTT de Node-RED se queda en "connecting" | Puerto o ajuste TLS incorrectos | 1883 sin TLS, 8883 con TLS |
| Node-RED muestra "disconnected" justo después de conectar | Client ID duplicado | Cada cliente necesita su propio ID |
Error del nodo InfluxDB ENOTFOUND influxdb |
Host configurado como localhost |
Usa el nombre de servicio influxdb |
| Grafana indica "database not found" | Base de datos no creada | Ejecuta CREATE DATABASE sensors |
| Los contenedores se detienen tras reiniciar | Falta la política de reinicio | IOTstack define restart: unless-stopped; revisa el archivo |
Empieza con ConnectMQ
Deja que IOTstack se encargue del procesamiento y que un broker MQTT gestionado gestione las conexiones. Crea una cuenta gratuita en app.connectmq.com, elige el plan Serverless sin tarjeta de crédito y pega las credenciales generadas en el nodo de configuración de Node-RED. Más proyectos con la Pi en el tutorial de MQTT con Raspberry Pi.
Preguntas frecuentes
¿Necesito el contenedor de Mosquitto en IOTstack?
Solo si todos los dispositivos están en la misma red local y quieres el broker en la Pi. Con un broker externo en la nube, Node-RED se suscribe a través de internet y te ahorras mantener la seguridad del broker en la Pi.
¿Qué versión de InfluxDB usa IOTstack?
El servicio influxdb es InfluxDB 1.8 con InfluxQL, y un servicio influxdb2 aparte ofrece la versión 2 con Flux. Elige uno y mantente con él, porque la configuración de Node-RED y Grafana es distinta.
¿Puedo ejecutar IOTstack en Raspberry Pi OS de 32 bits?
Algunas imágenes todavía publican versiones de 32 bits, pero el soporte se está reduciendo. Un sistema operativo de 64 bits evita la mayoría de los problemas de compatibilidad de imágenes.
¿Cómo traslado IOTstack a una Raspberry Pi nueva?
Instala IOTstack en la Pi nueva, detenlo, restaura tu docker-compose.yml y la carpeta volumes, y ejecuta docker compose up -d.



