Piwigo

Cela faisait quelques temps que j’Ă©tais Ă  la recherche d’une galerie pour y publier quelques photos de temps en temps. Plume a un gestionnaire de mĂ©dias faisant le taff, mais il a encore besoin de s’amĂ©liorer et j’ai donc optĂ© pour un outil plus spĂ©cialisĂ©.

D’anciens bricolages je connaissais surtout Gallery, projet depuis Ă  l’abandon mais qui Ă©tait pas mal. Dommage.

J’ai d’abord regardĂ© du cĂ´tĂ© de Piwigo mais le fait qu’il ne supporte que MySQL en base de donnĂ©es m’a rebutĂ©. En effet, j’utilise plutĂ´t du Postgres et cela me dĂ©rangeait de devoir installer un autre serveur de BDD uniquement pour un outil.

Je me suis donc tournĂ© dans un premier temps vers MediaGoblin qui lui gère cette base de donnĂ©es. Mais après deux soirĂ©es passĂ©es dessus Ă  essayer de le faire tomber en marche, j’ai abandonnĂ©. J’ai eu la GUI, serveur paramĂ©trĂ©, etc, mais les formulaires renvoyaient vers localhost et je n’arrivais pas Ă  trouver comment paramĂ©trer son adresse publique. La documentation est hĂ©las très incomplète et je n’arrivais pas Ă  me reprĂ©senter l’architecture du logiciel entre ce qui Ă©tait dit et ce que je constatais.

PlutĂ´t que de m’acharner, j’ai donc dĂ©cidĂ© d’ajouter MariaDB sur le serveur qui hĂ©berge dĂ©jĂ  mon Postgres et de donner sa chance Ă  Piwigo. Certes c’est pas top niveau perfs d’avoir ces deux outils sur le mĂŞme serveur, mais bon, je n’hĂ©berge pas non plus la Terre entière donc ça fera le job.

Présentation

Piwigo est nĂ© sous le nom PhpWebGallery, Ă©crit en 2001 par Pierrick Le Gall et inspirĂ© par le projet phpBB en tant que travail personnel. Il est finalement publiĂ© en 2002 sous licence GPL et s’enrichi continuellement tout en supportant de nouvelles langues. Le projet est renommĂ© Piwigo en 2009 et vie Ă  la fois de donations et contributions, mais aussi d’une offre d’hĂ©bergement SaaS basĂ©e dessus. Comme son premier nom l’indique, il est Ă©crit en PHP et a donc besoin d’une base de donnĂ©es MySQL/MariaDB.

En cherchant nĂ©anmoins au dĂ©but, j’avais cru voir qu’il gĂ©rait le support de Postgresql, mais finalement celui-ci fut abandonnĂ©.

L’outil vit Ă©galement avec son temps car il s’est progressivement enrichi d’API et dispose d’une application mobile sur iOS et Android. Le logiciel est traduit en 56 langues et le site web possède une douzaine de localisations diffĂ©rentes.

Installation

DĂ©ploiement des sources PHP

Le site propose un dĂ©marrage rapide qui est très simple Ă  mettre en oeuvre. Etant codĂ© en PHP, l’installation de l’outil n’est qu’un simple dĂ©ploiement de scripts. J’avoue ĂŞtre assez nostalgique de ces mĂ©thodes car au final on a juste besoin de dĂ©ployer une archive et ça marche… Quand je vois la plupart des applis web oĂą dĂ©sormais il faut installer 15 runtimes diffĂ©rents et multiplier les couches techniques, je reconnais devenir de plus en plus feignant et prendre l’image Docker par facilitĂ© parfois.

A noter qu’il dispose aussi d’une netinstall demandant d’envoyer un seul PHP qui fait tout le reste.

J’ai donc tĂ©lĂ©chargĂ© l’archive sur mon serveur web.

Par facilité, les actions sont réalisées en root.

wget https://piwigo.org/download/dlcounter.php?code=latest -o piwigo.zip
unzip piwigo.zip -d /srv/www/
chown -R apache:apache /srv/www/piwigo

