Dans cette série d’articles je vais décrire les différentes étapes que j’ai suivi pour déployer une appli basée sur la stack MERN (mongo / express / react / node) sur un Raspberry-pi 3b+.
Je ne sais pas encore combien de parties il y aura, et les autres ne sont pas encore écrites. Mais dès que ça sera fait, je mettrai les liens ici.
Mais pourquoi je voudrais faire ça ?
Quand on veut déployer un site web « statique » on a plein de solutions gratuites : page github, netlify, ZEIT Now, … et beaucoup d’autres.
Mais si on veut déployer un serveur NodeJS avec une base de donnée Mongo et ne pas être trop contraint par le choix de la plateforme (je ne vais pas parler de JAM stack ou de serverless functions ici), on se retrouve rapidement avec ces options :
- mettre tout ça sur un VPS
- partir sur la solution « developer friendly » avec Heroku
- auto-hébergement sur sa box
Pour la solution VPS l’offre la moins cher d’OVH est à 3,60€ / mois.
Si on part avec Heroku, on peut déployer tout ça gratuitement. Mais si on veut que ça tienne un peu la charge, il faut rapidement passer à la caisse – idem pour pour la db – et par expérience, ça revient à environ 25€ / mois.
Si on veut auto-héberger son appli, on choisi sa machine. La solution Rpi, c’est 50€ d’investissement, et c’est tout. Après ce n’est pas une bête de course, mais je ne suis pas complètement sur que ça ne soit pas équivalent à l’option VPS d’OVH…
Alors évidemment, y’a moult autres solutions. Mais celles-ci sont les plus évidentes.
Préparer son Raspberry-Pi
Si on prend la distribution « standard » de la fondation Raspberry, on se retrouve avec Raspbian (et une architecture 32 bits). Cela va causer des problèmes pour installer Mongo. Il faut donc commencer par mettre un système 64 bits sur son Pi.
Et puis parce qu’on est en 2020, on va vouloir utiliser Docker. Et là ça tombe bien, il existe la distribution hypriotOS qui est basée sur Debian et vient avec Docker pré-installé.
Et en plus, il y’a des fous furieux qui ont porté ça en 64 bits :
https://github.com/DieterReuter/image-builder-rpi64/releases
Afin de préparer la carte SD du pi, les gars derrière hypriotOS ont mis à disposition un petit outil (Mac / Linux seulement…) permettant de flasher la carte SD et tweaker la config. Les infos d’installation sont décrites dans leur repo :
https://github.com/hypriot/flash
Une fois le script installé, on récupère les fichiers user-data.yml et no-uart-config.txt d’exemple qui nous permettront de configurer le wifi (pi zéro ou 3) :
mkdir config-hypriot
cd config-hypriot
curl -o user-data.yml https://raw.githubusercontent.com/hypriot/flash/master/sample/wifi-user-data.yml
curl -o no-uart-config.txt https://raw.githubusercontent.com/hypriot/flash/master/sample/no-uart-config.txt
Dans le fichier user-data.yml, on peut changer le nom d’utilisateur / mot de passe (par défaut: pirate / hypriot), la timezone (dans mon cas : « Europe/Paris ») et si on veut / peut configurer le wifi, il faut également renseigner les champs ssid et psk avec nom du réseau wifi / mot de passe.
Également, on édite le fichier no-uart-config.txt pour ne garder que le nécessaire:
# sans cette ligne, pas de wifi
enable_uart=0
# on utilisera pas le gpu, donc on lui met le minimum de mémoire
gpu_mem=16
Ensuite on peut flasher sa carte SD avec la commande suivante (on lance le script sans la carte SD, on la branche quand le script le demande) :
flash --userdata ./user-data.yml --bootconf ./no-uart-config.txt ./hypriotos-rpi64-v20190720-125849.img
Une fois cela fait, on peut mettre la carte SD dans le Raspberry-pi et si tout s’est bien passé, on a un « Docker in a box« . J’ai personnellement testé avec un Rpi 3b+ sans problèmes !
Voilà pour cette partie 1. Si vous êtes à l’aise avec Docker vous pouvez d’ores et déjà faire tourner des containers (arm/v8) sur votre Pi. Sinon, la suite arrivera bientôt !
Peace !