Avec cette recette pas compliquée, apprenez comment gérer les ports de votre raspberry pi (ou de n'importe quelle Debian), et comment activer l'accès à distance à votre base de données. L'installation de mongodb sur le pi est également couverte.
Vous savez comment installer un raspberry pi 3B+ , et vous avez vu comme il est facile de mettre en place une base de données mongodb .
En fait, le raspberry pi est une excellente solution pour mettre en place un petit serveur mongodb. Il consomme si peu d'énergie qu'on peut sans scrupules le laisser continuellement allumé pour l'enregistrement des données. Et on peut simultanément les analyser à distance depuis son portable, par exemple.
Dans cet article, vous apprendrez à :
Cependant, nous ne nous intéresserons pas ici à la sécurisation du serveur mongodb.
Tout d'abord, il est important de réaliser qu'effectuer des recherches dans une base de données peut demander une puissance de calcul importante. Je suggère donc de choisir le raspberry pi 3B+, qui est suffisamment puissant.
Si ce n'est pas déjà fait, vous pouvez suivre la méthode standard pour installer Raspbian sur le pi , ou mener une installation headless , sans écran ni clavier. J'ai expliqué la méthode headless pour un raspberry pi zero W, mais elle marche tout aussi bien avec un 3B+.
Passons maintenant à l'installation de mongodb
Raspbian est un système 32 bits, et nous ne pourrons donc qu'installer la version 32 bits de mongodb. Or, avec cette version, la quantité de données que nous pourrons stocker dans la base sera limitée à environ 2 GB . Cela reste quand même tout à fait acceptable pour un projet basé sur le pi, qui par essence n'est probablement pas trop ambitieux.
De plus, mongodb ne fournit pas de package officiel pour le pi. Ce n'est pas un problème car mongodb est inclue dans la distribution Raspbian. Pour l'installer, il vous suffit de taper :
sudo apt install mongodb
sudo systemctl enable mongodb
Ensuite, vous pouvez effectuer quelques tests grâce à la ligne de commande mongo. Démarrez-la :
mongo
Puis faites la chose suivante :
> use test
switched to db test
> db.col.insert({a:1})
> db.col.insert({a:2})
> db.col.find()
{ "_id" : ObjectId("5ce6ad86dace0cba25fa3458"), "a" : 1 }
{ "_id" : ObjectId("5ce6ad8bdace0cba25fa3459"), "a" : 2 }
Nous avons créé une base de données "test", nous y avons inséré deux documents, que nous avons ensuite relus. Le serveur est donc parfaitement fonctionnel.
Voyons maintenant comment accéder à distance à cette base de données.
Logguez-vous sur un autre ordinateur fournissant un outil de terminal. Ce pourrait être un mac ou un PC Linux. Supposons que l'adresse du pi est 192.168.1.10.
D'abord, installez mongodb sur cet autre ordinateur pour obtenir la ligne de commande mongo. Ensuite, essayez de vous connecter au serveur mongodb tournant sur le pi :
> mongo 192.168.1.10
MongoDB shell version v4.0.9
connecting to: mongodb://rasptest2.lan:27017/test?gssapiServiceName=mongodb
2019-05-23T16:27:44.934+0200 E QUERY [js] Error: couldn't connect to server 192.168.1.10:27017, connection attempt failed: SocketException: Error connecting to rasptest2.lan:27017 (192.168.86.70:27017) :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:343:13
@(connect):2:6
exception: connect failed
Nous voyons que la connexion est refusée par le pi... essayons de comprendre ce qui se passe.
Retournez sur le pi, et installez lsof, un outil bien utile pour lister les ports ouverts sur la machine :
sudo apt install lsof
Ensuite, faites :
> sudo lsof -i -P -n | grep LISTEN
mongod 312 mongodb 9u IPv4 11595 0t0 TCP 127.0.0.1:27017 (LISTEN)
mongod 312 mongodb 11u IPv4 11597 0t0 TCP 127.0.0.1:28017 (LISTEN)
sshd 533 root 3u IPv4 14346 0t0 TCP *:22 (LISTEN)
sshd 533 root 4u IPv6 14348 0t0 TCP *:22 (LISTEN)
Étudions ces informations avec attention.
Sur mon pi, nous voyons que trois ports sont associés aux adresses IPv4: 27017, 27018, and 22.
Mais tout d'abord, qu'est-ce qu'un port? Je vois ça comme un point par lequel les communications réseau peuvent entrer et sortir d'un ordinateur. Pour que deux ordinateurs A et B puissent communiquer, une connexion doit être établie entre le port X de l'ordinateur A et le port Y de l'ordinateur B.
Sur chaque ordinateur, il est possible de décider de fermer un port complètement, ou de l'ouvrir uniquement à une sélection d'adresses IP, en mettant en place un firewall local sur l'ordinateur.
Retournons aux informations fournies par lsof pour le pi, et considérons cette ligne :
sshd 533 root 3u IPv4 14346 0t0 TCP *:22 (LISTEN)
Ceci veut dire que le démon sshd (le serveur ssh du pi) écoute sur le port 22. En d'autres termes, toutes les connections faites vers ce port depuis un ordinateur distant seront traitées par le serveur ssh. De plus, *:22 veut dire que le port est ouvert à toutes les adresses IP. Nous pouvons donc nous connecter par ssh à ce pi depuis n'importe où. Bien sûr, si le traffic sur le port 22 est bloqué entre l'ordinateur distant et le pi, par exemple par un firewall, cette connexion pourra toujours échouer.
Maintenant, regardons les deux lignes concernant mongod, le démon mongodb :
mongod 312 mongodb 9u IPv4 11595 0t0 TCP 127.0.0.1:27017 (LISTEN)
mongod 312 mongodb 11u IPv4 11597 0t0 TCP 127.0.0.1:28017 (LISTEN)
Ces deux lignes correspondent à deux ports différents, 27017 et 28017. Le premier est utilisé pour les connexions aux bases de données du serveur. Le deuxième permet d'administrer le serveur depuis une interface web, et nous verrons cela plus en détail par la suite. Nous voyons que ces deux ports ne sont ouverts qu'à 127.0.0.1 qui est l'adresse de la machine locale (le pi).
C'est la raison pour laquelle nous ne pouvions pas nous connecter depuis l'extérieur!
Maintenant, voyons comment ouvrir les ports de mongodb.
Dans la plupart des distributions linux, le firewall local est géré par iptables. Cet outil est extrêmement flexible, mais un peu compliqué à configurer... Et pour ma part, je ne l'utilise jamais directement.
À la place, j'utilise ufw, une interface de haut niveau vers iptables. Cet outil est tout simple, d'où son nom: the uncomplicated firewall.
D'abord, installons-le :
sudo apt install ufw
Ensuite, configurons quelques règles :
sudo ufw allow ssh
sudo ufw allow 27017
sudo ufw allow 28017
La première ligne autorise les connections ssh depuis l'extérieur . Il est très important d'ajouter cette règle avant d'activer ufw si vous avez besoin d'une connexion à distance par ssh vers le pi!
Les deux lignes suivantes ouvrent les deux ports mongodb vers l'extérieur.
⚠️ Attention . Nous allons maintenant ouvrir les ports mongodb aux connections à distance depuis l'extérieur, et nous n'avons pas sécurisé l'accès à notre serveur mongodb ... Cela veut dire qu'en principe, tout le monde pourra se connecter au serveur.
Ce genre de pratique est à déconseiller, mais vous pouvez trouver cela acceptable si votre réseau local est protégé par un firewall. Par exemple, le firewall de mon routeur internet bloque le traffic sur les ports 27017 et 28017 depuis l'extérieur. Ainsi, seules les machines déjà connectées à mon réseau local pourront accéder au serveur. Cette situation me convient à la maison, mais je ne ferais jamais un truc pareil dans un environnement professionnel.
Ceci est votre choix, et reste sous votre responsabilité.
Si vous êtes sûr de ce que vous faites, vous pouvez maintenant activer ufw, et vérifier son état :
sudo ufw enable
sudo ufw status
Il nous reste une dernière chose à faire pour activer l'accès à distance au serveur mongodb. Éditez le fichier de configuration du serveur mongodb sur le pi :
sudo nano /etc/mongodb.conf
Et commentez simplement la ligne suivante :
# bind_ip = 127.0.0.1
Sauvez le fichier, et redémarrez le service mongodb :
sudo systemctl restart mongodb
Maintenant, ouvrez un navigateur sur l'ordinateur à distance, et allez à l'URL suivante, qui spécifie l'adresse du pi, et le port de l'interface web pour l'administration du serveur mongodb :
http://192.168.1.10:28017/
Vous devriez atterrir sur une page qui ressemble à ça :
Et enfin, nous pouvons tester l'accès à distance vers la base de données. Sur l'ordinateur distant, lancez la ligne de commandes mongo :
mongo 192.168.1.10
Et accédez à votre base de données :
> use test
switched to db test
> db.col.find()
{ "_id" : ObjectId("5ce6ad86dace0cba25fa3458"), "a" : 1 }
{ "_id" : ObjectId("5ce6ad8bdace0cba25fa3459"), "a" : 2 }
Ça marche! Vous pouvez maintenant remplir et lire la base de données à distance.
Dans cet article, vous avez appris à :
Mais gardez surtout à l'esprit que nous n'avons pas sécurisé notre serveur mongodb comme il se doit. J'expliquerai ça dans un prochain article, quand j'aurai enfin sécurisé mon propre serveur.
D'ici-là, assurez-vous bien que les ports mongodb sont bien bloqués par le firewall de votre routeur.
N'hésitez pas à me donner votre avis dans les commentaires ! Je répondrai à toutes les questions.
Et si vous avez aimé cet article, vous pouvez souscrire à ma newsletter pour être prévenu lorsque j'en sortirai un nouveau. Pas plus d'un mail par semaine, promis!
Rejoignez ma mailing list pour plus de posts et du contenu exclusif: