Installare un ParseServer su server Ubuntu privato? Nulla di più semplice!

Per una mia applicazione mobile mi sono imbattuto nella necessità di avere un database remoto (e quindi condiviso tra piu installazioni) con il minimo sforzo di manutenzione e scrittura di codice (non avevo nessuna voglia di implementare REST e quant’altro per i dati necessari alla mia applicazione).

Cercando qua e là su internet ho scoperto l’esistenza di un’infrastruttura chiamata ParseServer che utilizza un database NoSQL (più info qui).
Tale progetto era inizialmente di proprietà di Facebook che lo ha abbandonato alla fine dell’anno scorso rilasciandone i sorgenti; un gruppo di appassionati lo ha ripreso in mano e a tutt’ora risulta un progetto vivo e molto comodo per le mie necessità (e quelle di tanti altri sviluppatori).
Senza dilungarmi troppo sulla storia di questo progetto, voglio spiegarvi come poter installare l’essenziale per poter cominciare ad utilizzare questa infrastruttura.

Nell’esempio che farò più sotto, ho utilizzato un server Ubuntu 16.04 (in modo tale da avere i pacchetti quanto più aggiornati possibile senza dover compromettere qualche dipendenza di sistema).

Iniziamo con installare node.js (su cui si basa l’intera applicazione ParseServer e ParseDashboard che vedremo poi) e tutti i pacchetti necessari per permettere l’installazione.
Diamo i seguenti comandi da terminale:

sudo apt-get install curl
cd ~
curl -sL https://deb.nodesource.com/setup_9.x -o nodesource_setup.sh
sudo -E bash ./nodesource_setup.sh

Spiegazione dei comandi:
– Il primo comando installa curl (un comando che ci permette il trasferimento di file tramite URL) nel caso non sia gia installato.
– Il secondo comando cd ~ ci permette di spostarci sulla directory home del nostro utente (nel caso non fossimo già li).
– Il terzo comando scarica tramite curl appena installato, uno script bash che si occupa di aggiornare automaticamente i repository di Ubuntu, in modo tale da poter scaricare sempre l’ultima versione disponibile di node.js (v8 in questo caso) e non quella presente nei repository standard (potenzialmente più vecchia).
– Il quarto comando non è altro che l’esecuzione dello script precedentemente scaricato.

Installazione di nodeJS e dipendenze:
Una volta che fino all’ultimo comando è stato terminato, possiamo dare il seguente comando che installera cURL, git e il meta-pacchetto di utility per la compilazione di sorgenti build:

sudo apt-get install -y nodejs build-essential git


Abbiamo il necessario per procedere all’installazione dei pacchetti veri e propri, procediamo

Come dicevo qualche riga più sopra, ParseServer si affida al database NoSQL mongodb per la persistenza del dato.
Come potete ben intuire quindi, risulta necessario installare anche mongodb perchè tutto giri correttamente.
Diamo i seguenti comandi (la spiegazione sotto)

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

Spiegazione dei comandi:
– Il primo comando importa la chiave necessaria all’accesso al repository messo a disposizione della community di mongodb
– Il secondo comando crea nella lista repositories un nuovo list con appunto il repo per il download del pacchetto mongodb
– Il terzo comando semplicemente aggiorna la lista dei pacchetti disponibili all’installazione sul sistema in uso
– Il quarto procede all’installazione del pacchetto mongodb-org confermando automaticamente ogni richiesta.

Al termine dell’installazione procediamo con il comando

sudo service mongod enabled
sudo service mongod start

– Il primo comando serve ad attivare il servizio del demone mongodb ad ogni riavvio del sistema.
– Il secondo ad attivare il demone in questo momento.

C’è un comando che permette di accedere ai database mongo installati nel sistema e poter fare query ed aggiornamenti direttamente da terminale.
Il comando è mongo e vi rimando qui per ogni eventuale utilizzo.

