/ Auto-Hébergement

Auto-Hébergement - Etape 1 : Choix et installation de docker via Hypriot OS

Cela fait maintenant quelques semaines que j’auto-héberge plusieurs services / applications, à la maison, sur un petit Raspberry Pi tout neuf. Il s'agit principalement de services offerts par Framasoft (merci à eux :-)) que j'avais envie de rapatrier chez moi, histoire de boucler la boucle de la dé-googlisation :-)

J'avais plusieurs pistes pour la solution technique de cet auto-hébergement, l'idée étant à terme d'avoir au moins un blog, un lecteur news (hors ligne, type RSS et / ou wallabag, version libre de Pocket, pour lire des pages Web plus tard et hors ligne), un searx (un moteur de recherche multi-sources), un Owncloud / Nextcloud (ou équivalent, pour stocker des fichiers, un agenda, et mes contacts). Il faudra les mails aussi, mais à plus long terme :-)

J'avais donc 4 solutions en tête :

Solution Cloud, type CozyCloud (ou Nextcloud)

Même si l'initiative est intéressante, il s'agit d'une plateforme indépendante, les applications doivent donc être développées spécifiquement pour elle. Impossible de réutiliser des briques logicielles existantes, l'offre applicative se retrouve de facto limitée.

Un serveur "standard" (type Debian ou Ubuntu)

... avec tous les paquets qui vont bien, installés et paramétrés dessus. Une sorte de solution monolithique, la plus optimisée au 1e abord ... mais fragile car une mauvaise installation / configuration d'une application risque de toucher toutes les autres. De plus, cela nécessite de la rigueur dans cette gestion des applications, au niveau des chemins d'accès, des sources ... bref, rigueur que je n'ai pas :-)

Une solution tout en un, type Yunohost ou Sandstorm.

Pour Yunohost, c'est intéressant car il s'agit d'une plateforme qui utilise des applications existantes, justes patchées pour s'intégrer à la plateforme Yunohost (login unique, administration ...)

J'ai longtemps hésité à adopter cette solution: c'est vraiment prêt à l'emploi, avec "de série" beaucoup d'applications que je recherchais. Je pense que cela reste une solution à privilégier si on ne veut pas trop bidouiller et / ou ne pas se prendre la tête.

J'ai cependant trouvé 2 (petites) limites :

  • pas de paquet(s) Debian (je me serais senti obligé d'en faire un :-))

  • les applications disponibles (et mises à jour) dépendent de packageurs Yunohost. Par exemple, il y a encore quelques jours, Owncloud était officiellement supporté, mais pas Nextcloud (même si une installation non officielle existait). Bref, il existe une petite latence entre la disponibilité des applications "upstream", et l'installation Yunohost, mais qui reste, il me semble, tout à fait acceptable pour un utilisateur lambda.

Dernière solution : plusieurs containers Docker.

Docker est un système de virtualisation, qui permet de faire tourner plusieurs systèmes / OS (appelés containers). Le principe est d'avoir un container par service, rendant les applications étanches entre-elles, et pouvant être démarrées / redémarrées / mises à jours de façon complètement indépendantes. Cela permet une très grande flexibilité dans la gestion des containers, mais cela nécessite d'apprendre un peu comment ça marche.

Également, on pourrait croire que faire tourner 4 ou 5 systèmes en parallèle, en plus sur un Raspberry Pi, va être complètement utopiste. En fait, Docker m'a vraiment impressionné en terme de performance, car on peut effectivement faire tourner plusieurs containers sans que cela se ressente sur les performances du système.

De plus, le choix des applications est très vaste, car il suffit, soit d'avoir une image Docker de l'application choisie (disponible sur Docker Hub, qui est comme un magasin d'applications, mais pour les containers), soit de la construire soit même, comme si on construisait un OS. On peut aussi réutiliser les recettes de construction du Docker Hub pour construire (adapter ou mettre à jour) ses propres images.

Si vous relisez le titre, vous savez quelle solution j'ai choisie :-) C'est principalement dans un but d'apprentissage, que je vais essayer de relater dans ce billet, et les prochains.

Installation

Avant de pouvoir jouer avec des containers, il faut un système de base pour les lancer. Cette fois, j'ai opté pour une solution standard : Hypriot OS. Il s'agit d'un système Debian, minimal, spécifique à l'architecture du Raspberry Pi, avec Docker déjà installé. Juste ce dont j'avais besoin.

L'installation est très simple, il suffit de flasher l'image du système sur une carte mémoire vierge, qu'il faudra mettre dans le Raspberry Pi comme carte principale. Le tutoriel d'Hypriot explique de façon détaillée la marche à suivre, mais basiquement il suffit de :

  • brancher la carte SD à utiliser dans votre PC

  • Télécharger et désarchiver l'image depuis le site d'Hypriot.

  • Repérer le nom de la carte en utilisant la commande lsblk (la taille ainsi que son emplacement sur /media/votre_login/quelque_chose devrait vous mettre sur la voie)

  • Démonter la carte (avec la commande umount /chemin/de/la/carte)

  • Utiliser la commande dd pour flasher la carte (attention, soyez sûr du nom de la carte, ou vous risquez d'effacer votre disque dur, ou l'autre périphérique USB que vous aviez oubliée ...). Par exemple, en remplaçant mmcblk0 par le bon nom de carte, et if=hypriot-rpi... par le nom de l'image, vous pouvez flasher la carte avec la commande sudo dd if=hypriot-rpi-201???.img of=/dev/mmcblk0 bs=1M

Un peu de patience, et votre système sera prêt :-)

Une fois la carte installée dans le Raspberry Pi, il suffit de se connecter via SSH, avec la commande ssh pirate@adresse.IP.du.raspberrypi Le mot de passe est hypriot (à changer à la première connexion, en utilisant passwd). Vous serez alors sur un terminal, au commande de votre serveur :-)

Test de Docker

Maintenant, nous pouvons tester que Docker fonctionne. Pour cela, nous allons lancer un container de serveur web très simple :
docker run -d -p 80:80 hypriot/rpi-busybox-httpd

Voici la commande décomposée :

  • docker run : demande à Docker de lancer un container

  • -d : en arrière-plan (les messages d'erreurs ne seront pas affichés, mais vous allez revenir sur le terminal après le lancement du conteneur).

  • 80:80 : On demande que le port 80 du container soit accessible sur le port 80 du serveur. Le port 80 est le port du protocole HTTP, que nous utiliserons pour tester que le serveur fonctionne.

  • hypriot/rpi-busybox-httpd : il s'agit de l'image que nous utilisons pour notre container. Il s'agit d'un serveur web très simple (rpi-busybox-httpd) de l'équipe Hypriot.

Une fois la commande terminée, vous pouvez tester avec une machine présente sur votre réseau local (votre PC qui s'est connecté en SSH, ou un téléphone en Wifi ...). Il suffit de lancer un navigateur, avec l'adresse http://adresse.IP.du.raspberrypi ou http://adresse.IP.du.raspberrypi:80

Vous devriez voir cette image s'afficher :

Félicitations, tout fonctionne :-)

Maintenant, pour vous donner envie de lire les prochains billets, imaginez que nous remplacions l'image hypriot/rpi-busybox-httpd par wordpress/image-du-dernier-wordpress, ou drupal/image-du-dernier-drupal ... et oui, il suffira de trouver la bonne image, et le lancement sera aussi simple que cela :-) En plus, rien ne nous empêche de lancer plusieurs conteneurs, en parallèle :-)

Évidemment, en réalité, ce n'est pas toujours aussi simple, mais c'est une autre histoire :-)

Pour aller plus loin :