Migrate Nextcloud / Migration Nextcloud

Bonjour,

Ayant moi-même réalisé cette opération avec succès, je me permets de copier/coller ci-dessous la petite documentation que j’avais rédigée au moment de ma migration, il y a quelques mois. À utiliser “en l’état”, en espérant que ça puisse servir !

Migrer d’un Nextcloud standalone à un Nextcloud YunoHost revient à deux choses :

  • migrer le Nextcloud existant (backup puis restauration),
  • ajouter un annuaire LDAP (celui utilisé par YunoHost) incluant les utilisateurs existants.

Pour info, je suis parti de ce sujet sur le forum Nextcloud :

Pour désigner le serveur/Nextcloud d’origine, je parlerai de “antérieur” , pour le nouveau, ce sera “YunoHost”.

L’astuce va consister à installer un Nextcloud YunoHost, récupérer les informations relatives au LDAP, restaurer son Nextcloud antérieur en écrasant celui qu’on a installé, puis ré-injecter les données LDAP.

:bulb: Prérequis :

  • connaître le shell de vos serveurs et un peu de SQL,
  • avoir accès aux deux hôtes en SSH,
  • avoir la même version de Nextcloud installé sur le serveur antérieur et sur le YunoHost (ici, la procédure a été faite pour Nextcloud 20),
  • avoir activé l’application Nextcloud ‘LDAP user and group backend’ sur le Nextcloud antérieur ; je ne suis pas sûr que ce soit essentiel à vrai dire, mais il n’est pas gênant de l’activer et de ne pas l’utiliser.

:no_entry: Si vous ne comprenez pas ce qui est fait par les commandes ci-dessous, il est dangereux de vous engager dans cette procédure en faisant des copier-coller !
Dans tous les cas, assurez-vous d’avoir sauvegardé des données qui pourraient être exposées.

Procédure :

Sur l’hôte antérieur, faire un backup des répertoires data (qui contient vos données) et nextcloud (qui contient les sources de Nextcloud), ainsi que de la base de donnée
(cf Backup — Nextcloud latest Administration Manual latest documentation pour la procédure détaillée).

Sur l’hôte YunoHost :
On va tout faire en CLI avec le Nextcloud en mode maintenance pour éviter qu’il n’aille interroger le LDAP

  1. Passer root :
sudo -s
  1. Installer Nextcloud :
yunohost app install nextcloud

:warning: NE PAS se connecter à Nextcloud une fois celui-ci installé.

  1. Mettre le Nextcloud en mode maintenance :
sudo -u nextcloud php /var/www/nextcloud/occ maintenance:mode --on
  1. Restaurer les données issues du Nextcloud antérieur :
  • sauvegarder le répertoire de configuration du Nextcloud YunoHost (exemple : cp -a /var/www/nextcloud/config/ /tmp)
  • remplacer le répertoire nextcloud du YunoHost par celui de l’antérieur
  • remplacer le répertoire data du YunoHost par celui de l’antérieur (ou modifier le paramètre datadirectory dans la config)
  • vérifier que l’utilisateur nextcloud est bien propriétaire des répertoires (si non : chown -R nextcloud:nextcloud /path/to/directory)
  • fusionner les deux fichiers de configuration (ancien et nouveau), sur la base du nouveau, en récupérant notamment le paramètre instanceid de l’ancienne config (bien regarder ligne par ligne ce qu’il est pertinent de garder de l’un ou l’autre des fichiers)
  1. Pour la base de données, nous allons détruire la base générée à l’installation, en recréer une et importer les données de la base antérieure :
  • AVANT la destruction, nous exportons certaines données relatives au LDAP YunoHost (ainsi que les tables oc_external_*) :
mysqldump -u root -p$(cat /etc/yunohost/mysql) nextcloud oc_external_applicable oc_external_config oc_external_mounts oc_external_options oc_ldap_group_mapping oc_ldap_group_members oc_ldap_user_mapping > /tmp/oc_yunohost_new_tables.sql
mysqldump -u root -p$(cat /etc/yunohost/mysql) nextcloud oc_appconfig --where "appid='user_ldap'" > /tmp/oc_yunohost_appconfig_ldap.sql
  • Dans ce dernier fichier, nous devons faire quelques modifications :
    <> retirer le bloc de création de la table (elle existera déjà)
    <> ajouter la ligne suivante avant les requêtes d’insertion des données :
DELETE FROM `oc_appconfig` WHERE `appid`='user_ldap';
  • On recrée la BDD :
