Raspberry - Server Dev

Introduction

Depuis quelques mois, j’ai un Raspberry qui traîne et l’objectif du jour va être de le transformer en plate-forme pour mes développements. L’objectif est assez simple : avoir un système de prise en main à distance (ssh), un système de gestion de sources & un système d’intégration continue. L’idée étant de pouvoir stocker mes différentes petites choses réalisées à droite à gauche. Pour le moment, j’utilise un serveur externe mais bon, je me dis que la framboise doit pouvoir m’aider.

Au début était la carte

Raspbian

La première chose à faire est d’installer le système sur une carte SD afin de pouvoir lancer l’installation. Il existe pas mal de systèmes que l’on peut installer (ici) mais le système officiel c’est Raspbian. Comme il s’agit de mes premiers pas, je vais rester dans le standard.

Téléchargement

Il faut commencer par le télécharger une image. Il existe deux images disponibles :

  • Jessie + Pixel = avec interface graphique
  • Jessie Lite = sans interface graphique

Je vais partir sur la deuxième image car “normalement”, je ne devrais pas avoir besoin d’interface (j’espère). Même si j’aurais bien tester la nouvelle interface Pixel … Pour le téléchargement : raspbian_lite_latest. Il s’agit d’un fichier zip qu’il faut donc décompresser … Jusque là, çà va :).

Gestion de l’image

Ensuite, il faut “copier” cette image sur une carte SD afin de pour la mettre dans le boîtier. Pour ce faire, j’ai très simplement suivi les instructions données ici. Elles sont claires et simples ! (Ps : j’ai profité d’avoir un PC sous windows. Un autre demain, il faudra que j’essaye sous Linux).

Premier lancement

Pour le premier lancement, il faut penser à mettre la carte, la prise réseau et la sortie graphique AVANT le courant. En effet, pas de bon ON/OFF. Dès que c’est branché, le PI se lance. Sur cette étape, rien à dire: à priori cela se lance. Pour en être sûr, j’avais connecté mon boitier à un écran donc j’ai vu que cela se lançait.

Première connexion

Adresse IP

Pour la première connexion, il faut trouver l’adresse IP du boîtier. Sur ma station Linux, j’ai l’application “Angry IP Scanner“. J’ai donc lancé, une recherche et je suis tombé sur la ligne suivante :

X.X.X.X : raspberry.local.

SSH

Par défaut, un utilisateur “pi” existe avec comme mot de passe “raspberry”. Il est donc possible de se connecter via une commande SSH :

ssh pi@X.X.X.X 

. et hop : nous voilà connecté !

Première configuration

Différents tutos trouvés (comme celui-ci)indiquent qu’il faut commencer par quelques actions de configuration, comme je suis obéissant :

sudo raspi-config

Les actions réalisées :

  • Expand Filesystem : pour profiter de tout l’espace de ma carte,
  • Change User Password : parce que celui par défaut est pas vraiment secret,
  • Boot Options : juste pour valider le mode texte sans connexion,
  • Internationalisation Options : fr_Fr.UTF8. On est en france tout ça,
  • Advanced options - HostName
  • Memory split - 16 Mo pour le GPU car finalement, j’ai pas besoin de vidéo autant tout donner au reste

Un petit reboot et c’est bon.

Modification de la connexion SSH

Présentation

L’objectif est de pouvoir me connecter à mon PI sans passer par un login/mot de passe. Il faut pour cela passer par une modification de la configuration de SSH.

J’avais déjà réalisé cela avec mon serveur distant et c’est à la fois pratique et dangereux :

  • Pratique et plus sécurisé : pas de mot passe,
  • Dangereux : si le PC qui contient la clé crame.

Mais bon, je pourrais toujours connecté mon boîtier à un écran.

Actions

J’ai commencé par créer un nouvel utilisateur correspondant à celui utilisé sur mon poste (j’aime bien …). De retour sur ma station, j’ai (comme conseillé ici) lancé la commande :

ssh-copy-id name@X.X.X.X  

et tout le travail se fait pour vous : magique. Bon par contre, il faut avoir un compte sur la machine quand même. NOTE: si cela ne fonctionne pas chez vous, vous pouvez utiliser les autres méthodes décrites dans le lien.

La prochaine connexion devient donc :

ssh X.X.X.X 

. Plus de login ni de mot de passe !

Dernière étape

Il faut modifier la configuration de ssh pour supprimer la possibilité de se connecter avec un mot de passe :

  • Ouverture du fichier : /etc/ssh/sshd_config
  • Modification de la clé : PasswordAuthentication à no
  • Un petit restart du service SSH : service ssh restart

Première étape : OK

Voilà !

Gogs - Go Git Service

Pourquoi Gogs ?

Depuis quelques temps, j’utilise GIT au quotidien en local pour mes “petits” développements ou recherches. J’ai déjà un stockage distant mais je me dis que finalement, la petite boîte peut largement suffire. Et non, je ne veux pas forcément que le code soit sous GitHub ou FramaGit. Partagé c’est bien mais faut encore que cela ait un intérêt sinon c’est juste du bruit.

