Ce guide explique en détail comment installer Nextcloud sur Ubuntu 24.04 LTS. Il s’agit d’un guide pas à pas détaillé. Lors de l’installation, nous avons veillé à optimiser les performances et la sécurité du système.
Qu’est-ce que Nextcloud?
Nextcloud est une plateforme collaborative auto-hébergée conçue pour améliorer la productivité grâce à des services intégrés tels que Fichiers, Talk, et Office. Elle offre des fonctionnalités similaires à Dropbox, Office 365 ou Google Drive lorsqu’elle est utilisée avec des suites bureautiques comme OnlyOffice.
Nextcloud peut être hébergé dans le cloud ou sur site, offrant ainsi des options de déploiement flexibles. Il permet de stocker des documents sur des serveurs privés ou des centres de données sécurisés, garantissant un contrôle et une sécurité accrus.
Étape 1 : Mise à jour et mise à niveau du système.
sudo apt update && sudo apt upgrade -y
Étape 2 : Installez Apache2 et les modules PHP.
sudo apt install apache2 libapache2-mod-php unzip \
php php-common php-bz2 bzip2 php-gd php-mysql \
php-curl php-mbstring php-imagick php-zip php-xml \
php-json php-bcmath php-intl php-gmp \
php-cli php-apcu imagemagick imagemagick-6.q16 librsvg2-bin php8.3-imagick wget -y
Activez les modules Apache requis
sudo a2enmod env rewrite dir mime headers setenvif ssl
Maintenant, redémarrez, activez et vérifiez qu’Apache fonctionne correctement.
sudo systemctl restart apache2
sudo systemctl enable apache2
Étape 3 : Installation et Configuration du serveur MariaDB
1. Installez le paquet mariadb-server
sudo apt install mariadb-server -y
2. Ensuite la configuration initiale.
sudo mysql_secure_installation
Vous verrez une série de questions. Voici les réponses recommandées. Mot de passe root : entrez votre mot de passe Ubuntu Server si demandé

Basculer vers unix_socket authentication : Non

Supprimer les utilisateurs anonymes : Oui

Désactiver l’accès distant du compte root : Oui (sauf si vous en avez besoin via VPN ou réseau sécurisé)

Supprimer la base de test : Oui


3. Connectez-vous à MariaDB, il suffit de taper la commande ci-dessous ; vous accéderez ainsi à l’invite de commandes MySQL.
sudo mysql -u root -p
4. Créer une base de données et un utilisateur pour Nextcloud et attribuer les autorisations à l’utilisateur. Vous pouvez changer les noms et le mot de passe.
Assurez-vous de l’écrire dans un bloc de texte avant de la coller dans votre serveur pour éviter les erreurs.
- Nom de la base de données – nextcloud
- Nom d’utilisateur de la base de données – nextclouduser
- Mot de passe – MOTDEPASSE
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'MOTDEPASSE';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
5. Maintenant, redémarrez et activez le service MariaDB.
sudo systemctl restart mariadb
sudo systemctl enable mariadb
Étape 4 : Télécharger Nextcloud, décompresser et autoriser
1. Placez-vous dans le bon répertoire
cd /var/www/
2. Téléchargez l’archive.
Choisir la bonne version de Nextcloud
Le site officiel vous poussera toujours vers la version la plus récente (ex: 33.0.0), mais pour un serveur stable qui ne "crashera" pas au premier paramètre modifié, suivez la règle du Dernier Chiffre :
- Version X.0.0 (🔴 Instable) : Version majeure neuve. Contient les nouvelles fonctionnalités mais souvent des bugs critiques.
- Version X.0.1 (🟡 Correctifs) : Les premiers correctifs ont été appliqués.
- Version X.0.2 et + (🟢 Optimisée) : Version réellement fiable et "rodée" pour la production.
🔍 Étape 1 : Identifiez votre version cible
Consultez la liste officielle pour choisir une version mature (ex: 32.0.6) :
📂 Ouvrir le répertoire des versions NextcloudÉtape 2 : Commande de téléchargement
Une fois votre version choisie, utilisez les commandes ci-dessous. Modifiez simplement la première ligne avec votre numéro de version :
# Définir la version (ex: 32.0.6)
NC_VER="32.0.6"
# Télécharger l'archive
sudo wget https://download.nextcloud.com/server/releases/nextcloud-${NC_VER}.tar.bz2
3. Extraire l’archive.
sudo tar -xvjf nextcloud-${NC_VER}.tar.bz2
sudo chown -R www-data:www-data /var/www/nextcloud
4. Ajoutez votre utilisateur au groupe www-data.
Changez votreutilisateur par votre nom d’utilisateur Ubuntu.
sudo usermod -aG www-data votreutilisateur
5. Attribution des droits sur le dossier Nextcloud.
sudo chown -R www-data:www-data /var/www/nextcloud
Étape 5 : Configuration d’Apache Création du Virtual Host.
Nous allons créer un Virtual Host pour Nextcloud dans Apache. Notez bien son nom car nous le modifierons plus tard pour améliorer ses performances et la configuration SSL.
1. Création du Virtual Host.
sudo nano /etc/apache2/sites-available/nextcloud.conf
- Modifiez les champs votresiteweb en fonction de votre domaine.
- Les champs commentés d’un # servent à désactiver temporairement. Nous les activerons plus tard.
<VirtualHost *:80>
ServerName votresiteweb.com
ServerAlias www.votresiteweb.com
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>
ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
<VirtualHost *:443>
# Protocols h2 http/1.1
ServerName cloud.votresiteweb.com
ServerAlias www.votresiteweb.com
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
</Directory>
# <FilesMatch "\.php$">
# SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
#</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "no-referrer"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>
</VirtualHost>
2. Activation du Virtual Host
sudo a2ensite nextcloud.conf
sudo systemctl reload apache2
systemctl restart apache2

