J’ai depuis plusieurs années un NAS sous OpenMediaVault. Bien que je fasse les mises à jour au grès de leurs sorties et alors que j’utilise la dernière version stable d’OMV, force est de constater que celle-ci est encore basée sur Debian 9.
Du coup, qui dit Debian 9, dit PHP 7.0. Or cette version n’est plus supportée depuis plus d’1 an et cela m’empêche d’élever la version de NextCloud au delà de la v15. C’est pour cela que j’ai étudié les possibilités pour palier à ce problème.
Quelques explications sur mon installation de NextCloud
Mon installation de NextCloud est une installation classique, sans aucun plugin OpenMediaVault :
- Création d’un virtual host à la main, consommant le PHP natif d’OpenMediaVault.
- Installation au sein d’un sous répertoire de /var/www/.
- Utilisation du serveur mail d’OpenMediaVault.
- Utilisation du MySQL d’OpenMediaVault, pour ça j’utilise un plugin.
Je me retrouve donc avec un NextCloud sur mon NAS installé en parallèle d’OpenMediaVault mais jouissant d’une certaine indépendance.
Les différentes solutions envisagées
Mise à jour de PHP
Malheureusement OpenMediaVault est écrit, entre autre, en PHP. Et mettre à jour la version courante de PHP présente de forts risques de voir toute l’interface ne plus fonctionner. Du coup cette solution a été exclue.
Ajout d’une seconde version de PHP en parallèle
Apparemment pour Debian il existe un dépôt qui ferait l’affaire: Sury. Cependant, j’ai voulu l’essayer et je me suis rendu compte qu’il installait bien la dernière version de PHP mais qu’il touchait également à la version courante… Trop risqué, solution rejetée.
Utilisation d’un container Docker
C’est la solution de la containérisation que j’ai donc retenue et ça tombe bien il y a un plugin OpenMediaVault pour manager Docker ! Mon seul problème étant que PHP-FPM tourne généralement sous le port 9000, port déjà utilisé dans mon cas, mais après quelques modifications le problème est vite résolu.
Installation d’un container PHP 7.4 sous OpenMediaVault 4
Installation de Docker
Installer le plugin Docker est assez simple. Il suffit de commencer par installer le plugin OMV-Extras.org, puis ensuite d’activer le dépôt Docker CE :
Et pour finir il n’y a qu’à installer le plugin Docker :
Récupération de l’image PHP
Récupérer une image via le plugin Docker est super simple ! Prenons par exemple mon image PHP qui fonctionne parfaitement avec NextCloud :
Préparation de la configuration et des optimisations du container
Maintenant nous allons préparer les fichiers de configurations qui seront montés en volume Docker afin de se substituer à ceux présents dans l’image.
En effet, mon image est assez complète, trop même puisqu’elle embarque x-debug par défaut. J’ai donc fait une modification pour décharger ce module :
cat /srv/docker/docker-php-ext-xdebug.ini
;zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so
Autre modification, j’ai déjà une application qui tourne sur mon port 9000 : Logitech Media Server qui assure le multi-room chez moi. Du coup, là encore, j’ai du faire quelques modifications pour faire tourner PHP sur un port différent (9001) mais également pour élever la quantité de mémoire disponible pour PHP comme le conseille les recommandations de NextCloud.
cat /srv/docker/zz-docker.conf
[global]
daemonize = no
[www]
listen = 9001
php_admin_value[memory_limit] = 512M
Mise en place d’un utilisateur dédié
L’image alpine utilise par défaut un utilisateur web avec pour UID
et GID
82 qui n’est pas présent sous Debian. Du coup j’ai du le créer. Comme nom, j’ai choisi www-docker afin de ressembler au fameux utilisateur et groupe www-data de Debian :
groupadd -g 82 www-docker
useradd -u 82 -g 82 -M www-docker
Pour que le Nginx d’OpenMediaVault puisse accéder aux informations, on va rajouter ww-data au groupe www-docker :
usermod -a -G www-docker www-data
Création du container
La création d’un container passe par un clic sur le bouton « Démarrer l’image » :
Puis ensuite on configure le future container en prenant soin de monter :
- Le répertoire où se trouve les sources de NextCloud.
- Le dossier contenant les données de NextCloud.
- Le répertoire de logs de NextCloud.
- Les fichiers de configuration préparés précédemment.
- Tout les volumes partagés dans NextCloud.
Bascule de NextCloud vers le container PHP
La bascule demande de modifier la configuration de Nginx pour taper sur le nouveau port :
fastcgi_pass 127.0.0.1:9001
Puis ensuite il faut réattribuer quelques droits :
chown -R www-docker:www-docker /var/www/nextcloud /var/log/nextcloud /srv/dev-disk-by-label-omvdata/nextcloud
Et pour finir on modifie la tache planifiée pour passer par docker :
cat /etc/cron.d/nextcloud
# Settings
NC_PATH=/var/www/nextcloud
PHP_UID=82
DOCKER_IMAGE=php
# Global
#*/15 * * * * www-data php -f ${NC_PATH}/cron.php
*/15 * * * * root docker exec -u ${PHP_UID} -i ${DOCKER_IMAGE} php -f ${NC_PATH}/cron.php
Mise à jour de NextCloud vers la dernière version
Pour mettre à jour NextCloud, rien de plus simple : il suffit d’utiliser l’interface web et de ne pas oublier que pour lancer la commande occ upgrade
on doit maintenant passer par docker :
docker exec -u 82 -i php php -f /var/www/nextcloud/occ upgrade
Au final, ça donne ça :
Pour finir un petit scan de sécurité histoire de contrôler son instance NextCloud :
Me voila enfin sous la dernière version de NextCloud tournant sous PHP 7.4 ! Je ne sais pas si c’est du ressenti ou pas mais je trouve l’interface plus rapide à parcourir avec PHP 7.4 !
De Guillaume Kulakowski le 1 avril 2020
J'ai préparé l'article il y a plusieurs jours... Zut. J'adore le mode de mise à jour au passage... Pas officiel mais on dit pas que ça marche pas...