# 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 !*