Nextcloud est un cloud personnel libre : fichiers synchronisés, partages, agenda, contacts. Sur votre VPS, vos données restent en France, sur un serveur que vous administrez. Ce guide installe Nextcloud 34 avec Docker Compose, MariaDB, Redis et les tâches de fond, publiés en HTTPS sur https://nom.vps.heberghub.app.
Ce qu'il vous faut
- Un VPS KVM : Docker ne s'installe correctement que sur une machine virtuelle, pas sur un VPS LXC.
- Docker et Docker Compose installés : voir Installer Docker sur un VPS KVM.
- Un accès SSH par clé (Première connexion SSH) et un VPS sécurisé (Sécuriser un VPS Debian).
- Le port 80 libre : c'est par lui que le frontal HTTPS joint votre VPS.
Au repos, les quatre conteneurs occupaient environ 250 Mo de mémoire dans notre essai ; une requête PHP peut monter jusqu'à 512 Mo (PHP_MEMORY_LIMIT par défaut).
1. Préparer le dossier et les secrets
mkdir -p /opt/nextcloud && cd /opt/nextcloud
cat > .env <<EOF
DOMAINE=nom.vps.heberghub.app
DB_ROOT_PASSWORD=$(openssl rand -hex 24)
DB_PASSWORD=$(openssl rand -hex 24)
ADMIN_USER=admin
ADMIN_PASSWORD=$(openssl rand -hex 16)
PROXY_IP=
EOF
chmod 600 .envRemplacez nom par le nom de votre VPS et notez le mot de passe administrateur (grep ADMIN_PASSWORD .env) dans votre gestionnaire de mots de passe.
2. Le fichier compose.yaml
Créez /opt/nextcloud/compose.yaml :
services:
db:
image: mariadb:11.8 # version recommandée pour Nextcloud 34
restart: unless-stopped
command: --transaction-isolation=READ-COMMITTED
environment:
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MARIADB_DATABASE: nextcloud
MARIADB_USER: nextcloud
MARIADB_PASSWORD: ${DB_PASSWORD}
volumes:
- db:/var/lib/mysql
healthcheck: # Nextcloud attend que la base soit prête
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
retries: 10
redis:
image: redis:8.10-alpine # cache et verrous de fichiers, sans port publié
restart: unless-stopped
app:
image: nextcloud:34.0.5-apache
restart: unless-stopped
ports:
- "80:80" # le seul port publié : le frontal HTTPS arrive ici
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
environment:
MYSQL_HOST: db
MYSQL_DATABASE: nextcloud
MYSQL_USER: nextcloud
MYSQL_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: redis
NEXTCLOUD_ADMIN_USER: ${ADMIN_USER}
NEXTCLOUD_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
NEXTCLOUD_TRUSTED_DOMAINS: ${DOMAINE} # lu à la première installation seulement
OVERWRITEPROTOCOL: https # liens en https, bien que le VPS reçoive du HTTP
OVERWRITECLIURL: https://${DOMAINE} # adresse des liens envoyés par e-mail
TRUSTED_PROXIES: ${PROXY_IP:-} # voir « L'adresse des visiteurs »
volumes:
- nextcloud:/var/www/html
cron:
image: nextcloud:34.0.5-apache # même image que app
restart: unless-stopped
entrypoint: /cron.sh # tâches de fond toutes les 5 minutes
depends_on:
- app
volumes:
- nextcloud:/var/www/html
volumes:
nextcloud:
db:- Seul le port 80 est publié. Docker contourne
ufw: un port publié serait ouvert sur Internet. La base et le cache restent sur le réseau interne de Docker. - Le HTTPS est géré en amont. Le frontal gère le certificat ; votre VPS reçoit le trafic en HTTP sur son port 80, avec l'en-tête
X-Forwarded-Proto: https. N'installez pas de certificat dans le VPS pour ce nom.OVERWRITEPROTOCOLetOVERWRITECLIURL(réglagesoverwriteprotocoletoverwrite.cli.url) font produire à Nextcloud des liens enhttps://. trusted_domains: Nextcloud refuse tout nom absent de cette liste.- Le service
cronexécute les tâches de fond ; Nextcloud passe de lui-même en mode « Cron ».
3. Premier lancement
docker compose up -d
docker compose logs -f appAttendez Nextcloud was successfully installed puis apache2 -D FOREGROUND, et quittez avec Ctrl+C. Vérifiez :
docker compose exec -u www-data app php occ statusVous devez lire installed: true. Ouvrez https://nom.vps.heberghub.app et connectez-vous. Paramètres d'administration > Vue d'ensemble liste les points à régler ; deux reviennent souvent :
docker compose exec -u www-data app php occ config:system:set default_phone_region --value=FR
docker compose exec -u www-data app php occ config:system:set maintenance_window_start --type=integer --value=1La seconde commande réserve les tâches lourdes à la nuit (de 1 h à 5 h, heure UTC).
4. L'adresse des visiteurs
Si Nextcloud prend l'adresse du frontal pour celle des visiteurs, sa protection contre la force brute ralentit tout le monde après quelques mots de passe erronés. Tentez une connexion avec un mauvais mot de passe, puis :
docker compose exec app grep -o "Login failed[^\"]*" data/nextcloud.log | tail -n 1Remote IPest votre adresse IP publique : rien à faire.- C'est une autre adresse : celle du frontal. Inscrivez-la dans
.env(PROXY_IP=…) puis relancezdocker compose up -d. Elle rejointtrusted_proxies, et Nextcloud lit alors l'adresse du visiteur dans l'en-têteX-Forwarded-Fors'il est transmis. Refaites l'essai.
5. Votre propre domaine
Ajoutez le domaine dans l'espace client (enregistrement TXT _heberghub-verify et CNAME vers nom.vps.heberghub.app, voir Relier un nom de domaine). Le trafic arrive de la même façon, en HTTP sur le port 80. Déclarez ensuite le nom dans Nextcloud :
docker compose exec -u www-data app php occ config:system:set trusted_domains 2 --value=cloud.votredomaine.frRemplacez aussi DOMAINE dans .env, puis docker compose up -d : overwrite.cli.url suit la nouvelle valeur.
6. Gros fichiers et durée des requêtes
Le frontal refuse les envois de plus de 512 Mo par requête et coupe une requête au-delà de 300 s. Le navigateur et les applications Nextcloud envoient les gros fichiers par morceaux, bien plus petits. Lancez en SSH les opérations longues (occ files:scan --all, par exemple), pas depuis une page web.
7. Envoyer les e-mails
Nextcloud envoie des e-mails pour réinitialiser un mot de passe oublié ou prévenir d'un partage. Sur votre VPS, le port 25 est fermé en sortie (anti-spam) ; les ports 465 et 587 sont ouverts, avec un nombre de connexions par minute limité. Utilisez le serveur SMTP authentifié de votre messagerie ou d'un service d'envoi, dans Paramètres d'administration > Paramètres de base > Serveur de messagerie :
| Champ | Valeur |
|---|---|
| Mode d'envoi | SMTP |
| Chiffrement | SSL avec le port 465, ou Aucun / STARTTLS avec le port 587 |
| Adresse source | une adresse que votre fournisseur vous autorise à utiliser |
| Authentification | identifiant et mot de passe SMTP |
Renseignez d'abord l'adresse e-mail de votre compte, puis cliquez sur Envoyer un e-mail. Sans e-mail, aucune réinitialisation de mot de passe par message : un administrateur s'en charge avec occ user:resetpassword nom-du-compte.
8. Mettre à jour
Nextcloud ne monte que d'une version majeure à la fois (34, puis 35, puis 36). Lisez les notes de version, sauvegardez (section suivante), changez le tag des services app et cron (34.0.5-apache vers le correctif suivant de la 34, ou vers une 35.0.x-apache), puis :
docker compose pull && docker compose up -d
docker compose logs -f appLa mise à jour se lance au démarrage du conteneur. Les tags mariadb:11.8 et redis:8.10-alpine reçoivent les correctifs de leur série à chaque docker compose pull.
9. Sauvegarder
Les VPS ne sont pas sauvegardés automatiquement. Sauvegardez la base et les dossiers config, data, custom_apps et themes du volume, en mode maintenance :
cd /opt/nextcloud
docker compose exec -u www-data app php occ maintenance:mode --on
docker compose exec -T db sh -c 'exec mariadb-dump --single-transaction -u nextcloud -p"$MARIADB_PASSWORD" nextcloud' > nextcloud-db.sql
tar -czf nextcloud-fichiers.tar.gz -C /var/lib/docker/volumes/nextcloud_nextcloud/_data config data custom_apps themes
docker compose exec -u www-data app php occ maintenance:mode --offLe chemin vaut pour le dossier /opt/nextcloud ; docker volume ls donne le nom du volume. Copiez le fichier SQL, l'archive, compose.yaml et .env hors du VPS.
Plusieurs applications sur le VPS
Pour faire cohabiter plusieurs applications, placez sur le port 80 un relais (Caddy, nginx ou Traefik) qui répartit par nom de domaine ; Nextcloud ne publie plus de port.
Problèmes fréquents
| Symptôme | Cause probable |
|---|---|
| « Accès à partir d'un domaine non approuvé » | Nom absent de trusted_domains (section 5). |
Liens ou redirections en http:// |
OVERWRITEPROTOCOL absent ou conteneur non recréé après modification. |
| Connexions lentes pour tout le monde après des erreurs | Nextcloud voit l'adresse du frontal (section 4) ; occ security:bruteforce:reset ADRESSE remet le compteur à zéro. |
It is only possible to upgrade one major version at a time |
Version majeure sautée : revenez au tag précédent et montez d'une version. |
| E-mail de test en échec | Port 25 fermé : passez par 465 ou 587 avec authentification. |
Besoin d'aide ?
Ouvrez un ticket depuis votre espace client avec le nom du VPS, la sortie de docker compose ps et les dernières lignes de docker compose logs app, sans le contenu du fichier .env.