MEAN.IO on the cloud

MEAN.IO

MEAN.IO è un fullstack framework in javascript ottimizzato per accelerare, semplificare e migliorare lo sviluppo e il deploy delle nostre applicazioni web.

Devo ringraziare @nicolorms per avermi introdotto a questo framework durante un hackathon al Museo della scienza e della tecnica a Milano.

L'acronimo di MEAN indica le tecnologie che ruotano attorno a questo framework:
MongoDB, il database nosql più utilizzato oggi. MongoDB Express, il framework web per Node.js Express.js Angular.js, il famoso framework client side di Google AngularJs Node.js, una piattaforma costruita per la realizzazione di applicazioni scalabili e di facile compilazione. Node.js

In FoootballGuru, Mean.io mi ha permesso di scrivere e manutenere in maniera semplice e dimanica, le API dell'applicazione mobile, scrivendone tutto il backoffice, per la gestione dei dati.

La documentazione del progetto è abbastanza intuitiva, e permette di avere una partenza razzo sullo sviluppo.

Chi come me si avvicina per la prima volta a questo framework e non ha molta familiarità con le tecnologie elencate prima, vede un radicale rallentamento e talvolta perdita di intusiasmo iniziale.

Non nascondo che a volte ho litigato con MEAN, ma appena capita la logica (MVC sia client side che server side), tutto è risultato più semplice e immediato.

Una punto cruciale dello sviluppo di una piattaforma in Node e soprattutto quando si usa MEAN.IO è il deploy.

Esistono molti servizi Paas e Iaas, che permettono il deploy di applicazioni sul cloud. Mi soffermerò su quelli utilizzati nella mia esperienza per FoootballGuru.

OpenShift e Heroku

I primi due PaaS in cui mi sono imbattuto sono OpenShift ed Heroku.
OpenShift, è stato il primo servizio testato, ma i risultati non sono stati eccellenti.

Heroku invece ha permesso un deploy molto agile e una facile manutenzione del sito. L'account gratuito permette una sola applicazione online (container o Dyno), ma molto performante.
Il deploy ha tutte le caratteristiche di un classico repository di GIT remoto, ma vediamolo in dettaglio.
Una volta eseguito il download e installato il client di Heroku, è possibile collegarsi al proprio account:

$ wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh

Se non presente, installare git sul vostro ambiente di sviluppo con il comando

$ sudo apt-get install git

Collegarsi al proprio account con le credenziali tramite il comando

$ heroku login

Instanziare un nuovo repository di git

$ git init
$ git add .
$ git commit -m 'init'

Creare l'applicazione in Heroku

$ heroku create <nomeapp>

Creare una nuova chiave ssh per l'accesso ad Heroku con il comando:

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/adam/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/adam/.ssh/id_rsa.
Your public key has been saved in /Users/adam/.ssh/id_rsa.pub.
The key fingerprint is:
a6:88:0a:0b:74:90:c6:e9:d5:49:d6:e3:04:d5:6c:3e adam@workstation.local

Aggiungere quindi la chiave ssh al client di Heroku

$ heroku keys:clear
$ heroku keys:add

Eseguire quindi la push del repository con git

$ git push heroku master

Per eseguire il progetto in ambiente di produzione, eseguire il comando:

$ heroku config:set NODE_ENV=production

Et voilà, la vostra applicazione è hostata su Heroku.

Digital Ocean

Solo parole di lode per questo stupendo servizio.
La piattaforma, permette di creare una macchina virtuale in circa 50 secondi, qualcosa di veramente incredibile.

La facilità poi di configurazione è rimandata all'abilità dello sviluppatore o del sistemista.
Nel mio caso ho utilizzato una macchina virtuale con Ubuntu 14.04 x64, 1GB di RAM, 30GB SSD, 1 CPU.

Per quanto possano sembrare misere le risorse, permettono di mettere in piedi un ambiente completo e performante.

L'installazione fatta di MEAN.IO su Digital Ocean, è un'installazione base, usando NGINX come web server in HTTPS.

Per prima cosa ho verificato l'installazione di Node.js: nel mio dropplet di Digital Ocean, il comando node -v non forniva alcuna risposta.
Cosa invece diversa per il comando nodejs -v. In questo caso ho creato un link alla foder di nodejs con il comando.

$ sudo ln -s /usr/bin/nodejs /usr/bin/node

Ho clonato il repository con il comando git clone, dopo di che è stato necessario installare il compilatore per node.js

$ sudo apt-get install python-software-properties python g++ make

Installare Bower e Grunt in maniera globale

$ sudo npm install -g bower
$ sudo npm install -g grunt-cli

Installare le dipendenze del progetto di MEAN.IO

$ sudo npm install

Lanciare infine l'applicazione in modalità production

$ export NODE_ENV=production
$ grunt

Al termine consiglio di stoppare il servizio, installare pm2 e eseguire il processo di node tramite il comando.

$ pm2 start server.js

Coming soon:
MEAN.IO on MS Azure

Stay tuned!