mysql -u root -p$(cat /etc/yunohost/mysql)
DROP DATABASE nextcloud;
CREATE DATABASE nextcloud;
\q
  • On importe les données de la base antérieure, puis celles conservées de YunoHost :
mysql -u root -p$(cat /etc/yunohost/mysql) nextcloud < /your/backup/directory/db_dump_ante.sql
mysql -u root -p$(cat /etc/yunohost/mysql) nextcloud < /tmp/oc_yunohost_new_tables.sql
mysql -u root -p$(cat /etc/yunohost/mysql) nextcloud < /tmp/oc_yunohost_appconfig_ldap.sql
  1. Nous devons maintenant modifier certaines données dans la BDD pour éviter les conflits et que le LDAP prenne en compte les utilisateurs existants.

:warning: Les utilisateurs qui avaient un compte Nextcloud sur l’antérieur et qui ne sont pas dans le LDAP de YunoHost vont perdre leur accès ! Pour éviter cela, assurez-vous que tous les utilisateurs du Nextcloud antérieur ont bien un compte dans le LDAP YunoHost.

mysql -u root -p$(cat /etc/yunohost/mysql)
USE nextcloud;
DELETE FROM `oc_accounts`;
DELETE FROM `oc_users`;
DELETE FROM `oc_ldap_user_mapping`;
\q

Les tables oc_accounts, oc_users, oc_ldap_user_mapping et oc_ldap_group_mapping doivent être vides.

  1. [Étape facultative en fonction de votre installation] Changer la correspondance nom d’utilisateur Nextcloud <-> attribut LDAP.

Par défaut, Nextcloud va récupérer l’attribut uid du LDAP YunoHost (les prénoms en minuscule théoriquement). Si dans votre Nextcloud antérieur vous identifiiez vos utilisateurs différement, il faut utiliser un autre attribut des utilisateurs LDAP, qui aura exactement la même valeur que celle utilisée dans l’antérieur. Par exemple, si vous utilisiez le prénom avec une majuscule, vous pouvez utiliser l’attribut cn, ou givenName. Dans le pire des cas, il faudra créer un attribut supplémentaire, pour tous vos utilisateurs YunoHost.
Pour faire la correspondance (dans cet exemple, je remplace uid par cn) :

mysql -u root -p$(cat /etc/yunohost/mysql)
USE nextcloud;
UPDATE `oc_appconfig` SET `configValue`='cn' WHERE `configKey`='ldap_expert_username_attr' AND `configValue`='uid';
UPDATE `oc_appconfig` SET `configValue`='(&(|(objectclass=posixAccount))(cn=%uid))' WHERE `configKey`='ldap_login_filter' AND `configValue`='(&(|(objectclass=posixAccount))(uid=%uid))';
UPDATE `oc_appconfig` SET `configValue`='1' WHERE `configKey`='ldap_login_filter_mode' AND `configValue`='0';
\q
  1. Vérifier que les différentes applications installées sur votre Nextcloud vont fonctionner correctement.

Par exemple, si vous utilisez le webmail, il faudra vérifier la correspondance entre les adresses mails des utilisateurs. Chaque application possède ses tables dans la base de données, et stocke des réglages dans la table oc_appconfig.

  1. Vérifier le bon fonctionnement de Nextcloud.

Pour cela, on va simplement lancer un status :

sudo -u nextcloud php /var/www/nextcloud/occ status

:question: Pour ma part, lors d’un premier essai où je ne pensais pas devoir migrer tout le répertoire nextcloud, j’avais une différence de version mineure (19.0.3 côté YunoHost vs 19.0.6 côté antérieur), j’ai donc mis à jour côté YunoHost en 19.0.6, mais Nextcloud n’était pas content et a quand même réclamé un upgrade (pourtant j’avais changé le numéro de version dans la config), qui a résolu le problème :

sudo -u nextcloud php /var/www/nextcloud/occ upgrade

Lors de la migration avec la version 20.0.7 des deux côtés, le status était normal (en migrant tout le répertoire nextcloud ou pas).

  1. Si tout est bon, on sort Nextcloud de la maintenance, on tente de se connecter avec un utilisateur LDAP avec les droits d’administation sur le Nextcloud (un utilisateur qui les avait avant, donc), et on va voir la liste des utilisateurs pour vérifier qu’il n’y a eu aucune collision (si c’est le cas, les utilisateurs ajoutés par le LDAP auront un numéro aléatoire ajouté à leur nom).

Et voilà ! :white_check_mark:

1 Like