Comme outil, il en existe plusieurs. Au début, j’avais pensé à GitLab mais pour avoir essayé de l’installé mais j’avais trouvé cela un peu lourd. Un autre outil que j’ai testé : gitosis couplé avec gitweb mais c’était un peu trop barbu. Un juste milieu que j’ai trouvé c’est Gogs. Après, j’ai peut-être complètement tort.

Installer

Je suis parti de la page suivante : ici. Pour le moment, j’ai pas besoin de serveur de base de données, donc on va se la tenter en SQLLite.

Quelques compléments :

  • Il faut prendre l’archi ARM via le site : https://golang.org/dl/
  • Comme je souhaite passer par SQLlite : go get -u -tags “sqlite” github.com/gogits/gogs
  • et pour le build : go build -tags “sqlite”

Les commandes sont assez longues mais au bout d’un moment, il est possible de lancer celle tant attendu :

./gogs web 

.

Première connexion

Il faut alors se rendre (depuis un autre poste …) sur l’url : monrasberry:3000 ce qui donne accès à une page de configuration.

selection_028

Configuration

Pour mon utilisation :

  • Type de base de données : SQLLite,
  • Path : j’ai mis un chemin absolu car il le demande dans le cas d’un démarrage en tant que service,
  • Désactivation de gravatar,
  • Obligation d’être enregistré pour voir les pages,
  • Création d’un compte admin : parce que bon …

Pour le moment, il s’agit des seuls changements qui me semblent nécessaires.

Passage en service

Supervisor

Depuis plusieurs lectures ou recherches, je tombe sur des scripts ou des installations de Supervisor. Par exemple, lors de ma journée sur Docker, pas mal d’images l’utilisent. L’outil semble (comme son nom l’indique bien) être un outil de supervision capable de lancer et relancer au besoin des processus. Cela semble tout à fait correspondre à mon besoin !

Installation et mise en place

L’installation est dès plus simple :

sudo apt-get install supervisor 

Ensuite, il faut ajouter la configuration de gogs dans supervisor. Pour ce faire (et c’est assez classique), il faut ajouter un fichier dans /etc/supervisor/conf.d. Afin d’être cohérent et de respecter la norme : gogs.conf.

Voici le contenu du fichier (sur la base de ici):

[program:gogs]
directory=/home/git/go/src/github.com/gogits/gogs/
command=/home/git/go/src/github.com/gogits/gogs/gogs web
autostart=true
autorestart=true
startsecs=10
stdout_logfile=/home/git/logs/stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/home/git/logs/stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
environment = HOME="/home/git", USER="git"

Premier truc, s’il y a une coquille dans le fichier (et ce fut le cas), le message d’erreur n’est pas clair. Dans mon cas … y’en avait pas. Bon à force de tâtonner, j’ai trouvé une typo dans mon fichier de conf.

Par contre, la commande systemctl status supervisor.service est très pratique et nous indique qu’à priori ça marche :

selection_029 Mais bon : un petit reboot pour être sur !

Deuxième étape : OK

Intégration continue

Lequel ?

Au boulot, on utilise Jenkins et je l’avais déployé sur une précédente instance … J’avais trouvé cela également lourd en terme de performance. Donc j’ai cherché et … c’est pas simple. J’ai choisi de tenter : StriderCD. Plusieurs articles en parle dans leur top (ici ou la) et il m’a semblé plus simple que d’autres. Après tout, j’ai pas besoin de grand chose …

.

Installation

J’aurais pu/du utiliser Docker pour monter mon serveur. Seulement, je ne maîtrise pas encore assez l’outil pour en appréhender tous les usages et j’avais peur de perdre du temps sur Docker plutôt que sur l’installation des outils. J’ai suivi la doc : ici.

Pour nodejs, j’ai repris les étapes réalisés lors de la mise en place d’une image Docker. Pour mongodb, un apt-get install. Git c’était fait. Pour node-gyp, j’ai suivi le guide : ici.

La commande d’install est … longue …

Au premier lancement, un “souci”. Par défaut, il tourne sur le même port que Gogs. Changement de l’appel :

PORT=4444 npm start

Et la, il demande un login & mode de passe. C’est “drôle”, j’ai pas le souvenir d’en avoir créer un. Comme beaucoup de choses, il existe une commande mais je l’ai pas trouvé dans la doc mais dans cette série de pages plutôt bien faîtes : ici

. Donc pour ajouter un premier utilisateur :

node bin/strider addUser

Supervisor ?

Comme pour Gogs, il serait intéressant d’avoir quelque choses qui suivent un peu plus le process de lancement. J’ai crée un fichier en me basant sur celui crée tout à l’heure.

Petit souci : pour mettre en place les variables, j’ai crée un fichier bash et j’ai omis de mettre

#!/bin/bash

dans l’en-tête. Supervisor n’a pas trop aimé …

Etape 3 : OK

Bilan

J’ai mon Raspberry qui tourne. Contrairement aux autres journées, j’ai été pas mal dérangé donc je n’ai pas pu aller aussi loin que je l’aurais voulu. Par exemple, j’aurais bien aimé paramétré un projet, le sync sur mon poste puis faire un “build” pour valider la plateforme … Mais ce sera pour un autre demain …

Liens