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.