Maintenant que j'ai un beau boîtier pour mon Raspberry Pi 3 B+, il faut l'utiliser ! Je me disais que mon site pourrait être servi par un RPi, c'est le moment de mettre en oeuvre ! 

Ingrédients

D'abord, listons le matériel nécessaire :

  • Un Raspberry Pi - évidemment. 🙂 Je vais utiliser un modèle 3 B+, mais il est possible qu'un modèle 2 puisse faire l'affaire. N'en ayant pas, je ne peux pas l'affirmer... Le modèle 3 convient également très bien.
  • Un boîtier pour le RPi - à moins de vivre dangereusement avec le RPi à l'air libre, il vaut mieux le protéger dans un boîtier. Tous les goûts sont dans la nature, comme tout plein de boîtiers, il y a l'embarras du choix ! Moi j'ai l'Argon One. 😉
  • Une alimentation micro USB et un câble de qualité - important ! Une alimentation de qualité assure la fiabilité de l'appareil, et évite que le RPi 3 émette des alertes de sous-voltage récurrents... J'ai un chargeur Aukey, et un câble microUSB Amazon Basics. Le chargeur Aukey a fait ses preuves, et le câble Amazon est un câble robuste et épais. Mais mon Argon One pompe un peu trop de courant au goût du RPi 3B+, et le RPi 3B+ me signale des baisses de tension... 😕
  • Une carte microSD - libre choix de capacité et de vitesse. La taille, voir ce qu'on veut mettre sur le serveur. 4 Go minimum pour écrire l'image disque, je conseille 8 Go pour pouvoir en faire quelque chose après. La vitesse de la carte, à voir, j'ai cru comprendre que le RPi ne pouvait pas exploiter correctement les cartes les plus rapides. Mon choix s'est tout de même porté sur une SanDisk Extreme 64 Go. 
  • Un écran HDMI et un clavier USB pour l'installation initiale - Une télé peut faire l'affaire. J'ai employé mon écran de test au boulot. 😉
  • Optionnel, un disque externe - même un SSD ! Le RPi peut démarrer sur un périphérique USB après une petite manipulation, et on peut utiliser des supports plus robustes que de simples cartes SD. J'utilise un SSD SanDisk SSD Plus de 120 Go dans un boîtier Inateck FE2004 (mais j'aurais dû prendre un Inateck SA01001, il va mieux avec l'Argon One 😑).

Ensuite, les logiciels :

  • Raspbian - une déclinaison de Debian pour le RPi. Il existe des images préinstallées chez Raspberry Pi. Pour mon usage serveur, j'utilise Raspbian Strech Lite, pas besoin d'encombrer l'espace limité avec une interface graphique qui ne servira pas.
  • Apache - le célèbre serveur web. Je devrais changer pour NGINX, mais j'ai la flemme d'apprendre la syntaxe du fichier de configuration...
  • php - le non moins célèbre langage, moteur de quasi tous les CMS.
  • MariaDB - fork de MySQL, moteur de bases de données libre. 
  • Joomla! - un CMS sympa. 😉 J'ai déjà donné dans Plone, Wordpress ne m'attire pas trop. En fait au final peu importe le CMS pour moi, vu que je n'utilise que les fonctions de base...

Tous les logiciels sont libres et gratuits, c'est la beauté de la solution. 😉 J'achète juste le peu de composants pour monter un serveur RPi (dans les 90 € dans mon cas), j'utilise le surplus de ma bande passante à la maison et hop plus besoin de mon VPS SSD à 45 € de l'année chez OVH. 😉

Installer un serveur web sur RPi pour Joomla!

Maintenant qu'on a tout ce qu'il nous faut, let's go !

Préparons déjà la carte SD. Je télécharge la dernière image de Raspbian chez Raspberry Pi. Ensuite, j'utilise balenaEtcher pour la recopier sur la carte SD. Son fonctionnement est assez simple pour se passer d'explications, je pense, sélectionner l'image, pointer sur la carte SD, et flasher. 😉

Ensuite, montage du RPi dans le boîtier. Je renvoie chacun à sa notice, mais ça ne devrait pas être très compliqué. Mon Argon One nécessitait plus de manipulations que le boîtier officiel, mais il est autrement plus stylé. 😆 J'insère la carte SD précédemment préparée dans le RPi, je branche la sortie HDMI à l'écran, connecte le clavier, et c'est parti, le RPi démarre sur Raspbian.

Le nom et le mot de passe de l'utilisateur par défaut sont pi / raspberry.

Première chose à faire, passer par raspi-config. C'est l'utilitaire en mode texte de configuration des options de Raspbian. Première chose à faire, changer le mot de passe de pi, par Change User Password. Précautions d'usage bien sûr, pas trivial, pas trop court, tout ça.

J'affecte après une adresse IP fixe à mon serveur en passant dans Network Options, je mets le clavier en azerty, je change le fuseau horaire dans Localisation Options, et surtout, j'active le serveur SSH dans Interfacing Options. Sans quoi l'intérêt du RPi s'effondre...

Important, utiliser Expand Filesystem dans Advanced Options pour agrandir la partition du Raspbian pour occuper tout l'espace de la carte SD. De base elle fait 8 Go, je crois ? 

Webmin

Ensuite, j'installe Webmin. C'est un outil d'administration fantastique, ça évite de se galérer à la ligne de commande pour tout un tas de truc. Je colle les lignes suivantes dans /etc/apt/sources.list.d/webmin.list :

deb http://download.webmin.com/download/repository sarge contrib
deb http://webmin.mirror.somersettechsolutions.co.uk/repository sarge contrib

Il faut ajouter la signature de l'auteur à apt :

wget http://www.webmin.com/jcameron-key.asc

apt-key add jcameron-key.asc

Je lance un apt-get update, un apt-get install webmin, et hop on est prêt à s'y connecter (en root par défaut). Là je change le nom de l'utilisateur pi, et j'en profite pour aller régler l'heure du système via NTP. 

Apache

J'installe Apache, par apt-get install apache2, ce qui me ramène un Apache 2.4. Je ramène mes fichiers de conf existants, et ça roule. Sinon, il faut créer un site virtuel. Dans Webmin c'est facile (Servers / Apache Webserver / Create virtual host). Mais en fait c'est pas facile de savoir quoi mettre en conf... Joomla! a une doc (un peu succinte) ici, Apache a une doc exhastive sur les serveurs virtuels, Et Cipherli.st donne des exemples de directives pour utiliser les algos de cryptage sécurisés. En mixant bien le tout, j'arrive à une définition pas mal. 😉

PHP

Pour PHP, le dépôt par défaut ne propose que PHP 7.0 (dernière en date 7.3). J'aime toujours le bleeding edge, donc je sors mon dépôt alternatif pour PHP. 😉 Je crée le fichier /etc/apt/sources.list.d/php.list :

deb https://packages.sury.org/php/ stretch main

Mais ce con de Debian/Raspbian ne sait pas récupérer à partir de sources en https... Il faut installer les paquets idoine :

apt-get install apt-transport-https lsb-release ca-certificates

Et pour ne pas que apt ne se plaigne qu'il ne connaît pas cette source, il faut installer sa signature :

wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

Maintenant je peux installer PHP et les modules nécessaires à Joomla! (le minimum nécessaire) :

apt-get install php7.3 php7.3-fpm php7.3-mbstring php7.3-mysql php7.3-xml php7.3-zip

Ne pas oublier de revoir son php.ini, en suivant ce genre de doc.

MariaDB

J'installe ensuite MariaDB. En version 10.1. Alors qu'il y a une 10.3 stable. Mais pas de binaires arm... 😢 Tant pis. De toute façon vu l'utilisation basique de la base par Joomla! (ou les autres CMS), cela n'a que peu d'importance :

apt-get install mariadb-server

Là le serveur MariaDB est accessible en local avec les identifiants root. Ça mérite d'être changé. Dans Webmin par exemple. 😉

Joomla!

Dans mon cas actuel, je récupère un site Joomla! existant sur un nouveau serveur. Donc je me contente de copier le répertoire, corriger les droits au besoin, et restaurer la base SQL. Dans le cas d'une nouvelle installation, je renvoie vers la très bonne doc de Joomla!.

Voilà, j'ai maintenant un serveur Joomla! opérationnel sur mon RPi ! Techniquement pour qu'il soit réellement utilisable, il faut encore ouvrir des ports sur son routeur, mais ce n'est pas l'objet de cette doc. Il y en a plein le net, faut chercher. 😉

Sécurisation (de base)

SSL

Donc le serveur fonctionne à présent, mais il faut le sécuriser un peu. Déjà, mettre en place une connexion SSL pour le serveur web. Avant, ça coûtait cher. Maintenant, avec Let's Encrypt, c'est gratuit et quasi-automatique

iptables

Ensuite, il ne faut pas accepter n'importe quelle connexion de n'importe où. En ayant un Linux, solution simple, iptables. Pareil, trop vaste sujet pour cette doc sans prétention, il y a un tuto très bien là. J'ai comme toujours mon fichier déjà fait. 😆 Attention à ne pas oublier iptables-persistent :

apt-get install iptables-persistent

fail2ban

C'est bien de filtrer les connexions, mais il y a des accès indésirables sur les connexions autorisées, comme les tentatives force brute... fail2ban est là pour ça. Il scrute les logs pour repérer les échecs d'authentification et créée une règle iptables pour bloquer l'adresse IP de l'attaquant potentiel. C'est aussi un trop vaste sujet pour ma doc de serveur RPi à pas cher. Le wiki Ubuntu a une doc pour les services courants (dont SSH), et cette page a un complément pour Joomla!.

Envoi de mail

Mon serveur étant hébergé sur une ligne domestique, l'envoi de mail est problématique, la plupart des services de messagerie refusant les connexions douteuses potentiellement sources de spams... Donc j'envoie les messages via GMail et Postfix. Un tuto bien fait m'a appris comment. 😉 J'ai choisi Internet with smarthost pour ma part, j'ignore la différence avec Internet site...

Boot USB

Pour la dernière partie de cette doc (qui fait plus de liens vers d'autres sites qu'expliquer des choses 😑), je remplace ma carte SD par un SSD USB, le RPi pouvant démarrer sur un périphérique externe. Framboise 314 explique très bien la manipulation. 😉 En résumé (pour RPi 3), il faut mettre program_usb_boot_mode=1 dans le fichier /boot/config.txt (accessible même sous Windows en connectant la carte telle quelle) et démarrer avec un Raspbian postérieur à 2017-04-10.

Maintenant que le RPi est préparé, il faut copier la SD sur le disque externe. Moi j'ai un SSD à pas cher dans un boîtier USB3. Mais la carte SD contenant Raspbian est multi-partitionnée et c'est la galère si on veut copier ça à la main. C'est là que je fais appel à Win32DiskImager (oui j'utilise Windows 😉). Notice exprès pour RPi ici.

Chez moi ça a pris quelques heures à copier... Je ne sais quoi blâmer, la carte SD, le SSD ou le disque qui a servi de tampon. Mais bon, tout est bien arrivé à destination, et le RPi démarre sans problème sur le SSD !

J'ai relancé raspi-config pour agrandir à nouveau la partition, mon SSD faisant 120 Go, mais il me dit qu'il peut pas, vu que ce n'est pas une carte SD... 😕 Je vois pas le problème en soi, c'est pas le type de media qui détermine le type de partition ou comment la gérer, mais bon...

Heureusement il existe encore un bon tuto en ligne. 😉 C'est une question de fdisk et parted, mais j'ai la flemme de lire les manpages juste pour m'en servir une fois... 😆

Economie d'énergie

Comme je le disais, l'Argon One consomme juste assez de courant pour déclancher l'alerte de sous-voltage... J'ai donc la mort dans l'âme désactivé le WiFi, le Bluetooth, la carte son et la sortie HDMI (en fait c'est juste le WiFi qui me dérange, ça faisait une interface de secours...).

Pour cela, je vais utiliser principalement /boot/config.txt. C'est pratique, on ne touche pas à l'OS, c'est un soft-switch.

Pour désactiver la carte son :

dtparam=audio=off

Pour désactiver le WiFi et le Bluetooth :

dtoverlay=pi3-disable-wifi

dtoverlay=pi3-disable-bt

Pour le HDMI, pas de soft switch, on passe par /etc/rc.local :

/usr/bin/tvservice -o

A ajouter avant exit 0 (ou tout endroit approprié dans le fichier 😉).

J'ai donc un beau serveur Joomla! RPi, raisonnablement sécurisé, qui démarre sur un SSD externe, et qui ne consomme plus autant de courant ! 👍

J'ai enfin reçu l'Argon One d'Argon40 ! C'est un boîtier pour Raspberry Pi très joli et bien fait, financé via Kickstarter. Sa particularité, d'être en aluminium massif, et d'avoir des petits plus comme un ventilateur, un bouton marche/arrêt qui permet d'éteindre proprement le Raspberry Pi, et d'un accès aux ports GPIO refermable.

Ar1 4

Argon One

Ici on voit le boîtier du dessus. Il possède des ouïes d'aération, et on discerne le capot du GPIO.

Ar1 3

Arrière de l'Argon One

Sur la face arrière, on voit les ports Ethernet, USB, HDMI, audio et microUSB d'alimentation, ainsi que le bouton Power. Et le fameux capot GPIO.

Ar1 2

Port GPIO

L'ouverture du capot expose les pins GPIO, colorés. Le port du RPi est déporté sur un carte interne vers le dessus du boîtier. Argon40 a même ajouté une légende des pins, pratique !

Ar1 7

PCB interne

Et voici le PCB interne, avec son ventilateur, programmable. Une extrusion du boîtier permet le refroidissement du processeur du RPi, via un pad thermique fourni. On voit à droite le connecteur reliant les GPIO du RPi au port externe en haut.

Ar1 6

IR !

Argon40 avait dû prévoir un port infrarouge, mais il n'y a pas de composants reliés...

J'ai dit que les ports HDMI, audio et alimentation étaient sur la même face que les ports Ethernet et USB... Alors que sur le RPi, ils sont répartis sur deux côtés. Cette carte permet cette entourloupe :

Ar1 1

Carte HDMI/audio

Elle s'enfiche sur le RPi pour déporter les connectiques HDMI et audio vers l'arrière du boîtier, comme ça :

Ar1 5

RPi + carte HDMI/audio

Et ça donne ça une fois dans le boîtier :

Ar1 9

RPi installé

Et boîtier fermé :

Ar1 10

Dos de l'Argon One

Le fond du boîtier est en plastique gris fumé, presque opaque mais laissant passer la lumière vive. On voit les diodes à travers :

Ar1 8

Diodes

Bien entendu, les fonctions de contrôle de ventilateur et de bouton marche/arrêt ne marchent pas par magie, il faut installer un script (en Python), fourni par Argon40, à l'adresse suivante : https://download.argon40.com/argon1.sh

Le script installe une unité systemd vérifiant la température pour actionner le ventilateur au besoin, et surveillant l'action du bouton Power. Il permet également sa propre désinstallation. A noter qu'il installe des raccourcis si l'environnement graphique est détecté (par la présence de /home/pi/Desktop, donc si l'utilisateur pi n'existe pas ou a été renommé, c'est raté...).

A noter aussi, la carte gérant le ventilateur consomme un peu de courant, et le RPi indique un sous-voltage récurrent... Ça peut être contourné en désactivant du matériel comme le WiFi ou la sortie HDMI, ou en utilisant une alimentation délivrant 5,1 V et 3 A.

Comme d'habitude, les photos pleine résolution sont ici.

Je crois pas, Netflix... 🤣

luther eau de rose

Je sauvegarde en ligne depuis quelques semaines, sur iDrive. J'en suis globalement content, mais je trouve l'appli un peu bof. Déjà, elle est traduite en peu de langues, et la traduction française par exemple est assez incomplète.

idrive

iDrive

On voit sur cette capture l'interface en français, où les libellés sont tronqués (tous les "..." sont des libellés trop longs), et des textes non traduits...

A part ça elle fait le taf, mais il y a quand même quelques manques. Le style des journaux de l'application indiquent l'utilisation de rsync, ce qui est bien, mais l'application n'utilise pas Volume Shadow Copy, ce qui est bof pour un logiciel de sauvegarde... De fait le fichier Outlook de Sévrine n'est pas synchronisé pour une raison obscure d'échec de verification (bien qu'Outlook ne tourne pas au moment de la sauvegarde...), et le résultat des sauvegardes est souvent en échec à cause des erreurs... 😑

En plus il existe peu de documentation et la FAQ n'est pas très locace sur les raisons des erreurs... Il est probable que ce soit des fichiers temporaires et/ou système genre desktop.ini ou thumbs.db, mais le log n'est pas assez détaillé pour me le dire.

Je suis quand même globalement satisfait du service. Je vais creuser pour démêler les problèmes et rapporter le fruit de mes recherches ici. 😉