Ora finalmente installiamo ParseServer e ParseDashboard
Ora che tutto è pronto, possiamo installare i due pacchetti sul nostro sistema con questo semplice comando:
sudo npm install -g parse-server parse-dashboard
La procedura potrebbe richiedere qualche secondo in quanto vengono scaricati i due pacchetti e le loro dipendenze.

Una volta terminato potremmo verificare la corretta installazione verificando con

which parse-server
which parse-dashboard

Il risultato dovrebbe essere una path simile a questa:

/usr/bin/parse-server

e

/usr/bin/parse-dashboard

Finito! Installazione terminata!…….e ora?
E ora le cose si articolano un pochino.
Personalmente io ho optato per creare due files di configurazione in formato json (uno per il parse-server e uno per parse-dashboard) all’interno di una direcotry come /opt/parse.
Lanciando le due applicazioni nodeJS con i seguenti comandi:


/usr/bin/parse-server /opt/parse/servers/myApp/server-config.json
/usr/bin/parse-dashboard --config /opt/parse/dashboard-config.json

Riporto due esempi dei files di configurazione:
server-config.json

{
"appId": [l'app id dell'applicazione, una stringa random che potete creare tramite mille utility presenti sul web oppure a vostra immaginazione],
"masterKey": [la master key dell'applicazione, una stringa random che potete creare tramite mille utility presenti sul web oppure a vostra immaginazione, è necessaria per un accesso "admin" alle tabelle, non datela in giro],
"databaseURI":"mongodb://localhost:27017/laMiaApp",
"port": [opzionalmente potete cambiare la porta d'ascolto del server, default: 1337],
"serverURL": "http://127.0.0.1:[port]/parse" ,
"cloud":"/opt/parse/servers/laMiaApp/cloud/main.js" [il percorso del file main.js che presenta le definizioni delle funzioni cloud per l'elaborazioni complesse del dato],
"publicServerURL":"http://www.laMiaApp.com/parse",
"appName": "laMiaApp"
}

I dati necessari per permettere al ParseServer di avviarsi sono:

"appId", "masterKey", "databaseURI", "serverURL" e "cloud"

dashboard-config.json

{
"apps": [
{
"serverURL": [URL del parse-server in ascolto],
"appId": [app id definita sul file di configurazione del parse-server a cui ci si vuol collegare],
"masterKey": [master key definita sul file di configurazione del parse-server a cui ci si vuol collegare],
"appName": [un nome che identifica l'app (non necessariamente la stessa impostata nel parse-server)]
}
],
"users": [
{
"user":"user" [utilizzato per il login alla dashboard],
"pass":"password" [utilizzato per il login alla dashboard]
}
]
}

Queste sono più o meno le definizioni di base per far girare il proprio ParseServer e la relativa ParseDashboard.
Per avviare le due applicazioni con i json visti in precedenza basterà lanciare i seguenti comandi:

parse-server /opt/parse/servers/laMiaApp/server-config.json
parse-dashboard --config /opt/parse/dashboard-config.json

Il collegamento alla dashboard sarà tramite l’url http://[ip del server]:4040/.
Al login però, la pagina mostrerà un messaggio che dice che la dashboard gira solamente con il protocollo https, per aggirare il problema basterà aggiungere al comando di avvio della dashboard –allowInsecureHTTP true.
Questo aggirerà il problema ma sconsiglio di utilizzare la dashboard rendendola accessibile da remoto; utilizzate piuttosto Let’s encrypt per creare i certificati da passare tramite le opzioni –sslKey e –sslCert da impostare nel comando di avvio dell’applicazione.

Per avviare queste due applicazioni anche dopo il riavvio del server vi consiglio di creare due file .service in /etc/systemd/system e abilitarli per l’avvio automatico.

Come scritto in precedenza, queste sono delle configurazioni di base per far partire l’infrastruttura di un ParseServer su un server privato; per ulteriori opzioni come l’invio dei messaggi push oppure l’invio mail di conferma iscrizione o reset password e l’integrazione dell’iscrizione tramite Facebook o Twitter, vi rimando al sequente link e alla documentazione presente qui.

Se ci sono dubbi, scrivetemi nei commenti!