Publié le 22 février 2022 - par

Gestion de photos avec le logiciel « Piwigo »

Utilisateur d’un Synology aujourd’hui un peu ancien, j’étais à la recherche d’une solution pour héberger une galerie de photos et changer le Synology par un modèle plus récent n’était pas dans la liste des options envisagées.
Je me suis dit : « Pourquoi pas avec un Raspberry Pi sans carte microSD et uniquement avec un SSD ? » … Mais alors quel logiciel utiliser ? Après quelques recherches j’ai opté pour Piwigo. Je vous propose de découvrir l’installation du Raspberry Pi et l’utilisation de cette photothèque opensource.

Introduction

Tout d’abord un grand merci à François pour avoir accepté cette proposition d’article et m’avoir ouvert son site framboise314, vraiment très sympa de sa part !

Utilisateur d’un Synology aujourd’hui un peu ancien, j’étais à la recherche d’une solution pour héberger une galerie de photos. Changer le Synology par un modèle plus récent n’était pas dans la liste des options envisagées.
– Pourquoi pas avec un Raspberry Pi sans carte microSD mais uniquement avec un SSD ?
– Mais alors quel logiciel utiliser ?

Après quelques recherches mon choix se porte sur Piwigo :
https://fr.piwigo.org/ (site global https://piwigo.org/), opensource, ayant déja une belle histoire (https://fr.piwigo.org/a-propos) à installer « chez soi » et tout maîtriser, mais aussi avec une autre possibilité celle d’être hébergé par Piwigo (https://fr.piwigo.org/obtenir-piwigo),
– un des plus de Piwigo c’est la disponibilité d’une application téléphone (android / ios) qui fonctionne que ce soit en mode hébergé chez Piwigo ou dans le mode « chez soi ».
Enfin une documentation abondante est disponible ainsi qu’un forum, clairement Piwigo a fait ses preuves avec des sites ayant pour certains plus de 100 000 photos.

Je vous propose de partager l’installation et la configuration de A à Z du Raspberry Pi en partant d’un pi4 sorti de la boite, avec :
– les outils à installer pour assurer un « bon » fonctionnement du Raspberry Pi Piwigo,
– les problèmes rencontrés,
– les solutions mises en oeuvre,
– les points à améliorer.

L’objectif de ce long article est d’arriver avec une solution qui répondera à la demande initiale.

L’environnement à installer

A minima, le strict nécessaire pour Piwigo :

  • Une connexion internet,
  • Un matériel avec un OS et un peu d’espace disque,
  • Une base de donnée,
  • Un langage de programmation,
  • Un serveur web,
  • Un serveur de messagerie,
  • Piwigo.

Le Raspberry Pi est connecté à Internet aussi ai-je ajouté :

  • un certificat ssl
  • un filtrage des accès

Installation du Raspberry Pi 4

L’installation d’une image pour un Raspberry Pi 4 directement sur un disque SSD c’est possible avec l’utilitaire rpi-imager mais y a de forte chance que le Raspberry Pi 4 ne démarre pas. En effet par défaut le démarrage s’effectue sur la carte microSD. Le démarrage via un port USB n’est pas configuré. Le passage par une première étape via la carte microSD est nécessaire. Je met le lien de l’article utilisé en annexe c’est très bien expliqué. Pour vérfier qu’il est possible de démarrer via un port USB, le résultat de la commande rpi-eeprom-config doit afficher la ligne BOOT_ORDER=0xf14 comme ci-dessous :

Le Raspberry Pi peut être maintenant arrêter correctement avec la commande shutdown now et débranché électriquement.

Insertion du disque SSD sur le PC sous linux ubuntu, dans mon cas, car il est temps de le flasher avec l’image souhaitée via rpi-imager .

image choisie flashée sur le disque SSD (depuis, la capture d’écran, l’image à télécharger est en date du 2022-01-28)

Une fois l’opération terminée avant d’éjecter le disque proprement et de le débrancher du PC, deux fichiers sont mis dans le répertoire pour éviter de connecter écran, clavier et souris sur le Rapsberry Pi :
– un fichier ‘vide’ nommé ssh est créé dans le répertoire /media/userid/boot via la commande
touch /media/userid/boot/ssh ,
il sera ainsi possible de se connecter la première fois au Raspberry Pi par ssh avec l’identifiant et mot de passe par défaut,
– un fichier wpa_supplicant.conf est copié dans le même répertoire, il contient les informations nécessaires pour se connecter au wifi. Un exemple est mis ci-dessous mais il devra bien sûr être adapté. Si plusieurs réseaux sont disponibles, le paragraphe network={ … } peut être dupliqué.

La carte microSD est retirée du Raspberry Pi et le disque SSD connecté sur un des deux ports « bleu » USB 3 car le disque utilisé supporte l’USB 3.


L’alimentation du Raspberry Pi est reconnectée, celui-ci démarre et quelques dizaines de seconde plus tard une connexion via la commande ssh@192.168.1.13 (à remplacer par l’adresse IP de votre Raspberry Pi) s’effectue avec succès.
Sachant que le Raspberry Pi est client dhcp comment pouvais je savoir l’adresse ?
Effectivement c’est une bonne question.
Deux solutions possibles :
– via l’interface d’administration de la box internet pour visualiser les adresses IP actives et détecter le petit nouveau,
– via la commande nmap -sn 192.168.0.0/24 (à adapter au réseau local cela peut être par exemple nmap -sn 192.168.1.0/24).

La première action doit être de changer le mot de passe de l’utilisateur pi, le message de sécurité est d’ailleurs explicte lors de la connexion. N’oubliez pas que le Rapsberry Pi sera accessible depuis l’internet.

Ensuite les actions habituelles :
sudo apt-get update
sudo apt-get full-upgrade
sudo raspi-config (pour configurer la localisation : Europe Paris et les locales : fr euro ISO 9915)
et redémarrage via la commande sudo shutdown -r