ÉTAPE 6 : Certification SSL.
1. Installation de certbot.
🛑 Prérequis Critique : Ouverture du Port 80
Avant de lancer la génération du certificat SSL (Certbot) à l'étape suivante, vous devez impérativement vous assurer que le port 80 (HTTP) de votre routeur est redirigé (Port Forwarding) vers l'adresse IP locale de votre serveur.
Pourquoi ? Let's Encrypt utilise le port 80 pour vérifier que vous êtes bien le propriétaire du domaine. Si ce port est fermé, la validation échouera et vous ne pourrez pas sécuriser votre installation. Une fois le certificat obtenu, Certbot redirigera automatiquement tout le trafic vers le port 443 (HTTPS).
sudo apt install certbot python3-certbot-apache -y
2. Obtention du certificat.
Remplacez votresiteweb par votre nom de domaine.
sudo certbot --apache -d votresiteweb.com
ÉTAPE 7: Optimisation des performances.
1.Installer PHP-FPM
sudo apt install php8.3-fpm
sudo a2dismod php8.3
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
2. Intégration FPM et HTTP/2 dans votre Virtual Host
sudo nano /etc/apache2/sites-available/nextcloud.conf
Supprimez le commentaire # aux 4 lignes suivantes
Protocols h2 http/1.1
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
3. Activer le module HTTP/2 d’Apache
sudo a2enmod http2
systemctl restart apache2
Pour optimiser la taille et les performances du chargement de fichiers, il est nécessaire de modifier certains paramètres du fichier php.ini (/etc/php/8.3/fpm/php.ini) listés ci-dessous. Vous pouvez adapter ces valeurs à votre environnement.
sudo nano /etc/php/8.3/fpm/php.ini
upload_max_filesize = 64M
post_max_size = 96M
memory_limit = 512M
max_execution_time = 600
max_input_vars = 3000
max_input_time = 1000
Il faut maintenant mettre à jour la configuration du pool PHP-FPM dans /etc/php/8.3/fpm/pool.d/www.conf. Vous trouverez ci-dessous quelques valeurs optimales, mais vous devez leur attribuer vos propres valeurs.
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
pm.max_children = 64
pm.start_servers = 16
pm.min_spare_servers = 16
pm.max_spare_servers = 32
Redémarrez maintenant PHP-FPM pour appliquer toutes les modifications.
service php8.3-fpm restart
4. Ajustez maintenant la mémoire opcache.
sudo nano /etc/php/8.3/fpm/php.ini
Pour activer les paramètres ci-bas, supprimez le point-virgule (;) devant chaque ligne requise.
[opcache]
; Décommenter et Activer l'OPcache
opcache.enable=1
; Important pour les commandes 'occ' (Cron et maintenance)
opcache.enable_cli=1
; Mémoire de cache (en Mo) - 128 est le minimum recommandé par Nextcloud
opcache.memory_consumption=128
; Correction de l'avertissement Nextcloud sur les chaînes de caractères
opcache.interned_strings_buffer=16
; Nombre maximal de fichiers (scripts) à mettre en cache
opcache.max_accelerated_files=10000
; Intervalle de vérification des fichiers (en secondes)
opcache.revalidate_freq=1
; REQUIS PAR NEXTCLOUD : Conserve les commentaires PHP pour certaines applications
opcache.save_comments=1
sudo systemctl restart php8.3-fpm
5. Compilation JIT (Just-In-Time) d’Opcache
La compilation JIT (Just-In-Time) d’Opcache est une fonctionnalité importante. Elle améliore les performances de PHP en compilant le code en langage machine à l’exécution, au lieu de l’interpréter à chaque fois. Cela peut considérablement améliorer les performances des tâches gourmandes en ressources CPU. L’activer serait donc très efficace pour optimiser les performances de Nextcloud.
sudo nano /etc/php/8.3/fpm/conf.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable_cli=1
opcache.jit=on
opcache.jit = 1255
opcache.jit_buffer_size = 128M
sudo service php8.3-fpm restart
6. Activer APCu dans PHP
APCu est un système de cache de données utilisateur. Il s’agit d’un cache local pour le système. Nextcloud l’utilise pour la mise en cache en mémoire. Il est nécessaire d’activer APCu via l’interface de ligne de commande (CLI), car il est désactivé par défaut, ce qui peut entraîner des problèmes avec les tâches cron de Nextcloud.
sudo apt install php8.3-apcu
Activer APCu via l’interface de ligne de commande.
sudo nano /etc/php/8.3/fpm/conf.d/20-apcu.ini
extension=apcu.so
apc.enable_cli=1
sudo systemctl restart php8.3-fpm
sudo systemctl restart apache2
7. Configurer le cache Redis
Dans Nextcloud, Redis est utilisé pour la mise en cache locale et distribuée, ainsi que pour le verrouillage transactionnel des fichiers. Nous utilisons APCu pour la mise en cache locale, car il est plus rapide que Redis. Nous utiliserons Redis pour le verrouillage des fichiers. Le mécanisme de verrouillage transactionnel de Nextcloud verrouille les fichiers afin d’éviter leur corruption lors du fonctionnement normal.
sudo apt install redis-server php-redis -y
8. Démarrer et activer le service Redis
sudo systemctl start redis-server
sudo systemctl enable redis-server
9. Configurez Redis pour utiliser un socket Unix plutôt que des ports
Nous devons trouver quel est le nom du socket utilisé par notre système. Voici trois exemples.
- /var/run/redis/redis-server.sock
- /run/redis/redis-server.sock
- /tmp/redis.sock
Ouvrez le fichier et cherchez
unixsocket
sudo nano /etc/redis/redis.conf
Notez le socket utilisé vous en aurez besoin plus tard.
Voici les valeurs à changer. Le nom de socket peut être différent pour vous.Supprimez le commentaire (#) devant chaque ligne requise ci -bas.
port 0
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770
10. Activer le verrouillage de session Redis dans PHP
Naviguer dans le dossier fpm et identifiez le fichier redis.ini.
cd /etc/php/8.3/fpm/conf.d/ && ls

Une fois son numéros et son nom identifié nous allons le modifier pour ajouter les valeurs suivante :
sudo nano 25-redis.ini
extension=redis.so
redis.session.locking_enabled=1
redis.session.lock_retries=-1
redis.session.lock_wait_time=10000
11. Ajouter l’utilisateur Apache au groupe Redis
sudo usermod -a -G redis www-data
12. Redémarrez Redis, PHP-FPM et Apache
sudo systemctl restart redis-server
sudo systemctl restart php8.3-fpm
sudo systemctl restart apache2
ÉTAPE 8 : Installation de Nextcloud.
🔒 Activation de l'accès sécurisé (Port 443)
À cette étape, votre certificat SSL est maintenant généré. Pour que vous puissiez accéder à votre Nextcloud depuis l'extérieur de votre domicile (viahttps://cloud.votredomaine.com), vous devez ouvrir et rediriger le port 443 (HTTPS) de votre routeur vers votre serveur.
Note de sécurité : Désormais, tout le trafic entre votre navigateur et votre serveur sera chiffré. Le port 80 peut rester ouvert pour permettre la redirection automatique vers le HTTPS et le renouvellement du certificat automatiquement via Certbot, mais c'est le port 443 qui gérera l'intégralité de vos transferts de données.
Ouvrez une page de navigation privée et rendez-vous sur https://votresiteweb.com
Dans les deux premiers champs créez votre compte administrateur pour votre instance Nextcloud.
Remplissez la section base de données en fonction de ce que vous avez rempli à l’étape 3.4.

Vous pouvez ignorer et décocher toutes ces cases pour installer manuellement ces applications plus tard si vous le souhaitez.

Ajustement du fichier config.php
sudo nano /var/www/nextcloud/config/config.php
Ajoutez cette section avant la fin en prenant garde à ne pas supprimer la dernière parenthèse suivie du de la virgule ), . Pour ‘default_phone_region’ => ‘XX’,Allez-y en fonction de votre région selon la norme Code ISO 3166-1 alpha-2.
- Canada'CA'
- France'FR'
- États-Unis'US'
- Royaume-Uni'GB'
- Allemagne'DE'
- Belgique'BE'
- Suisse'CH'
'htaccess.RewriteBase' => '/',
'default_phone_region' => 'CA',
'maintenance_window_start' => 2,
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => '/run/redis/redis-server.sock',
'port' => 0,
'dbindex' => 0,
'timeout' => 1.5,
),
sudo systemctl restart redis-server
sudo systemctl restart apache2
sudo -u www-data php --define apc.enable_cli=1 /var/www/nextcloud/occ maintenance:update:htaccess
sudo systemctl restart php8.3-fpm
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices
cd /var/www/nextcloud
sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive
ÉTAPE 9 : configuration du pare-feu.
Vous avez l’option d’utiliser soitUncomplcated firewall (UFW) ou, pour une gestion plus fine, les règles nftables.Choisissez l’option qui vous convient le mieux.
9-1 Uncomplicated firewall (UFW).
1. Installation.
sudo apt install ufw
# 1. Définir les règles par défaut
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. Autoriser les ports essentiels (HTTP, HTTPS, SSH)
# Si votre port SSH est différent, modifiez en conséquence.
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 3. Autoriser les services locaux (Loopback, essentiel pour PHP-FPM et BDD)
# L'accès à Redis (port 0) est géré par les permissions de fichier Unix, non par UFW.
sudo ufw allow in on lo
# 4. Activer UFW et vérifier les règles
sudo ufw enable
sudo ufw status verbose
2. Application des règles et activation.
9-2 Règles nftables
1. Éditer le fichier de configuration principal
sudo nano /etc/nftables.conf
2. Application des règles.
#!/usr/sbin/nft -f
# 1. NETTOYAGE
flush ruleset
# Création de la table 'inet' (gère IPv4 et IPv6 simultanément)
table inet filter {
chain input {
# 1. DÉFINITION DES POLITIQUES (Drop par défaut)
type filter hook input priority 0; policy drop;
# 4. DURCISSEMENT DE SÉCURITÉ (HARDENING)
# Rejeter les paquets liés à aucune connexion valide
ct state invalid drop
# Bloquer les combinaisons de flags TCP anormales (Scans furtifs, SYN floods)
tcp flags & (fin|syn) == (fin|syn) drop
tcp flags & (syn|rst) == (syn|rst) drop
tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 drop
tcp flags != syn ct state new drop
# 2. AUTORISER LE TRAFIC CRITIQUE
# Loopback (trafic interne local)
iif "lo" accept
# Trafic de connexion existante et reliée (ESSENTIEL)
ct state established,related accept
# Autoriser ICMP (Ping) - Limité à 1/sec, rejeter les inondations
ip protocol icmp icmp type echo-request limit rate over 1/second burst 3 packets drop
ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 1/second burst 3 packets drop
# Autoriser le reste du trafic ICMP (essentiel pour le routage IPv4/IPv6)
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# 3. AUTORISER LES PORTS DE NEXTCLOUD
# Regroupement des ports en une seule ligne (la magie de nftables !)
tcp dport { 22, 80, 443 } accept
}
chain forward {
# Politique par défaut DROP pour le transfert/routage
type filter hook forward priority 0; policy drop;
}
chain output {
# Politique par défaut ACCEPT pour le trafic sortant
type filter hook output priority 0; policy accept;
}
}
3. Charger les nouvelles règles et activer le service au démarrage
sudo nft -f /etc/nftables.conf
sudo systemctl enable --now nftables
sudo nft list ruleset
Optimisation vitale : Activer les tâches de fond (Cron)
Par défaut, Nextcloud exécute ses tâches de maintenance (nettoyage de la corbeille, indexation, envois d'emails) à chaque fois qu'un utilisateur charge une page. C'est la méthode "AJAX". Cela ralentit considérablement la navigation.
Pour un serveur performant, il faut confier ce travail au planificateur de tâches de Linux (le Cron) de l'utilisateur web (www-data).
Étape 1 : Configurer le Cron système
Ouvrez le planificateur de tâches de l'utilisateur www-data avec cette commande :
sudo -u www-data crontab -e
Si le système vous demande de choisir un éditeur, tapez le chiffre correspondant à nano et validez.
Allez tout en bas du fichier et ajoutez cette ligne exacte. Elle indique au serveur d'exécuter le script de maintenance de Nextcloud toutes les 5 minutes :
*/5 * * * * php -f /var/www/nextcloud/cron.php
Sauvegardez et quittez (Ctrl+O, Entrée, Ctrl+X si vous utilisez nano).
Étape 2 : Activer le réglage dans Nextcloud
Il ne reste plus qu'à dire à Nextcloud d'arrêter de s'en occuper lui-même :
- Connectez-vous à Nextcloud avec votre compte administrateur.
- Allez dans Paramètres > Administration > Paramètres de base.
- Dans la section Tâches de fond, sélectionnez l'option Cron.
Attendez environ 5 minutes, rafraîchissez la page : vous devriez voir un point vert indiquant que la dernière tâche s'est exécutée récemment. Votre interface web sera désormais beaucoup plus réactive !
Bonus Sysadmin : Vider le cloud des nouveaux utilisateurs (Skeleton)
Le problème des dossiers et fichiers par défaut
À chaque création d'un nouvel utilisateur, Nextcloud copie automatiquement le contenu d'un dossier modèle appelé skeleton (le squelette). Ce dossier contient des répertoires par défaut ("Documents", "Photos") et un manuel PDF de bienvenue.
En production, on veut souvent offrir un espace 100% vierge. L'erreur de débutant est d'aller supprimer ces fichiers dans le dossier système de Nextcloud : à la prochaine mise à jour, ils reviendront !
La solution propre : Créer son propre Skeleton
La vraie méthode d'administrateur système consiste à créer un dossier vide en dehors de Nextcloud (dans /usr/local/share) et de dire à l'application de l'utiliser. Cela sépare proprement vos configurations des fichiers système.
Étape 1 : Création du dossier dédié
On crée un dossier vide dans un répertoire système standard :
sudo mkdir -p /usr/local/share/nextcloud/skeleton
Étape 2 : Gestion des permissions (Crucial)
Pour que Nextcloud puisse utiliser ce dossier lors de la création d'un compte, l'utilisateur web (www-data) doit en être le propriétaire et avoir les droits de lecture :
sudo chown -R www-data:www-data /usr/local/share/nextcloud/skeleton
sudo chmod -R 755 /usr/local/share/nextcloud/skeleton
Étape 3 : Modification de la configuration
Maintenant, on indique à Nextcloud d'ignorer son dossier par défaut pour utiliser le vôtre. Ouvrez le fichier de configuration :
sudo nano /var/www/nextcloud/config/config.php
Ajoutez cette ligne juste avant la parenthèse de fin ); tout en bas du fichier :
'skeletondirectory' => '/usr/local/share/nextcloud/skeleton',
L'impact : En laissant le dossier /usr/local/share/nextcloud/skeleton totalement vide, vos futurs utilisateurs auront un cloud d'une propreté absolue à leur première connexion. Si plus tard vous souhaitez qu'ils aient tous un dossier spécifique (ex: "Documents RH"), il suffira de le créer dans ce répertoire !