Nextcloud

Ubuntu 20.04 – Installation de Nextcloud 19 (Nginx, PHP7-FPM, MariaDB et SSL/TLS)

Nextcloud est un fork du célèbre ownCloud, solution vous permettant de créer votre propre cloud auto-hébergé et ainsi de stocker et synchroniser vos fichiers, vos contacts, votre agenda et vos contenus multimédias directement sur votre serveur. Vous pourrez alors accéder à toutes ces informations directement depuis votre navigateur web ou votre mobile via une application dédiée.

Fin avril 2016, Frank Karlitschek, cofondateur de ownCloud Inc, a annoncé son départ de la société, en mettant en cause, des dissensions internes, liées en partie à la stratégie de la société, mais également à la double licence du projet, qui ne favorise guère la participation de la communauté.

Frank Karlitschek et Niels Mache, patron de Struktur AG (connu pour l’offre collaborative Spreed.ME), rebootent aujourd’hui cette initiative sous la forme d’une nouvelle société et d’un nouveau projet : Nextcloud.

Ce fork d’ownCloud s’intégrera avec la plate-forme Spreeautd.ME et proposera un modèle plus ouvert pour la communauté. Les contrats de licence imposés aux contributeurs seront éliminés de cette nouvelle initiative, qui se veut plus transparente vis-à-vis du monde Open Source. L’objectif est de rééquilibrer la balance entre communauté et aspects commerciaux.

Nextcloud

Les principales fonctionnalités de Nextcloud sont :

  • Synchronisation de fichiers entre différents ordinateurs (clients dédiés multi-plateformes)
  • Stockage sécurisé (chiffrage des fichiers) et ajout de services externes (Amazon, Google, Dropbox, NFS, FTP, SFTP, WebDAV…)
  • Authentification LDAP/Active Directory, Kerberos et Shibboleth/SAML 2.0
  • Partage de fichiers entre utilisateurs ou publiquement
  • Éditeur de documents en ligne avec la suite Collabora Online (basée sur OpenOffice)
  • Visionneuse de documents en ligne (PDF, Open document…)
  • Gestion de différents workflows
  • Calendrier (CalDAV) et gestionnaire de contacts (CardDAV)
  • Conférences audio et vidéo sécurisées (WebRTC) avec possibilité de partage d’écran
  • Galerie d’images
  • … et de nombreuses fonctionnalités supplémentaires grâce aux applications Nextcloud.

Nextcloud peut être installé sur n’importe quel serveur supportant une version récente de PHP et supportant MariaDB (base de données par défaut), MySQL ou PostgreSQL.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 20.04. Si vous disposez d’une version antérieure, vous pouvez mettre à jour votre système en suivant cette procédure.
  • Votre utilisateur doit avoir accès à sudo.

2 – Nginx

Notre choix se portera sur le serveur HTTP Nginx pour une question de performances. Nginx est reconnu pour ses hautes performances, sa stabilité, son ensemble de fonctionnalités, sa configuration simple ainsi que sa faible consommation en ressources.

2.1 – Installation

Installez le paquet nginx :

sudo apt-get -y install nginx

2.2 – Configuration

Modifiez les directives suivantes du fichier de configuration Nginx /etc/nginx/nginx.conf :

user www-data;
worker_processes 8;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    # multi_accept on;                                                                                                                                                                                                                   
}

