Installazione di Node-RED per la progettazione di flussi in ambito IoT

Node-RED è una piattaforma che consente la progettazione visuale di flussi di automazione; è molto usata nel contesto dell’IoT (Internet of Things) ma può essere usata anche per la realizzazione di API, di servizi server, di integrazioni e di prototipi.

I flussi si realizzano con un’interfaccia grafica drag-and-drop, connettendo nodi di vario tipo come: input, output, logica, API, dispositivi IoT, ecc.

Qualche anno fa avevo scritto un paio di post su questo argomento [2][3], ma, siccome potrebbe servirmi per un progetto, ho deciso di riprendere in mano l’argomento.

Nel frattempo ho dovuto sostituire il server su cui facevo le prove e, quindi, mi sono trovato a dover reinstallare Node-RED, riporto in questo i post i passi seguiti.

Installazione di Docker su Ubuntu

Questa volta ho preferito usare un container Docker piuttosto che una installazione diretta sul server Ubuntu, in questo modo dovrebbe essere più semplice aggiornare ed eventualmente trasferire i dati più facilmente.

Quindi per prima cosa ho installato Docker con questi comandi [4], sl mio server al momento c’è Ubuntu 22.04.5 LTS:

# Aggiorna la lista dei pacchetti disponibili
sudo apt-get update

# Installa certificati SSL e curl (necessari per scaricare chiavi e accedere ai repository HTTPS)
sudo apt-get install -y ca-certificates curl

# Crea la directory per le chiavi APT di terze parti, se non esiste
sudo install -m 0755 -d /etc/apt/keyrings

# Scarica la chiave GPG ufficiale di Docker e salvala nella cartella delle chiavi
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# Imposta i permessi di lettura per la chiave, per consentirne l'uso ad APT
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Aggiunge il repository ufficiale di Docker alla lista delle fonti APT, usando la chiave appena salvata
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" |  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Ricarica la lista dei pacchetti, ora includendo anche Docker
sudo apt-get update

# Installa Docker Engine, CLI, containerd, e i plugin Buildx e Compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Test: esegue un container Docker di prova per verificare che l'installazione funzioni
sudo docker run hello-world

Ho installato Docker con l’utente root, può essere opportuno, in un sistema di produzione, installarlo con un altro utente per motivi di sicurezza.

L’ultimo comando serve a verificare che Docker sia installato e funzioni correttamente, l’output dovrebbe essere simile a quello di questo screenshot:

Istallazione di Node-RED su Ubuntu

A questo punto, per creare il container di Node-RED, ho eseguito i seguenti passaggi

mkdir /root/dockerdata/nodered
cd /root/dockerdata/nodered 
vi docker-compose.yml

Nel file docker-compose.yml ho inserito il seguente contenuto:

version: '3.8'
services:
  node-red:
    image: nodered/node-red:latest
    container_name: mynodered
    restart: unless-stopped
    ports:
      - "1880:1880"
    volumes:
      - node_red_data:/data
    environment:
      - TZ=Europe/Rome

volumes:
  node_red_data:

E, infine, ho lanciato il seguente comando per creare il container: docker compose up -d

L’inmstallazione è finita ed il comando docker ps dovrebbe mostrare che il container:

  • E’ in esecuzione.
  • E’in ascolto sulla porta 1880 di tutte le interfacce di rete.
  • Ha un certo container id con quale può essere riferito, ma anche un nome che è più facile da usare: mynodered.

Qui di seguito elenco alcuni comandi che uso spesso per gestire i container, si può anche far riferimento a questo cheat-sheet per ipararne altri [5]:

docker ps                             # Mostra i container in esecuzione
docker ps -a                          # Mostra tutti i container, inclusi quelli fermati

docker start mynodered               # Avvia il container chiamato 'mynodered'
docker stop mynodered                # Ferma il container 'mynodered'
docker restart mynodered             # Riavvia il container 'mynodered'

docker rm mynodered                  # Rimuove il container 'mynodered' (deve essere fermo)

docker images                        # Elenca tutte le immagini Docker locali
docker pull nodered/node-red         # Scarica l’immagine 'nodered/node-red' da Docker Hub
docker rmi nodered/node-red          # Rimuove l’immagine 'nodered/node-red' dal sistema