En allant ensuite dans le dossier piwigo, j’ai constatĂ© quelque chose de dĂ©plaisant. Les dossiers Ă  la racine avaient la totalitĂ© des permissions et des scripts php Ă©taient exĂ©cutables.

Je change donc tout cela :

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod -x {} \;

Je préfère.

Ensuite, ayant SELinux activĂ©, il faut donner l’autorisation au daemon Web d’aller Ă©crire dans les dossiers mĂ©dias pour les upload.

semanage fcontext -a -t httpd_sys_rw_content_t '/srv/www/piwigo/upload(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/srv/www/piwigo/_data(/.*)?'
restorecon -R /srv/www/piwigo/

Voyons ce que ça donne.

ls -lZ

total 352
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     1823 26 mars  19:53 about.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     5723 26 mars  19:53 action.php
drwxr-xr-x.  4 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 admin
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    10567 26 mars  19:53 admin.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    15758 26 mars  19:53 comments.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0      467 26 mars  19:53 COPYING.txt
drwxr-xr-x.  6 apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0  4096  9 sept. 21:56 _data
drwxr-xr-x.  2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 doc
drwxr-xr-x.  2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 docs
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     5548 26 mars  19:53 feed.php
drwxr-xr-x.  2 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 galleries
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4443 26 mars  19:53 identification.php
drwxr-xr-x. 10 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 include
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    10749 26 mars  19:53 index.php
drwxr-xr-x.  3 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 install
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    15461 26 mars  19:53 install.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    17203 26 mars  19:53 i.php
drwxr-xr-x. 72 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 language
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    18092 26 mars  19:53 LICENSE.txt
drwxr-xr-x.  5 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 local
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     2776 26 mars  19:53 nbm.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     3346 26 mars  19:53 notification.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    10252 26 mars  19:53 password.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    28545 26 mars  19:53 picture.php
drwxr-xr-x.  6 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 plugins
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     2112 26 mars  19:53 popuphelp.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    10933 26 mars  19:53 profile.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     1562 26 mars  19:53 qsearch.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     2013 26 mars  19:53 random.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     1905 26 mars  19:53 README.md
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     3514 26 mars  19:53 register.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     7433 26 mars  19:53 search.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     6321 26 mars  19:53 search_rules.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4860 26 mars  19:53 tags.php
drwxr-xr-x.  4 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 template-extension
drwxr-xr-x.  6 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 themes
drwxr-xr-x.  3 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     4096 26 mars  19:53 tools
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0     3159 26 mars  19:53 upgrade_feed.php
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    15218 26 mars  19:53 upgrade.php
drwxr-xr-x.  4 apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0  4096  9 sept. 21:56 upload
-rw-r--r--.  1 apache apache unconfined_u:object_r:httpd_sys_content_t:s0    41950 26 mars  19:53 ws.php

Veuillez noter que je n’ai donnĂ© aucun droit d’Ă©criture au dossier locale qui est lĂ  oĂą la config gĂ©nĂ©rĂ©e Ă  la prochaine Ă©tape sera stockĂ©e. Ceci empĂŞchera l’installeur de crĂ©er le fichier, il faudra donc le faire Ă  la main.

Création de la base de données et de son utilisateur

Connectez-vous Ă  votre serveur MySQL/MariaDB avec un compte admin.

mysql -u root -p
Enter password: 
-- creation de la BDD
create database piwigo;

-- Dans le cas oĂą votre BDD est sur un autre serveur, mettez @'%'. Si MySQL est sur la mĂŞme serveur, mettez localhost pour en faire un utilisateur restreint au domaine local.
CREATE USER 'piwigo'@'%' IDENTIFIED  BY '<un mot de passe fort>';

-- On donne les droits Ă  l'utilisateur sur la base. Adaptez 'piwigo'@'%' avec localhost Ă  la place de % si besoin
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX, DROP, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON db_piwigo.* to 'piwigo'@'%'

