# Guide d'installation de Nextcloud (Nginx + PostgreSQL) sur Ubuntu Server
L'installation de Nextcloud peut s'avérer fastidieuse : la documentation officielle ne respecte pas toujours un ordre chronologique, surtout dans une configuration **Nginx + PostgreSQL**. Ce guide est un mémo structuré, corrigé et optimisé pour réussir l'installation sans perdre de temps.
---
## Table des matières
1. [Configuration initiale & vérification des versions](#1-configuration-initiale--vérification-des-versions)
2. [Installation des prérequis et modules PHP](#2-installation-des-prérequis-et-modules-php)
3. [Mise en place des fichiers de Nextcloud](#3-mise-en-place-des-fichiers-de-nextcloud)
4. [Création de la base de données PostgreSQL](#4-création-de-la-base-de-données-postgresql)
5. [Création du répertoire de données](#5-création-du-répertoire-de-données)
6. [Installation via OCC (ligne de commande)](#6-installation-via-occ-ligne-de-commande)
7. [Configuration du serveur Nginx](#7-configuration-du-serveur-nginx)
8. [Activation du HTTPS avec Certbot](#8-activation-du-https-avec-certbot)
9. [Optimisation du fichier config.php](#9-optimisation-du-fichier-configphp)
10. [Configuration du CRON](#10-configuration-du-cron)
11. [Importation de fichiers externes](#11-importation-de-fichiers-externes)
12. [Conseils et bonnes pratiques](#12-conseils-et-bonnes-pratiques)
---
## 1. Configuration initiale & vérification des versions
Ce guide s'appuie sur l'environnement suivant (à adapter selon vos versions) :
| Composant | Version testée |
|-----------------|-------------------------|
| OS | Ubuntu 20.04 LTS+ |
| Serveur Web | Nginx 1.18.0 |
| Base de données | PostgreSQL 12+ |
| PHP | 7.4 (adapter si PHP 8.x)|
Vérifiez les versions installées sur votre serveur :
```bash
# Version d'Ubuntu
lsb_release -a
# Version de Nginx
nginx -v
# Version de PostgreSQL
psql --version
# Version de PHP
php -v
```
---
## 2. Installation des prérequis et modules PHP
Mettez à jour le système avant toute chose :
```bash
sudo apt update && sudo apt upgrade -y
```
### Installation des paquets requis
Installez PHP-FPM, le connecteur PostgreSQL, Redis (cache + verrouillage de fichiers) et toutes les extensions PHP recommandées par Nextcloud :
```bash
sudo apt install -y \
php-gd php-curl php-mbstring php-intl php-gmp php-bcmath \
php-xml php-imagick imagemagick php-zip php-bz2 \
php-fpm php-pgsql php-apcu redis-server php-redis
```
### Activation et vérification des modules
```bash
# Activer le cache APCu pour la CLI PHP
sudo -u www-data php --define apc.enable_cli=1
# Vérifier le statut de PHP-FPM (adaptez le numéro de version)
sudo systemctl status php7.4-fpm
# Si le module pgsql n'est pas actif, le forcer manuellement
sudo phpenmod pgsql
sudo systemctl restart php7.4-fpm.service
```
> **Note :** Les modules sont généralement activés automatiquement. Vérifiez les configurations actives dans `/etc/php/7.4/fpm/conf.d/`.
---
## 3. Mise en place des fichiers de Nextcloud
```bash
cd /var/www
# Télécharger l'archive officielle
sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2
# Décompresser l'archive
sudo tar -xjvf latest.tar.bz2
# Supprimer l'archive (optionnel)
sudo rm latest.tar.bz2
# Attribuer les droits à www-data
sudo chown -R www-data:www-data /var/www/nextcloud
```
---
## 4. Création de la base de données PostgreSQL
La base est configurée avec l'encodage UTF-8, une isolation `read committed` et le fuseau horaire `Europe/Paris`.
### Option A — Ligne de commande (recommandée)
Connectez-vous au shell PostgreSQL :
```bash
sudo -u postgres psql
```
Puis exécutez les requêtes suivantes *(remplacez `%DbName%`, `%Username%` et `%Password%` par vos propres valeurs)* :
```sql
CREATE DATABASE %DbName%;
CREATE USER %Username% WITH PASSWORD '%Password%';
ALTER ROLE %Username% SET client_encoding TO 'utf8';
ALTER ROLE %Username% SET default_transaction_isolation TO 'read committed';
ALTER ROLE %Username% SET timezone TO 'Europe/Paris';
GRANT ALL PRIVILEGES ON DATABASE %DbName% TO %Username%;
-- Quitter le shell psql
\q
```
> **⚠️ Important :** N'entourez pas le nom d'utilisateur de guillemets simples dans `CREATE USER` — cela provoquerait une erreur de syntaxe sous PostgreSQL.
### Option B — Script automatisé
```bash
chmod +x newdatabase.sh
sudo ./newdatabase.sh
```
---
## 5. Création du répertoire de données
Pour des raisons de sécurité, le répertoire de données doit être placé **en dehors** de la racine web (`/var/www`). Nous utilisons `/opt/nextcloud/data`.
```bash
# Créer le dossier
sudo mkdir -p /opt/nextcloud/data
# Assigner la propriété à www-data
sudo chown -R www-data:www-data /opt/nextcloud
```
---
## 6. Installation via OCC (ligne de commande)
L'outil `occ` permet d'installer Nextcloud sans passer par l'interface web. Remplacez toutes les variables `%...%` par vos propres paramètres :
```bash
cd /var/www/nextcloud
sudo -u www-data php occ maintenance:install \
--database "pgsql" \
--database-name "%DbName%" \
--database-user "%Username%" \
--database-pass "%Password%" \
--admin-user "%NextcloudAdminUserName%" \
--admin-pass "%NextcloudAdminPassword%" \
--data-dir "/opt/nextcloud/data" \
--verbose
```
> **⚠️ Dépannage :** Si l'installation échoue et que vous devez la relancer, supprimez d'abord le fichier de config généré partiellement, sinon Nextcloud refusera de réinstaller :
>
> ```bash
> sudo rm /var/www/nextcloud/config/config.php
> ```
---
## 7. Configuration du serveur Nginx
Créez le fichier de configuration et son lien symbolique :
```bash
sudo touch /etc/nginx/sites-available/nextcloud
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
```
Éditez le fichier (`sudo nano /etc/nginx/sites-available/nextcloud`) et insérez la configuration suivante. Ajustez `server_name` et la version du socket PHP-FPM selon votre système :
```nginx
server {
listen 80;
server_name %maybeyoursubdomain.yourdomain.topleveldomain%;
root /var/www/nextcloud/;
# En-têtes de sécurité
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Frame-Options "SAMEORIGIN";
access_log /var/log/nginx/nextcloud.access;
error_log /var/log/nginx/nextcloud.error;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Règles CardDAV / CalDAV / Webfinger
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/webfinger {
return 301 /index.php$uri;
}
location ~ /.well-known/acme-challenge {
allow all;
}
location ^~ /.well-known {
return 301 /index.php$uri;
}
# Taille maximale des fichiers téléversés
client_max_body_size 512M;
fastcgi_buffers 64 4K;
# Désactiver gzip (évite la suppression de l'en-tête ETag)
gzip off;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;
location / {
rewrite ^ /index.php;
}
# Interdire l'accès aux dossiers sensibles
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
deny all;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
deny all;
}
# Traitement PHP
location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
try_files $fastcgi_script_name =404;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
# Adaptez la version PHP si besoin (ex: php8.1-fpm.sock)
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_param PHP_VALUE "memory_limit = 2048M";
}
location ~ ^/(?:updater|ocs-provider)(?:$|/) {
try_files $uri/ =404;
index index.php;
}
# Cache des ressources statiques CSS / JS
location ~* \.(?:css|js)$ {
try_files $uri /index.php$uri$is_args$args;
add_header Cache-Control "public, max-age=7200";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Referrer-Policy no-referrer;
access_log off;
}
location ~* \.(?:svg|gif|png|html|ttf|woff|ico|jpg|jpeg)$ {
try_files $uri /index.php$uri$is_args$args;
access_log off;
}
}
```
Vérifiez la syntaxe et redémarrez Nginx :
```bash
sudo nginx -t
sudo systemctl restart nginx
```
---
## 8. Activation du HTTPS avec Certbot
```bash
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx
```
Suivez l'assistant : sélectionnez votre domaine et activez la redirection automatique HTTP → HTTPS. Certbot mettra à jour le fichier Nginx automatiquement.
---
## 9. Optimisation du fichier config.php
```bash
sudo nano /var/www/nextcloud/config/config.php
```
Voici un modèle propre et cohérent. Assurez-vous que `datadirectory` pointe bien vers `/opt/nextcloud/data` (défini à l'étape 5) :
```php
<?php
$CONFIG = array (
'passwordsalt' => 'un_sel_genere_automatiquement',
'secret' => 'un_secret_genere_automatiquement',
'instanceid' => 'un_id_genere_automatiquement',
'trusted_domains' => array (
0 => '%YOURSERVERIP%',
1 => '%maybeyoursubdomain.yourdomain.topleveldomain%',
),
// Base de données
'dbtype' => 'pgsql',
'dbname' => '%DBNAME%',
'dbhost' => 'localhost',
'dbport' => '',
'dbtableprefix' => 'oc_',
'dbuser' => '%DBUSER%',
'dbpassword' => '%DBUSERPASSWORD%',
// Chemins & URLs
'datadirectory' => '/opt/nextcloud/data',
'overwrite.cli.url' => 'https://%maybeyoursubdomain.yourdomain.topleveldomain%',
// Divers
'version' => '24.0.5.1',
'installed' => true,
'filelocking.enabled'=> true,
// Cache local (APCu)
'memcache.local' => '\\OC\\Memcache\\APCu',
// Cache distribué + verrouillage de fichiers (Redis)
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => array(
'host' => 'localhost',
'port' => 6379,
),
);
```
---
## 10. Configuration du CRON
Par défaut, Nextcloud utilise AJAX pour ses tâches de fond, ce qui ralentit la navigation. Le mode **Cron système** est fortement recommandé.
Éditez la crontab de `www-data` :
```bash
sudo crontab -u www-data -e
```
Ajoutez cette ligne pour exécuter `cron.php` toutes les 5 minutes :
```
*/5 * * * * php -f /var/www/nextcloud/cron.php
```
Ensuite, dans l'interface web Nextcloud : **Paramètres → Administration → Paramètres de base** → sélectionnez **Cron** (au lieu d'AJAX).
---
## 11. Importation de fichiers externes
Si vous transférez des fichiers directement dans `/opt/nextcloud/data/%user%/files/` via SCP, FTP ou tout autre protocole, Nextcloud ne les détectera pas automatiquement.
Forcez la réindexation avec `occ` :
```bash
cd /var/www/nextcloud
sudo -u www-data php occ files:scan --all
```
---
## 12. Conseils et bonnes pratiques
**Séparation des privilèges**
Ne jamais utiliser le compte administrateur créé lors de l'installation pour les usages quotidiens. Connectez-vous une première fois pour configurer les applications, puis créez un compte utilisateur standard dédié.
**Réparer une installation bancale**
En cas d'anomalie ou de mise à jour partielle, lancez l'outil de vérification interne :
```bash
sudo -u www-data php occ maintenance:repair
```
**Adapter la version PHP**
Ce guide utilise PHP 7.4. Si vous utilisez PHP 8.x, remplacez toutes les occurrences de `php7.4-fpm` par la version correspondante (ex: `php8.1-fpm`).
---
*Bonne installation, et profitez bien de votre cloud personnel !*