Visto che ho ricevuto molte richieste tramite Corso JavaScript, su come iniziare a programmare e pubblicare dei progetti con JavaScript / NodeJS ho deciso di scrivere questo post e spero che possa essere utile.
Heroku può essere anche essere controllato via Dashboard Web, ma il terminale è meno dispersivo
Molti hanno iniziato a programmare e a pubblicare i propri lavori attraverso Altervista, un hosting gratuito per PHP oppure attraverso CPanel, ed è comprensibile. Tuttavia per NodeJS le cose funzionano un po' diversamente e nonostante sia improbabile trovare un hosting gratuito NodeJS è comunque possibile avvicinarsi a qualcosa di analogo.
La tecnologia che consiglio per mettere in produzione un'applicazione NodeJS è Docker o comunque Linux Container, tuttavia se si cerca qualcosa di gratis ed immediato questa è la via che consiglio.
La PaaS Heroku e le sue limitazioni
Heroku è la prima Platform as a Service ad avere riscosso un certo successo ed è anche il modo più veloce e con meno manutenzione che ci permette di mostrare qualcosa al mondo :) senza dover diventare sistemisti, in quanto ci dobbiamo preoccupare solo del nostro codice applicativo e lasciamo in gestione a loro il sistema operativo (Linux), i suoi aggiornamenti, la messa in sicurezza, la sua configurazione, database, backup.. e tanti aspetti che almeno all'inizio non fanno la differenza.
Ecco i limiti principali di Heroku gratuito:
Le applicazioni su Heroku non gestiscono file statici, es. upload di immagini, file,.. o meglio se abbiamo questa necessità bisogna appoggiarsi a un server di terze parti: Amazon S3 o altro fornitore, per avere la persistenza.
La nostra applicazione NodeJS (o un'altra tecnologia) chiamata anche Dyno viene "spenta" quando non viene utilizzata per più di 10 minuti (o comunque un tot di tempo), questo significa che a volte bisogna aspettare qualche secondo prima che il nostro sito sia nuovamente visibile. Si risolve passando a un piano a pagamento.
Il database Postgres può avere massimo un cero numero di record. Si risolve passando a un piano a pagamento.
Prerequisiti
Se già siete riusciti a sviluppare qualcosa in NodeJS avete già l'occorrente: npm, nodejs, git, dovete solo installare Heroku CLI, il comando da terminale che vi permette di interagire con l'hosting.
Applicazione NodeJS d'esempio + Database: Ghost
Potrei scrivere un esempio in NodeJS, ma preferisco utilizzare un'applicazione reale. Ghost è una sorta di Wordpress sviluppata in NodeJS, quindi un'applicazione reale per fare blog e che memorizza i post in un database Postgres. Probabilmente quello che il 99% dei siti e applicazioni fanno. Se utilizzate MongoDB, Redis o un altro db la procedura sarà comunque molto simile.
Scompattate il file .zip
che avete scaricato da Ghost e assicuratevi che la struttura sia analoga. Tutti i comandi che eseguiremo saranno dati dall'interno della cartella del progetto ghost-corso-javascript
.
❯ mkdir ghost-corso-javascript
❯ cd ghost-corso-javascript
❯ ls
Gruntfile.js PRIVACY.md config.example.js core npm-shrinkwrap.json
LICENSE README.md content index.js package.json
Inizializzazione del progetto Heroku / NodeJS
Create un file Procfile
, questo file descrive come deve partire la vs applicazione sul server remote.
web: npm start --production
Ora ci autentichiamo con i dati di registrazione che abbiamo ottenuto da Heroku. È necessario farlo una sola volta.
❯ heroku login
...
Perfetto, ora siamo pronti a creare, modificare o monitorare le nostre applicazioni su Heroku, senza necessariamente usare il browser.
Quindi creiamo la nostra prima applicazione pubblica, il nome e le password ci vengono generate in automatico da Heroku e possiamo anche verificarlo nella dashboard web.
❯ heroku create
Creating app... done, ⬢ intense-crag-21138
❯ heroku addons:add heroku-postgresql:hobby-dev --app intense-crag-21138
Creating heroku-postgresql:hobby-dev on ⬢ intense-crag-21138... free
Database has been created and is available
! This database is empty. If upgrading, you can transfer
! data from another database with pg:copy
Created postgresql-rugged-11532 as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation
Ovviamente i nomi generati per voi saranno diversi, ma in questo caso:
- intense-crag-21138 è il nome dell' app
- postgresql-rugged-11532 è il nome del database
Sarà vostra cura mantenere segrete le password associate.
Bene, ora abbiamo un'applicazione vuota e un database associato. Dobbiamo inizializzare un progetto git (l'upload e le modifiche utilizzeranno questa convenzione).
Poi dobbiamo ottenere l'url del database e associare il progetto git al repository git locale a quello remoto. Così come mostrato nei comandi sottostanti.
❯ git init
❯ heroku config --app intense-crag-21138
=== intense-crag-21138 Config Vars
DATABASE_URL: postgres://vxwuvgbqigvmhp:_cDFRk8HgoNXRDT7Q8IIeI-lJ7@ec2-54-243-249-56.compute-1.amazonaws.com:5432/df0vo3enil32je
DATABASE_URL: postgres://user:password@host:port/dbname
❯ heroku git:remote -a intense-crag-21138
set git remote heroku to https://git.heroku.com/intense-crag-21138.git
Di tutte le modifiche fatte finora la nostra applicazione Ghost non è a conoscenza, quindi ora dobbiamo farle conoscere i parametri di produzione quando partirà in modalità production.
Quindi costruiamo il nostro config.js
così come suggerito nell'esempio e andiamo a modificare la parte "production" con i dati che abbiamo in possesso.
Come potete vedere in produzione, in questo caso, si può utilizzare addirittura un db diverso (Postgres) rispetto a quello usato in sviluppo (SQLite) e partendo dalla dburl che siamo in possesso ricaviamo: host, user, password e il nome del database.
❯ cp config.example.js config.js
production: {
url: 'http://intense-crag-21138.herokuapp.com',
mail: {},
database: {
client: 'postgres',
connection: {
host: 'ec2-54-243-249-56.compute-1.amazonaws.com',
user: 'vxwuvgbqigvmhp',
password: '_cDFRk8HgoNXRDT7Q8IIeI-lJ7',
database: 'df0vo3enil32je',
port: '5432'
},
debug: false
},
server: {
host: '0.0.0.0',
port: process.env.PORT
}
},
Ci siamo quasi, ora dobbiamo solo più aggiungere le modifiche a git e pubblicare online i cambiamenti. Questi 3 comandi sono quelli che utilizzeremo ogni volta che vogliamo sincronizzare il codice locale con il codice remoto.
❯ git add .
❯ git commit -m "Guarda mamma, ho l'app NodeJS online"
❯ git push heroku master
Counting objects: 491, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (468/468), done.
...
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing...
remote: Done: 53.5M
remote: -----> Launching...
remote: Released v4
remote: https://intense-crag-21138.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/intense-crag-21138.git
* [new branch] master -> master
Congratulazioni, la vostra app NodeJS + Database è visibile a tutti su internet! Nel log si vede che è riconosciuta come app NodeJS, vengono ricevuti i cambiamenti e il sito punta alla nuova versione.
Bello, ma come si fa a sapere se sta funzionando correttamente?
Manutenzione e debugging
Non potendo gestire il server direttamente, Heroku ci mette comunque a disposizione dei tool per fare il deploy e capire come sta funzionando dietro le quinte.
Uptime. Con il seguente comando sappiamo da quanto tempo è attiva la nostra app e in che modalità.
❯ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping
=== web (Free): npm start --production (1)
web.1: up 2016/10/17 18:36:58 +0200 (~ 6m ago)
Sta funzionando correttamente? Con i seguenti comandi possiamo vedere i log e/o riavviare la nostra istanza di app remota.
❯ heroku logs
..
❯ heroku restart
Restarting dynos on ⬢ intense-crag-21138... done