Comment créer un serveur Raspberry Pi pour le développement

Publié: 2022-03-11

Le Raspberry Pi est un petit ordinateur que vous pouvez obtenir pour aussi peu que 5 USD et sur lequel vous pouvez exécuter de nombreux types de logiciels différents et créer de nombreux projets différents.

Dans cet article, je vais vous guider tout au long du processus de configuration en tant que serveur de développement domestique et de déploiement d'une application JavaScript complète à laquelle vous pouvez accéder depuis l'extérieur de votre réseau. C'est idéal pour configurer votre propre espace de travail numérique à distance ou simplement pour contrôler le matériel que vous utilisez pour le développement.

De quoi avez-vous besoin pour ce serveur domestique Raspberry Pi ?

Bien qu'il s'agisse maintenant d'un didacticiel Raspberry Pi 3 en particulier, il devrait toujours fonctionner avec des modèles remontant à la première génération. Si vous avez un modèle plus ancien ou un Raspberry Pi Zero, veuillez nous faire part de votre expérience dans les commentaires ci-dessous.

En plus de la carte Raspberry Pi elle-même, vous aurez besoin de :

  • Un chargeur Micro USB
  • Un câble Ethernet
  • Une carte microSD (minimum 8 Go et les cartes jusqu'à 32 Go semblent bien fonctionner)

Ceux-ci seront également utiles lors de la configuration initiale :

  • Un clavier USB
  • Un câble HDMI et un moniteur

Le système d'exploitation Raspberry Pi : Raspbian

L'installation d'un système d'exploitation sur un Raspberry Pi est simple. Tout d'abord, à l'aide de votre ordinateur, installez l'image de démarrage sur une carte microSD. Ensuite, insérez simplement la carte dans le Raspberry Pi et démarrez à partir de là.

Raspbian est une distribution Linux portée à partir de Debian 7.0 ( Wheezy ), et est le système d'exploitation officiel pour Raspberry Pi optimisé pour l'architecture de l'appareil. Bien qu'il existe d'autres options pour exécuter votre système d'exploitation préféré sur le Pi, nous utiliserons Raspbian en raison de sa simplicité.

Ce tutoriel a été mis à jour pour fonctionner avec cette version (ou ultérieure) de Raspbian :

 Kernel version : #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) Kernel release : 4.9.0-8-amd64

Pour installer Raspbian, rendez-vous sur la page de téléchargement officielle et téléchargez le fichier zip avec la dernière version de Raspbian.

Ensuite, insérez la carte microSD dans la fente ou l'adaptateur de carte SD de votre ordinateur. Selon le système d'exploitation de votre ordinateur, suivez les instructions fournies sur le site Web de Raspberry pour Linux, Mac OS ou Windows.

Une fois le processus terminé, éjectez la carte SD de votre ordinateur et insérez-la dans le Raspberry Pi. Connectez le Raspberry Pi à votre routeur à l'aide du câble Ethernet et branchez le chargeur micro USB, ce qui lancera le démarrage du Raspberry Pi.

Pour la configuration initiale, il existe deux options :

  • Si vous avez un clavier USB et un moniteur HDMI, vous pouvez les brancher sur le Raspberry Pi pour la configuration initiale.
    • Votre Pi devrait reconnaître ces appareils dès qu'ils sont branchés.
    • La première fois que le Pi démarre, il exécute automatiquement raspi-config . Après le premier démarrage, vous devrez exécuter vous-même sudo raspi-config afin de configurer l'appareil.
  • Si vous ne les avez pas, vous pouvez vous connecter à votre Raspberry Pi pendant qu'il utilise SSH :
    • Tout d'abord, vous devez trouver l'adresse IP de votre Raspberry Pi dans votre réseau local. Cela peut être fait en vous connectant à la page d'administration de votre routeur ou en utilisant un outil réseau comme nmap .
    • Une fois que vous avez l'adresse IP de l'appareil, connectez-vous en utilisant SSH depuis votre terminal (ou via Putty si vous utilisez Windows). L'utilisateur par défaut est pi et le mot de passe par défaut est raspberry . Ainsi, par exemple, si l'adresse IP est 192.168.1.16, exécutez ssh [email protected] et entrez le mot de passe lorsque vous y êtes invité.
    • Lorsque vous êtes connecté, exécutez sudo raspi-config .

raspi-config vous guidera à travers la configuration finale. Vous pouvez configurer toutes les options, mais les plus importantes sont les deux premières : étendre le système de fichiers, en veillant à ce que tout le stockage de la carte SD soit disponible pour le système d'exploitation, et modifier le mot de passe de l'utilisateur Pi par défaut, afin que votre serveur soit à l'abri des intrus.

Raspi-config

Installer un serveur Web (Nginx) sur votre Raspberry Pi

Ensuite, vous allez installer le serveur Web. Je préfère Nginx parce qu'il a une petite empreinte mémoire et parce qu'il fonctionne bien avec Node.js (que vous configurerez plus tard). D'autres serveurs Web, tels qu'Apache ou lighttpd, fonctionneraient également, mais nous utiliserons Nginx pour cette démonstration.

Avant de commencer à installer quoi que ce soit, vous devez vous assurer que tout est à jour en exécutant ces commandes sur le Pi :

 sudo apt-get update sudo apt-get upgrade

Ensuite, vous pouvez installer Nginx en utilisant apt-get :

 sudo apt-get install nginx

Une fois l'installation terminée, démarrez le serveur en exécutant :

 sudo service nginx start

Si vous n'aviez pas à déterminer l'adresse IP locale de votre Raspberry Pi à l'étape précédente, il est temps de le découvrir en exécutant ifconfig . La sortie de votre adaptateur Ethernet sera sous eth0 , et avec son adresse IP locale étiquetée inet addr .

Une fois que vous connaissez l'adresse IP, vous pouvez y pointer le navigateur de votre ordinateur, où vous devriez voir le message par défaut "Bienvenue à Nginx".

Ouverture sur le Web : redirection de port

Vous pouvez ignorer cette étape si vous ne prévoyez pas d'accéder à votre Raspberry Pi depuis l'extérieur de votre réseau local. Mais pour ceux qui souhaitent accéder à leur serveur depuis d'autres endroits, assurons-nous que c'est possible.

Dans un réseau domestique typique, les appareils connectés au routeur sont invisibles pour le monde extérieur. Seul votre routeur est accessible de l'extérieur, en utilisant l'adresse IP externe de votre réseau. Votre routeur est chargé de déterminer quel trafic entrant est autorisé sur le réseau et à quel appareil il doit être envoyé.

Lorsqu'un appareil du réseau local établit une connexion (par exemple, lorsque vous ouvrez un site Web sur votre navigateur), le routeur reconnaît le trafic de réponse entrant comme faisant partie de cette connexion et l'autorise. Cependant, si le routeur reçoit du trafic entrant qui ne fait pas partie d'une connexion ouverte (par exemple, lorsqu'un périphérique extérieur tente d'établir une connexion avec un périphérique interne), il empêchera le trafic entrant de traverser le réseau. Il s'agit d'une fonction de sécurité importante pour protéger le réseau !

Alors, comment pouvez-vous vous connecter à votre Pi de l'extérieur ? La réponse est la redirection de port. Le routeur doit être configuré pour permettre aux connexions entrantes sur des ports spécifiques de passer et d'être envoyées au bon périphérique. Par défaut, le protocole HTTP utilise le port 80 et SSH utilise le port 22. Ce sont donc les deux ports que vous devez ouvrir sur votre routeur pour accéder à votre application Web et permettre des connexions sécurisées pour la gestion de votre serveur.

Redirection de port.

Les étapes de configuration de votre routeur pour ouvrir et transférer les ports peuvent varier en fonction de votre fournisseur d'accès Internet et de la marque de votre routeur, mais dans tous les cas, vous devriez pouvoir le faire via les options de configuration avancées de la page d'administration de votre routeur. Recherchez simplement une option avec un nom comme "Transfert", "Redirection de port" ou "Traduction d'adresse réseau".

Vous devez ouvrir un port pour les connexions HTTP et un autre pour SSH. L'idée de base consiste à transférer les données adressées à ces deux ports externes vers votre Raspberry Pi, le trafic Web allant au port 80 où Nginx écoute, et le trafic SSH allant au port 22, où le serveur SSH accepte les connexions d'ordinateurs externes. Voici un exemple de ce à quoi cela pourrait ressembler dans la page de configuration de votre routeur :

Tableau de configuration de la redirection de port.

Configuration de la redirection de port si l'adresse IP interne de votre Raspberry Pi est 192.168.1.16 . Tout le trafic entrant à destination des ports 80 ou 22 est transmis à cette adresse interne.

Vous pouvez déterminer l'adresse IP externe de votre routeur en tapant simplement "quelle est mon adresse IP" dans Google. Si vous sortez ensuite du réseau de votre routeur, vous pouvez tester le fonctionnement de la redirection de port en ouvrant une connexion SSH avec ssh pi@{external IP address} . De même, la redirection de port HTTP peut être testée en saisissant l'adresse IP externe dans la barre d'adresse de votre navigateur. N'oubliez pas que la redirection de port permet à quiconque de l'extérieur d'accéder à l'appareil sur ces ports s'il connaît l'adresse IP externe de votre routeur.

Si vous n'avez pas d'adresse IP statique, vous pouvez configurer un DNS dynamique. C'est une étape très simple et facile. Vous pouvez configurer un DNS dynamique à partir de votre routeur ou vous pouvez configurer votre Raspberry Pi pour cela. Je ne vais pas expliquer comment configurer DDNS ici, mais BitPi.co a un bon tutoriel sur le sujet si nécessaire.

Installer le Framework : JavaScript full-stack

Vous pouvez exécuter la plupart des frameworks Web sur Nginx, mais voyons comment passer à la pile complète avec JavaScript. Pour ce faire, vous devez installer Node.js et MongoDB.

De nos jours, Node.js s'installe facilement sur un Raspberry Pi avec :

 sudo apt-get install nodejs

Une fois l'installation terminée, vous pouvez vérifier s'il fonctionne en exécutant node -v .

Vous pouvez maintenant installer MongoDB simplement en tapant :

 sudo apt-get install mongodb

Sachez simplement que si jamais vous avez besoin d'éteindre le Raspberry Pi, vous devez d'abord arrêter le service afin d'éviter la corruption de la base de données :

 sudo service mongodb stop

Déployez votre application

Vous pouvez développer sur votre ordinateur local, puis transférer vos modifications vers un référentiel Git sur BitBucket. Étant donné que Raspbian est livré avec Git préinstallé, vous pouvez ensuite extraire votre dernier code d'application sur l'appareil et l'exécuter.

Échafauder le projet

Configurons d'abord du code d'application et transférons-le dans un référentiel Git. Il existe de nombreuses façons de démarrer une application, mais l'une de mes préférées est generator-angular-fullstack, qui échafaude à la fois le code serveur et le code client.

Installez generator-angular-fullstack sur votre ordinateur :

 npm install -g generator-angular-fullstack

Créez un nouveau répertoire pour votre application :

 mkdir my-app cd my-app

Et échafaudez l'application :

 yo angular-fullstack my-app

Créer le référentiel et pousser le code

Créez maintenant un référentiel dans BitBucket, comme décrit ici. Configurez ensuite votre répertoire local :

 git init git remote add origin [email protected]:USER/REPO.git

Vous pouvez donc valider et pousser le code :

 git add . git commit -m 'Initial commit' git push -u origin master

Le générateur est livré avec le plug-in grunt-build-control, qui vous permet de valider le code de construction dans une branche spécifique de votre référentiel. Ajoutez simplement la configuration de BitBucket à Gruntfile.js dans le répertoire racine de votre application :

 buildcontrol: { options: { dir: 'dist', commit: true, push: true, connectCommits: false, message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' }, bitbucket: { options: { remote: '[email protected]:USER/REPO.git', branch: 'build' } } }, // ...

Exécutez maintenant :

 grunt build

…pour créer le dossier de distribution, suivi de ceci :

 grunt buildcontrol:bitbucket

… pour valider et envoyer le code à la branche de construction de votre référentiel.

Générer la clé SSH

Votre code est maintenant hébergé. Avant de pouvoir le déployer sur votre Raspberry Pi, vous devez générer une clé SSH pour le Raspberry Pi et l'ajouter à votre compte BitBucket. Nous allons parcourir cette étape rapidement, mais si vous rencontrez des problèmes, veuillez suivre le guide BitBucket. Alors, reconnectez-vous à votre terminal Raspberry Pi et générez la paire de clés publique/privée :

 ssh-keygen

Ensuite, démarrez l'agent :

 ssh-agent /bin/bash

Et ajoutez la clé à l'agent :

 ssh-add /home/pi/.ssh/id_rsa

Il ne vous reste plus qu'à afficher le contenu de la clé publique :

 cat /home/pi/.ssh/id_rsa.pub

… afin que vous puissiez le copier et le coller dans BitBucket.

Dans BitBucket, cliquez sur votre photo de profil et accédez à Gérer le compte . Sous SÉCURITÉ , recherchez les clés SSH et cliquez sur le bouton Ajouter une clé .

Cloner le référentiel

Il n'y a pas de convention pour savoir où placer le code de vos applications, mais vous pouvez créer un répertoire /var/www et y placer tous vos projets.

 cd /var sudo mkdir www

Pour éviter l'utilisation de sudo lorsque vous souhaitez placer des fichiers dans la racine Web, vous pouvez changer le propriétaire en votre utilisateur Pi et le groupe en www-data , qui est utilisé par Nginx :

 sudo chown -R pi:www-data www cd www

Maintenant, vous pouvez cloner la branche build de votre dépôt et installer les dépendances :

 git clone [email protected]:USER/REPO.git --branch build --single-branch cd REPO npm install --production

Une fois terminé, vous pouvez démarrer votre application en définissant l'environnement sur production :

 export NODE_ENV=production; node server/app.js &

Maintenant, pointez le navigateur de votre ordinateur vers l'adresse IP de l'appareil pour vérifier si cela fonctionne.

Vous aimeriez avoir un serveur de développement que vous pourriez appeler le vôtre ? Vous pouvez, avec un #RaspberryPi.
Tweeter

Configurer le proxy inverse Nginx

Il reste une étape supplémentaire pour rendre votre application accessible de l'extérieur. Bien que Nginx écoute sur le port 80, où il recevra les requêtes HTTP pour votre Pi, l'application Node elle-même écoute sur un port différent (par exemple, le port 8080). Par conséquent, vous devez configurer Nginx pour qu'il agisse en tant que proxy inverse, en reconnaissant les requêtes destinées à votre application et en les transmettant à Node.

Nginx conserve le fichier de configuration de chaque application qu'il dessert dans le dossier sites-available :

 cd /etc/nginx/sites-available/

Ici, vous pouvez copier le fichier de configuration default et le modifier à votre convenance :

 sudo cp default my-app sudo nano my-app

Le fichier de configuration final devrait ressembler à ceci, avec Nginx agissant comme un proxy pour le serveur Node.js :

 server { listen 80; root /var/www/my-app/; # identifies the location of the application you are configuring server_name my-app.dev; # identifies the hostname used by this application's traffic location / { proxy_pass http://localhost:8080/; # configures the back-end destination for this traffic } }

Afin d'activer cette configuration, vous devez créer un lien symbolique dans le dossier sites-enabled , où Nginx recherche les configurations actives pendant l'exécution :

 sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/my-app

Et rechargez le service pour activer ces modifications :

 sudo service nginx reload

À ce stade, votre application est prête à recevoir le trafic HTTP destiné au domaine my-app.dev (grâce à la directive server_name my-app.dev que vous avez configurée ci-dessus). Le dernier problème que vous devez résoudre est de savoir comment faire en sorte que le trafic que vous envoyez de l'extérieur corresponde à ce nom de domaine. Bien que vous puissiez acheter un nom de domaine et le faire pointer vers votre adresse IP, le fichier hosts vient à la rescousse et rend cela inutile.

Sur le poste de travail à partir duquel vous accéderez au site, ajoutez simplement l'adresse IP externe de votre routeur et faites-la correspondre au nom d'hôte my-app.dev . Tout trafic HTTP que vous générez pour my-app.dev sera ensuite envoyé directement à votre routeur, avec le nom d'hôte correct dans l'en-tête Host HTTP.

Sous Windows, avec des privilèges d'administrateur, vous pouvez modifier le fichier situé dans c:\windows\system32\drivers\etc\hosts avec le bloc-notes. Sur Linux et Mac, vous pouvez utiliser le terminal avec sudo nano /etc/hosts et sudo nano /private/etc/hosts respectivement.

 ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 212.124.126.242 my-app.dev # add your host name to the list

Et après?

Maintenant que tout est configuré, vous pouvez déployer autant d'applications que vous le souhaitez sur votre Raspberry Pi, et installer pour toujours ou pm2 pour maintenir vos serveurs Node.js en vie.

Et n'oubliez pas que si quelque chose ne va pas, vous pouvez simplement effacer la carte SD et recommencer à zéro !

Serveur de développement Raspberry Pi en action.

En relation: Contrôlez votre climat avec ce didacticiel sur le thermostat Raspberry Pi