docker exec -it mynodered /bin/bash  # Apre una shell bash interattiva nel container 'mynodered'
                                     # ⚠️ Funziona solo se l'immagine ha /bin/bash disponibile

docker system prune                  # Rimuove risorse inutilizzate (container, immagini, volumi, network NON usati)
                                     # ⚠️ ATTENZIONE: può cancellare dati se usato con leggerezza

docker volume inspect nodered_node_red_data  # Mostra dettagli sul volume 'nodered_node_red_data'

docker volume ls                     # Elenca tutti i volumi Docker

docker volume rm                     # ❌ Errore: comando incompleto, manca il nome del volume
docker

Pubblicazione del servizio

A questo punto Node-RED è in esecuzione e potrebbe essere raggiunto all’indirizzo http://localhost:1880, se il server avesse un ambiente grafico e un browser. ma siccome, come in questo caso, è una condizione non si verifica mai, allora è necessario fare in modo che si possa accedere anche dall’indirizzo: http://<indirizzo_ip_del_server>:1880.

Questo si può fare agendo sul firewall, magari con un comando come:

sudo ufw allow 1880/tcp
sudo ufw status

Io ho preferito creare un virtual host su Apache in modo tale da accedere al servizio con un dominio dedicato e sulla porta 443 (SSL).

In pratica ho eseguito questi passi:

  1. Ho modificato il DNS in modo tale che il dominio nodered.claudiobattaglino.it punti al mio server Ubuntu.
  2. Ho creato un virtual host così definito:
    <VirtualHost *:80>
        ServerName nodered.claudiobattaglino.it
    
        ProxyPreserveHost On
        ProxyRequests Off
        ProxyPass / http://localhost:1880/
        ProxyPassReverse / http://localhost:1880/
    
        ErrorLog ${APACHE_LOG_DIR}/nodered_error.log
        CustomLog ${APACHE_LOG_DIR}/nodered_access.log combined
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =nodered.claudiobattaglino.it
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    </VirtualHost>
    

     

  3. Ho installato usando Let’s Encrypt un certificato SSL per questo virtual host.
  4. Riavviato Apache.

Ora Node-RED è raggiungibile all’indirizzo: https://nodered.claudiobattaglino.it (quando il container docker è avviato ovviamente).

 

Impostazione di una password

A installazione terminata è consigliabile proteggere l’accesso all’interfaccia di Node-RED con una password perché purtroppo, di default, l’autenticazione è disabilitata.

Per attivarla ed impostare un account di accesso è necessario seguire questa procedura:

docker exec -it mynodered /bin/bash #Apre una shell sul container mynodered
node-red admin hash-pw #genera una password per l'utente admin (quando richiesto, inserire la password scleta e segnarsi l'hash che genera il comando)
vi /data/settings.js #editare il file settings.js

Nel file settings.js, cercare la sezione commentata contenente adminAuth e scrivere:

adminAuth: {                                                                    
    type: "credentials",                                                         
    users: [{                                                                    
        username: "admin",                                             
        password: "<hashdella_pasword_generata_prima>",
        permissions: "*"           
    }]                                                                 
},

A questo punto basta riavviare il container e accedere al sito per verificare che sia attiva l’autenticazione:

L’account per accedere è admin / <password_impostata_prima>.

Prossimi sviluppi

Ho letto che sono stati sviluppati dei nodi per interrogare e interagire con modelli LLM. Questa è una cosa molto importante perché può facilitare la realizzazione di flussi molto utili.

Io ovviamente lo userò per le solite cazzatine, per esempio, si potrebbe realizzare un flusso nell’ambito dell’IoP (Internet of Plants) per monitorare lo stato di piante.

Stay tuned!!!

 

Fonti e riferimenti

  1. Node Red, sito ufficiale.
  2. Web service con Node Red: come rendere disponibili i dati di una misurazione, su questo blog.
  3. Un corso interessante su NodeRed, su questo blog.
  4. Installazione di Docker su Ubuntu, documentazione ufficiale.
  5. The Ultimate Docker Cheat Sheet, su DockerLabs.
  6. Istruzioni per creare un certificato con Let’s Encrypt.
  7. Node-RED Essentials, presenbtazione ufficiale del prodotto su Youtube.
  8. Elenco dei nodi disponibili su Node-RED, sul sito ufficiale.
5 giorni ago

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *