Auto-hébergement Web avec Raspberry Pi

Dans la continuité des mes articles sur Raspberry Pi, après la Vidéo surveillance je m’attaque maintenant au sujet de l’auto-hebergement. Pourquoi, comment y arriver, utopie..?

Avec Free t’as tout compris !

Oui t’as surtout compris que pour le prix t’as pas grand chose,
ou du moins que le service est médiocre !

En effet, mes sites web sont jusqu’à aujourd’hui hébergés chez Free.fr,
mais je constate depuis quelques temps une dégradation des connections
et des accès à MySQL (si le serveur n’est pas en train de redemarrer) !

Aussi, je passe le pas de l’auto-hébergement...

- Pour un soucis d’indépendence et de liberté... Pour contribuez directement à l’indépendance du net et à la liberté d’expression (Art. XI de la Déclaration des droits de l’homme et du citoyen).
- Pour garder le contrôle et la responsabilité de ses propres données. Pourquoi mettre ses photos de vacances sur un serveur, pourquoi ne pas les garder chez soi et dire aux autres de venir les regarder (c’est le principe même d’Internet) ?
- Pour participer à l’Internet acentré et pour contribuer à le rendre résistant (cf. Internet libre ou Minitel 2).
- Pour ne plus être tributaire d’un hébergeur de masse comme Free où ça rame et où je doit me contenter de ce qu’ils veulent bien installer !
- Pour ne plus passer 35min en dialogue de sourd avec la hotline, pour un service humain et proche : la hotline c’est moi !

Tout d’abord un tour d’horizon de la communauté Auto-hébergement sur le Net :
- Point d’entré su la planète Auto-hébergement.fr et Wiki associé
- Le wiki/logithèque des applications web
- Quelques outils pour l’Auto-hébergement

Pour en savoir plus :
- L’auto hébergement, une solution d’avenir ?
- Vers un auto-hebergement simplifié
- Planet auto-hébergement
- La Freedom Box ou la petite boîte qui voulait que l’Internet restât libre
- Sur le site de Korben, une foule d’infos complémentaires sur les Fournisseur d’accès et hébergement internet libres.
- Une PirateBox miniature à moins de 40 euros !
- Commotion, le projet d’un Internet hors de tout contrôle
- Annuaire d’hébergeurs sur ubuntu-fr
- Réseau d’Hébergeurs Indépendants et ENgagés
- FAI libre
- Ouvaton l’hébergement coop.
- ...

Mise en place

Pour cela nous avons besoin d’un ordinateur connecté en permanence au réseau :
- Par hasard un Raspberry Pi ça consomme de l’ordre de 3.5 W (700 mA sur 5 V, ce qui nous donne 5 V * 0.7 A = 3.5 W = 0.0035 kW) ;
- Dans une journée il y a 24h et dans un an 365 jours, donc 0.0035 * 24 * 365 = 30.66 kW de consommé sur un an ;
- D’après la page des tarifs EDF (fév 2014) en option heures pleines / heures creuses, un Rasp 3.5 W allumé 24/24 coûte donc 30,66 * 0.1277 = 3,92 € TTC

Soit moins de 4 € d’électricité par an !

Mon installation RPi
Mes sites web tournent là dessus !

Comme d’hab. s’assurer que le système est à jour :

# aptitude update
# aptitude upgrade
# aptitude dist-upgrade

Avant de commencer il faut vérifier, via l’outil raspi-config, que le serveur SSH soit bien actif.

Il est inutil de démarrer en mode graphique, comme il est inutile de réserver trop de mémoire pour le GPU.

On pourra de plus s’intéresser à l’overclocking mais je vous laisse faire vos propres essais :)

Ensuite, on peut se débarasser de l’inutile :

# aptitude purge xserver-xorg xserver-xorg-core xserver-xorg-input-all xserver-xorg-input-evdev xserver-xorg-input-synaptics xserver-xorg-video-fbdev xserver-common xpdf xinit x11-common x11-utils x11-xkb-utils xarchiver screen pcmanfm penguinspuzzle lxde-common lxappearance lxde-icon-theme lxinput lxmenu-data lxpanel lxpolkit lxrandr lxsession lxsession-edit lxshortcut lxtask lxterminal leafpad dillo galculator gnome-icon-theme gnome-themes-standard gnome-themes-standard-data gpicview hicolor-icon-theme
# aptitude purge ~c
# aptitude install deborphan && deborphan
# aptitude -R install localepurge && localepurge

P.S. penser à désactiver aussi les services superflus...

Concernant SSH, des réglages s’imposent dans le fichier /etc/ssh/sshd_config :

Port 22  # ou un autre port
PermitRootLogin no
AllowUsers pi

Rq. si, comme moi, vous avez dans l’idée de contrôler la RPi via un Bot XMPP authentifié,
cette étape est falcutative. A suivre.. :)

Attribution d’une IP fixe

Pour faciliter la connexion à la RPi il est plus pratique d’avoir une IP fixe :

# vi /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet static
   address 192.168.1.14
   gateway 192.168.1.1
   netmask 255.255.255.0
   #network 192.168.1.1
   #broadcast 192.168.1.255

Avec :
- address : l’IP que l’on souhaite réserver à la carte
- gateway : l’adresse du routeur (ici celle de la box sfr)

Après un redémarrage, on se connectera (sur le réseau interne) par $ ssh pi@192.168.1.14

Ensuite il faut configurer le DHCP de sa bidule box pour assigner l’adresse IP choisie à l’adresse MAC de la carte.

Koi d’autre..?

Cette étape est optionnelle, cependant comme le RPi s’exécute depuis une carte SD et que sa durée de vie est directement liée au nombre de cycle d’écriture / lecture, il est de bon ton d’installer Ramlog qui transforme la partition /var/log, fréquemment utilisée pour les logs des applications, en espace en RAM (l’écriture sur disque s’effectuera dès que Ramlog sera stoppé).

ramlog_2.0.0-1easyvdr1_all.deb.7z
$ sudo aptitude install lsof
$ wget http://www.tremende.com/ramlog/download/ramlog_2.0.0_all.deb
$ sudo dpkg -i ramlog_2.0.0_all.deb
$ sudo reboot -n

On définit la taille de la zone mémoire dans le fichier /etc/default/ramlog :

TMPFS_RAMFS_SIZE=40m

Et on redémarre le service : /etc/init.d/ramlog restart

Sécurité

Pour renforcer la sécurité il est recommendé :
- d’installer Fail2ban afin d’identifier et de bannir les IPs malveillantes ;
- de configurer de paire ses règles de pare-feu IP tables ;
- et, d’éventuellement, d’installer denyhosts pour n’autoriser que certaines machines à se connecter via SSH.

Mais ceci n’est pas l’objet de cet article, je vous laisse creuser ce point...

Installation du serveur Web

Il est tout à fait possible d’installer Apache sur notre RPi, mais il est un peu trop gourmand en ressources aussi les alternatives sont Lighttpd et Nginx.

Nginx est un serveur HTTP libre et open-source reconnu pour ses hautes performances, sa stabilité, sa configuration simple ainsi que sa faible consommation de ressources. On l’utiliera donc pour monter un serveur LEMP : Linux + NginX (prononcer Engine X) + MySQL + PHP :

# aptitude install nginx
# service nginx start
# mkdir /var/www
# chown -R www-data.www-data /var/www

Pour faire travailler Nginx avec PHP et MySQL :

# aptitude install php5 php5-fpm php-apc mysql-server php5-mysql

Sur les conseils de Pablo Ruth
nous avons rajouté :
- PHP-FPM, un gestionnaire de processus FastCGI pour PHP, permettant d’éviter une surconsommation de mémoire et d’IO :

# vi /etc/php5/fpm/pool.d/www.conf
;listen = 127.0.0.1:9000
listen = /var/run/php5-fpm.sock
# /etc/init.d/php5-fpm restart


- et PHP-APC, un cache PHP qui peut diviser par trois le temps d’exécution :

# vi /etc/php5/fpm/conf.d/20-apc.ini
extension=apc.so
apc.shm_size=100
# /etc/init.d/php5-fpm restart

Rq. pour pouvoir envoyer de gros fichiers via PHP (ex. si on héberge un Owncloud)
modifier les valeurs de post_max_size = 32M, d’upload_max_filesize = 32M du fichier /etc/php5/fpm/php.ini et rajouter client_max_body_size 32M; dans la conf NginX (cf. plus bas).

Configuration du serveur Web

Pour tester notre toute nouvelle installation nous allons créer un nouveau fichier de configuration mysytes dans NginX :

# vi /etc/nginx/sites-available/mysytes
server {
       listen   80;  # listen for ipv4; this line is default and implied
       #listen   [::]:80 default ipv6only=on;  # listen for ipv6

       root /var/www;

       index index.php index.html index.htm;

       # Make site accessible from http://localhost/  
       server_name localhost;

       location / {
               # First attempt to serve request as file, then
               # as directory, then fall back to index.html
               try_files $uri $uri/ /index.html;
               # Uncomment to enable naxsi on this location
               # include /etc/nginx/naxsi.rules
       }

       # Local documentation
       location /doc {
               alias /usr/share/doc/;
               autoindex on;
               allow 127.0.0.1;
               deny all;
       }

       # Only for nginx-naxsi : process denied requests
       #location /RequestDenied {
               # For example, return an error code
               #return 418;
        #}

       #error_page 404 /404.html;

       # Redirect server error pages to the static page /50x.html
       #error_page 500 502 503 504 /50x.html;
       #location = /50x.html {
       #       root /usr/share/nginx/www;
        #}

       # Pass the PHP scripts to FastCGI server
       location ~ \.php$ {
               fastcgi_split_path_info ^(.+\.php)(/.+)$;
               # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
       
               # With php5-cgi alone:
               #fastcgi_pass 127.0.0.1:9000;
               # With php5-fpm:
               fastcgi_pass unix:/var/run/php5-fpm.sock;
               fastcgi_index index.php;
               include fastcgi_params;
       }

       # Deny access to .htaccess files,
       # if Apache's document root concurs with nginx's one
       location ~ /\.ht {
               deny all;
       }
}

Ce site est available, mais pas enabled, donc :

# cd /etc/nginx/sites-enabled
# rm default
# ln -s ../sites-available/mysytes
# service nginx restart

Et nous rejoutons 2 pages, une statique et une dynamique :

# vi /var/www/index.html
<html><body>Welcome to my sites!</body></html>

# vi /var/www/info.php
<?php phpinfo(); ?>

# chown -R www-data.www-data /var/www

Puis http://localhost et/ou http://localhost/info.php,
tout devrais fonctionner :)

P.S. pour renforcer encore un peu plus la sécurité de notre base de données on utilisera le script :

# mysql-secure-installation
Enter current password for root (enter for none):
If this is a first time installation, just press enter (leave pw blank)
Change the root password? Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

P.I. pour rajouter PhpMyAdmin :

# aptitude install phpmyadmin
Web server to configure automatically: None
Configure the database for phpmyadmin with dbconfig-common: Yes
Enter your MySQL password when prompted
Enter the password that you want to use to log into phpmyadmin

Et rajouter :

# PhpMyAdmin
       location /pma {
               alias /usr/share/phpmyadmin/;
               try_files $uri $uri/ /index.php;
               client_max_body_size 32M;

               location ~ ^/pma(.+\.php)$ {
                       alias /usr/share/phpmyadmin$1;
                       fastcgi_pass unix:/var/run/php5-fpm.sock;
                       fastcgi_index index.php;
                       include fastcgi_params;
                }
       }

dans la conf NginX.

Reste plus qu’à déménager mes sites... SPIP

- sur le serveur http://klnavarro.free.fr, se connecter à l’interface d’administration
- procéder à la purge du cache : menu configuration > vider le cache
- réaliser une sauvegarde de la base de données : menu configuration > maintenance du site (+ éventuellement un dump de la base avec PHPMyAdmin)
- recopier l’intégralité des dossiers et fichiers situés à la racine du site
- supprimer ou renommer le fichier /var/www/klnavarro/config/connect.php
- transférer le tout sur mon nouvel hébergement (dans /var/www/klnavarro/ sur ma RPi par exemple :)
- se rendre à http://192.168.1.14/klnavarro/ecrire, le processus d’installation reprend comme lors d’une installation vierge
- renseigner l’ensemble des paramètres qui sont demandés
- une fois la configuration terminée, procéder à la restauration de la sauvegarde
- c’est presque terminé... mais il va falloir reprendre la configuration générale du site qui pour partie n’est pas restaurée
- répéter ces m^mes opération pour les autres sites /iwar et /shadowsonline
- c’est terminé, les sites sont de nouveau opérationnels et sous Raspberry Pi !

DynDNS

Il faut maintenant rendre accessible le serveur à l’extérieur, c’est quand même le but de l’opération, pour cela il suffit de rediriger le port 80 de la bidule box vers le port 80 du serveur RPi (la configuration dépend de la bidule box) via le NAT ;
De même pour les ports HTTPS (443), FTP (21), MySQL (3306) et SSH si nécessaire.

De plus, comme les bidules box n’ont en général pas d’adresse IP fixe, il faut passer pas un serveur DynDNS : par exemple chez no-ip.

Et si comme moi vous avez un nom de domaine chez gandi une API nous est proposée afin de mettre à jour automatiquement ses enregistrement DNS avec l’IP changeante du serveur RPi : https://github.com/Chralu/gandyn.

Utopie ?

Mais il y a des hics :
- Ca prend du temps, même si des solutions clef en main existent : il faut gérer soi-même la sécurité de son serveur (ce qui n’est pas une question à prendre à la légère), les sauvegardes, l’accéssibilité 24/24, ...
- On est toujours tributaire de son FAI (Free, Orange, SFR, ...) ; Notre débit d’upload est souvent très limité !
- Atention, ça ne garanti pas sa vie privée, pour cela il faut établir une chaîne de confiance, crypter, etc..., mais seulement la souveraineté sur ses données !
- Mais on est là pour s’instruire et parce que c’est fun :-)