Installer Nextcloud 17 sur CentOS 8 avec Nginx, PHP 7.3 et MariaDB

Ce guide explique, pas à pas, comment installer Nextcloud 17 sur un serveur CentOS 8 : installation de Nginx, PHP‑FPM 7.3 depuis REMI, MariaDB, réglages SELinux, configuration d’un hôte virtuel Nginx et obtention d’un certificat Let’s Encrypt. Prérequis : serveur avec 2 Go de RAM, 25 Go d’espace libre et 2 cœurs CPU. Suivez les étapes, vérifiez les commandes et adaptez les chemins et noms de domaine à votre environnement.
Important
- Gardez une sauvegarde de vos données et de /etc avant de modifier la configuration.
- Remplacez les mots de passe, noms d’hôte et chemins par vos valeurs réelles.
- Testez chaque étape sur un environnement non productif si possible.
Nextcloud est un logiciel libre (open source), similaire à Dropbox, issu d’un fork du projet ownCloud. Nextcloud est écrit en PHP et JavaScript et supporte plusieurs systèmes de gestion de base de données : MySQL/MariaDB, PostgreSQL, Oracle et SQLite.
Pour synchroniser vos fichiers entre poste et serveur, Nextcloud propose des applications pour Windows, Linux et macOS, ainsi qu’une application mobile pour Android et iOS.
Dans ce tutoriel, nous montrons comment installer Nextcloud 17 avec le serveur Web Nginx, PHP 7.3 (PHP‑FPM) et MariaDB sur un serveur CentOS 8. Nous installerons Nextcloud et le sécuriserons avec un certificat SSL gratuit Let’s Encrypt.
Prérequis
- Serveur CentOS 8 avec 2 Go de RAM, 25 Go d’espace libre et 2 cœurs CPU.
- Accès root ou un utilisateur avec sudo.
- Un nom de domaine pointant vers l’IP du serveur (ex. cloud.exemple.com).
Ce que nous allons faire
- Installer Nginx
- Installer PHP‑FPM 7.3
- Configurer PHP‑FPM 7.3
- Installer et configurer MariaDB
- Générer un certificat SSL via Let’s Encrypt
- Télécharger et installer Nextcloud 17
- Configurer l’hôte virtuel Nginx pour Nextcloud
- Ajuster SELinux pour Nextcloud
- Finaliser avec l’assistant d’installation Nextcloud
Étape 1 - Installer Nginx
Nous commençons par installer le serveur Web Nginx et ouvrir les ports HTTP et HTTPS dans firewalld.
Installez Nginx depuis le dépôt AppStream :
sudo dnf install nginx
Démarrez le service nginx et activez‑le au démarrage :
systemctl start nginx
systemctl enable nginx
Vérifiez le statut du service :
systemctl status nginx
Vous devriez voir que le service Nginx est actif sur votre serveur CentOS 8.
Ajoutons ensuite les services HTTP et HTTPS au pare‑feu firewalld :
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
Résultat : Nginx est installé et les ports HTTP/HTTPS sont ouverts.
Étape 2 - Installer PHP‑FPM
Nextcloud recommande PHP 7.2 ou 7.3; ici nous utilisons PHP 7.3 fourni par le dépôt REMI.
Activez le dépôt PowerTools, installez EPEL et ajoutez le dépôt REMI :
sudo dnf config-manager --set-enabled PowerTools
sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Vérifiez les dépôts disponibles :
dnf repolist
Activez le module PHP 7.3 de REMI :
dnf module list php
dnf module enable php:remi-7.3
Installez PHP et les modules nécessaires pour Nextcloud :
sudo dnf install php-fpm php-cli php-devel php-gd php-mysqlnd php-pear php-xml php-mbstring php-pdo php-json php-pecl-apcu php-pecl-apcu-devel php-pecl-imagick-devel php-intl php-opcache php-zip
Vous avez maintenant installé PHP et PHP‑FPM 7.3.
Étape 3 - Configurer PHP‑FPM 7.3
Nous allons adapter php.ini, activer et configurer l’opcache, et placer PHP‑FPM pour qu’il fonctionne avec Nginx.
Éditez le fichier php.ini :
vim /etc/php.ini
Recherchez et modifiez (ou décommentez) les valeurs suivantes :
memory_limit = 512M
date.timezone = Asia/Jakarta
cgi.fixpathinfo = 0
Note : changez date.timezone pour votre fuseau horaire (par exemple Europe/Paris).
Configurez l’opcache :
vim /etc/php.d/10-opcache.ini
Ajoutez ou modifiez :
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
Éditez la configuration PHP‑FPM du pool par défaut :
vim /etc/php-fpm.d/www.conf
Changez l’utilisateur et le groupe pour nginx :
user = nginx
group = nginx
Réglez l’écoute sur le socket Unix :
listen = /run/php-fpm/www.sock
Décommentez et exportez quelques variables d’environnement :
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Activez le cache d’opcodes sur disque :
php_value[opcache.file_cache] = /var/lib/php/opcache
Créez les répertoires de session et opcache, puis définissez les droits :
mkdir -p /var/lib/php/{session,opcache}
chown -R nginx:nginx /var/lib/php/{session,opcache}
Démarrez et activez PHP‑FPM :
systemctl enable php-fpm
systemctl start php-fpm
Vérifiez que le socket et le service sont actifs :
netstat -pl | grep php
systemctl status php-fpm
Résultat : PHP‑FPM écoute via /run/php-fpm/www.sock.
Important
- Ne laissez pas cgi.fixpathinfo à 1 : cela peut être une faille de sécurité avec Nginx.
- Adaptez memory_limit selon la charge et le nombre d’utilisateurs.
Étape 4 - Installer et configurer MariaDB
Installez le serveur MariaDB :
sudo dnf install mariadb mariadb-server
Démarrez et activez MariaDB :
systemctl start mariadb
systemctl enable mariadb
Sécurisez l’installation et créez le mot de passe root :
mysql_secure_installation
Répondez « Y » aux options pour définir un mot de passe root, supprimer les utilisateurs anonymes, supprimer la base test et recharger les privilèges.
Connectez‑vous au shell MySQL :
mysql -u root -p
TYPE YOUR ROOT PASSWORD
Créez la base de données et l’utilisateur pour Nextcloud (remplacez les identifiants par des valeurs sûres) :
create database nextcloud_db;
create user nextclouduser@localhost identified by 'nextcloudpassdb';
grant all privileges on nextcloud_db.* to nextclouduser@localhost identified by 'nextcloudpassdb';
flush privileges;
Conseil de sécurité
- Utilisez un mot de passe fort pour l’utilisateur de base de données.
- En production, restreignez l’accès réseau à MariaDB (bind-address, pare‑feu) si nécessaire.
Étape 5 - Générer le certificat SSL avec Let’s Encrypt
Installez certbot depuis EPEL :
sudo dnf install certbot
Générez un certificat pour votre domaine (adaptez le chemin webroot, le domaine et l’e‑mail) :
certbot certonly --webroot --webroot-path /usr/share/nginx/html --agree-tos -m [email protected] -d cloud.hakase-labs.io
Les certificats seront créés dans /etc/letsencrypt/live/cloud.hakase-labs.io :
ls -lah /etc/letsencrypt/live/cloud.hakase-labs.io/
Important
- Certbot doit pouvoir écrire dans le webroot pour valider le défi HTTP.
- Configurez le renouvellement automatique : certbot renew (crontab/systemd timer).
Étape 6 - Télécharger et installer Nextcloud
Installez unzip si nécessaire :
sudo dnf install unzip
Téléchargez Nextcloud 17 et extrayez‑le :
cd /var/www/
wget https://download.nextcloud.com/server/releases/nextcloud-17.0.2.zip
unzip nextcloud-17.0.2.zip
Créez le répertoire de données et définissez les propriétaires :
mkdir -p /var/www/nextcloud/data/
sudo chown -R nginx:nginx /var/www/nextcloud
Remarque
- Par défaut, l’assistant Nextcloud propose d’utiliser le dossier data dans l’arborescence Web. Pour plus de sécurité, placez le dossier data hors du répertoire Web et configurez le chemin dans la configuration Nextcloud.
Étape 7 - Configurer l’hôte virtuel Nginx pour Nextcloud
Créez la configuration Nginx :
cd /etc/nginx/conf.d/
vim nextcloud.conf
Collez la configuration suivante en veillant à adapter server_name et chemins de certificats :
upstream php-handler {
#server 127.0.0.1:9000;
server unix:/run/php-fpm/www.sock;
}
server {
listen 80;
listen [::]:80;
server_name cloud.hakase-labs.io;
# enforce https
return 301 https://$server_name:443$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name cloud.hakase-labs.io;
# Use Mozilla's guidelines for SSL/TLS settings
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
# NOTE: some settings below might be redundant
ssl_certificate /etc/ssl/nginx/fullchain.pem;
ssl_certificate_key /etc/ssl/nginx/privkey.pem;
# Add headers to serve security related headers
# Before enabling Strict-Transport-Security headers please read into this
# topic first.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;
# Path to the root of your installation
root /var/www/nextcloud;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# The following 2 rules are only needed for the user_webfinger app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
# The following rule is only needed for the Social app.
# Uncomment it if you're planning to use this app.
#rewrite ^/.well-known/webfinger /public.php?service=webfinger last;
location = /.well-known/carddav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host:$server_port/remote.php/dav;
}
# set max upload size
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Enable gzip but do not remove ETag headers
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
# Uncomment if your server is built with the ngx_pagespeed module
# This module is currently not supported.
#pagespeed off;
location / {
rewrite ^ /index.php;
}
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
deny all;
}
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) {
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
# Avoid sending the security headers twice
fastcgi_param modHeadersAvailable true;
# Enable pretty urls
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
}
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
try_files $uri/ =404;
index index.php;
}
# Adding the cache control header for js, css and map files
# Make sure it is BELOW the PHP block
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463";
# Add headers to serve security related headers (It is intended to
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
# Optional: Don't log access to assets
access_log off;
}
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
try_files $uri /index.php$request_uri;
# Optional: Don't log access to other assets
access_log off;
}
}
Testez la configuration Nginx et redémarrez :
nginx -t
systemctl restart nginx
Vérifiez les ports écoutés :
netstat -plntu
Résultat : l’hôte virtuel Nginx pour Nextcloud est en place et HTTPS est activé.
Étape 8 - Configurer SELinux pour Nextcloud
Si SELinux est en mode enforcing, il faut marquer certains répertoires comme accessibles en écriture par le serveur Web.
Installez l’outil de gestion SELinux :
sudo dnf install policycoreutils-python-utils
Appliquez les contextes SELinux aux répertoires Nextcloud :
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/data(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/config(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/apps(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/assets(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.htaccess'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/nextcloud/.user.ini'
restorecon -Rv '/var/www/nextcloud/'
La configuration SELinux pour Nextcloud est maintenant appliquée.
Important
- Ne changez pas globalement SELinux en permissive pour contourner des erreurs ; ajustez les contextes spécifiques.
Étape 9 - Assistant d’installation Nextcloud
Ouvrez un navigateur et rendez‑vous à l’adresse HTTPS de votre instance :
Vous verrez la page d’installation Web de Nextcloud :
- Créez un compte administrateur (nom et mot de passe).
- Choisissez MySQL/MariaDB comme type de base de données.
- Saisissez les informations de la base (nextcloud_db, nextclouduser, mot de passe).
Cliquez sur Finish Setup ; l’installation se lancera et, à la fin, vous obtiendrez le tableau de bord Nextcloud :
Vous avez maintenant Nextcloud 17 fonctionnel avec Nginx, PHP‑FPM 7.3 et MariaDB sur CentOS 8.
Checklist rapide avant mise en production
- Remplacer tous les mots de passe d’exemple.
- Déplacer le dossier data hors du répertoire web si possible.
- Configurer la rotation de logs et le monitoring (journal, métriques).
- Mettre en place des sauvegardes régulières (fichiers + base).
- Automatiser le renouvellement Let’s Encrypt (certbot renew).
- Appliquer des règles firewall/iptables adaptées.
Dépannage courant
- Erreur 502 Bad Gateway : vérifier que php-fpm est démarré et que le socket /run/php-fpm/www.sock existe et appartient à nginx.
- Erreur permissions lors d’upload : vérifier propriétaires et contextes SELinux sur /var/www/nextcloud et /var/www/nextcloud/data.
- Problèmes de certificat : certbot doit avoir accès au webroot ; vérifiez que /usr/share/nginx/html retourne les fichiers de challenge.
Quand cela échoue
- Si l’installation web reste bloquée : consultez les logs Nginx (/var/log/nginx/error.log) et PHP (/var/log/php-fpm/error.log).
- Pour des erreurs SQL : connectez‑vous à MariaDB et vérifiez la validité des privilèges et la disponibilité de la base.
Bonnes pratiques opérationnelles
- Mettez à jour régulièrement PHP et Nextcloud (corrigez les vulnérabilités).
- Surveillez l’utilisation disque, les verrous de base et les performances PHP‑FPM (pm.*).
- Limitez l’exposition réseau des services administratifs.
Glossaire rapide
- PHP‑FPM : FastCGI Process Manager pour PHP, gère les processus PHP.
- webroot : répertoire public du serveur Web utilisé pour valider Let’s Encrypt.
- SELinux : mécanisme de contrôle d’accès obligatoire sur CentOS/RHEL.
Résumé
Ce guide couvre l’installation complète de Nextcloud 17 sur CentOS 8 avec Nginx, PHP‑FPM 7.3 et MariaDB, plus la sécurisation via Let’s Encrypt et l’ajustement SELinux. Après avoir suivi les étapes, vous disposerez d’une instance Nextcloud opérationnelle prête à recevoir des utilisateurs.
Référence
Matériaux similaires

Installer et configurer Tripwire sur Ubuntu 16.04

Split View sur Mac — guide pratique

Image comme puce dans Word : guide rapide

Libérer le cache iPhone sans supprimer l'app
Nettoyer votre Sony PSP : guide complet
