
Uno dei migliori e piĂš conosciuti tool per il âflow-based programmingâ e che fornisce ottimi strumenti per lâInternet of Things è sicuramente Node-RED. Esso è un progetto open source ospitato su GitHub e sviluppato da Nick OâLeary e Dave Conway-Jones della IBM, anche se non è assolutamente basato su tecnologie IBM. La sua caratteristica principale è che è completamente scritto in JavaScript ed HTML e si basa sul framework server-side NodeJS. Ciò significa che può essere eseguito su un qualsiasi PC in cui sia possibile installare NodeJS e con tutti i sistemi operativi disponibili da Windows a Linux passando per Mac OS X.
Questo articolo non intende essere una guida introduttiva o completa a Node-RED ma vuole mostrare come questâultimo possa essere eseguito nel cloud ! Grazie alle sue fondamenta in NodeJS e la potenza di tutti i servizi Microsoft Azure, è possibile creare un Azure Web Site per unâapplicazione NodeJS che ospiti Node-RED in modo da potervi accedere, controllare e svilupparci ovunque ci troviamo !
In questo modo, non câè bisogno di mettere su un server âon premiseâ oppure a casa una delle board maggiormente utilizzate dai makers come la Raspberry Pi o la Intel Galileo. Queste soluzioni vanno bene per scenari dove câè poco carico e traffico sui âflowsâ di Node-RED ma per ottenere un sistema altamente scalabile con milioni di connessioni, lâunica soluzione possibile è quella di utilizzare una PaaS come Microsoft Azure.
Siete interessati a sapere come si ? Partiamo !
Deploy in un Local Git repository su Azure
Il primo passo da fare è quello di procurarsi il codice sorgente di Node-RED, poichè è necessario eseguire una piccola modifica al codice stesso. Abbiamo a disposizione molteplici soluzioni per farlo, grazie alla funzionalità di integrate source control fornita da Azure per i Web Sites. Quando si crea un Web Sites, è possibile impostare il deploy da un source control system in modo che ogni modifica apportata al proprio repository (locale o remoto) viene automaticamente distribuita in produzione su Azure. Il codice sorgente può essere su Visual Studio Online, in un Local Git repository (su Azure), GitHub, Dropbox, Bitbucket, CodePlex oppure su un qualsiasi altro repository esterno basato su Git o Mercurial.
Nel caso di Node-RED, le possibili soluzioni sono quelle di usare un Local Git repository oppure un repository remoto su GitHub. Nel corso dellâarticolo, li vedremo entrambi per completezza ma ciascuno di voi potrĂ scegliere il modo migliore in base alle proprie esigenze.
In primo luogo, bisogna creare un Azure Web Site utilizzando il management portal online.

Per impostare un deploy da un source control system, è possibile utilizzare il link corrispondente nella pagina principale del Web Site appena creato.

Per utilizzare un Local Git repository, è necessario selezionare la corrispondente voce âLocal Git repositoryâ.

Per abilitare il publishing attraverso Git, la prima volta che viene utilizzato, il management portal chiede di impostare le credenziali di accesso (username e password). Queste credenziali sono comuni a tutti i Web Sites, per cui se sono state giĂ impostate, non verrano richieste nuovamente. Al termine di questa operazione, Azure crea un repository Git locale in cui è possibile pubblicare la propria applicazione; per farlo il portale ci mostra i passi da eseguire : scaricare ed installare Git sul proprio PC, creare un repository Git locale e committare lâapplicazione sul repository remoto in Azure.
In questo caso, lâapplicazione locale è Node-RED per cui è necessario scaricarne il codice sorgente attraverso il file zip disponibile sul sito ufficiale. Una volta estratti i file in una cartella sul proprio PC (nel mio caso C:\Users\Paolo\Source\Repos\node-red-0.8.0), usando la Git Bash (nella medesima cartella di Node-RED) è possibile creare il repository locale, aggiungere i file dellâapplicazione ed eseguire il primo commit in locale attraverso I seguenti comandi :
git init
git add .
git commit âm âInitial Node-RED commitâ

(Eâ necessario ricordare che per eseguire il commit, Git richiede di impostare email e username mediante il comand git config per i parametri user.email e user.name)
Il passo successivo consiste nellâaggiungere un server Git remoto ed eseguire il push del master branch sul repository in Azure; dal management portal, nella dashboard del Web Site, è possibile ricavere il nome di tale repository. I comandi da eseguire sono i seguenti :
git remote add azure [repository URL on Azure]
git push azure master
Ovviamente, Git chiede la password per la connessione al repository remoto ed al termine di tale operazione, Azure inizia il deploy, il cui risultato è visibile nel tab Deployments del management portal.

