Nextcloud

Documentation technique

Packaging

Nextcloud est packagé sur l’infrastructure d’ImmaeEu sous deux formes:

  • Une forme « mutualisée », hébergée sur https://cloud.immae.eu, où des personnes ont un compte individuel sur la même instance nextcloud.

  • Une forme « instanciée », où un utilisateur est administrateur d’une instance complète de Nextcloud et libre de gérer ses utilisateurs. L’utilisateur est responsable du nom de domaine de cette forme.

Chaque instance (la mutualisée ou chacune des instanciée) est attaché à son propre service php-fpm. L’instance mutualisée est servie par le httpd principal, alors que les formes instanciées sont généralement services par le httpd de production (en fonction du besoin de l’utilisateur)

Un module défini dans le dépôt git (systems/eldiron/websites/tools/cloud/farm.nix) permet d’instancier facilement un nouveau Nextcloud. La création de la base de données et de la première configuration reste pour le moment manuelle.

Le chargement de configuration de Nextcloud utilise une variable d’environnement NEXTCLOUD_CONFIG_DIR, pointant vers un dossier dans lequel est recherché (par défaut) un fichier config.php. À cela Nextcloud (voir lib/private/Config.php#readData) ajoute une recherche de fichiers *.config.php. Cette fonctionnalité permet d’avoir un fichier config.php écrivable par nextcloud, et des fichiers override.config.php pointant vers des objets fixes gérés par nix. Inconvénient : lorsqu’on édite dans la GUI une configuration qui impacte cette configuration, Nextcloud va réécrire config.php toutes les variables (y compris les supplémentaires donc). Les informations habituellement contenues dans le config.php original sont version, installed, maintenance et les clés liées au mail mail_*, habituellement gérées par l’administrateur de l’instance dans l’interface d’administration. Les variables de configuration sont référencées sur la documentation Nextcloud.

Nouvelle instance

  • Déclarer la configuration dans le dépôt git, et activer la configuration NixOS:

    # (...) nixos-rebuild switch
    # Variable utilisée dans la suite
    instance=someName
    
  • Créer la base de données:

    CREATE USER nextcloud_$instance WITH PASSWORD 'somepassword';
    CREATE DATABASE nextcloud_$instance WITH OWNER nextcloud_$instance;
    
  • Copier et adapter une configuration existante.

    • Modifier les infos de la base de données

    • Ne pas oublier de forcer 'appstoreenabled' => false,

  • Lancer l’initialisation. Elle créera automatiquement un utilisateur admin « immae »:

    # Ligne d’installation à retester maintenant que le override.config.php est implémenté dans nix
    nextcloud-occ-$instance maintenance:install --database=pgsql --database-name=nextcloud_$instance --database-host=/run/postgresql --database-user=nextcloud_$instance --admin-user=immae --data-dir=/var/lib/nextcloud_farm/$instance/data
    
  • Ajuster les trusted domains dans le fichier config.php

Mises à jour

Les mises à jour de Nextcloud ne doivent pas sauter de version. Il faut également mettre à jour jusqu’à la dernière sous-version supportée avant de passer à la suivante.

Avant de faire la mise à jour, s’assurer que la nouvelle version est bien compatible avec la version de php requise. Cette information est disponible dans le fichier lib/versioncheck.php.

Les apps (https://apps.nextcloud.com/) doivent êtres mises à jour conjointement avec Nextcloud. Elles sont chacune dans un fichier, séparé du dossier de la dérivation (flakes/mypackages/pkgs/webapps/nextcloud/apps). La définition de l’application référence notamment chaque version de Nextcloud supportée et la version correspondante pour l’application.

La version de nextcloud est elle définie dans flakes/mypackages/pkgs/webapps/nextcloud/default.nix et déclarée dans flakes/mypackages/pkgs/webapps/default.nix. Une fois les applications et Nextcloud à jour (voir Processus rapide pour mettre à jour les dérivations des apps pour les apps), chaque instance peut être mise à jour de façon indépendante en modifiant le numéro de version associé. Gérer éventuellement les apps oubliées (ou non supportées) à l’étape précédente, qui vont provoquer une erreur à cette étape. La version de php utilisée se déclare au niveau de la définition de l’instance.

Avant l’activation de la mise à jour, mettre l’instance en mode maintenance, éventuellement, faire un backup de la bdd. Puis après l’activation, lancer l’upgrade et ajouter les éventuels index manquant:

instance=librezo
nextcloud-occ-$instance maintenance:mode --on
sudo -u postgres pg_dump nextcloud_$instance > backup_$instance.sql
# (... Activer la configuration NixOS)
nextcloud-occ-$instance upgrade
nextcloud-occ-$instance maintenance:mode --off
nextcloud-occ-$instance db:add-missing-indices

Si le site est de retour après cela, réitérer pour les éventuels autres sauts de version.

Processus rapide pour mettre à jour les dérivations des apps

  • Pour chaque fichier d’apps, chercher les versions sur https://apps.nextcloud.com, récupérer les versions pertinentes (celles supportées) et mettre un hash dummy.

  • Une fois toutes déclarées, compiler toutes les applications d’un coup:

    nix build --keep-going ./flakes/mypackages#webapps-nextcloud_27-all
    

    et recommencer jusqu’à ne plus avoir d’erreur

Points d’attention

Suivi des versions

Suivi des bugs

Suivi des CVE

Accès / Suppression des données

  • Il n’est actuellement pas prévu dans Nextcloud de façon simple de récupérer l’ensemble des données de l’utilisateur. En plus des fichiers, il faut identifier et extraire des logs (httpd et fichier nextcloud) les lignes concernant l’utilisateur. Il faut également parcourir toutes les tables de la base de données nextcloud pour récupérer les données stockées par les éventuelles applications (liste à créer lorsque pertinent)

  • La suppression d’un utilisateur passe par la commande nextcloud-occ user:delete. Cette commande fait appel à un hook UserDeletedEvent qui génère un événement indiquant aux applications de supprimer les données de l’utilisateur. L’exhaustivité de ce nettoyage n’est pas garanti, un deuxième passage dans les tables peut être nécessaire pour s’assurer que les données sont bien supprimées (liste à créer lorsque pertinent). Note: les clés étrangères dans la base de données de Nextcloud sont rares, ce qui n’aide pas à ce processus. Nextcloud ne doit pas être en mode « maintenance » lors de la suppression (les applications ne sont pas activées dans ce mode)