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
  2. Installation des prérequis et modules PHP
  3. Mise en place des fichiers de Nextcloud
  4. Création de la base de données PostgreSQL
  5. Création du répertoire de données
  6. Installation via OCC (ligne de commande)
  7. Configuration du serveur Nginx
  8. Activation du HTTPS avec Certbot
  9. Optimisation du fichier config.php
  10. Configuration du CRON
  11. Importation de fichiers externes
  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 :

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

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 :

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

# 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

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 :

sudo -u postgres psql

Puis exécutez les requêtes suivantes (remplacez %DbName%, %Username% et %Password% par vos propres valeurs) :

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é

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.

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

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 :

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 :

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 :

sudo nginx -t
sudo systemctl restart nginx

8. Activation du HTTPS avec Certbot

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

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

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 :

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 :

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 !