Durante la fase di deploy, Azure esegue anche npm (NodeJS Package Manager) per poter installare tutti i moduli necessari a Node-RED per poter funzionare; tale informazioni è ricavata attraverso il file package.json.
A questo punto sembra di aver finito ma purtroppo navigando allâURL del sito non saremo in grado di visualizzare il tool visuale di Node-RED per la creazione dei âflowsâ. Per risolvere questo problema è necessario effettuare una piccola modifica al file settings.js impostando opportunamente il parametro uiPort nel modo seguente :
// the tcp port that the Node-RED web server is listening on
uiPort: process.env.PORT || 1880,
Al termine dellâarticolo sarĂ piĂš chiaro il perchè di tale modifica.
A questo punto, bisogna committare in locale le modifiche ed aggiornale sul repository in Azure in modo da avviare il re-deploy automatico.
git add .
git commit âm âuiPort setting changedâ
git push azure master
Prima di poter utilizzare Node-RED, manca un ultima modifica. Il tool visuale fa uso intensivo del protocollo WebSocket che è necessario abilitare nella Configure tab del management portal per il Web Site corrente. Resta inteso che questo passo è necessario solo se utilizziamo il tool per la creazione dei âflowsâ che, come sappiamo, sono dei file JSON che potremmo anche sviluppare in locale e caricare in Azure.

Dopo aver eseguito il salvataggio, navigando al Web Site con il proprio browser sarĂ possibile vedere in esecuzione il tool visuale e Node-RED. Siamo pronti per creare i nostri âflowsâ !

Deploy attraverso un repository su GitHub
La seconda possibilitĂ consiste nellâutilizzare un repository su GitHub. Ovviamente, potremmo utilizzare quello ufficiale di Node-RED ma in questo caso non potremmo eseguire la modifica necessaria al file settings.js. Per questo motivo, un buon modo è quello di creare un fork del repository originale attraverso il proprio account GitHub.
Per farlo, è necessario accedere a GitHub con le proprie credenziali, andare sul repository di Node-RED e cliccare su fork.

Una volta completato il fork, GitHub avrĂ creato un repository con un URL di questo tipo https://github.com/<username>/node-red in modo da poterlo clonare sul proprio PC attraverso la Git Bash nel modo seguente :
git clone /node-red.git”>/node-red.git”>https://github.com/<username>/node-red.git
Al termine del cloning, possiamo modificare il file settings.js (come fatto in precedenza) ed eseguire il commit sul repository.
git add .
git commit âm âuiPort setting changedâ
git push
In questo caso, non abbiamo alcun bisogno di un repository Git su Azure poichè stiamo utilizzando quello di GitHub al quale faremo puntare Azure stesso nel momento della creazione del Web Site.
Dopo aver creato un nuovo Web Site come fatto in precedenza, impostiamo il deploy attraverso il source control GitHub.

Microsoft Azure si connette a GitHub e chiede lâautorizzazione a poter accedere a tutti i repository del proprio account in modo da poterci far selezionare a quale repository deve collegarsi per farne il deploy.

Come giĂ fatto in precedenza, è necessario abilitare il protocollo WebSocket per ottenere cosĂŹ lâapplicazione visuale di Node-RED pronta ed in esecuzione !
Test di Node-RED su Azure con un semplice flow di debug
Per essere sicuri che lâapplicazione Node-RED stia funzionando correttamente, possiamo realizzare un semplice flow di debug con i due soli seguenti nodi :
-
inject : permette di iniettare dati in un flow. Il valore di default del payload del messaggio è il timestamp che può essere cambiato in fase di configurazione del nodo;
-
debug : permette la stampa del payload del messaggio ricevuto nella finestra di debug;
Aggiungiamo e colleghiamo i due nodi nel modo seguente.

Cliccando su Deploy, il flow viene deployato ed eseguito nellâistanza di Node-RED e se proviamo a cliccare sul nodo di inject, vedremo il timestamp visualizzato nella finestra di debug. Il nostro flow è in esecuzione su Azure !!
IISNode ⌠la magia per avere Node-RED su Azure
Il componente principale che permette lâesecuzione di applicazioni NodeJS su Azure è il modulo ISS chiamato IISNode, i cui vantaggi sono i seguenti :
-
ha cura del ciclo di vita del processo node.exe;
-
NodeJS è per natura single threaded ma IISNode permette la creazione di piÚ processi node.exe e di gestire il carico delle richieste tra piÚ istanze;
-
si assicura che se unâapplicazione NodeJS viene aggiornata, il processo node.exe venga riciclato;
-
fornisce lâaccesso alle informazioni di log via HTTP;
Talvolta, per garantire lâesecuzione delle applicazioni NodeJS su IISNode sono necessari alcuni piccoli accorgimenti al codice sorgente dellâapplicazione stessa ed in particolare lâimpostazione della porta HTTP di ascolto attraverso la variabile dâambiente process.env.PORT. Ciò spiega il perchè del fatto che il tool visuale di Node-RED non può essere in ascolto sulla porta 1880 (default) ma è necessario impostare la porta su cui è in ascolto IISNode in HTTP.
Conclusioni
Node-RED è un validissimo tool per la realizzazione di progetti per lâInternet of Things attraverso dei âflowsâ con una UI eseguita allâinterno di un browser. Il problema principale è strettamente legato alla sua distribuzione.
Le soluzioni âon premiseâ o locale vanno bene per scenari semplici ma sicuramente non per scenari enterprise. In questo caso possiamo utilizzare le funzionalitĂ di Azure per lâesecuzione delle applicazioni NodeJS aggiungendo anche la scalabilitĂ e la gestione del carico grazie al modulo IISNode allâinterno di IIS.