Aller au contenu principal
Gaprod

Migrer Nextcloud de SQLite vers MariaDB ou PostgreSQL

Billy Rousseau— Fondateur de Gaprod11 min read

Une instance Nextcloud installée rapidement peut utiliser SQLite, une base contenue dans un fichier local. Ce choix convient à un test ou à un usage minimal, mais la documentation Nextcloud recommande MariaDB ou PostgreSQL dès que plusieurs utilisateurs, clients de synchronisation et applications accèdent au service. La commande occ db:convert-type permet de migrer Nextcloud de SQLite vers MariaDB ou PostgreSQL sans déplacer les fichiers des utilisateurs ni réinstaller l'instance.

Cette opération modifie pourtant le cœur de la plateforme. Il faut préparer la base cible, installer le bon connecteur PHP, sauvegarder l'état actuel et empêcher les écritures pendant la copie. Voici une procédure avec contrôles et retour arrière.

Faut-il vraiment remplacer SQLite sur cette instance ?

SQLite stocke la base Nextcloud dans un fichier, généralement data/owncloud.db. Il ne nécessite pas de serveur SQL séparé, ce qui simplifie une installation de démonstration. Nextcloud le réserve toutefois aux tests et aux instances minimales. Les accès simultanés d'une équipe, la synchronisation de plusieurs appareils et les applications actives augmentent les écritures concurrentes que MariaDB ou PostgreSQL gèrent mieux.

Vérifiez d'abord le moteur réellement utilisé :

sudo -E -u www-data php /var/www/nextcloud/occ \
  config:system:get dbtype

Une réponse sqlite3 confirme le périmètre de ce guide. Si la commande renvoie mysql ou pgsql, ne lancez pas une conversion destinée à SQLite. Pour replacer la base dans l'architecture complète, consultez le guide Nextcloud.

La conversion change uniquement le moteur de base et les paramètres db* de config.php. Elle ne déplace pas le code, le répertoire de données, le domaine ou le serveur web. Si vous changez aussi de machine, suivez plutôt la méthode de migration Nextcloud vers un nouveau serveur et séparez les deux interventions.

MariaDB ou PostgreSQL ?

Les deux moteurs sont recommandés dans la documentation Nextcloud. Choisissez celui que votre équipe sait sauvegarder, superviser, mettre à jour et restaurer. Ne changez pas de technologie uniquement pour suivre un exemple de commande.

Que sauvegarder avant db:convert-type ?

La conversion copie les tables vers une nouvelle base, puis modifie la configuration active. Une sauvegarde exploitable doit donc couvrir au minimum :

  1. le fichier SQLite d'origine ;
  2. le dossier config/, en particulier config.php ;
  3. les données et applications nécessaires à une restauration complète ;
  4. la liste des applications actives et désactivées ;
  5. la version de Nextcloud, la commande lancée et sa sortie.

Le guide de sauvegarde Nextcloud détaille les composants à conserver. Pour une copie cohérente du fichier SQLite, bloquez d'abord les nouvelles écritures. La commande de conversion active elle-même le mode maintenance pendant la copie, mais il faut aussi protéger la sauvegarde réalisée avant son lancement. La procédure dédiée explique les états et contrôles du mode maintenance Nextcloud.

sudo -E -u www-data php /var/www/nextcloud/occ maintenance:mode --on
sudo -E -u www-data php /var/www/nextcloud/occ status

Arrêtez aussi la tâche cron Nextcloud pendant la fenêtre. Attendez que les clients aient reçu l'état de maintenance, puis relevez le chemin réel des données et copiez la configuration et la base vers un emplacement protégé :

sudo -E -u www-data php /var/www/nextcloud/occ \
  config:system:get datadirectory
sudo install -d -m 0700 /srv/backup-nextcloud-db
sudo cp -a /var/www/nextcloud/config \
  /srv/backup-nextcloud-db/config-before-conversion
sudo cp -a /CHEMIN/DATA/owncloud.db \
  /srv/backup-nextcloud-db/owncloud.db

Remplacez /CHEMIN/DATA/ par le datadirectory réel. Ne supposez pas que la base se trouve sous /var/www/nextcloud/data. Contrôlez les fichiers copiés, leur taille, leurs droits et l'espace libre avant de continuer.

La conversion retire le mode maintenance à la fin

Le code actuel de db:convert-type active le mode maintenance pendant la copie, puis le désactive après une réussite ou une erreur. Si l'instance est publiquement accessible, gardez les requêtes externes bloquées au niveau du proxy ou du serveur web jusqu'à la fin de la recette. Une maintenance activée avant la commande ne restera pas active automatiquement.

