Installer Nextcloud sur un VPS KVM avec Docker

VPS7 min de lectureMis à jour le

Sommaire 13 sections
  1. Ce qu'il vous faut
  2. 1. Préparer le dossier et les secrets
  3. 2. Le fichier compose.yaml
  4. 3. Premier lancement
  5. 4. L'adresse des visiteurs
  6. 5. Votre propre domaine
  7. 6. Gros fichiers et durée des requêtes
  8. 7. Envoyer les e-mails
  9. 8. Mettre à jour
  10. 9. Sauvegarder
  11. Plusieurs applications sur le VPS
  12. Problèmes fréquents
  13. Besoin d'aide ?

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

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

bash
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 .env

Remplacez 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 :

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. OVERWRITEPROTOCOL et OVERWRITECLIURL (réglages overwriteprotocol et overwrite.cli.url) font produire à Nextcloud des liens en https://.
  • trusted_domains : Nextcloud refuse tout nom absent de cette liste.
  • Le service cron exécute les tâches de fond ; Nextcloud passe de lui-même en mode « Cron ».

3. Premier lancement

bash
docker compose up -d
docker compose logs -f app

Attendez Nextcloud was successfully installed puis apache2 -D FOREGROUND, et quittez avec Ctrl+C. Vérifiez :

bash
docker compose exec -u www-data app php occ status

Vous 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 :

bash
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=1

La 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 :

bash
docker compose exec app grep -o "Login failed[^\"]*" data/nextcloud.log | tail -n 1
  • Remote IP est votre adresse IP publique : rien à faire.
  • C'est une autre adresse : celle du frontal. Inscrivez-la dans .env (PROXY_IP=…) puis relancez docker compose up -d. Elle rejoint trusted_proxies, et Nextcloud lit alors l'adresse du visiteur dans l'en-tête X-Forwarded-For s'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 :

bash
docker compose exec -u www-data app php occ config:system:set trusted_domains 2 --value=cloud.votredomaine.fr

Remplacez 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 :

bash
docker compose pull && docker compose up -d
docker compose logs -f app

La 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 :

bash
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 --off

Le 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.

Retour à la documentation