Notes sur l’instalation de Piwigo

Voici quelques notes sur l’installation de Piwigo [1], [2], une application web dédié à la gestion de photos. Malgré mes réticences à augmenter ma surface d’attaque avec l’utilisation d’un PHP et d’une grosse base de données, je teste cette solution qui promet de faciliter la gestion et le partage des photos à plusieurs.

Voilà l’idée: mon serveur HTTP va transférer les requêtes à l’application Piwigo (PHP+Mysql), qui sera isolé dans un conteneur. Les données importantes (les photos) seront dans un dossier partagé avec l’hôte.

1. Création du conteneur

Notre conteneur s’appelle piwigo. On procède de manière standard:

$ umask a=rx,g+w    ## J'ai eu des soucis car mon umask par défaut est différent.
$ sudo mkdir /srv/piwigo    ## Emplacement des photos.
$ sudo mkdir -p /usr/share/webapps/piwigo    ## Emplacement du site.

Notez que les fichiers du site doivent-être accessible depuis le serveur nginx, qui est sur l’hôte.

$ sudo mkdir /var/lib/machines/piwigo
$ sudo pacstrap -c /var/lib/machines/piwigo base base-devel git /nginx/ php php-fpm php-gd mariadb ffmpeg perl
[…]
$ sudo systemd-nspawn -D /var/lib/machines/piwigo
[root@piwigo ~]# passwd
New password:  ## Choisir un mot de passe root.
Retype new password:
passwd: password updated successfully
[root@piwigo ~]# echo "pts/0" >> /etc/securetty
[root@piwigo ~]# logout

Container piwigo exited successfully.
$ sudo systemd-nspawn -D /var/lib/machines/piwigo --bind=/srv/piwigo --bind=/usr/share/webapps/piwigo -b
[…]

piwigo login: root
Password:  ## Entrer le mot de passe root.
[root@piwigo ~]# pacman -S <your-favorite-text-editor>
[root@piwigo ~]# pacman -S --asdeps unzip
[…]

On a besoin de compiler un paquet AUR, ce qui ne peut se faire en tant que root. On utilise la méthode indiquée par [3]:

[root@piwigo ~]# ## Création d'un répertoire _home_ dédié à la compilation de paquets.
[root@piwigo ~]# mkdir /home/build
[root@piwigo ~]# chgrp nobody /home/build
[root@piwigo ~]# chmod g+ws /home/build
[root@piwigo ~]# setfacl -m u::rwx,g::rwx /home/build
[root@piwigo ~]# setfacl -d --set u::rwx,g::rwx,o::- /home/build
[root@piwigo ~]# ## Compilation du paquet en tant que _nobody_
[root@piwigo ~]# cd /home/build
[root@piwigo build]# git clone https://aur.archlinux.org/piwigo.git
[root@piwigo build]# cd piwigo
[root@piwigo build]# sudo -u nobody makepkg
[root@piwigo build]# pacman -U piwigo-12.3.0-1-any.pkg.tar.zst

Étrangement, le répertoire /usr/share/webapps/piwigo n’est accessible qu’à _root_. Je relaxe la restriction (ce qui fait effectivement marcher le site):

[root@piwigo ~]# chgrp -R http /usr/share/webapps/piwigo

Piwigo utilise beaucoup de fonctions dépréciées de PHP 8, ce qui créé plein de messages gênants dans les pages Web. On peut les désactiver en modifiant le fichier /usr/share/webapps/piwigo/include/config_default.inc.php

$conf['show_php_errors'] = E_ALL & ~E_DEPRECATED & ~E_NOTICE & ~E_WARNING;

Ensuite, il faut modifier les liens du dossier /usr/share/webapps/piwigo pour les faire passer par /srv/piwigo.

2. Configuration de PHP (dans le conteneur)

On se base sur le guide d’Archlinux [4] pour éditer /etc/php/php.ini:

[…]
date.timezone = Europe/Paris
[…]
open_basedir = /usr/share/webapps/:/srv/piwigo:/tmp
[…]
extension=exif
[…]
extension=gd
[…]
extension=mysqli
[…]
extension=pdo_mysql

On déplace ensuite le socket de communication entre nginx et piwigo dans le dossier commun entre l’hôte et le conteneur. Pour cela, on édite /etc/php/php-fpm.d/piwigo.conf:

[piwigo]
listen = /srv/piwigo/piwigo.sock

On active finalement PHP

[root@piwigo ~]# systemctl enable php-fpm
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service -> /usr/lib/systemd/system/php-fpm.service.

3. Configuration de MariaDB (dans le conteneur)

On se base sur le guide l’Archlinux aussi [5]. On commence par initializer la base de données, puis on démarre le service

[root@piwigo ~]# mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
[root@piwigo ~]# systemctl start mariadb

On créé ensuite un utilisateur piwigo_db_user avec un mot de passe associé, et on lui accorde les privièges pour la base de donnée piwigo_db:

[root@piwigo ~]# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE piwigo_db;
MariaDB [(none)]> CREATE USER 'piwigo_db_user'@'localhost' IDENTIFIED BY '$!#@!$';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON piwigo_db.* TO 'piwigo_db_user'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> quit

On sécurise ensuite la base de données:

[root@piwigo ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

On termine par activer la base de données au démarrage.

[root@piwigo ~]# systemctl enable mariadb
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service -> /usr/lib/systemd/system/mariadb.service.

4. Configuration de nginx (dans l’hôte)

Piwigo fournit un exemple de configuration ici:

> /etc/nginx/sites-available/piwigo.conf.example

À l’aide d’un autre terminal, je copie-colle son contenu dans la configuration nginx de l’hôte. Il faut mettre en place ssh

server {
     listen       80;
     server_name  photos.jpilot.fr;

     return 301 https://photos.jpilot.fr;
}

server {
 listen       443 ssl;
 server_name  photos.jpilot.fr;
 […]

Puis il faut adapter le fastcgi_pass:

[…]
location ~ ^(?<script_name>.+?\.php)(?<path_info>/.*)?$ {
     try_files                 $script_name =404;
     include                   /etc/nginx/fastcgi_params;
     fastcgi_pass              unix:/srv/piwigo/piwigo.sock;
     fastcgi_param             PATH_INFO $path_info;
     fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
 }

Avant de relancer le service, je vérifie la syntaxe avec nginx -t.

5. Lancement

On va maintenant relancer le conteneur en background. On édite le fichier /etc/systemd/nspawn/piwigo.nspawn

[Exec]
PrivateUsers=no
LinkJournal=guest

[Files]
Bind=/srv/piwigo
Bind=/usr/share/webapps/piwigo

L’option PrivateUsers simplifie le partage de fichiers entre l’hôte et le conteneur. L’option LinkJournal permet de stocker les log dans le conteneur, tout en les rendant accessible depuis l’hôte.

Il ne reste plus qu’à démarrer la machine

$ sudo machinectl start piwigo

links

social