Ubuntu 20.04 & 21.04 - Installation de Nextcloud 20 (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.

Des services comme Dropbox, Microsoft OneDrive ou l’iCloud d’Apple offrent une alternative attractive et pratique au stockage local sur votre propre appareil : ordinateur, tablette ou smartphone, grâce à une accessibilité permanente et globale via Internet. Cependant, le volume de stockage gratuit n'est pas illimité et avec des données sensibles, la question de la sécurité des fichiers stockés se pose alors. Si vous désirez profiter des avantages du Cloud tout en conservant un contrôle total de l’ensemble de vos données, il est alors nécessaire d’héberger et de gérer votre propre service de stockage en ligne.

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. Alors que les utilisateurs de ownCloud peuvent utiliser certaines fonctionnalités exclusivement dans l’édition Entreprise sous licence commerciale, tous les composants Nextcloud sont eux disponibles gratuitement sous la licence libre AGPLv3. Nextcloud offre une assistance professionnelle payante en cas de besoin.

 

Les principales fonctionnalités de 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.

Sommaire

1 - Prérequis

2 - Nginx

2.1 - Installation

2.2 - Configuration

3 - Installation et téléchargement de Nextcloud

4 - Droits Unix

5 - Les modules PHP

6 - PHP-FPM

6.1 - Installation

6.2 - Création du pool nextcloud

6.3 - Configuration du service php-fpm

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

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

7.1 - Installation de MariaDB

7.2 - Configuration de MariaDB

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

8 - Nom de domaine & virtual host

9 - SSL/TLS avec Let's Encrypt

9.1 - Installation

9.2 - Génération des certificats

9.3 - Renouvellement automatique du certificat

10 - HTTP2

11 - Nextcloud

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

12.1 - Cache PHP : OPcache

12.2 - Cache de données : APCu & Redis

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

14 - Suivre les recommandations de Nextcloud

14.1 - Augmenter la mémoire PHP

14.2 - Création d'index supplémentaires

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

15 - Installation de la suite Collabora Online

16 - Accéder à votre Nextcloud à partir de votre réseau local

17 - Questions et problèmes rencontrés

18 - Nextcloud sur Android...

 

1 - Prérequis

sudo apt-get update

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;

 

...

 

 

grep processor /proc/cpuinfo | wc -l

8

3 - Installation et téléchargement de Nextcloud

cd /var/www

sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2

sudo wget https://download.nextcloud.com/server/releases/latest.tar.bz2.sha256

sha256sum -c latest.tar.bz2.sha256 < latest.tar.bz2

La commande doit retourner sur la sortie standard :

latest.tar.bz2: OK

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

 

sudo tar -xvf latest.tar.bz2

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 :

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.

sudo adduser nextcloud

sudo chown -R nextcloud:www-data /var/www/nextcloud

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

5 - Les modules PHP

Nextcloud nécessite certains modules PHP pour fonctionner :

Installez les modules PHP 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

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 sites web sur un même serveur, de créer et configurer un groupe de processus PHP (appelé aussi pool) par application. Un pool définit notamment le UID/GID des processus PHP et le nombre de processus PHP à dédier à votre site, en fonction des ressources de votre serveur. De ce fait, il est possible d'atteindre un niveau d'isolation des applications PHP intéressant.

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 :

sudo systemctl stop php7.4-fpm.service

free -m

              total        used        free      shared  buff/cache   available

Mem:           3913          58        2532          39        1322        3539

Swap:          1048           0        1048

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

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

[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

 

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 :

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

[Service]

UMask=0027

sudo systemctl reenable php7.4-fpm.service

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

Nous allons maintenant créer la base de données et configurer l'accès externe de votre Nextcloud via un nom de domaine sécurisé par le protocole SSL/TLS et un certificat Let's Encrypt. Nous verrons ensuite comment améliorer les performances et la sécurité votre Nextcloud. Enfin, nous détaillerons la procédure pour vous permettre d'éditer vos fichiers directement en ligne avec Collabora Online.

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

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.25-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.

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.

sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/nextcloud

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.

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

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

sudo chmod 600 /etc/ssl/certs/dhparam.pem

upstream php-nextcloud {

    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_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-nextcloud;

        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;

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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 :

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

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.

upstream php-nextcloud {

    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_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-nextcloud;

        fastcgi_intercept_errors  on;

        fastcgi_request_buffering off;

        fastcgi_read_timeout      3600;

    }

 

    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;

    }

}

 

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 :

NextcloudNextcloud 
 

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

➔ Devenir Membre pour lire la suite

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

➔ Devenir Membre pour lire la suite

 

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 activités 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

➔ Devenir Membre pour lire la suite

 

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

Nextcloud RecommandationsNextcloud Recommandations 
 

14.1 - Augmenter la mémoire PHP

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.

su nextcloud

cd /var/www/nextcloud

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.

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 :

Nextcloud Recommandations SuccèsNextcloud Recommandations Succès 
 

15 - Installation de la suite Collabora Online

Nextcloud Collabora OnlineNextcloud Collabora Online 
 

Collabora Online est une puissante suite bureautique en ligne basée sur LibreOffice avec édition collaborative. Elle prend en charge tous les principaux documents, formats de feuille de calcul et de présentation, et fonctionne avec tous les navigateurs modernes...

16 - 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.

upstream php-nextcloud {

    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;

 

    ...

 

 

sudo systemctl reload nginx.service

su nextcloud

<!--?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' => '20.0.2.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

);

 

17 - Questions et problèmes rencontrés

N'oubliez pas d'ajouter une virgule à la fin de la ligne précédente !

Solution 2 : scanner les fichiers avec la commande occ :

Connecté sous l'utilisateur nextcloud et dans le répertoire /var/www/nextcloud, exécutez la commande suivante :

php occ files:scan

18 - 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.