http {

    ##                                                                                                                                                                                                                                   
    # Basic Settings                                                                                                                                                                                                                     
    ##                                                                                                                                                                                                                                   

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    server_tokens off;                                                                                                                                                                                                                 

    # server_names_hash_bucket_size 64;                                                                                                                                                                                                  
    # server_name_in_redirect off;                                                                                                                                                                                                       

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

...
  • worker_processes : pour profiter pleinement de la puissance de votre serveur, il est recommandé de mettre autant de worker_processes que de cœurs disponibles sur votre serveur. Pour connaître le nombre de cœurs sur votre serveur, il suffit de lancer la commande :

    grep processor /proc/cpuinfo | wc -l
    8
  • server_tokens : pour des raisons de sécurité, il est recommandé de désactiver l’envoi d’informations telles que le numéro de version de votre Nginx. Pour cela, décommentez cette directive dans le bloc http.

3 – Installation et téléchargement de Nextcloud

  • Téléchargez la dernière version de Nextcloud :

    cd /var/www
    sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2
  • Téléchargez le SHA256 :

    sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2.sha256
  • Vérifiez l’intégrité de l’archive téléchargée :

    sha256sum -c latest.tar.bz2.sha256 < latest.tar.bz2
    latest.tar.bz2: OK
  • Vérifiez la signature PGP et la provenance de l’archive téléchargée :

    sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2.asc
    sudo wget https://nextcloud.com/nextcloud.asc
    gpg --import nextcloud.asc
    gpg --verify latest.tar.bz2.asc latest.tar.bz2

    La dernière commande doit retourner sur la sortie standard :

    gpg: Signature made Wed 18 Mar 2020 03:28:40 PM CEST
    gpg:                using RSA key ************
    gpg: Good signature from "Nextcloud Security <security@nextcloud.com>" [unknown]
    gpg: WARNING: This key is not certified with a trusted signature!
    gpg:          There is no indication that the signature belongs to the owner.
    Primary key fingerprint: **** **** **** **** **** **** **** **** **** ****
  • Décompressez l’archive Nextcloud :

    sudo tar -xvf latest.tar.bz2
  • Supprimez les fichiers et signatures téléchargés :

    sudo rm latest.tar.bz2* nextcloud.asc

4 – Droits Unix

Lors du déploiement basique d’un serveur HTTP, l’utilisateur sous lequel fonctionne ce serveur (Apache, Nginx…) est la plupart du temps www-data, nobody ou apache. Cela signifie que si plusieurs sites existent sous la même instance de Nginx, tous utilisent le même utilisateur. Or si l’un des sites s’avère corrompu par un utilisateur malveillant alors l’assaillant peut profiter pleinement de tous les droits de l’utilisateur sous lequel tourne le serveur web. Tous les sites s’avèrent donc vulnérables.

Pour des raisons évidentes de sécurité, il est donc recommandé de cloisonner ces utilisateurs et d’avoir un utilisateur dédié à la gestion du dossier nextcloud. Cet utilisateur aura des droits aussi restreints que possible à ce répertoire.

Par défaut, les fichiers de Nextcloud possèdent les permissions suivantes :

  • répertoires : 755 (permission de lecture, d’écriture et d’exécution pour le propriétaire et permission de lecture et d’exécution pour le groupe et les autres)
  • fichiers : 644 (permission de lecture et d’écriture pour le propriétaire et permission de lecture uniquement pour le groupe et les autres).

Nous allons donc modifier le propriétaire du répertoire /var/www/nextcloud et l’attribuer à un nouvel utilisateur dédié : nextcloud.

Par ailleurs, Nginx est lancé sous l’utilisateur www-data et doit avoir accès en lecture au répertoire /var/www/nextcloud pour lire les ressources statiques (HTML, CSS, JS, etc.). Nous allons donc attribuer le répertoire /var/www/nextcloud au groupe www-data.

Enfin nous retirerons toutes les permissions de ce répertoire aux autres utilisateurs.

  • Créez un utilisateur nextcloud :

    sudo adduser nextcloud
  • Modifiez le propriétaire et le groupe du répertoire /var/www/nextcloud :

    sudo chown -R nextcloud:www-data /var/www/nextcloud
  • Retirez toutes les permissions aux autres utilisateurs :

    sudo chmod -R o-rwx /var/www/nextcloud

5 – Les modules PHP

Nextcloud nécessite certains modules PHP pour fonctionner :

  • Modules obligatoires :
    • PHP ctype
    • PHP dom
    • PHP GD
    • PHP iconv
    • PHP JSON
    • PHP libxml (version égale ou supérieure à 2.7.0)
    • PHP mb multibyte
    • PHP posix
    • PHP SimpleXML
    • PHP XMLWriter
    • PHP zip
    • PHP zlib
    • PHP bcmath
    • PHP gmp
    • PHP pdo_mysql (connecteur pour MySQL/MariaDB)
  • Modules hautement recommandés :
    • PHP curl : nécessaire pour certaines fonctionnalités de Nextcloud comme l’authentification HTTP
    • PHP fileinfo : améliore les performances d’analyse des fichiers
    • PHP bz2 : nécessaire pour l’installation et l’extraction des applications Nextcloud
    • PHP intl : améliore les performances sur l’internationalisation et les opérations sur caractères non ASCII
    • PHP openssl : nécessaire pour accéder aux ressources HTTPS.

Installez les paquets suivants :

sudo apt-get -y install php-cli php-json php-curl php-imap php-gd php-mysql php-xml php-zip php-intl php-imagick php-mbstring php-bcmath php-gmp
Vous devez disposer d’une version de PHP égale ou supérieure à 7.2.

Pour connaître la version installée sur votre système, tapez la commande suivante :

php -v

6 – PHP-FPM

Le module PHP-FPM permet la communication entre le serveur Nginx et PHP, basée sur le protocole FastCGI. Ce module, écoutant sur le port 9000 par défaut ou sur un socket UNIX, permet notamment l’exécution de scripts PHP dans un processus indépendant de Nginx avec des UID et GID différents. Il sera alors possible, dans le cas de la gestion de plusieurs applications sur un même serveur, de créer et configurer un groupe (appelé aussi pool) par application. Un pool définit notamment le UID/GID des processus PHP et le nombre de processus minimum, maximum ou encore le nombre de processus en attente à lancer.

6.1 – Installation

Installez le paquet php-fpm :

sudo apt-get install -y php-fpm

6.2 – Création du pool nextcloud

Créez le pool dédié à Nextcloud en créant le fichier de configuration suivant : /etc/php/7.4/fpm/pool.d/nextcloud.conf

[nextcloud]
listen = /var/run/nextcloud.sock

listen.owner = nextcloud
listen.group = www-data

user = nextcloud
group = www-data

pm = ondemand
pm.max_children = 30
pm.process_idle_timeout = 60s
pm.max_requests = 500

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Certaines valeurs sont très arbitraires et seront, en fonction des ressources disponibles sur votre serveur et celles que vous souhaiterez dédier à votre Nextcloud, différentes d’une configuration à l’autre. Cependant ces différentes directives respectent certaines conditions :

  • [nextcloud] : nom du pool. Il est possible de créer plusieurs pools par fichier. Chaque pool doit commencer par cette directive.
  • listen : interface d’écoute des requêtes. Les syntaxes acceptées sont ADRESSE_IP:PORT (exemple : listen = 127.0.0.1:9000) et /path/to/unix/socket (exemple : listen = /var/run/nextcloud.sock). Le socket est représenté comme un simple fichier sur le système et permet d’interfacer des processus entre eux sans passer par la couche réseau du système, ce qui est inutile lorsque Nginx et PHP-FPM sont hébergés sur le même serveur. Je vous conseille donc d’utiliser un socket.
  • listen.owner & listen.group : affecte l’utilisateur et le groupe au socket Unix si utilisé. Ces deux paramètres peuvent être associés au paramètre listen.mode qui définit les permissions du socket (660 par défaut). Il est important que Nginx ait les droits de lecture sur le socket Unix.
  • user & group : utilisateur et groupe sous lesquels le pool de processus sera exécuté. Cet utilisateur et ce groupe doivent bien sûr exister sur votre système et surtout accéder aux fichiers PHP de votre Nextcloud. Cela veut dire aussi que chaque fichier et répertoire créé dans Nextcloud appartiendra à cet utilisateur et à ce groupe. Comme nous l’avons vu dans le chapitre dédié aux droits Unix, chaque fichier devra appartenir à l’utilisateur nextcloud et au groupe www-data.
  • pm : directive acceptant les 3 valeurs suivantes : static, dynamic et ondemand.
    • static : les processus, au nombre de pm.max_children, sont continuellement actifs (quelle que soit la charge et l’affluence de votre Nextcloud) et sont susceptibles de consommer de la mémoire inutilement. Cette directive est recommandée si Nextcloud est l’unique application de votre serveur.
    • dynamic : le nombre de processus fils pourra varier suivant la charge. Cependant, nous gardons le contrôle sur le nombre de processus fils à créer au démarrage du serveur, le nombre de processus maximum, en attente de requêtes, etc. Les directives suivantes deviennent obligatoires : pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers. Cette directive est recommandée si vous avez plusieurs pools avec un fort trafic (plus de 10 000 requêtes/jour).
    • ondemand : aucun processus fils n’est lancé au démarrage du serveur, les processus s’activent à la demande et auront une durée de vie définie par la directive pm.process_idle_timeout. L’intérêt de cette directive est de libérer de la mémoire en cas de faible charge mais celle-ci peut légèrement augmenter le temps de réponse de votre Nextcloud. Cette directive est recommandée si vous avez plusieurs pools avec potentiellement une faible affluence.

    Sachant que l’utilisation de Nextcloud est personnelle et souvent limitée à quelques utilisateurs, nous choisirons et détaillerons ici la directive ondemand.

  • pm.max_children : nombre maximum de processus fils. La valeur du paramètre pm.max_children varie d’un système à l’autre. Voici la procédure à réaliser pour déterminer la valeur de ce paramètre :
    1. Arrêtez le service php-fpm :

      sudo systemctl stop php7.4-fpm.service
    2. Affichez la mémoire disponible (colonne available) sur votre système :

      free -m
                    total        used        free      shared  buff/cache   available
      Mem:           3913          58        2532          39        1322        3539
      Swap:          1048           0        1048

      Sur cet exemple, le système dispose de 3539Mo de RAM disponible. La quantité de RAM que vous souhaitez allouer au maximum à Nextcloud dépend de vous et des autres services actifs que vous disposez sur ce même système. Dans notre exemple, nous partirons du principe que nous souhaitons allouer au maximum 1024Mo de RAM à Nextcloud.

    3. Affichez la mémoire utilisée par un processus fils php-fpm :

      sudo systemctl start php7.4-fpm.service && ps --no-headers -o "rss,cmd" -C php-fpm7.4 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
      18M
    4. Déterminez le nombre de pm.max_children en appliquant la méthode de calcul suivante :

      pm.max_children = mémoire allouée (en Mo) / mémoire utilisée par un processus fils
      Dans notre exemple : 1024 / 18 = 56

    5. Éditez à nouveau le fichier /etc/php/7.4/fpm/pool.d/nextcloud.conf et ajustez la valeur du paramètre pm.max_children :

      [nextcloud]
      listen = /var/run/nextcloud.sock
      
      listen.owner = nextcloud
      listen.group = www-data
      
      user = nextcloud
      group = www-data
      
      pm = ondemand
      pm.max_children = 56
      pm.process_idle_timeout = 60s
      pm.max_requests = 500
      
      env[HOSTNAME] = $HOSTNAME
      env[PATH] = /usr/local/bin:/usr/bin:/bin
      env[TMP] = /tmp
      env[TMPDIR] = /tmp
      env[TEMP] = /tmp
  • pm.process_idle_timeout : durée en secondes avant qu’un processus fils inactif soit détruit.
  • pm.max_requests : nombre de requêtes que chaque processus fils devra exécuter avant d’être détruit. Cette valeur ne doit pas être trop élevée afin de contourner d’éventuelles fuites mémoires, ni trop faible pour ne pas solliciter régulièrement le CPU à chaque création de processus fils. 500 reste une valeur recommandée.
  • env[*] : variables d’environnement nécessaires à PHP-FPM.

Redémarrez le service php-fpm afin d’activer le nouveau pool nextcloud :

sudo systemctl start php7.4-fpm.service

6.3 – Configuration du service php-fpm

Enfin, il est nécessaire de spécifier à PHP-FPM les permissions de chaque fichier ou répertoire nouvellement créé dans votre Nextcloud et ainsi respecter les permissions que nous avions spécifiées dans le chapitre des droits Unix. Pour cela :

  • Tapez la commande suivante :

    sudo systemctl edit php7.4-fpm.service

    Il se peut que l’éditeur de texte par défaut de votre système ne soit pas celui que vous avez l’habitude d’utiliser. Si c’est le cas, tapez la commande suivante et choisissez l’éditeur par défaut de votre système :

    sudo update-alternatives --config editor
  • Ajoutez les lignes suivantes :

    [Service]
    UMask=0027
  • Réactivez le service php7.4-fpm :

    sudo systemctl reenable php7.4-fpm.service

7 – Création de la base de données sous MariaDB

7.1 – Installation de MariaDB

Installez les paquets suivants :

sudo apt-get install -y mariadb-server mariadb-client

7.2 – Configuration de MariaDB

Lancez le script de configuration (recommandé) avec la commande sudo mysql_secure_installation :

sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): [Touche Entrée]
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