Comment préparer la base MariaDB ou PostgreSQL cible ?

La base cible doit exister avant la conversion, avec un compte capable de créer les tables Nextcloud. Installez aussi le connecteur correspondant dans le même environnement PHP que celui qui exécute occ et que le service web utilise :

  • pdo_mysql pour MariaDB ou MySQL ;
  • pdo_pgsql pour PostgreSQL.

Vérifiez le PHP en ligne de commande :

php --ini
php -m | grep -E 'pdo_mysql|pdo_pgsql'

Si PHP-FPM ou Apache charge une autre configuration, contrôlez également ce SAPI puis redémarrez le service PHP concerné après l'installation du module. Une extension visible en ligne de commande ne prouve pas qu'elle est active côté web.

Préparer MariaDB

Nextcloud demande notamment InnoDB, le niveau d'isolation READ-COMMITTED et un journal binaire désactivé ou configuré en ROW. La base peut être créée avec utf8mb4 :

CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE_FORT';
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';

Testez la connexion avec ce compte, pas seulement avec l'administrateur MariaDB :

mariadb -u nextcloud -p -h 127.0.0.1 nextcloud

Préparer PostgreSQL

Créez un rôle dédié et une base vide dont il est propriétaire :

CREATE USER nextcloud WITH PASSWORD 'MOT_DE_PASSE_FORT';
CREATE DATABASE nextcloud OWNER nextcloud TEMPLATE template0 ENCODING 'UTF8';
\connect nextcloud
GRANT CREATE ON SCHEMA public TO nextcloud;

Testez ensuite le même chemin réseau que celui utilisé pendant la conversion :

psql -U nextcloud -h 127.0.0.1 -d nextcloud

Une base sur un autre serveur demande en plus une règle d'accès, un pare-feu et une connexion chiffrée adaptés à votre environnement. Validez ces éléments avant la fenêtre de maintenance.

Comment lancer la conversion SQLite vers MariaDB ?

La syntaxe générale est :

occ db:convert-type [options] type username hostname database

Pour MariaDB ou MySQL, le type attendu est mysql. Omettez --password afin que la commande demande le secret sans l'inscrire directement dans l'historique du shell :

cd /var/www/nextcloud
sudo -E -u www-data php occ db:convert-type \
  --all-apps \
  mysql nextcloud 127.0.0.1 nextcloud

Le port par défaut documenté est 3306. Ajoutez --port=PORT si votre serveur écoute ailleurs. --all-apps demande aussi la conversion des tables appartenant aux applications désactivées dont le code est encore présent.

Avant de garder cette option, listez les applications :

sudo -E -u www-data php occ app:list

Elle ne récupère pas les tables d'une application déjà supprimée du disque. Le convertisseur s'appuie sur les définitions de schéma trouvées dans les répertoires d'applications configurés. Il peut donc signaler d'anciennes tables impossibles à convertir. Comparez-les à la liste officielle des tables historiques avant de supprimer quoi que ce soit.

N'ajoutez pas --clear-schema par réflexe. Dans le code Nextcloud, cette option supprime toutes les tables du schéma cible. Pour une intervention normale, utilisez une base neuve et vide. Si une tentative précédente a laissé des tables, analysez son erreur puis recréez une cible propre plutôt que d'effacer une base dont le contenu n'est pas identifié.

Comment convertir SQLite vers PostgreSQL ?

Le principe reste identique, mais le type devient pgsql et le port courant de PostgreSQL est 5432. Comme la commande documente 3306 par défaut, indiquez explicitement le port PostgreSQL :

cd /var/www/nextcloud
sudo -E -u www-data php occ db:convert-type \
  --port=5432 \
  --all-apps \
  pgsql nextcloud 127.0.0.1 nextcloud

La commande demande le mot de passe, crée le schéma attendu puis transfère les données reconnues. Sur une instance volumineuse, gardez la session ouverte et surveillez l'espace, la charge et les journaux de la base. Ne relancez pas une seconde conversion pendant que la première travaille.

Si le processus échoue, conservez la première erreur complète. Vérifiez en priorité le connecteur PHP, les identifiants, les droits du compte cible, le port, la résolution du nom d'hôte et l'état du schéma cible.

Sur Nextcloud 35, l'option --chunk-size limite le nombre de lignes traitées par requête et vaut 1 000 par défaut. Si le processus manque de mémoire sur une grande table, consultez d'abord occ db:convert-type --help, puis recommencez sur une base cible propre avec une valeur plus basse, par exemple --chunk-size=500. Ne réduisez pas cette valeur pour masquer une autre erreur SQL.

Que modifie Nextcloud après une conversion réussie ?

Quand la conversion aboutit, Nextcloud met automatiquement à jour les paramètres de base dans config.php. Relisez-les sans afficher le mot de passe dans un rapport partagé :

sudo -E -u www-data php /var/www/nextcloud/occ \
  config:system:get dbtype
sudo -E -u www-data php /var/www/nextcloud/occ status
grep -E "'db(type|name|host|user|tableprefix)'" \
  /var/www/nextcloud/config/config.php

Pour MariaDB ou MySQL, activez ensuite la prise en charge utf8mb4 comme l'indique la documentation de conversion :

sudo -E -u www-data php /var/www/nextcloud/occ \
  config:system:set mysql.utf8mb4 \
  --type boolean --value=true

Selon l'état de la base et la version installée, la commande dédiée db:convert-mysql-charset peut aussi être nécessaire pour convertir des tables existantes. Lisez son aide et la page d'administration avant de l'exécuter. Ne confondez pas ce traitement avec la conversion du moteur.

Quels contrôles effectuer avant de rouvrir Nextcloud ?

Gardez l'accès externe bloqué après la commande. Réactivez le mode maintenance si vous devez redémarrer le serveur web pour consulter la page d'administration sans ouvrir le service aux utilisateurs :

sudo -E -u www-data php /var/www/nextcloud/occ maintenance:mode --on

Vérifiez d'abord la connexion à la nouvelle base, les journaux Nextcloud et ceux du moteur SQL. Sur une version qui fournit db:schema:check, comparez le schéma obtenu à celui attendu :

sudo -E -u www-data php /var/www/nextcloud/occ db:schema:check

La commande est disponible dans Nextcloud 35. Pour une branche antérieure, appuyez-vous sur les commandes présentes dans occ list, la Vue d'ensemble de l'administration et les alertes réellement affichées. S'il manque des index après l'opération, suivez la procédure ciblée pour vérifier et réparer les index Nextcloud au lieu d'ajouter du SQL à la main.

Retirez ensuite le mode maintenance pour une recette limitée :

sudo -E -u www-data php /var/www/nextcloud/occ maintenance:mode --off

Testez au minimum :

  • une connexion administrateur et une connexion utilisateur ;
  • l'ouverture, l'envoi et le téléchargement d'un fichier ;
  • un partage interne et un lien public existant ;
  • une application métier utilisée par l'équipe ;
  • le calendrier ou les contacts si ces applications sont actives ;
  • le passage de la tâche cron ;
  • l'absence de nouvelle erreur dans les journaux.

Réactivez cron seulement après ces contrôles. La disparition du bandeau SQLite ne suffit pas à valider la migration.

Comment revenir à SQLite en cas d'échec ?

Le retour le plus sûr intervient avant toute réouverture aux utilisateurs. Gardez alors l'instance en maintenance, restaurez le dossier config/ sauvegardé et le fichier owncloud.db, puis vérifiez les propriétaires et permissions. Redémarrez PHP si nécessaire et contrôlez occ status avant de retirer le mode maintenance.

Après de nouvelles écritures dans MariaDB ou PostgreSQL, l'ancienne base SQLite n'est plus à jour. La remettre en service ferait disparaître de l'état visible les modifications produites depuis la bascule. Il faut alors résoudre le problème sur la cible ou organiser une restauration cohérente, pas simplement repointer config.php vers l'ancien fichier.

Conservez la sauvegarde SQLite jusqu'à la validation fonctionnelle et à la première sauvegarde vérifiée du nouveau moteur. Documentez ensuite le moteur, la base, le compte technique, le port, la procédure de dump et la restauration correspondante.

Conclusion

Pour migrer Nextcloud de SQLite vers MariaDB ou PostgreSQL, préparez une base vide et son connecteur PHP, gelez les écritures, sauvegardez SQLite et config.php, puis lancez occ db:convert-type avec le type et le port adaptés. Contrôlez le nouveau dbtype, le schéma, les applications et les usages avant de reprendre cron. Si vous ne souhaitez pas administrer le serveur, PHP et la base, l'offre Nextcloud Gaprod fournit un espace géré et hébergé en France.

Découvrir l'hébergement Nextcloud GaprodEspace Nextcloud géré, sans serveur ni base de données à administrer

Sources officielles

Articles similaires

Prêt à démarrer avec Gaprod ?

Hébergement web, VPS et solutions cloud 100% français, avec support expert inclus.

30j rembourséMigration gratuiteSupport 7j/7