📄 Optimisation Nextcloud — Séparation HOT / COLD STORAGE

🎯 Objectif

Optimiser les performances de Nextcloud en déplaçant les répertoires les plus sollicités vers un volume NVMe rapide, tout en conservant le reste des données sur du Ceph HDD plus économique.
Cette technique améliore significativement :

  • la vitesse d’affichage des galeries,

  • la génération des previews,

  • les performances de Memories,

  • la fluidité de l’expérience utilisateur,

  • tout en maintenant un espace de stockage massif et abordable.


1. 📁 Architecture de stockage

Nextcloud repose sur deux catégories de données :

1.1 Données FROIDES (/mnt/nextcloud)

Stockées sur Ceph HDD + DB/WAL sur NVMe
Contient :

  • les fichiers des utilisateurs

  • les répertoires avatar, calendar, theming, drawio, etc.

  • la majorité de appdata_* (CSS, JS, facereco, theming…)

Ces données sont rarement modifiées, et tolèrent parfaitement la latence HDD grâce à Ceph + DB/WAL 100 Go.


1.2 Données CHAUDES (nouveau volume NVMe — /mnt/hot)

Volumes créés dans le pool CephNVMe haute performance.

Ces répertoires sont les plus sollicités en lecture/écriture, notamment par :

  • Memories

  • FullTextSearch

  • Photos

  • RichDocuments

  • Editor

  • Web previews

  • l’uploader WebDAV (transactions temporaires)

Ces répertoires saturent les disques HDD lors des opérations lourdes (prévisualisation massive, importations, photos, vidéos).


2. 📦 Répertoires déplacés vers stockage CHAUD

Le contenu de appdata_XXXX/ a été analysé, et seuls les répertoires contenant beaucoup de fichiers dynamiques, regenerables ou non-critiques ont été déplacés.

✔️ Répertoires déplacés vers /mnt/hot

Répertoire Rôle Justification
preview/ Prévisualisations Très haut volume de fichiers générés par l’app Photos/Memories
photos/ Cache interne Photos Accès intensif
dav-photocache/ Cache DAV pour Memories Critique pour performance
richdocuments/ Office/WebODF Beaucoup d’I/O
text/ Éditeur collaboratif Sessions & autosaves
unsplash/ Cache d’images Lecture intensive

🔹 Ces éléments ne doivent PAS être sauvegardés.
Ils se régénèrent automatiquement.


3. 🔗 Connexion entre les deux volumes : mount --bind

Au lieu de symlinks (problématiques dans Nextcloud), on utilise mount --bind, ce que Nextcloud accepte 100% du temps.

Exemple (réel) après configuration :

                /dev/sdc on /mnt/hot type ext4 (rw,relatime)
/dev/sdc on /mnt/nextcloud/data/appdata_xxx/preview type ext4 (rw,relatime)
/dev/sdc on /mnt/nextcloud/data/appdata_xxx/photos type ext4 (rw,relatime)
...

              

Cette approche permet :

  • Nextcloud voit un répertoire normal

  • Le volume chaud bénéficie d’I/O NVMe

  • Le volume froid reste intact et cohérent

  • Aucune modification dans config.php


4. ⚙️ Étapes complètes (sans script)

4.1 Créer le volume chaud

Dans Proxmox → pool CephNVMe → nouveau disque virtuel → 48 Go.

Dans la VM :

                mkfs.ext4 /dev/sdc
mkdir /mnt/hot
echo '/dev/sdc /mnt/hot ext4 defaults 0 0' >> /etc/fstab
mount -a

              

4.2 Déplacement des répertoires

IMPORTANT : Nextcloud désactivé.

                occ maintenance:mode --on

              

Copier vers volume chaud :

                rsync -avH /mnt/nextcloud/data/appdata_xxx/preview/ /mnt/hot/preview/
rsync -avH /mnt/nextcloud/data/appdata_xxx/photos/ /mnt/hot/photos/
...

              

4.3 Supprimer les dossiers d’origine (pas les recréer!)

                rm -rf /mnt/nextcloud/data/appdata_xxx/preview
rm -rf /mnt/nextcloud/data/appdata_xxx/photos
...

              

4.4 Créer les bind-mounts

                mkdir -p /mnt/nextcloud/data/appdata_xxx/preview
mount --bind /mnt/hot/preview /mnt/nextcloud/data/appdata_xxx/preview

              

Idem pour :

  • photos

  • dav-photocache

  • richdocuments

  • text

  • unsplash


4.5 Ajouter dans /etc/fstab

⛔ L’ordre est crucial : monter /mnt/hot avant les bind-mounts.

                /dev/sdc  /mnt/hot  ext4  defaults  0  0

/mnt/hot/preview  /mnt/nextcloud/data/appdata_xxx/preview  none  bind  0  0
/mnt/hot/photos   /mnt/nextcloud/data/appdata_xxx/photos   none  bind  0  0
/mnt/hot/dav-photocache /mnt/nextcloud/data/appdata_xxx/dav-photocache none bind 0 0
...

              

Vérifier :

                mount -a
mount | grep hot

              

4.6 Réactiver Nextcloud

                occ maintenance:mode --off

              

5. ✔️ Pourquoi cette optimisation est sûre

🔒 Pas de corruption possible :

  • les données déplacées sont recréables

  • les opérations se font Nextcloud OFF

  • les bind-mounts présentent à NC une arborescence standard

♻️ Sans impact sur les sauvegardes :

  • seul /mnt/nextcloud doit être sauvegardé

  • /mnt/hot NE DOIT PAS l’être

  • en cas de perte : les caches seront régénérés automatiquement


6. 🚀 Résultat : un Nextcloud soutenable et scalable

Après optimisation :

  • GUI plus fluide

  • Memories accéléré

  • indexation plus rapide

  • réduction des IOPS sur pool froid

  • plateau de performance beaucoup plus haut

La technique utilisée dans les installations Nextcloud à 50 000+ utilisateurs.