7.3 – Création de la base de données nextcloud

  • Tout d’abord, connectez-vous sur l’interface MySQL avec l’utilisateur root et grâce au mot de passe saisi lors de la configuration de MariaDB :

    sudo mysql -u root -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 42
    Server version: 10.3.22-MariaDB-1ubuntu1 Ubuntu 20.04
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  • Créez la base de données nextcloud :

    CREATE DATABASE nextcloud;
    Query OK, 1 row affected (0.00 sec)

    Tout comme pour la gestion du répertoire nextcloud et pour plus de sécurité, vous allez tout d’abord créer un utilisateur MySQL nextcloud dédié à la base de données nextcloud, renseigner un mot de passe et ensuite lui donner les droits sur cette base de données. Exécutez les commandes suivantes en remplaçant mon_mot_de_passe par le vôtre (attention deux commandes sont à modifier) :

    CREATE USER "nextcloud"@"localhost";
    Query OK, 0 rows affected (0.00 sec)
    
    SET password FOR "nextcloud"@"localhost" = password('mon_mot_de_passe');
    Query OK, 0 rows affected (0.00 sec)
    
    GRANT ALL PRIVILEGES ON nextcloud.* TO "nextcloud"@"localhost" IDENTIFIED BY "mon_mot_de_passe";
    Query OK, 0 rows affected (0.00 sec)
    
    FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    
    EXIT;
    Bye

8 – Nom de domaine & virtual host

