Installer Nextcloud avec Docker (et le rendre rapide)
Installer Nextcloud avec Docker, PostgreSQL et Redis derrière un reverse proxy, puis les réglages qui le rendent vraiment rapide : cron, miniatures, applis inutiles.
Nextcloud remplace Google Drive, Google Agenda et Google Contacts : vos fichiers synchronisés sur tous vos appareils, des partages par lien, un agenda et un carnet d’adresses compatibles avec tous les téléphones.
C’est aussi l’application qui a la réputation d’être lente. Elle ne l’est pas forcément : la plupart des lenteurs viennent d’une installation trop minimale. Ce guide installe la bonne base, puis applique les réglages qui font la différence. Je les ai mesurés sur mon propre serveur.
Ce qu’il vous faut
- un serveur avec Docker (installer Docker) et au moins 2 Go de RAM libres ;
- un reverse proxy qui gère le HTTPS (le reverse proxy expliqué) ;
- un sous-domaine, par exemple
cloud.mondomaine.fr, qui pointe vers le serveur (nom de domaine et DNS) ; - de la place sur le disque pour vos fichiers, plus de la marge.
L’architecture : 4 conteneurs
| Conteneur | Rôle | Pourquoi il est indispensable |
|---|---|---|
nextcloud |
L’application web | — |
db (PostgreSQL) |
La base de données | SQLite, le choix par défaut, devient très lent dès quelques milliers de fichiers |
redis |
Le cache et les verrous | Sans lui, chaque page recalcule tout, et les synchronisations se bloquent entre elles |
cron |
Les tâches de fond | Sans lui, les tâches tournent pendant que vous naviguez et ralentissent chaque page |
Le docker-compose.yml
Créez un dossier /opt/stacks/nextcloud, puis un fichier .env avec deux mots de passe générés : celui de la base
et celui du compte administrateur.
sudo mkdir -p /opt/stacks/nextcloud && cd /opt/stacks/nextcloud
echo "POSTGRES_PASSWORD=$(openssl rand -hex 24)" | sudo tee .env >/dev/null
echo "NEXTCLOUD_ADMIN_PASSWORD=$(openssl rand -hex 16)" | sudo tee -a .env >/dev/null
sudo chmod 600 .env
Puis le fichier compose.yml :
name: nextcloud
services:
app:
image: nextcloud:35-apache # version majeure fixée : on change de version à la main
restart: unless-stopped
depends_on: [db, redis]
env_file: .env
environment:
POSTGRES_HOST: db
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
REDIS_HOST: redis
NEXTCLOUD_ADMIN_USER: proprietaire # compte administrateur, créé tout seul au 1er démarrage
NEXTCLOUD_TRUSTED_DOMAINS: cloud.mondomaine.fr
OVERWRITEPROTOCOL: https # Nextcloud est derrière un proxy HTTPS
TRUSTED_PROXIES: 172.16.0.0/12 # le réseau Docker du reverse proxy
PHP_UPLOAD_LIMIT: 16G
PHP_MEMORY_LIMIT: 1G
volumes:
- ./html:/var/www/html
- ./data:/var/www/html/data
ports:
- "127.0.0.1:8080:80" # joignable seulement par le reverse proxy
cron:
image: nextcloud:35-apache
restart: unless-stopped
entrypoint: /cron.sh
depends_on: [db, redis]
volumes:
- ./html:/var/www/html
- ./data:/var/www/html/data
db:
image: postgres:17-alpine
restart: unless-stopped
env_file: .env
environment:
POSTGRES_DB: nextcloud
POSTGRES_USER: nextcloud
volumes:
- ./db:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
Lancez le tout :
sudo docker compose up -d
Le générateur docker-compose produit la même base, avec les étiquettes Traefik ou la configuration Caddy déjà prêtes.
Pourquoi fixer la version majeure ? Nextcloud ne permet de monter que d’une version majeure à la fois (34
vers 35, puis 35 vers 36). Avec l’étiquette latest, une mise à jour automatique peut sauter une version et rendre
l’installation impossible à démarrer. Avec 35-apache, vous recevez les correctifs de la 35, et vous choisissez le
moment de passer à la 36.
Le reverse proxy
Avec Caddy, deux lignes suffisent, plus la redirection dont les applis d’agenda et de contacts ont besoin :
cloud.mondomaine.fr {
redir /.well-known/carddav /remote.php/dav/ 301
redir /.well-known/caldav /remote.php/dav/ 301
reverse_proxy 127.0.0.1:8080
}
Avec Traefik, ajoutez les étiquettes habituelles et un middleware redirectRegex pour ces deux mêmes adresses.
Deux réglages évitent les mauvaises surprises :
- Pas d’en-tête
X-Frame-Options: DENYsur ce site. Nextcloud affiche certaines pages dans un cadre : avecDENY, l’éditeur de documents ou les aperçus restent vides. UtilisezSAMEORIGIN. - Des délais longs sur le reverse proxy (une heure, par exemple), sinon l’envoi de gros fichiers est coupé en plein milieu.
Premier démarrage
Grâce à NEXTCLOUD_ADMIN_USER et NEXTCLOUD_ADMIN_PASSWORD, Nextcloud s’installe tout seul au premier
démarrage (une à deux minutes). Connectez-vous ensuite sur https://cloud.mondomaine.fr avec le compte
proprietaire et le mot de passe du fichier .env (sudo cat .env).
Pourquoi ne pas utiliser la page d’installation ? Tant qu’elle n’est pas remplie, elle est ouverte à tout le monde. Le premier venu peut créer le compte administrateur, et la page affiche même le mot de passe de la base dans son code. Or des robots repèrent les nouveaux sites en quelques minutes, grâce aux journaux publics des certificats HTTPS. L’installation automatique ne laisse aucune fenêtre d’attaque.
Puis lancez ces commandes une fois, pour compléter l’installation :
# Raccourci : lancer une commande Nextcloud (occ) dans le conteneur
occ() { sudo docker compose exec -u www-data app php occ "$@"; }
occ background:cron # les tâches de fond passent par le conteneur cron
occ config:system:set default_phone_region --value=FR
occ config:system:set maintenance_window_start --type=integer --value=1 # tâches lourdes la nuit (1 h UTC)
occ db:add-missing-indices
occ maintenance:repair --include-expensive
Dans Paramètres d’administration → Vue d’ensemble, il ne doit plus rester d’avertissement important.
Le rendre rapide
C’est ici que tout se joue. Sur mon serveur, l’écran principal mettait plusieurs secondes à s’afficher. Après ces trois réglages, il s’ouvre presque instantanément.
1. Désactiver les applis que vous n’utilisez pas
Nextcloud active d’office une vingtaine d’applis. Chacune ajoute du code à chaque page. Les plus inutiles pour un usage familial :
for a in firstrunwizard nextcloud_announcements recommendations related_resources \
support survey_client weather_status user_status app_api; do
occ app:disable "$a"
done
Vous pourrez toujours les réactiver depuis la page Applications.
2. Préparer les miniatures à l’avance
Par défaut, Nextcloud fabrique la miniature d’une photo au moment où vous l’affichez. Un dossier de 500 photos déclenche donc 500 calculs, et la page rame. L’appli Preview Generator les prépare à l’avance :
occ app:install previewgenerator
# Seulement les tailles réellement affichées : moins de calcul, moins de disque
occ config:app:set previewgenerator squareSizes --value="32 256"
occ config:app:set previewgenerator widthSizes --value="256 384"
occ config:app:set previewgenerator heightSizes --value="256"
occ config:system:set preview_max_x --value=2048 --type=integer
occ config:system:set preview_max_y --value=2048 --type=integer
occ config:app:set preview jpeg_quality --value=70
# Une première fois pour tous les fichiers existants (long : laissez tourner)
occ preview:generate-all
Puis, pour les nouveaux fichiers, planifiez preview:pre-generate toutes les 30 minutes (un timer systemd ou une
ligne cron sur le serveur) :
sudo docker compose -f /opt/stacks/nextcloud/compose.yml exec -T -u www-data app php occ preview:pre-generate
3. Vérifier que Redis et le cron travaillent
occ config:system:get memcache.locking # doit afficher \OC\Memcache\Redis
date -d @$(occ config:app:get core lastcron) # dernier passage du cron : moins de 5 minutes
Si l’interface reste lente, mesurez avant de chercher plus loin : dans le navigateur (F12 → Réseau), regardez si c’est la première réponse du serveur qui est lente (problème de serveur ou de base) ou le chargement des fichiers JavaScript (applis en trop, connexion lente).
Les applications
- Ordinateur : le client de synchronisation Nextcloud (Windows, Mac, Linux).
- Téléphone : l’appli Nextcloud, avec l’envoi automatique des photos si vous n’utilisez pas Immich.
- Agenda et contacts sur Android : l’appli DAVx⁵, avec l’adresse
https://cloud.mondomaine.fr. - iPhone : Réglages → Calendrier → Comptes → Ajouter un compte CalDAV, même adresse.
Créez un compte par personne, et désactivez les inscriptions publiques si vous aviez activé une appli qui les permet.
Sauvegarder Nextcloud
Trois choses à sauvegarder, toutes nécessaires pour restaurer :
| Quoi | Où | Comment |
|---|---|---|
| Les fichiers | ./data |
Copie classique (restic, rsync…) |
| La base de données | conteneur db |
pg_dump chaque nuit, pas une copie du dossier ./db à chaud |
| La configuration | ./html/config/config.php |
Copie classique : il contient les clés de chiffrement |
sudo docker compose exec -T db pg_dump -U nextcloud nextcloud | gzip | sudo tee nextcloud-$(date +%F).sql.gz > /dev/null
Puis envoyez le tout hors du serveur : sauvegarder son serveur avec restic.
Mettre à jour
- Correctifs (35.0.x) :
sudo docker compose pull && sudo docker compose up -d. - Version majeure : sauvegardez, changez
35-apacheen36-apachedans les deux servicesappetcron, relancez, puis suivez les messages dans Vue d’ensemble. Une version majeure à la fois.
Plus de détails : mettre à jour ses applications Docker sans rien casser.
En cas de problème
| Symptôme | Cause probable | Solution |
|---|---|---|
| « Accès par un domaine non approuvé » | Le domaine n’est pas dans trusted_domains |
occ config:system:set trusted_domains 1 --value=cloud.mondomaine.fr |
Boucle de redirection, ou liens en http:// |
Nextcloud ne sait pas qu’il est en HTTPS | OVERWRITEPROTOCOL=https et TRUSTED_PROXIES corrects |
| Connexion refusée après plusieurs essais | Protection anti force brute | occ security:bruteforce:reset <IP> |
| Un client de synchronisation oublié boucle sur un ancien mot de passe | Il déclenche la protection en boucle | Déconnectez-le ou mettez-le à jour |
| Envoi de gros fichiers coupé | Délai du reverse proxy trop court | Augmentez les délais de lecture et d’écriture |
Une commande qui ne marche pas, une explication pas claire ? Signaler une erreur dans cette page.