Pour permettre l’accessibilité du Raspberry Pi depuis l’extérieur du réseau local, une action est à effectuer sur la box internet.
La configuration s’effectue depuis la console d’administration de la box (les écrans sont spécifiques à chaque box). L’objectif est de rediriger dans le cas présent les ports 22 (ssh), 80 (http) et 443 (https) vers le Raspberry Pi.

Comment vérifier ?
– Connaître l’adresse IP publique :
cf le site https://trouver-ip.com/adresse-ip.php
ou via la commande directement depuis le Raspberry Pi : curl ifconfig.me
– Configurer le téléphone mobile en point d’accès
– Utiliser la connexion du téléphone pour se connecter en utilisant l’adresse publique en ssh : ssh pi@a.b.c.d -v
– Si la redirection est bien effective, la connexion doit s’effectuer avec succès

Le serveur Raspberry Pi doit être maintenant accessible en ssh depuis l’extérieur du réseau local.

Dernier point, le nom de hôte par défaut c’est raspberrypi, j’ai changé en piwigo via la commande :
sudo hostname piwigo

Une base de donnée, un langage de programmation et un serveur web

Avec une seule commande l’installation s’effectue sans problème :

sudo apt-get install apache2 mariadb-server php libapache2-mod-php php-common php-mbstring php-xmlrpc php-gd php-xml php-intl php-cli php php-ldap php-zip php-curl unzip git

Installation réussie pour les trois « paquets » qui constituent la clé de voute de la solution. Il manque le logiciel de messagerie mais cela sera un paragraphe dédié.

Paramétrage

php

Pour éviter des messages d’attention rencontrés ultérieurement ou carrément des erreurs, avec Piwigo, le fichier /etc/php/7.4/apache2/php.ini est modifié, comme indiqué ci-dessous, en effet certaines valeurs par défaut peuvent être trop faible, comme par exemple le temps d’exécution maximum par défaut à 30s. Pratiquement une heure a été nécessaire la première fois pour calculer les sommes de contrôle (md5) pour plus de 31000 photos :

memory_limit = 256M
upload_max_filesize = 100M
date.timezone = Europe/Paris

max_execution_time = 3600

mariadb

Lors de l’installation de Piwigo qui viendra un peu plus tard, il est nécessaire d’avoir au préalable un serveur de base donnée d’installé, ce qui vient d’être réalisé précédemment, et une base de donnée de créée associée à un utilisateur dédié :

– connexion à l’interface SQL via la commande
sudo mysql

– ajout d’un utilisateur piwigo (le nom de cet utilisateur peut être différent) avec un mot de passe xxxx
CREATE USER ‘piwigo’@’localhost’ IDENTIFIED BY ‘xxxx’;

– privilèges positionnés pour cet utilisateur et mise à jour :

GRANT ALL PRIVILEGES ON * . * TO ‘piwigo’@’localhost’;

FLUSH PRIVILEGES;


– création de la base de donnée pour Piwigo (le nom de la base est laisser à votre appréciation) :
create database piwigo_db;

Trace des commandes passées :
pi@piwigo:~ $ sudo mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 1547
Server version: 10.5.12-MariaDB-0+deb11u1 Raspbian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

MariaDB [(none)]>

MariaDB [(none)]> CREATE USER ‘piwigo’@’localhost’ IDENTIFIED BY ‘xxxx’;
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON * . * TO ‘piwigo’@’localhost’;
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.002 sec)

MariaDB [(none)]> create database piwigo_db;
Query OK, 1 row affected (0.001 sec)


MariaDB [(none)]> quit
Bye


Notez les informations suivantes, cela sera utile ultérieurement sur la page de configuration de Piwigo :
– utilisateur pour la gestion de la base de donnée, ici : piwigo
– le mot de passe de cet utilisateur : xxxx
– le nom de la base de donnée créé, ici : piwigo_db

Pour vérifier, la configuration de la base de donnée :

Pour connaitre le répertoire de stockage utilisé par la base de donnée :

apache

Par défaut à ce stade de l’installation, pas de changement, l’accès à l’adresse IP du Raspberry Pi via un navigateur doit afficher la page habituelle, cela valide aussi la redirection du port 80 normalement déja effectuée :

A noter :
– le répertoire des pages internet :
/var/www/html
– les fichiers journaux d’accès et d’erreur du serveur web:
/var/log/apache2/access.log
et /var/log/apache2/error.log
– les fichiers de paramétrage dans le répertoire :
/etc/apache2/sites-available/
Une configuration activée se concrétise par un lien créé dans le répertoire /etc/apache2/sites-enabled vers le fichier de configuration situé dans /etc/apache2/sites-available .
L’activation d’une configuration s’effectue avec la commande :
sudo a2ensite 000-default
dans ce cas cela signifie qu’un fichier de configuration 000-default.conf existe au préalable dans le répertoire /etc/apache2/sites-available

Des modifications seront apportées dans les fichiers de configuration lors du chapitre sur la sécurité.

Remarques (dépannage) suite à l’installation

(1) Initialement j’avais souhaité faire étape par étape, cependant lors de l’accès à la page administration de Piwigo le message d’erreur suivant s’est affiché :
« Fatal error: Uncaught Error: Call to undefined function mb_substr() in /var/www/html/photos/piwigo/admin/intro.php:358 Stack trace: #0 /var/www/html/photos/piwigo/admin.php(320): include() #1 {main} thrown in /var/www/html/photos/piwigo/admin/intro.php on line 358« 

Installer le paquet php-mbstring dès le début évitera ce message.

(2) In fine c’est la toute dernière version de php la 7.4 qui s’installe, cf les exemples de paquet ci-dessous :

(3) Une visualisation du fichier journal système, toujours utile à faire régulièrement, montre quelques erreurs à corriger :

– Deux paquets sont à installer via la commande suivante, les erreurs ne sont pas dûes au disque SSD en particulier, une installation faite sur une carte microSD génère les mêmes erreurs :
sudo apt-get install libblockdev-mdraid2 libblockdev-crypto2

– Editer le fichier /etc/php/7.4/apache2/php.ini
Si la ligne n’est pas commentée, mettre en commentaire en insérant le caractère ; au début de la ligne :

extension=/usr/lib/php/20190902/
qui devient
;extension=/usr/lib/php/20190902/

Un redémarrage du serveur apache via la comande sudo service apache2 restart est nécessaire pour prendre en compte ces modifications .

L’affichage des erreurs comme ci-dessous sera évitée. Ce ne sont que messages d’attention mais cela rempli le fichier journal. La lecture ne sera plus polluée par des messages parasites :

(4) Quelques heures après l’installation, crash du Raspberry Pi. Débranchement puis re-branchement pas mieux. Ré-démarrage avec succès sur la carte microSD. Après quelques recherches sur Internet la présomption sur le disque SSD est confirmée, c’est bien lui qui est la cause du problème :
« ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s « 


Pour corriger, le seul moyen est de connecter le disque SSD non pas sur un des deux ports USB3 (couleur ‘bleu’) mais sur un des deux ports USB2 (couleur ‘noire’), depuis plus de problème. Si une autre solution est trouvée, merci par avance de la partager. Coté performance, je n’ai rien constaté de pénalisant par rapport à l’utilisation faite.
Autre correction (usb-storage.quirks) à faire ultérieurement selon l’article mis en référence (cf le 2ème lien)

Le serveur de messagerie

Un sujet pouvant être complexe dans la mise en oeuvre, ce qui justifie un chapitre dédié.
Le serveur de messagerie le plus connu c’est le paquet postfix dont l’installation en lui même ne pose aucun problème via la commande :
sudo apt install postfix mailutils

Le paquet mailutils a été aussi installé car cela permet d’avoir la commande mail disponible, qui est très utile pour réaliser des tests d’envoi de courriel en ligne de commande.

– Il est recommandé voir indispensable d’avoir un nom de domaine associé à la connexion internet. Le service ddns.net (site https://www.noip.com) rempli parfaitement ce rôle, mais ce n’est pas le seul.

Après cette étape, le Raspberry Pi est accessible depuis l’extérieur via monnomamoi.ddns.net en ssh (port 22) ou http (port 80). Pour l’accès en https (port 443) un certificat ssl est nécessaire, cela sera réalisé un peu plus loin.

L’intérêt du serveur de messagerie c’est son utilisation via le logiciel Piwigo :
– quand un utilisateur est créé, un courriel peut lui être envoyé avec son identifiant et le mot de passe,
– le webmestre peut envoyer une notification à un utilisateur ou un groupe d’utilisateurs suite à l’ajout d’une photo, d’un album ou pour tout autre raison à son bon vouloir,
bref si la galerie des photos est mise en place pour plus d’une personne c’est utile.

Une fois qu’un courriel peut être envoyé via la ligne de commande et qu’il a été bien reçu, ce qui valide toute la chaîne de transmission je n’ai eu aucun paramétrage spécifique à faire sur Piwigo.
Piwigo s’appuie sur la capacité du serveur là où il est hébergé, à envoyer des courriels.

C’est complexe car les tests d’envoi ne sont pas, jamais ?, réussit du premier coup. Il faut ensuite chercher sur le net et il est facile de s’y perdre.

Voici la configuration qui fonctionne dans le cas présent, connecté à une ligne internet agrume:

contenu du fichier /etc/postfix/relay_password

avant @orange.fr mettre votre identifiant de connexion
après le caractère : mettre votre mot de passe en clair !
après modification du contenu du fichier comme indiqué ci-dessus :
– modifier les droits sudo chmod 600 /etc/postfix/relas’appuits’appuits’appuity_password
– passser la commande sudo postmap /etc/postfix/relay_password
qui va génèrer le fichier /etc/posftix/relay_password.db

chaque ligne va définir la correspondance pour l’utilisateur émetteur d’un courriel :
dans le cas présent quelque soit que le nom d’hôte soit piwigo.home ou piwigo, et quelque soit l’utilisateur sur le Raspberry Pi, l’émetteur est défini comme étant nom@free.fr (c’est mon choix, c’est à personnaliser bien sûr)
ainsi le courriel envoyé sera « vu » par le destinataire comme ayant été envoyé par nom@free.fr
après modification du contenu du fichier comme indiqué ci-dessus :
– passser la commande sudo postmap /etc/postfix/sender_canonical
qui va génèrer le fichier /etc/posftix/sender_canonical.db

contenu du fichier /etc/postfix/main.cf

Surligné en jaune les modifications faites dans le cas de l’article. C’est bien sûr à personnaliser pour chacun.

Le port smtp (25) n’est pas redirigé depuis l’extérieur, vers le Raspberry Pi, il n’est donc pas possible de recevoir un courriel sur le Raspberry Pi. Coté sécurité c’est aussi bien, cela évite, si postfix est configuré incorrectement, que le Raspberry Pi serve de serveur de relais et d’être ensuite mis sur une liste ‘noire’. D’autre part la possibilité de recevoir un courriel n’est pas nécessaire pour Piwigo.

Quelques commandes utiles :
sudo tail -f /var/log/mail.err et sudo tail -f /var/log/mail.warn
permet de visualiser les erreurs de postfix, par exemple si une commande postmap n’a pas été passée, un message d’erreur sera présent,

sudo tail -f /var/log/mail.info ou sudo tail -f /var/log/mail.log
le contenu de ces deux fichiers sont identiques,
permet de visualiser le bon envoi d’un courriel, la connexion au serveur de l’agrume dans le cas présent

mailq
y aurait il un ou plusieurs courriels en attente d’envoi ?

sudo postfix flush
Indique à postfix de traiter les messages en attente

sudo service postfix stop
sudo service postfix start
sudo service postfix reload

Permet respectivement d’arrêter le service postfix, de le démarrer, de recharger la configuration

sudo postfix check
permet de vérifier la bonne syntaxe des différentes fichiers, cette commande sera beaucoup utilisé au départ 😉

Si un message d’attention peut être évité autant corriger le problème, la lecture des fichiers journaux en sera facilitée. Pour éviter un message d’attention (warning) même sans impact :

Modifier le lien comme indiqué, la commande sudo postfix check ne renverra plus de message !

Tester en envoyant un message vers des destinaires de différents opérateurs internet, cette étape est indispensable pour valider la bonne configuration. Par exemple :

cat /etc/motd | mail -s ‘motd’ utilisateur@free.fr
cat /etc/motd | mail -s ‘motd’ utilisateur@gmail.com
cat /etc/motd | mail -s ‘motd’ utilisateur@orange.fr

etc

Visualiser les fichiers journaux référencés ci-dessus à la recherche de message d’erreur, il ne doit pas y en avoir.

Un certificat SSL

En 2022, avoir un site accessible en https est nécessaire et indispensable, heureusement aujourd’hui c’est très facile à mettre en oeuvre, et c’est même gratuit, grâce https://letsencrypt.org/ . Le processus a été automatisé et se charge même de modifier les fichiers du serveur apache.

  • Installation du package certbot de letsencrypt :
    sudo apt-get install certbot
  • Installation du plugin permettant la configuration du serveur apache :
    sudo apt-get install python3-certbot-apache
  • vérification de l’installation du plugin par la commande :
    sudo certbot plugins
  • configuration (étape importante) du plugin apache par la commande :
    sudo certbot –apache
    Il sera demandé :
    – une adresse courriel valide permettant de recevoir des messages du site letsencrypt.org
    – de valider le nom DNS qui doit être automatiquement proposé (cf étape ddns précédente)
    Ensuite un certificat sera demandé par le script et automatiquement installé et configuré,
    Ainsi que le fichier /etc/apache2/sites-available/000-default-le-ssl.conf
  • Vérification du certificat mis en place :
    sudo certbot certificates
  • Fichier journal
    sudo cat /var/log/letsencrypt/letsencrypt.log
  • le certificat est valable 90 jours, pour le renouveler :
    manuellement :
    sudo letsencrypt renew

    ou via la crontab, par exemple :
    0 2 30 * * /usr/local/sbin/certbot-auto renew –pre-hook « service apache2 stop » –post-hook « service apache2 start » >> /var/log/certbot-renew.log | mail -s « CERTBOT Renouvellement » moncourriel@free.fr < /var/log/certbot-renew.log

Piwigo

Enfin voici Piwigo !!!

Installation

Télécharger la dernière version (au 23 janvier 2022 c’est la version 12.2.0) depuis le site : https://fr.piwigo.org/obtenir-piwigo (ou via le lien direct https://fr.piwigo.org/download/dlcounter.php?code=latest). On obtient un fichier compressé au format zip.
– Soit le fichier est « dézippé » sur le poste et les fichiers transférés ensuite vers le Raspberry Pi par les outils sftp ou scp
– Soit le fichier « zip » est copié en premier sur le Raspberry Pi puis « dézipppé » après, via la commande unzip,
A noter un sous répertoire Piwigo est automatiquement créé.

Une fois décompressé, un fichier README.md est lisible et contient quelques informations dont les prérequis.

Un fichier README doit toujours être lu ! Ne pas le lire peut signifier ne pas installer, dans le cas présent, le logiciel ImageMagick . A minima le paquet doit être installé : imagemagick-6.q16 via la commande apt install imagemagick-6.q16 , pour avoir la commande convert disponible sinon ce type de message sera lu dans le fichier /var/log/apache2/error.log lors de l’utilisation de Piwigo. Et surtout le binaire convert est LE binaire utilisé par Piwigo pour convertir les images dans des dimensions différentes. Effectivement je n’avais pas donc pas lu …

Chargement de la page Piwigo, le tout premier accès affichera la page de configuration du logiciel, surligné en jaune les informations à saisir :

Si le message ci-dessous s’affiche, au lieu de la page d’installation, cela signifie que le paquet php7.4-mysql n’est pas installé. L’installation s’effectue alors via la commande :
sudo apt install php7.4-mysql
puis rafraîchir le serveur web avec la commande :
sudo service apache2 restart

Les sept champs surlignés en jaune doivent être saisis :
– pour les trois premiers, il s’agit des informations notées lors de la configuration de la base de donnée
– pour les quatre derniers, il s’agit de nouvelles informations, le texte situé à droit est explicite.
finalement, cliquer sur le bouton « installation« .
L’installation de Piwigo est concluant.

A noter le fichier :
./local/config/database.inc.php
C’est LE fichier à conserver. Il contient les informations de connexions à la base de donnée.

Chargement des photos

Un clic sur « Visiter la galerie » pour continuer et c’est l’affichage ci-dessous, sur lequel on notera deux lignes de messages d’erreurs, moyennement jolies et peu utiles. Cet affichage malencontreux va être corrigé ultérieurement. Ajoutons une photo car c’est bien ce que l’on souhaite faire !!

Corrigeons les messages qui s’affichent car il semble que cela empêche l’onglet « Formulaire web » de s’afficher correctement.
Selectionner (=clic) sur le mot « Plugins » à gauche, puis sélectionner « LocalFiles Editor« . La première fois une erreur s’est affichée mais il semble sans conséquence (sur plusieurs installations réalisées, le message d’erreur est apparu une seule fois). Continuons.

cliquer ensuite sur « configuration« 

Enfin copier coller la ligne suivante puis enregistrer :

$conf[‘show_php_errors’] = E_ALL & ~E_NOTICE & ~E_DEPRECATED;

  • Lors du rechargement de la page, les messages en haut de page ne doivent plus s’afficher
  • L’onglet « Formulaire web » va être fonctionnel

Trois possibilités pour ajouter des photos :
– « Formulaire web » :
le plus simple et le plus rapide.

– « Applications » :
Onglet très riche d’applications utiles, je retiens ici la possibilité d’avoir un Piwigo installé sur son téléphone, permettant d’accéder au Raspberry Pi et à la galerie de photos. Top non ?

– « FTP + synchronisation » :
Il aurait été préférable de mettre en avant le protocole de transfert sftp et non ftp pour des raisons de sécurité. Avec l’utilisation de ftp le nom de connexion et le mot de passe circulent en clair sur le réseau. C’est l’onglet à privilégier, de mon point de vue, pour transférer de multiples albums et photos.
C’est donc l’option retenue pour transférer mes 32 000 photos et albums. Les fichiers sont à déposer dans le sous-répertoire galleries dans l’arborescence de Piwigo. (un sous-répertoire = un album, et il peut y avoir plusieurs sous albums).

Formulaire web

option « Formulaire web« , puis glisser lâcher des fichiers photos depuis le dossier que le PC, ensuite un clic sur le bouton « Démarrer le transfert »
Et voila : premier album avec une première photo.

Pour visualiser l’album, cliquer en haut à gauche sur « Visiter »

FTP + synchronisation

Transférer les répertoires, ce sont les albums, et les fichiers, ce sont les images, dans le sous-répertoire piwigo/galleries, puis outils, synchroniser « fichiers et répertoires« , après bien sûr avoir décocher la case « simulation« .
Ici création d’un sous-répertoire framboise314-2 puis transfert du fichier framboise314.jpg

Deux albums !

Cependant un point d’attention les deux albums sont différents en terme de stockage et de gestion, au moins au départ :
– Celui créé par le « Formulaire web » est dit « virtuel« , les images sont stockées dans le sous-répertoire _data/
Il est possible de supprimer l’album via l’option « gérer » de l’album
– Celui créé par « FTP + Synchronisation » a les images stockées dans le sous-répertoire galleries
Pour supprimer un album, il faut supprimer le répertoire et les fichiers puis « Synchroniser« 

Ultérieurement au fur et à mesure de la visualisation des photos, la même photo est redimensionnée pour permettre un affichage ad-hoc, et stocké ailleurs. Précisément :
– Si une photo est transférée initialement et stocké dans ./galleries
– Ensuite la même photo, redimensionnée automatiquement par Piwigo via l’utilisation du binaire convert, est stockée dans ./_data/i/galleries/
La source reste toujours dans le monde « FTP + Synchronisation » dans ./galleries
Une même photo peut exister en plusieurs exemplaires :

piwigo# find . -name « 7273 » -exec ls -la {} \;

-rw-r–r– 1 www-data www-data 74531 Feb 10 12:58 ./_data/i/galleries/2021/2021_11_24-28/IMG_7273-xs.JPG
-rwxrwx— 1 www-data www-data 3881813 Nov 24 13:49 ./galleries/2021/2021_11_24-28/IMG_7273.JPG


Une photo redimmensionnée au format xs signifie : 432 x 324 px affichée sur un navigateur,
la même sera au format sm (576×432) pour un affichage sur un téléphone mobile, etc etc ….

Les différents dimensions possibles d’une photo

Il est possible de préparer les photos dans les différents formats souhaités. Ainsi l’affichage sera rapide, car les photos n’auront pas à être préparées ie converties à la volée.
Cela se passe dans l’administration > Photos > Gestion par lot
La génération utilise intensivement le processeur. Si c’est sur un Raspberry Pi ou un serveur vous appartenant, vous seul serez impacté. Si c’est hébergé, il est certainement judicieux de ne pas faire des milliers de photos en une seule fois, mais par lot.

Par défaut les albums ainsi créés sont dits « public » ils sont visibles dès la page d’accueil de Piwigo (comme la copie d’écran ci-dessus). Il est possible de passer un album en mode « privé » uniquement visible par un internaute authentifié et ayant les droits de lecture donc de visionnage de l’album.
Piwigo intègre une gestion fine des utilisateurs, des groupes d’utilisateurs et des droits de chacun donnés par le webmestre sur la possibilité ou non de visionner des albums.

Les répertoires utilisés selon le mode de création d’un album

Piwigo est très riche en terme de fonctionnalités, plugins additionnels, c’est à découvrir sans modération.

Pour terminer, le tableau de bord de Piwigo, capturé à la fin de l’article, après deux installations, histoire de collecter le maximum d’information et de situation :

Depuis le téléphone Piwigo aussi !

Depuis le téléphone aussi il est possible d’accéder à la galerie de photos. C’est extrêmement pratique.

Les ajouts

clé ssh

Pour éviter une connexion au Raspberry Pi avec un mot de passe, le mieux est d’utiliser une clé ssh et de modifier sur le Raspberry Pi le fichier /etc/ssh/sshd_config pour n’autoriser qu’une connexion via clé.

– Depuis le PC sous linux passer la commande :
ssh-copy-id pi@piwigo ou ssh-copy-id pi@a.b.c.d en remplaçant a.b.c.d par l’adresse du Raspberry Pi.
Cela pré-suppose qu’une clé privée/publique a été généré au préalable avec la commande ssh-keygen

– Editer ensuite le fichier /etc/ssh/sshd_config et positionner pour la ligne PubkeyAuthentication la directive yes et pour PasswordAuthentication avec no.
Après modification, prendre en compte le fichier modifié avec la commande sudo service sshd restart

Vérifier que le comportement, lors d’une nouvelle connexion correspond à celui souhaité, en tentant une connexion lambda depuis un autre terminal ou une autre machine, sans clé ssh valide

C’est parfait l’accès est interdit !

Un filtrage des accès

Dès qu’un serveur informatique est accessible publiquement sur Internet, il est aussitôt la cible de tentative d’accès. Un outil existe pour surveiller les accès et bannir automatiquement les adresses IPv4 indélicats selon les règles mises en place, c’est fail2ban

Les règles et les fichiers de configuration peuvent être complexes à écrire et à mettre en oeuvre. Ici cela sera très simple pour mettre en évidence la mécanique de l’outil et son efficacité.

Ce qui est souhaité :
– filtrage des tentatives de connexion sur ssh,
– filtrage des tentatives d’accès sur URL du serveur apache, détection des codes HTML 400, 403, 404

Installation de l’outil par la commande :
sudo apt install fail2ban

Les cinq binaires nommés fail2ban-xxxxx sont installés dans le répertoire /usr/sbin/.
Le démon fail2ban-server est automatiquement démarré.
La commande service fail2ban status ou fail2ban-server status permet de le vérifier.

– Dans le répertoire /etc/fail2ban/jail.d/ le fichier defaults-debian.conf permet d’activer les filtres souhaités,
– Dans le répertoire /etc/fail2ban/filter.d/ sont stockés les fichiers pour chacun des filtres. Les filtres sont construits avec des expressions régulières.

ssh

C’est le plus simple à mettre en oeuvre car un fichier de configuration prédéfinie existe (/etc/fail2ban/filter.d/sshd.conf)

Il suffit de compléter le paragraphe existant avec celui ci-dessous dans le fichier defaults-debian.conf et de recharger la configuration via la commande sudo service fail2ban reload

enabled = true pour activer le filtre
maxretry = 2 signifie qu’après deux tentatives infructueuses détectées l’adresse IP ‘coupable’ sera bannie.
bantime = 864000 c’est la durée du bannissement en seconde, ici cela fait 10 jours, mais il est aussi possible d’utiliser d’indiquer 10d (d pour day).

Les valeurs par défaut sont plus tolérantes (3 pour le « retry » et 3600 pour le temps de bannissement). C’est aisément personnalisable pour chacun.

Une adresse bannie se traduit par un filtre positionné via la commande iptables. Les adresses bannies et les filtres mises en place sont visualisables via la commande :
iptables -L -n -v

apache

Il existe beaucoup de fichier de configuration du style apache-xxx dans le répertoire /etc/fail2ban/filter.d et multiples exemples sur le net. Ayant souhaité faire très simple un fichier nommé apache400-403-404.conf est créé dans le répertoire /etc/fail2ban/filter.d avec trois lignes comme indiqué ci-dessous, ce qui permet de détecter aisément les codes 400, 403 et 404 et d’ignorer 4 types de fichiers :

Le contenu du fichier defaults-debian.conf est complété avec le paragraphe suivant :

La configuration fail2ban est rechargée comme précédemment avec la commande :
sudo service fail2ban reload

Envoi de courriel

Pour vérifier le bon fonctionnement et être alerté en temps réel ou presque, selon le délai d’acheminement des courriels, il est possible de configurer un envoi de courriel à chaque adresse bannie. Les lignes suivantes sont à ajouter dans le fichier defaults-debian.conf :

[DEFAULT]
destemail = vous@chez.fr
sender = user@leserveurpiwigo.xxx


destemail correspond à l’adresse destinatrice qui va recevoir le courriel
sender est le nom de l’utilisateur qui sera considéré comme l’émetteur du courriel depuis le Raspberry Pi.

Le courriel reçu indique :
– Dans le sujet le filtre qui a été déclenché et l’adresse IP bannie
– Dans le corps du courriel est indiqué plus de détail sur l’adresse IP et le plage de réseau grâce à une recherche whois (le paquet whois doit être installé)

Résultats & recommandations

Quelques minutes ou dizaines de minutes suffisent pour vérifier que la pêche est fructueuse. Après pratiquement deux mois voici le nombre d’adresse IP bloquée selon le filtre :
– sshd : 205
– apache400-403-404 : 874

Le fichier journal de fail2ban est /var/log/fail2ban.log et indique :
– Les adresses bannies détectés,
– Les filtres chargés au démarrage,
– Le démarrage et l’arrêt du service fail2ban.

Le résultat de la commande iptable qui ne peut être utilisé que sous l’autorité de l’utilisateur ‘root
Très instructif le contenu du fichier /var/log/apache2/access.log !
Un exemple des courriels reçus

Il est recommandé d’ajouter en dernière ligne du paragraphe [DEFAULT] une ligne sur le modèle :

ignoreip = 192.168.1.0/24 192.168.0.0/24 x.x.x.x

ou x.x.x.x est l’adresse IP publique du Raspberry Pi.
Les adresses 192.168.x.x sont à modifier selon la configuration réseau de chacun.

Cela évitera d’être banni soi même !

Il est possible de bannir ou de libérer une adresse manuellement via la ligne de commande :
sudo fail2ban-client set sshd banip 185.213.155.168
et
sudo fail2ban-client set sshd unbanip 185.213.155.168


Pour obtenir la liste des adresses IP bannies pour un filtre :
sudo fail2ban-client status sshd
sudo fail2ban-client status apache400-403-404

Sécurité vue de l’extérieur

Essayer de configurer au mieux un Raspberry Pi ou tout système informatique, c’est bien et c’est même ce qui devrait être fait par défaut, mais personne n’est à l’abri d’une configuration disons perfectible. Pour vérifier de multiples sites existent, voici ceux utilisés et les modification effectuées pour améliorer la sécurité.
Evidemment le service fail2ban doit être désactivé pendant les tests et vous devez être le propriétaire du site faisant l’objet du test. Cela peut paraître évident mais c’est encore mieux en le disant.

Le résultat du premier site utilisé https://observatory.mozilla.org/ indique l’étendu du problème, le score est 0 le grade F, bref c’est nul, il faut être lucide.

Après quelques modifications de la configuration du serveur apache c’est mieux, beaucoup mieux :
Grade B avec un score de 75/100 et 10 tests de passés avec succès sur 11.

En fait il est possible d’atteindre le maximum de sécurité ie 125 et le grade A+, mais dans ce cas Piwigo ne fonctionnent plus correctement 🙁 . En sécurité c’est toujours une affaire d’équilibre : un système informatique hors tension enfermé dans un coffre fort à 15m sous terre, est sécurisé mais il ne sert à rien.

Le site utilisé est intéressant car il indique les tests effectués et les corrections à faire (i). Un test peut être effectué toutes les cinq minutes :

Voici les modifications du serveur apache effectuées :

– Ajout à la fin du fichier /etc/apache2/apache2.conf :

Header always set X-Content-Type-Options « nosniff »
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict
FileETag None
User www-data
group www-data

Il est nécessaire que tous les fichiers « servis » par le serveur apache appartiennent au même groupe et utilisateur que le serveur apache, la comande suivante fait le travail :
sudo chown -R www-data.www-data sur l’arborescence Piwigo ce qui inclut les répertoires galleries etc
sinon les mises à jour des plugins par exemple ne fonctionneront pas et un message sibyllin ERREUR en rouge s’affichera en haut à droite de la page en lieu et place d’un message de bonne installation :

Les droits sur les fichiers, c’est important !

– Ajout à la fin du fichier /etc/apache2/sites-available/000-default.conf mais avant la balise </VirtualHost> :

RewriteEngine on
RewriteCond %{SERVER_NAME} =monserveur.ddns.net
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
Redirect permanent / https://monserveur.ddns.net/


Bien sûr le serveur indiqué sur la ligne Redirect permanent est à modifier !

– Ajout à la fin du fichier /etc/apache2/sites-available/000-default-le-ssl.conf mais avant la balise </VirtualHost> :

Header always set Strict-Transport-Security « max-age=31536000; includeSubDomains; preload »
Header always set X-Content-Type-Options « nosniff »


– Modification du fichier /etc/apache2/conf-available/security.conf
positionner la directive ServerTokens à Prod
et ServerSignature à Off
Moins d’informations sont disponibles sur le serveur apache mieux c’est.

Avant, ces deux modifications et redémarrage du serveur apache, la commande :
sudo nmap -sV -p 80 192.168.1.13 (adapter la commande en mettant l’adresse de votre Raspberry Pi) indique :

PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.52 ((Raspbian))


Après c’est mieux, les informations de version et de système d’exploitation ne sont plus visibles :

PORT STATE SERVICE VERSION
80/tcp open http Apache httpd


Après toutes les modifications effectués, le service apache2 est redémarré.

Augmenter la sécurité imposerait de modifier le code de Piwigo, par exemple ajouter les préfixes __Host- et __Secure aux cookies déposés. C’est un autre sujet hors du périmètre de cet article.

La configuration ssl est vérifiée via le site https://www.ssllabs.com/ssltest/.

Sauvegarde

Le sujet sauvegarde est un sujet important. Les données c’est le plus critique, l’OS et l’environnement peuvent être recréés. Concernant les données c’est plus compliqué, plus long, voir impossible. Pourquoi ne pas envisager de copier régulièrement via, par exemple, la commande rsync, les sauvegardes de la base de données et les photos vers un autre environnement ?

Pour sauvegarder la base de donnée, la commande mysqldump remplie parfaitement son rôle via un script minimaliste :

Utilitaires

Ces deux utilitaires, utiles au quotidien, sont installés sur chaque Raspberry Pi utilisé :

neofecth
via la commande sudo apt install neofetch
Le programme est ensuite ajouté en dernière ligne du fichier .bashrc ainsi à chaque connexion, bien que cela prenne une ou deux secondes supplémentaires, les informations systèmes du raspberypi sont affichées.

nmon
via la commande sudo apt install nmon
Cet outil système permet d’avoir sur une même console texte toutes les informations nécessaires : processeur, mémoire, disque, réseau etc en mode interactif. Un mode « batch » est aussi disponible. L’aide (h) est explicite et la documentation accessible sur Internet pléthorique.

Points d’amélioration

– Passer la commande mysql_secure_installation pour sécuriser le serveur base de donnée,
– Supprimer la possibilité de se connecter en ligne de commande sous l’autorité de l’utilisateur root sans mot de passe, seul la connexion via une clé est alors autorisée,
– Ne plus utiliser l’utilisateur par défaut pi mais créer un autre utilisateur,
– A minima modifier le port ssh d’écoute par défaut (port 22),
– Voir supprimer l’accès ssh direct depuis l’extérieur et mettre en place un tunnel VPN avec openvpn,
– Arriver à configurer correctement les directives « Content Security Policy (CSP) » et »X-XSS-Protection » du serveur apache pour permettre le fonctionnement de Piwigo,
– installer et utiliser le plugin Piwigo : HistoryIPExcluder, pour bannir les adresses IP qui essayent de se connecter,
– faire fonctionner le disque SSD sur l’USB 3,

Conclusion

L’article est long mais j’espère qu’il sera utile et vous donnera envie d’installer et d’utiliser Piwigo.

Le logiciel Piwigo correspond parfaitement au besoin :
– Une gestion efficace des photos,
– Une fluidité de l’interface,
– De multiples utilisateurs avec une bonne granularité d’accès,
– Globalement très simple à installer, malgré la longueur de cet article 🙂

Piwigo est un logiciel dit Open Source le code source est donc librement accessible, modifiable et re-distribuable. Est il gratuit ? je ne vais pas entrer dans ce débat, cependant n’oubliez pas que ce qui est gratuit n’a pas de prix, aussi si vous souhaitez contribuer plusieurs choix sont proposés par Piwigo sur leur page « contribuer » https://fr.piwigo.org/contribuer

Sources et références

11 réflexions au sujet de « Gestion de photos avec le logiciel « Piwigo » »

  1. Delsaux

    Bravo, superbe travail, documentation topMerci pour le partageTrès bon choix pour piwigo, je le faisais tourner sur un tout petit nas (256 Mo Ram)  il y a pleine d’années et j’en étais vraiment raviça me donne envie de m’y remettre une fois fini de jouer avec NFS et esxi 😉

    Répondre
  2. Philippe Hermès Auteur de l’article

    Bonjour CDBI72,

    Effectivement Piwigo gère aussi les vidéos via un plugin.
    J’ai installé le plugin VideoJS depuis Piwigo et les vidéos au format mp4 sont bien gérés.
    GitHub : https://github.com/Piwigo/piwigo-videojs

    Y aussi le plugin Embedded Videos (anciennement PY GVideo) qui permet d’ajouter à votre galerie des vidéos depuis Dailymotion, Youtube, Vimeo, Wideo et Wat.

    Cordialement

    Répondre
  3. Philippe Hermès Auteur de l’article

    Pour être précis cf les informations de VideoJS, les formats suivants sont supportés : 

    • webm,webmv
    • ogg,ogv
    • mp4,m4v
    Répondre
  4. Thierry

    Super travail Philippe !Merci pour ce partage.Cela va bien au-delà  de Piwigo, c’est carrément une install serveur qui peut servir en grande partie à plein d’autre chose.Plutôt que HistoryIPExcluder j’ai trouvé ça, bon je n’ai pas encore regardé en profondeur mais cela peut être inintéressant : freeandthings.wordpress.com/2015/06/17/fail2ban-configuration-for-piwigo-failed-logins/
     
    En tout cas bravo !

    Répondre
  5. Philippe Hermès Auteur de l’article

    Bonjour Thierry,
    Merci pour ce petit mot, cela fait toujours plaisir !

    J’ai regardé, mais pas encore essayé le plugin dont le lien est partagé dans le commentaire. (lien direct sur le plugin : https://piwigo.org/ext/extension_view.php?eid=801)
    Ce qui me pose problème : 
    – Le plugin date de 2015, pas de mise à jour depuis, cela fait 7 ans,
    – Il est indiqué : « Compatible with: Piwigo releases 2.7, 2.8, 2.9, 2.10″,
    – La dernière version de Piwigo disponible sur laquelle j’ai basé l’article c’est la version 12.2.0 , cela fait beaucoup de version d’écart.
    bref à creuser c’est intéressant, je vais tenter un courriel à l’auteur du plugin et partagerai la réponse.

    Pour info :
    – 1434 adresses IP sont maintenant bannies concernant la règle : apache400-403-404 
    – sshd : sujet clos coté sécurité, l’accès ssh depuis l’extérieur a été supprimé
    Reste donc exposé coté internet :  apache pour piwigo et openvpn.

    Répondre
  6. Philippe Hermès Auteur de l’article

    @Thierry,
    Voici le retour du développeur, que je partage, littéralement, c’est un photographe néo zélandais qui m’a répondu dans les 24h (top!).
    « I wrote the plugin when I was hosting Piwigo on my own server so that I have a better idea if anyone is trying to hack it. Since then I moved to 3rd party hosting so I am not as concerned about it as I used to. I am currently busy with other projects and not planning to revisit this. The best people to answer your question would be probably Piwigo developers since they would know if the functionality the plugin depends on has changed or not. From memory it was very simple handler relying on Piwigo provided callback/hook function when a failed login occurs. « 

    – le plugin a été écrit quand il hébergeait lui même Piwigo, ce n’est plus le cas aujourd’hui
    – vu le gap de version, seul l’équipe Piwigo pourrait confirmer si le mécanisme utilisé pour détecter les « failed login »

    Cordialement

    Répondre
  7. Philippe Hermès Auteur de l’article

    Bonjour,
    Pratiquement 2 ans plus tard, après l’écriture de cette article et la mise en oeuvre du raspberry pi connecté à l’internet.
    Un point sur le filtrage IP :
      36 286 @IP bloqués dont :
         – 1 108 pour l’openvpn
         – 25 723 sur le serveur web apache2
         – 9 455 sur le service SSH, service désactivé depuis 1 an
    Uniquement  OpenVPN et apache ouvert depuis l’internet.

    A noter la dernière version 14.1 de Piwigo est disponible

    Bon Piwigo

    Répondre
  8. SHAW

    Hello, bravo pour ce blog complet !Je compte faire un projet pers pour ma famille en utilisant piwigo sur raspberry pi.
    Avec l’experience, quelle est la taille du disque que vous utilisez après 2 ans et demi et pour combien de photos/vidéos environ ?
    Je n’ai pas d’ordre de grandeur et j’aimerais ne pas faire d’erreurs de jugement sur la taille du SSD à acheter (je pense utiliser un HD pour la redondance)
     
    Merci d’avance <3

    Répondre
  9. Philippe Hermès Auteur de l’article

    Bonjour SHAW,

    Un grand merci pour votre commentaire !

    Après 26 mois de mise en fonctionnement cela fonctionne comme une horloge.
    Coté chiffres, il est important de noter que c’est une utilisation purement familiale (cf https://fr.piwigo.org/qui-utilise-piwigo#our-users pour d’autres utilisations). Les photos ne sont pas des photos en très haute résolution qui font des dizaines de Mo chacune et les vidéos ne sont pas très longues.
    Pour partager des valeurs : les photos entre 2 et 7Mo et les vidéos maxi 130Mo.
    – 42 472 photos
    – 1130 albums
    – total photos : 112Go
    – total vidéos : 52Go
    – total cache : 49Go
    Total = 213Go  et le taux d’ocuppation du disque de 512Go SSD est de 54%

    Je partage l’info suivante purement gratuitement et sans rétribution du vendeur ; Les disques ont été acquis chez https://www.nierle.com , le disque de 1To est à 70€ (https://www.nierle.com/fr/article/982738/Disque_dur_MediaRange_SSD_externe,_960_Go,_USB_3.0,_Type_C,_argent.html)

    Coté redondance, oui un autre disque c’est une possibilité. Autre solution un autre pi ailleurs et une synchro via rsync over VPN.

    Coté sécurité, à noter qu’en 26 mois  : environ 1130 adresses bloqués coté VPN et plus de 28000 coté apache.

    Si vous avez d’autres questions n’hésitez pas.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.