Si vous souhaitez accéder à votre Nextcloud de l’extérieur (et non seulement via localhost), il est nécessaire de faire pointer votre domaine ou sous-domaine vers l’IP de votre serveur. Pour cela, commencez par modifier les règles DNS dans l’interface administrateur du fournisseur de votre nom de domaine.

  • Créez le fichier suivant /etc/nginx/sites-available/nextcloud et modifiez les lignes en surbrillance en fonction de votre configuration :

    upstream php-handler {
        server                        unix:/var/run/nextcloud.sock;
    }
    
    server {
        listen                        80;
        listen                        [::]:80;
        server_name                   cloud.mondomaine.com;
    
        # Path to the root of your installation
        root                          /var/www/nextcloud/;
    
        # Add headers to serve security related headers
        add_header                    X-Frame-Options "SAMEORIGIN";
        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                    Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
        add_header                    Referrer-Policy no-referrer always;
    
        location = /robots.txt {
            allow                     all;
            log_not_found             off;
            access_log                off;
        }
    
        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;
    
        location / {
            rewrite                   ^ /index.php$uri;
        }
    
        location ~ ^/.well-known/acme-challenge/* {
            allow                     all;
        }
    
        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/.+|ocs-provider/.+).php(?:$|/) {
            fastcgi_split_path_info   ^(.+.php)(/.*)$;
            include                   fastcgi_params;
            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;
            fastcgi_pass              php-handler;
            fastcgi_intercept_errors  on;
            fastcgi_request_buffering off;
        }
    
        location ~ ^/(?:updater|ocs-provider)(?:$|/) {
            try_files                 $uri/ =404;
            index                     index.php;
        }
    
        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~* .(?:css|js|woff|svg|gif)$ {
            try_files                 $uri /index.php$uri$is_args$args;
            add_header                Cache-Control "public, max-age=15778463";
            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;
            # Optional: Don't log access to assets
            access_log                off;
        }
    
        location ~* .(?:png|html|ttf|ico|jpg|jpeg)$ {
            try_files                 $uri /index.php$uri$is_args$args;
            # Optional: Don't log access to other assets
            access_log                off;
        }
    }
  • Activez le virtual host :

    sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/nextcloud
  • La nouvelle configuration sera prise en compte après redémarrage des services Nginx et PHP-FPM :

    sudo systemctl restart nginx.service
    sudo systemctl restart php7.4-fpm.service

9 – SSL/TLS avec Let’s Encrypt

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte. Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. Depuis sa création, Let’s Encrypt a livré plus de 100 millions de certificats.

9.1 – Installation

Installez les paquets software-properties-common et certbot :

sudo apt-get install -y software-properties-common
sudo apt-get install -y certbot

9.2 – Génération des certificats

Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins Apache et Nginx entièrement automatisés. Ces plugins mettent à jour automatiquement la configuration des virtual hosts mais le plugin Nginx est encore expérimental. Dans cet article, nous recommandons d’utiliser le plugin webroot pour Nginx qui permet de générer et renouveler son certificat sans interrompre le serveur Nginx.

Le plugin webroot crée un fichier temporaire /var/www/nextcloud/.well-known/acme-challenge dans le dossier racine de votre Nextcloud, celui-ci permettra aux serveurs de Let’s Encrypt de valider votre certificat en appelant ce fichier temporaire.

  • Générez votre certificat en remplaçant email@mondomaine.com et cloud.mondomaine.com par vos informations personnelles :

    sudo certbot certonly --webroot -w /var/www/nextcloud --agree-tos --no-eff-email --email email@mondomaine.com -d cloud.mondomaine.com --rsa-key-size 4096
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Plugins selected: Authenticator webroot, Installer None
    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for cloud.mondomaine.com
    Using the webroot path /var/www/nextcloud for all unmatched domains.
    Waiting for verification...
    Cleaning up challenges
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/cloud.mondomaine.com/fullchain.pem.
       Your key file has been saved at:
       /etc/letsencrypt/live/cloud.mondomaine.com/privkey.pem
       Your cert will expire on 20XX-XX-XX. To obtain a new or tweaked
       version of this certificate in the future, simply run certbot
       again. To non-interactively renew *all* of your certificates, run "certbot
       renew"
     - Your account credentials have been saved in your Certbot
       configuration directory at /etc/letsencrypt. You should make a
       secure backup of this folder now. This configuration directory will
       also contain certificates and private keys obtained by Certbot so
       making regular backups of this folder is ideal.
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/cloud.mondomaine.com :

    • cert.pem : le certificat de votre domaine cloud.mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • SSL/TLS utilise un système de chiffrement asymétrique (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS.Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions. La première commande peut prendre plusieurs heures :

    sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
    sudo chmod 600 /etc/ssl/certs/dhparam.pem
  • Ajoutez ou modifiez les lignes en surbrillance dans votre virtual host (/etc/nginx/sites-available/nextcloud) en remplaçant les chemins des directives ssl_certificate, ssl_certificate_key, ssl_trusted_certificate et ssl_dhparam par l’emplacement de vos certificats et de la clé DH précédemment générés :

    upstream php-handler {
        server                        unix:/var/run/nextcloud.sock;
    }
    
    server {
        listen                        80;
        listen                        [::]:80;
        server_name                   cloud.mondomaine.com;
        return                        301 https://$server_name$request_uri;
    }
    
    server {
        listen                        443 ssl;
        listen                        [::]:443 ssl;
        server_name                   cloud.mondomaine.com;
    
        # Path to the root of your installation
        root                          /var/www/nextcloud/;
    
        ssl                           on;
        ssl_certificate               /etc/letsencrypt/live/cloud.mondomaine.com/fullchain.pem;
        ssl_certificate_key           /etc/letsencrypt/live/cloud.mondomaine.com/privkey.pem;
        ssl_trusted_certificate       /etc/letsencrypt/live/cloud.mondomaine.com/chain.pem;
        ssl_dhparam                   /etc/ssl/certs/dhparam.pem;
    
        ssl_session_cache             shared:SSL:1m;
        ssl_session_timeout           1440m;
        ssl_buffer_size               8k;
        ssl_protocols                 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers                   TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers     on;
        ssl_stapling                  on;
        ssl_stapling_verify           on;
    
        # Add headers to serve security related headers
        add_header                    X-Frame-Options "SAMEORIGIN";
        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                    Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
        add_header                    Referrer-Policy no-referrer always;
    
        location = /robots.txt {
            allow                     all;
            log_not_found             off;
            access_log                off;
        }
    
        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;
    
        location / {
            rewrite                   ^ /index.php$uri;
        }
    
        location ~ ^/.well-known/acme-challenge/* {
            allow                     all;
        }
    
        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/.+|ocs-provider/.+).php(?:$|/) {
            fastcgi_split_path_info   ^(.+.php)(/.*)$;
            include                   fastcgi_params;
            fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param             PATH_INFO $fastcgi_path_info;
            fastcgi_param             HTTPS on;
            #Avoid sending the security headers twice
            fastcgi_param             modHeadersAvailable true;
            fastcgi_param             front_controller_active true;
            fastcgi_pass              php-handler;
            fastcgi_intercept_errors  on;
            fastcgi_request_buffering off;
        }
    
        location ~ ^/(?:updater|ocs-provider)(?:$|/) {
            try_files                 $uri/ =404;
            index                     index.php;
        }
    
        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~* .(?:css|js|woff|svg|gif)$ {
            try_files                 $uri /index.php$uri$is_args$args;
            add_header                Cache-Control "public, max-age=15778463";
            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;
            # Optional: Don't log access to assets
            access_log                off;
        }
    
        location ~* .(?:png|html|ttf|ico|jpg|jpeg)$ {
            try_files                 $uri /index.php$uri$is_args$args;
            # Optional: Don't log access to other assets
            access_log                off;
        }
    }
  • Rechargez votre configuration Nginx :

    sudo systemctl reload nginx.service

9.3 – Renouvellement automatique du certificat

Les certificats délivrés par Let’s Encrypt sont valides 90 jours. Une tâche planifiée permettant de renouveler l’ensemble des certificats présents sur votre serveur est fournie avec le paquet certbot. Celle-ci est exécutée deux fois par jour et les renouvelle si et seulement si vos certificats expirent dans un délai inférieur à 30 jours.

  • Testez si le renouvellement automatique est fonctionnel avec la commande suivante :

    sudo certbot renew --dry-run

10 – HTTP2

Je vous conseille vivement d’activer le nouveau protocole HTTP2 qui augmentera la sécurité et la rapidité de votre Nextcloud.

HTTP2 permet notamment :

  • la compression des headers des requêtes et des réponses qui permet de réduire la bande passante lorsque les headers (comme les cookies) sont similaires
  • le multiplexage des requêtes au serveur consistant à faire passer de multiples informations via un seul tuyau de transmission. Ainsi, on économise les multiples connexions entre le client et le serveur. Les requêtes, quant à elles, sont effectuées simultanément par le navigateur. Les requêtes ne se suivent donc plus les unes derrière les autres (HTTP1) et les plus prioritaires (CSS par exemple) ne sont plus bloquées par les moins prioritaires (images par exemple)
  • le push des ressources du serveur au navigateur. Désormais, le serveur pourra envoyer l’ensemble des ressources référencées dans une même page (CSS, JS…), avant même que le navigateur n’ait analysé celle-ci.

L’activation du protocole HTTP2 est très simple et consiste en l’ajout de la directive http2 dans votre virtual host :

upstream php-handler {
    server                        unix:/var/run/nextcloud.sock;
}

server {
    listen                        80;
    listen                        [::]:80;
    server_name                   cloud.mondomaine.com;
    return                        301 https://$server_name$request_uri;
}

server {
    listen                        443 ssl http2;
    listen                        [::]:443 ssl http2;
    server_name                   cloud.mondomaine.com;

    # Path to the root of your installation
    root                          /var/www/nextcloud/;

...

Une fois la modification effectuée, n’oubliez pas de recharger votre configuration Nginx :

sudo systemctl reload nginx.service

11 – Nextcloud

Vous risquez d’obtenir un timeout lors du premier lancement de Nextcloud dans votre navigateur (dû aux processus en arrière-plan permettant la création du filesystem pour votre utilisateur, la création du schéma de la base données Nextcloud, etc.). Il est donc nécessaire d’augmenter le temps de réponse dans la configuration de PHP-FPM et Nginx.

  • Éditez le fichier /etc/php/7.4/fpm/pool.d/nextcloud.conf et ajoutant le paramètre request_terminate_timeout (valeur en secondes) :

    [nextcloud]
    listen = /var/run/nextcloud.sock
    
    listen.owner = nextcloud
    listen.group = www-data
    
    user = nextcloud
    group = www-data
    
    pm = ondemand
    pm.max_children = 56
    pm.process_idle_timeout = 60s
    pm.max_requests = 500
    
    env[HOSTNAME] = $HOSTNAME
    env[PATH] = /usr/local/bin:/usr/bin:/bin
    env[TMP] = /tmp
    env[TMPDIR] = /tmp
    env[TEMP] = /tmp
    
    request_terminate_timeout = 300
    
  • Éditez le virtual host /etc/nginx/sites-available/nextcloud et ajoutant le paramètre fastcgi_read_timeout (valeur en secondes) :

    upstream php-handler {
        server                        unix:/var/run/nextcloud.sock;
    }
    
    server {
        listen                        80;
        listen                        [::]:80;
        server_name                   cloud.mondomaine.com;
        return                        301 https://$server_name$request_uri;
    }
    
    server {
        listen                        443 ssl http2;
        listen                        [::]:443 ssl http2;
        server_name                   cloud.mondomaine.com;
    
        # Path to the root of your installation
        root                          /var/www/nextcloud/;
    
        ssl                           on;
        ssl_certificate               /etc/letsencrypt/live/cloud.mondomaine.com/fullchain.pem;
        ssl_certificate_key           /etc/letsencrypt/live/cloud.mondomaine.com/privkey.pem;
        ssl_trusted_certificate       /etc/letsencrypt/live/cloud.mondomaine.com/chain.pem;
        ssl_dhparam                   /etc/ssl/certs/dhparam.pem;
    
        ssl_session_cache             shared:SSL:1m;
        ssl_session_timeout           1440m;
        ssl_buffer_size               8k;
        ssl_protocols                 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers                   TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers     on;
        ssl_stapling                  on;
        ssl_stapling_verify           on;
    
        # Add headers to serve security related headers
        add_header                    X-Frame-Options "SAMEORIGIN";
        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                    Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
        add_header                    Referrer-Policy no-referrer always;
    
        location = /robots.txt {
            allow                     all;
            log_not_found             off;
            access_log                off;
        }
    
        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;
    
        location / {
            rewrite                   ^ /index.php$uri;
        }
    
        location ~ ^/.well-known/acme-challenge/* {
            allow                     all;
        }
    
        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/.+|ocs-provider/.+).php(?:$|/) {
            fastcgi_split_path_info   ^(.+.php)(/.*)$;
            include                   fastcgi_params;
            fastcgi_param             SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param             PATH_INFO $fastcgi_path_info;
            fastcgi_param             HTTPS on;
            #Avoid sending the security headers twice
            fastcgi_param             modHeadersAvailable true;
            fastcgi_param             front_controller_active true;
            fastcgi_pass              php-handler;
            fastcgi_intercept_errors  on;
            fastcgi_request_buffering off;
            fastcgi_read_timeout      300;
        }
    
        location ~ ^/(?:updater|ocs-provider)(?:$|/) {
            try_files                 $uri/ =404;
            index                     index.php;
        }
    
        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~* .(?:css|js|woff|svg|gif)$ {
            try_files                 $uri /index.php$uri$is_args$args;
        add_header                Cache-Control "public, max-age=15778463";
            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;
            # Optional: Don't log access to assets
            access_log                off;
        }
    
        location ~* .(?:png|html|ttf|ico|jpg|jpeg)$ {
            try_files                 $uri /index.php$uri$is_args$args;
            # Optional: Don't log access to other assets
            access_log                off;
        }
    }

La nouvelle configuration sera prise en compte après redémarrage des services Nginx et PHP-FPM :

sudo systemctl restart nginx.service
sudo systemctl restart php7.4-fpm.service

Lancez votre navigateur et rendez-vous à l’adresse suivante : http://cloud.mondomaine.com/.

Configurez votre compte administrateur et les informations de votre base de données nécessaires à Nextcloud :

blank

Vérifiez la force de votre protocole SSL/TLS en vérifiant votre Nextcloud sur SSL Labs. Avec une telle configuration, vous devriez obtenir un A+.

12 – Améliorer les performances de votre Nextcloud avec le cache

12.1 – Cache PHP : OPcache

OPcache (qui signifie Optimizer Plus Cache) est introduit depuis la version 5.5.0 de PHP. Il sert à cacher l'opcode de PHP, c’est-à-dire les instructions de bas niveau générées par la machine virtuelle PHP lors de l’exécution d’un script. Autrement dit, le code pré-compilé est stocké en mémoire.

La suite est réservée aux membres. Déjà membre ? Se connecter

Accédez à l'intégralité des contenus de HowTo Wared en illimité.

Soutenez la publication de tutoriels et une rédaction indépendante.

Obtenez des réductions (VPN, plugins Nextcloud, Wordpress, ...)

12.2 – Cache de données : APCu & Redis

APCu permet notamment de mettre en cache les variables PHP et de les stocker en mémoire vive. Redis est un système de gestion de base de données NoSQL avec un système de clef-valeur scalable (s'adapte à la charge). Une des principales caractéristiques de Redis est de conserver l'intégralité des données

La suite est réservée aux membres. Déjà membre ? Se connecter

Accédez à l'intégralité des contenus de HowTo Wared en illimité.

Soutenez la publication de tutoriels et une rédaction indépendante.

Obtenez des réductions (VPN, plugins Nextcloud, Wordpress, ...)

13 – Améliorer la sécurité de votre Nextcloud

Développé en langage Python, Fail2Ban est un outil permettant d'analyser des fichiers de logs et de déclencher des actions si certaines choses suspectes sont détectées. Fail2ban est capable de détecter des connexions non autorisées et de bannir (via iptables) l'adresse IP de l'attaquant

La suite est réservée aux membres. Déjà membre ? Se connecter

Accédez à l'intégralité des contenus de HowTo Wared en illimité.

Soutenez la publication de tutoriels et une rédaction indépendante.

Obtenez des réductions (VPN, plugins Nextcloud, Wordpress, ...)

14 – Suivre les recommandations de Nextcloud

Votre instance Nextcloud effectue automatiquement des vérifications sur la sécurité et la configuration. Il est possible de consulter les avertissements liés à votre configuration dans les paramètres de votre Nextcloud (Administration → Vue d’ensemble) :

blank

14.1 – Augmenter la mémoire PHP

  • Éditez le fichier /etc/php/7.4/fpm/php.ini et modifiez la valeur de la variable memory_limit :

    memory_limit=512M
  • Redémarrez le service php-fpm :

    sudo systemctl restart php7.4-fpm.service

14.2 – Création d’index supplémentaires

Cette opération permet d’améliorer la vitesse des requêtes SQL et par conséquent la navigation, l’affichage et la recherche de vos fichiers.

  • Connectez-vous sous l’utilisateur nextcloud et placez-vous à la racine du répertoire de Nextcloud :

    su nextcloud
    cd /var/www/nextcloud
  • Lancez une nouvelle indexation :

    php occ db:add-missing-indices

14.3 – Modification du type de données dans les tables Nextcloud

Certaines colonnes de la base de données n’ont pas été converties automatiquement en big int. Il est nécessaire de réaliser cette opération manuellement.

  • Toujours connecté avec l’utilisateur nextcloud et dans le répertoire /var/www/nextcloud, lancez la conversion :

    php occ db:convert-filecache-bigint

Vous pouvez maintenant recharger la page et constater que la sécurité et la configuration suivent désormais les recommandations officielles :

blank

15 – Accéder à votre Nextcloud à partir de votre réseau local

Si votre Nextcloud est hébergé chez vous, l’accès à votre cloud via votre réseau local peut être intéressant. Nous allons créer un nom de domaine accessible uniquement à partir de votre réseau local.

  • Ajoutez un nom de domaine dans le fichier /etc/hosts pointant vers votre réseau local (127.0.0.1) :

    127.0.0.1   localhost
    127.0.0.1   cloud.local
    
  • Ajoutez le nom de domaine dans le virtual host de votre Nextcloud (/etc/nginx/sites-available/nextcloud) :

    upstream php-handler {
        server                        unix:/var/run/nextcloud.sock;
    }
    
    server {
        listen                        80;
        listen                        [::]:80;
        server_name                   cloud.mondomaine.com cloud.local;
        return                        301 https://$server_name$request_uri;
    }
    
    server {
        listen                        443 ssl http2;
        listen                        [::]:443 ssl http2;
        server_name                   cloud.mondomaine.com cloud.local;
    
        ...
  • Rechargez la configuration Nginx :

    sudo systemctl reload nginx.service
  • Connectez-vous sous l’utilisateur nextcloud afin de pouvoir modifier le fichier de configuration de votre Nextcloud :

    su nextcloud
  • Ajoutez la ligne suivante dans le fichier de configuration Nextcloud (/var/www/nextcloud/config/config.php) :

    <!--?php
    $CONFIG = array (
      'instanceid' =--> '*****secret*****',
      'passwordsalt' => '*****secret*****',
      'secret' => '*****secret*****',
      'trusted_domains' =>
      array (
        0 => 'cloud.mondomaine.com',
        1 => 'cloud.local'
      ),
      'datadirectory' => '/var/www/nextcloud/data',
      'overwrite.cli.url' => 'http://cloud.mondomaine.com',
      'dbtype' => 'mysql',
      'version' => '19.0.4.0',
      'dbname' => 'nextcloud',
      'dbhost' => 'localhost',
      'dbport' => '',
      'dbtableprefix' => 'oc_',
      'dbuser' => 'nextcloud',
      'dbpassword' => '*****secret*****',
      'installed' => true,
      'memcache.local' => '\OC\Memcache\APCu',
      'memcache.locking' => '\OC\Memcache\Redis',
      'redis' => array(
        'host' => 'localhost',
        'port' => 6379,
      ),
      'loglevel' => 2,
      'logtimezone' => 'Europe/Paris',
      'logfile' => '/var/log/nextcloud/nextcloud.log',
      'log_rotate_size' => 104857600
    );
  • Lancez votre navigateur et rendez-vous à l’adresse suivante : cloud.local

    Cette adresse ne sera accessible qu’au sein de votre réseau local.

Nextcloud sur Android…

Découvrez l’excellente application officielle Nextcloud sur Android qui vous permettra de synchroniser et de partager vos fichiers sur votre mobile.



Ubuntu Server 20.04 LTSNginx 1.17.10
PHP7-FPM 7.4.3
MariaDB 10.3.22
Nextcloud 19.0.4
Fail2ban 0.11.1



51 réponses
  1. tforgione
    tforgione dit :

    Merci pour vos fichiers de config…

    J’avais des problèmes de cycle de redirection avec les fichiers de config de nginx donnés sur le site officiel de nextcloud, mais avec le votre, tout fonctionne !

    Répondre
  2. dj59
    dj59 dit :

    Merci pour votre super tuto, fonctionnel sous Debian 9.5 !

    A la place de l’étape 9.1, il suffit juste d’ajouter les backports dans /etc/apt/sources.list :

    sudo nano /etc/apt/sources.list

    # Debian Stretch, dépôt de rétroportages (« backports »)
    deb http://deb.debian.org/debian/ stretch-backports main

    sudo apt-get install certbot -t stretch-backports

    De plus, pour éviter l’avertissement sur la fuite d’informations suivante :
    L’en-tête HTTP « Referrer-Policy » n’est pas défini sur « no-referrer », « no-referrer-when-downgrade », « strict-origin » ou « strict-origin-when-cross-origin ». Cela peut entraîner une fuite d’informations.

    Il faut ajouter « add_header Referrer-Policy no-referrer; » dans le virtual host /etc/nginx/sites-available/nextcloud après la ligne # Add headers to serve security related headers

    Répondre
  3. burd
    burd dit :

    Bonjour,
    Bravo pour ce tuto qui est de loin le plus clair et détaillé que j’ai pu trouver.
    J’avais déjà un serveur Nextcloud auto-hébergé mais il m’a permis de de corriger ou d’ajouter certaines petites choses.
    J’aurais juste une petite question. Mes besoins évoluant, J’aimerais garder mon reverse proxy via Nginx tout en ayant un accès en local, ce que je n’ai pas actuellement.
    Après documentation j’envisage soit de monter un serveur DNS pour gérer les redirections soit de faire une nouvelle configuration apache2, mais je crains que mes connaissance ne soit trop maigre pour choisir l’option la plus judicieuse.
    Auriez-vous une idée de la démarche à suivre ?

    Répondre
  4. Christian
    Christian dit :

    Quel tuto ! Chapeau bas !
    Cela fonctionne bien sous Linux Mint 19.

    3 questions :

    • Letsencrypt : est-ce que le cron pour le renouvellement est obligatoire ? J’ai lu que la paquet CERTBOT installé s’occupe maintenant de lancer 2 fois par jour via systemd timer.
    • REDIS : ne faut-il pas charger et lancer le service redis ? et ajouter le user nextcloud au groupe redis ? Ou est-ce que votre procédure rend cela caduque ?
    • J’accède bien à nextcloud via mon nom de domaine mais pas par localhost ou l’IP local. localhost me renvoie sur la page d’accueil d’apache (normal). Par contre, localhost/nextcloud semble vouloir pointer sur une page localhost/nextcloud/nextcloud/status.php et j’obtiens une erreur 404 Not found avec nginx en petit sous le message d’erreur.

    Merci pour votre aide et esprit de partage.

    Répondre
    • Edouard WATTECAMPS
      Edouard WATTECAMPS dit :

      Merci Christian,

      Voici mes réponses :

      • En effet vous avez raison. L’installation du paquet certbot ajoute une tâche planifiée permettant le renouvellement des certificats. L’article a été mis à jour dans ce sens.
      • Le service redis est automatiquement lancé après installation du paquet. Nul besoin de le lancer ou de gérer de quelconque droit.
      • J’ai ajouté une section permettant l’accès en local en fin d’article.

      W.

      Répondre
  5. Yann
    Yann dit :

    Un très grand merci pour votre tuto, tout simplement le plus clair que l’on puisse trouver : tout y est parfaitement bien expliqué, vous prenez le temps de dire ce que font les commandes que nous tapons.
    J’ai vraiment pris plaisir à le suivre pour configurer Nextcloud sur mon serveur et tout a marché du premier coup (sauf la configuration du cache des données mais c’était de ma faute, une erreur de syntaxe).
    Je place votre site en favoris. :D

    Répondre
  6. niko
    niko dit :

    Un très bon tuto.
    Je l’utilise depuis déjà plus d’un an, à chaque fois que je monte une instance nextcloud et il reste toujours fonctionnel, simple et efficace.
    Je précise que mes serveurs sont sous debian buster.

    Répondre
  7. Giacomo Angeloni
    Giacomo Angeloni dit :

    Salut, merci pour ce super tuto, tout marche très bien… en local…

    Quand je suis connecté ailleurs que sur ma box (en 4G avec mon téléphone par exemple…) mon serveur est inaccessible…
    J’ai bien redirigé mon nom de domaine vers l’adresse IPV4 de mon routeur (freebox révolution) et redirigé tout le trafic entrant vers mon serveur (pour le test).
    J’ai vu que la plage de ports disponibles sur le routeur ne comprend pas les ports 80 et 443 (qui sont ceux utilisés si j’ai bien compris). Est-il possible d’utiliser d’autres ports personnalisés (compris entre 16384 et 32767) et si oui, comment procéder, quels fichiers modifier ?

    Merci d’avance pour la réponse =P

    P.S. : De plus, l’obtention du certificat SSL/TLS ne marche pas (j’obtiens un request timed out au moment de la vérification). Je pense que cela vient aussi de mon problème de ports…

    Répondre
    • Edouard WATTECAMPS
      Edouard WATTECAMPS dit :

      Bonjour,

      Nous nous éloignons un peu du sujet car Free partage les adresses IP publiques entre plusieurs de leurs abonnés et allouent ainsi une plage de ports à chacun d’eux. Pour contourner ce problème, vous avez deux solutions :

      • la plus simple est d’obtenir une IP unique en suivant la procédure ici
      • la plus contraignante est de spécifier un port différent du port 80 dans la configuration du vhost Nginx, par exemple le port 16384, et ajouter une redirection du port 16384 dans l’interface admin de votre Freebox vers l’IP locale de votre serveur (192.168.1.X). Vous pourrez accéder à votre cloud de l’extérieur via http://cloud.mondomaine.com:16384
        Concernant l’accès en HTTPS et l’obtention du certificat SSL/TLS, vous avez tout à fait raison, cela ne fonctionnera pas. Lors de la génération du certificat, l’outil certbot tente d’accéder à votre serveur via les ports 80 ou 443. Il ne faut pas oublier que HTTPS = 443 donc vous ne pourrez obtenir un certificat SSL/TLS sur un port différent…

      W.

      Répondre
      • Giacomo Angeloni
        Giacomo Angeloni dit :

        Merci pour la réponse précise.

        J’ai finalement utilisé la solution la plus contraignante : rediriger deux des ports disponibles vers les ports 80 et 443 de mon serveur et je me connecte donc en spécifiant le bon port après mon nom de domaine.

        Pour le certificat, je m’en suis créé un auto-signé pour pouvoir profiter du https. Je me connecte ensuite en spécifiant le port de ma box associé au port 443 du serveur.

        Je change de FAI d’ici deux semaines donc je garde cette solution et tenterai de faire quelque chose de plus propre le moment venu.

        En tous cas, merci encore pour les explications et le tuto, tout fonctionne à merveille !

        Répondre
  8. nico may
    nico may dit :

    Bonjour et merci pour le tuto,
    tout marche à merveille depuis Internet comme en localhost, comme avec l’adresse depuis le serveur cloud.local.
    par contre en me connectant depuis un autre PC sur mon réseau LAN en utilisant l’adresse IP du serveur, j’arrive sur une page 404 Not Found – nginx à l’adresse IPDUSERVEUR/index.php/login, qui de plus semble fausse.
    Le plus intéressant est que j’ai vu le fond bleu tant qu’il y avait des erreurs de droits pour les dossier config, apps et DATA.
    J’ai visité des dizaines de sites sans trouver de solution.
    Probablement un problème autour d’un fichier conf, mais lequel et quoi ?
    Pourriez vous m’aider à résoudre ce problème d’accès depuis le réseau ? (plus rapide pour charger les fichiers sur le cloud qu’en passant par le net…)

    Merci beaucoup

    Répondre
  9. LittleTux
    LittleTux dit :

    Bonjour à tous,

    Nous utilisons Nexcloud en V18 sur Ubuntu depuis longtemps sans rencontrer de gros soucis et on est super satisfait.

    Confinement oblige (on est un lycée) le serveur est montée en puissance en terme d’utilisation pour assurer la continuité pédagogique

    On voulait mettre des softs à disposition aux élèves et pas de problème sur l’upload on a mis des dossiers de taille considérable ( +7Go). Par contre quand on veut download c’est mêmes fichiers/dossiers ça s’arrête toujours à 2Go pile ce qui me fait penser que ya une restriction quelque part au niveau de la conf par défaut mais j’ai rien trouvé sur la GUI.

    Quelqu’un a une idée de comment on peut débrider ça ?

    Bonne journée.

    Répondre
    • Louatron
      Louatron dit :

      Bonjour à tous,

      Je relance la question n’ayant pas eu de retour et le problème étant toujours présent et gênant dans l’utilisation du serveur.

      Nous utilisons Nexcloud en V18 sur Ubuntu depuis longtemps sans rencontrer de gros soucis et on est super satisfait.

      Confinement oblige (on est un lycée) le serveur est montée en puissance en terme d’utilisation pour assurer la continuité pédagogique

      On voulait mettre des softs à disposition aux élèves et pas de problème sur l’upload on a mis des dossiers de taille considérable ( +7Go). Par contre quand on veut download c’est mêmes fichiers/dossiers ça s’arrête toujours à 2Go pile ce qui me fait penser que ya une restriction quelque part au niveau de la conf par défaut mais j’ai rien trouvé sur la GUI.

      Quelqu’un a une idée de comment on peut débrider ça ?

      Bonne journée.

      Répondre
  10. Jacques VALLOIS
    Jacques VALLOIS dit :

    Bonjour et merci pour ce tuto bien clair.

    J’aurais une question : Après avoir suivi les instructions pour accéder en local à mon serveur, ça ne semble fonctionner que si j’ajoute dans le fichier « hosts » des machines à partir desquelles je veux y accéder.
    Est-ce bien normal ?

    Bien cordialement,

    Jacques.

    Répondre
    • Edouard WATTECAMPS
      Edouard WATTECAMPS dit :

      Bonjour,

      Oui c’est tout à fait normal. Votre domaine local « cloud.local » n’est pas du domaine publique et n’est donc pas enregistré auprès d’un fournisseur de noms de domaine. Ce domaine, étant inconnu de vos machines, il est nécessaire d’indiquer et d’associer votre IP locale à ce nom de domaine sur chacune des machines souhaitant accéder à votre serveur via la configuration du fichier hosts.

      Répondre
      • Jacques VALLOIS
        Jacques VALLOIS dit :

        Bonjour et merci pour la réponse.

        Je m’en doutais un peu, mais ne voyant pas cela mentionné, je me demandais s’il n’y avait pas une astuce qui faisait que ça n’était pas utile.

        Du coup, je me demande si c’est faisable pour une tablette avec l’application android ?

        Bien cordialement,

        Jacques.

        Répondre
  11. Frederic Aoussou
    Frederic Aoussou dit :

    Bonjour Edouard,

    En me connectant sur mon serveur via Cloud.local,je n’arrive à lancer l’application « Collabora Office ». J’ai pourtant déclaré dans le fichier de configuration de Collabora Office « loolwsd.xml » ce nom de domaine comme je l’ai fait pour le nom de domaine principal de mon serveur Nextcloud,mais ça n’a rien changé.

    Aurais-tu une idée ?

    Merci de ton aide

    Frédéric

    Répondre
      • Frederic Aoussou
        Frederic Aoussou dit :

        Bonjour Edouard,

        Désolé pour ce long silence, je ne reçois pas de notification quand il y a une réponse. J’ai pu relever le log de Nextcloud mais je ne trouve aucun fichier de log de Collabora :
        Voici ci-dessous le log de Nextcloud :
         » ……
        {« reqId »: »KV3Sq2IfWjpAUdn3gG37″, »level »:3, »time »: »2020-07-04T19:22:46+02:00″, »remoteAddr »: »127.0.0.1″, »user »: »–« , »app »: »PHP », »method »: »GET », »url »: »/logout?requesttoken=A%2BcElVlANXOFU83iS8pFKsVeDfOwUQ3QpR7Utep5xMQ%3D%3Aaq9sxxNzdibmNoW6eqkUYvQMdL%2BGFz%2Bx6UmF3JhKo4k%3D », »message »: »session_start(): A session had already been started – ignoring at /var/www/nextcloud/lib/private/Session/Internal.php#209″, »userAgent »: »Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0″, »version »: »19.0.0.12″}
        … »

        Je ne vois aucun lien avec Collabora.

        Merci de votre aide.

        Frédéric

        Répondre
        • Frederic Aoussou
          Frederic Aoussou dit :

          Re bonjour,

          En complément, j’ai relevé un extratit du log de NGINX qui pourrait aider à la compréhension du problème :

          « ….;
          020/07/04 19:22:55 [error] 22482#22482: *48 client intended to send too large body: 7000924 bytes, client: 192.168.1.1, server: collabora.XXXX.net, request: « POST /lool/convert-to/png HTTP/1.1 », host: « collabora.XXXX.net »
          2020/07/04 19:24:28 [error] 22482#22482: *115 client intended to send too large body: 7000924 bytes, client: 192.168.1.1, server: collabora.XXXX.net, request: « POST /lool/convert-to/png HTTP/1.1 », host: « collabora.XXXX.net »
          …. »

          Frederic

          Répondre
          • Edouard WATTECAMPS
            Edouard WATTECAMPS dit :

            Bonjour Frédéric,

            Essayez d’ajouter la directive client_max_body_size 10M; dans la conf Nginx (/etc/nginx/nginx.conf) dans le bloc http puis redémarrez Nginx.
            Ensuite dans le fichier /etc/php/7.4/fpm/php.ini, modifiez les directives :
            upload_max_filesize=500M
            post_max_size=500M
            et enfin redémarrez le service php-fpm.
            Tentez de vous connecter à nouveau et dites-moi si les erreurs sont toujours présentes dans votre log Nginx.

          • Frederic Aoussou
            Frederic Aoussou dit :

            Bonjour Edouard,

            J’ai appliqué les config recommandés dans le fichier Conf de Nginx et dans le fichier php.ini, et j’ai bien relancé les services « Nginx » et « php7.4-fpm » et voici les erreurs logs (antérieures à ma manip de 14H00) relevées :

            2020/07/05 01:24:57 [error] 22482#22482: *875 directory index of « /var/www/html/ » is forbidden, client: 34.76.17.151, server: collabora.XXXX.net, request: « GET / HTTP/1.1 », host: « 93.XXX.XXX.XXX »
            2020/07/05 04:03:14 [error] 22482#22482: *892 directory index of « /var/www/html/ » is forbidden, client: 193.118.53.202, server: collabora.XXXX.net, request: « GET / HTTP/1.1 », host: « 93.XXX.XXX.XXX »
            2020/07/05 06:28:22 [error] 22482#22482: *908 directory index of « /var/www/html/ » is forbidden, client: 184.105.247.196, server: collabora.XXXX.net, request: « GET / HTTP/1.1 », host: « 93.XXX.XXX.XXX »
            2020/07/05 11:57:40 [error] 22482#22482: *981 open() « /var/www/html/favicon.ico » failed (2: No such file or directory), client: 192.168.1.1, server: collabora.XXXX.net, request: « GET /favicon.ico HTTP/2.0 », host: « collabora.XXXX.net »

          • Edouard WATTECAMPS
            Edouard WATTECAMPS dit :

            Où est installé Collabora (/var/www/html ?) et quelle procédure avez-vous suivi pour l’installer ?

            D’ici une semaine ou deux, sachez que votre Nextcloud pourra être mis à jour vers la v19. Cette version contiendra Collabora nativement.

          • Frederic Aoussou
            Frederic Aoussou dit :

            Merci Edouard de votre retour
            J’ai suivi la procédure d’installation du site officiel (https://www.collaboraoffice.com/code/linux-packages/). Pour créer le certificat ssl via Certbot, j’ai dû déclarer dans un fichier VHOST dédié à Collabora le chemin « /var/www/html  » pour le root du serveur.

            ça marche bien avec le serveur Nextcloud via le nom de domaine pas via le nom de domaine local. Ce n’est pas grave. Merci encore de toute votre aide.

            Frédéric

  12. ben
    ben dit :

    Bonjour Edouard

    Je suis votre tuto pour enfin autoheberger mes donnees sur mon raspberry pi (derniere raspian GUI a jour); a ce sujet merci!

    Cependant, a l’installation de nginx et plus loin lors de l’installation des paquets php, je recupere une erreur (ligne rouge):

    Jul 04 11:20:33 host systemd[1]: Failed to start A high performance web server and a reverse proxy server.

    Après un peu de recherche sur le net, je pense que le problème se situe au niveau de nginx.conf; j’y ai deja modifie les directives comme indique)
    j’ai passe cette commande:

    sudo nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful

    Merci d’avance

    Répondre
      • ben
        ben dit :

        re Edouard
        Voici:
        sudo systemctl status nginx.service
        ● nginx.service – A high performance web server and a reverse proxy server
        Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
        Active: failed (Result: exit-code) since Sat 2020-07-04 17:18:01 CEST; 54s ago
        Docs: man:nginx(8)
        Process: 24786 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)

        Jul 04 17:18:01 banana systemd[1]: Starting A high performance web server and a reverse proxy server…
        Jul 04 17:18:01 banana nginx[24786]: nginx: [emerg] « server » directive is not allowed here in /etc/nginx/nginx.conf:65
        Jul 04 17:18:01 banana nginx[24786]: nginx: configuration file /etc/nginx/nginx.conf test failed
        Jul 04 17:18:01 banana systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
        Jul 04 17:18:01 banana systemd[1]: nginx.service: Failed with result ‘exit-code’.
        Jul 04 17:18:01 banana systemd[1]: Failed to start A high performance web server and a reverse proxy server

        Répondre
        • Edouard WATTECAMPS
          Edouard WATTECAMPS dit :

          Comme l’indique les logs le problème vient de la ligne 65 à cause de la présence de la directive server. Cette directive n’est permise que dans un virtual host (étape 8) dans le fichier /etc/nginx/sites-available/nextcloud. Avez-vous défini votre vhost dans le fichier de conf Nginx ?

          Répondre
          • Frederic Aoussou
            Frederic Aoussou dit :

            Dans le fichier Conf de Nginx, à la ligne 62, j’ai cette déclaration : « ..include /etc/nginx/sites-enabled/*; …. »
            Je pense cette ligne déclare bien le vhost de Nextcloud

  13. Ben
    Ben dit :

    bonsoir / bonjour Edouard et Frederic

    Encore merci pour votre aide.
    Autant pour moi, ce block server a la ligne ligne 65, c’est quelque chose que j’avais teste et que j’avais oublie d’enlever; j’ai donc supprime ce block et en relancant

    sudo systemctl status nginx.service

    je recupere maintenant :
    ● nginx.service – A high performance web server and a reverse proxy server
    Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Sun 2020-07-05 22:52:10 CEST; 7s ago
    Docs: man:nginx(8)
    Process: 12548 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 12549 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=1/FAILURE)

    Jul 05 22:52:08 banana nginx[12549]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    Jul 05 22:52:08 banana nginx[12549]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
    Jul 05 22:52:09 banana nginx[12549]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    Jul 05 22:52:09 banana nginx[12549]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
    Jul 05 22:52:09 banana nginx[12549]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    Jul 05 22:52:09 banana nginx[12549]: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
    Jul 05 22:52:10 banana nginx[12549]: nginx: [emerg] still could not bind()
    Jul 05 22:52:10 banana systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
    Jul 05 22:52:10 banana systemd[1]: nginx.service: Failed with result ‘exit-code’.
    Jul 05 22:52:10 banana systemd[1]: Failed to start A high performance web server and a reverse proxy server.

    qui indique donc que le port 80 est deja utilise –> par lighttpd :

    sudo netstat -ltnp

    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1295/lighttpd

    cp6 0 0 :::80 :::* LISTEN 1295/lighttpd

    Je n’ai pas souvenir d’avoir volontairement installe lighttpd (installe par defaut ds la raspian buster ?), pour l’instant le raspberry ne sert que de pi-hole
    donc solution a mon probleme :
    – je desinstalle lighttpd et je recupere ainsi le port 80
    – ou j’edite le fichier nginx.conf et remplace le port 80 par un autre port…

    Vos remarques / suggestions par rapport a ces 2 options, surtout si je change le port 80 ds le nginx.conf –> implications / points de vigilance pour le reste du tuto ?
    Merci d’avance.

    Répondre
    • Edouard WATTECAMPS
      Edouard WATTECAMPS dit :

      Bonjour Ben,

      Je te conseille fortement de désinstaller lighttpd. Faire cohabiter plusieurs serveurs HTTP sur un même serveur complique la configuration et pour quel intérêt finalement ? De plus, si tu modifies le port d’écoute par défaut (80) dans Nginx, tu devras systématiquement spécifier le port dans l’URL d’accès à ton Nextcloud.

      Répondre

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *