Usare un server di MongoDb sul Raspberry

Mettiamo di avere un Raspi centralizzato che funge da server per alcune applicazioni. Tra queste c'è anche un'istanza di MongoDb che raccoglie dati in continuo da vari Raspies dislocati in giro per la casa (o azienda).
Potrebbe essere il caso di una configurazione "edge" della struttura IoT che abbiamo creato, dove i vari devices inviano i dati ad un server locale che elaborerà i dati e li compatterà prima di inviarli al cloud.
E' quindi necessario avere un server di MongoDb. Per utilizzarlo su un Raspberry è però necessario che sia della versione superiore alla 2.4 e, quindi, che giri su un OS a 64bit.

La connessione ad un server Mongo può essere fatta sia con autenticazione che senza. Se lo scopo è quello di utilizzarlo solo internamente e con devices non esposti al web non ci dovrebbero essere problemi ma se volete anche utilizzarlo da remoto via wan, è importante che la connessione avvenga con autenticazione.

Entriamo nel Raspi che ospiterà il server (diretti o con SSH), entriamo come al solito in Mongo e nel dbase che vogliamo rendere server (use <mio dbase>). Qui ora creiamo lo user che servirà per autenticarci con:

db.createUser({

   user: '<mio nome>',

   pwd: '<mia password>',

   roles: [{role: 'readWrite', db: '<mio dbase>'}]

})

Abbiamo creato lo user, creata una password, definito il ruolo di leggere/scrivere e assegnato allo user un dbase (infatti questa autenticazione sarà valida solo per questo dbase)

A questo punto possiamo modificare il file di configurazione per permettere l'accesso dall'esterno.
Sempre sulla macchina dove c'è il server Mongo digitiamo:

sudo nano /etc/mongod.conf

C'è la linea che inizia con bindIp ed è quella che permette l'accesso da localhost quando scriviamo "mongo" sul terminale per avviare la sessione. Qui si tratta di dare accesso a tutte le connessioni esterne al localhost. Mettiamo 0.0.0.0 come IP (alcuni consigliano di commentare la riga ma a me non ha mai funzionato la connessione esterna in questo modo). Lasciamo la porta a 27017 che è quella di default (ma potremmo cambiarla ricordandoci di specificarla in connessione).

# network interfaces

net:

   port: 21017

# bindIp: 127.0.0.1


Andiamo poi sulla linea security che troveremo commentata (#), togliamo il commento e scriviamo sotto:

security

   authorization: 'enabled'


Salviamo ed usciamo e riavviamo il servizio:

sudo service mongod restart


A questo punto è tutto pronto per connetterci al server Mongo. Ovviamente, se vogliamo connetterci da wan, dobbiamo aprire la porta 27017 sul router.
Per connetterci dallo stesso device su cui gira il server, invece di digitare mongo come prima dobbiamo digitare:

Invece per connetterci da un altro Raspberry, ad esempio:

dove IP host è l'indirizzo IP del server Mongo.

Infine, visto che lo scopo di tutto ciò è caricare dati sul dbase da altri devices, utilizzando pymongo in uno script di python, dobbiamo inserire queste istruzioni:

Notare le istruzioni che sono state aggiunte all'interno della parentesi MongoClient() che senza autenticazione era vuota. Le istruzioni successive, che specificano il dbase e la collezione, devono rimanere le stesse.
Nel caso si voglia connettere al server dallo stesso device, al posto dell'IP host si mette 127.0.0.1 e non serve specificare il nome del dbase.