Création du vhost Apache

Je ferai simple ici car le but est juste d’accĂ©der Ă  l’application. A adapter selon votre serveur web et la façon dont vous hĂ©bergez (si reverse proxy en frontal, etc). Dans ma conf complète, je me suis permis d’y ajouter quelques directives issues du fichier .htaccess de Nextcloud. Notamment celles de sĂ©curitĂ© et de gestion de cache.

<VirtualHost *:80>
        ServerName piwigo
        CustomLog /var/log/httpd/pwigo_access.log common
        ErrorLog /var/log/httpd/piwigo_error.log
        DocumentRoot /srv/www/piwigo
        ServerAdmin admin@example.com

        # Encoded slashes need to be allowed
        AllowEncodedSlashes             On
        <Directory />
                Options MultiViews FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>

</VirtualHost>

Premier démarrage

En se connectant Ă  l’adresse de Piwigo sur votre serveur Web, vous serez directement redirigĂ© Ă  l’Ă©cran d’installation. Celui-ci vous demandera de fournir les identifiants de connexion Ă  la base de donnĂ©es et de crĂ©er un compte admin sur l’appli.

Dans le cas oĂą SELinux fait des misères, il suffit de gĂ©nĂ©rer les règles d’accès Ă  partir des logs d’audit.

grep php-fpm /var/log/audit/audit.log | audit2allow -M rulesPiwigo

Puis de les appliquer :

semodule -i rulesPiwigo.pp

Dans tous les cas, avec les restrictions que j’ai mises ici, la config ne pourra ĂŞtre Ă©crite par le site. RĂ©cupĂ©rez donc les instructions gĂ©nĂ©rĂ©es et reportez les dans /srv/www/piwigo/local/config/database.inc.php

Côté droits, je me suis assuré que le fichier est en lecture uniquement.

chown apache:apache /srv/www/piwigo/local/config/database.inc.php
chmod 400 /srv/www/piwigo/local/config/database.inc.php

Ceci fait, vous pouvez accĂ©der Ă  l’application et vous y connecter avec le profil crĂ©Ă© prĂ©cĂ©demment.

Premiers pas

Une fois Piwigo disponible, j’ai surtout commencĂ© Ă  parcourir les diverses options d’admin pour voir le niveau de personnalisation. Il y a pas mal de choses notamment au niveau des thèmes de l’interface qui permettent de dĂ©finir le nombre de vignettes par pages, la taille, les Ă©lĂ©ments Ă  afficher, etc.

piwigo2

On commence d’abord par se crĂ©er un album dans lequel on va pouvoir ensuite envoyer des photos. Il est possible de crĂ©er des albums publics et privĂ©s au choix. Un système d’hĂ©ritage de droits facilite la gestion avec les sous albums.

En ayant mis les options de caches que j’ai citĂ© plus haut, les temps de chargement sont corrects et les imports ne m’ont pas pris trop de temps. Il convient de modifier la conf PHP pour envoyer des fichiers de grande taille au niveau des entrĂ©es, notamment les valeurs de post_max_size et upload_max_filesize.

Piwigo permet de créer ses propres filigranes, mais pour ma part je gère ça avec Darktable.

Outre l’envoi par le site, vous pouvez aussi faire des imports directement en envoyant les fichiers sur le serveur ou bien en passant par les applications mobiles. Piwigo dispose d’une appli Android et iOS pour se synchro avec sa propre galerie. Je n’ai pas Ă©tĂ© bien loin dans l’utilisation de cette version mobile car au moment oĂą j’Ă©cris ce billet, elle possède un bug Ă  cause duquel les images ne s’affichent pas lorsqu’on utilise un reverse proxy.

A voir avec l’usage, mais cette première approche m’a bien plu et l’outil semble vraiment bien foutu. Il faut dire qu’Ă©tant assez âgĂ©, il dispose d’une certaine maturitĂ© et expĂ©rience. La documentation est correcte pour une prise en main initiale et possède des chapitres avancĂ©s intĂ©ressants.