Le lab des experts

Comment installer NextCloud sur Debian ?

Comment installer Nextcloud sur Debian

Lancé en 2016, NextCloud est un serveur d’hébergement et de partage de fichiers, gratuit et open-source, issu du projet ownCloud. NextCloud offre donc une alternative à d’autres services de partage de fichiers tels que Google Drive, Dropbox et iCloud, pour stocker des fichiers, documents, images, films ou vidéos. Avec sa version 25 (dite Hub 3) sortie fin 2022, NextCloud est l’un des projets open source les plus actifs aujourd’hui. NextCloud peut être installé sur un ordinateur de bureau sur la plupart des systèmes d’exploitation, notamment Windows, macOS, FreeBSD et Linux, pour synchroniser les fichiers avec votre serveur Nextcloud.

Le tutoriel ci-après vous guide pour installer NextCloud sur Debian 11.

Conditions préalables pour installer NextCloud sur Debian

  • Un serveur exécutant Debian 11 ou supérieur
  • Un nom de domaine valide pointé avec l’adresse IP de votre serveur. Dans ce tutoriel, nous allons utiliser le domaine nextcloud.example.com
  • Un mot de passe root configuré sur votre serveur
  • Les permissions Administrateur

Démarrage de l’installation de Nextcloud sur Debian 11

Pour débuter l’installation de Nextcloud sur Debian 11, la première étape est de mettre à jour le système Debian utilisé par votre serveur VPS : 

# apt update && sudo apt upgrade -y

Nous partons du principe qu’un pare-feu est installé sur votre VPS et que les ports 80/443 et 22 sont ouverts.

Pour cette installation de Nextcloud, vous devrez donc installer Nginx, PostgreSQL, PHP et d’autres packages requis sur votre système. Vous pouvez tous les installer en exécutant la commande suivante :

# apt install imagemagick php-imagick php7.4-common php7.4-pgsql php7.4-fpm php7.4-gd php7.4-curl php7.4-imagick php7.4-zip php7.4-xml php7.4-mbstring php7.4-bz2 php7.4-intl php7.4-bcmath php7.4-gmp nginx unzip wget

Téléchargement de Nextcloud

Visitez la page de téléchargement NextCloud et téléchargez la dernière version de NextCloud sur votre système. Au moment de la rédaction de cet article, la dernière version de NextCloud est 25 (dite hub 3). Vous pouvez la télécharger avec la commande suivante :

# wget https://download.nextcloud.com/server/releases/latest.zip

Une fois le téléchargement terminé, décompressez le fichier téléchargé avec la commande suivante :

# unzip latest.zip

Puis, déplacez le répertoire extrait vers le répertoire racine Web Apache :

# mv nextcloud /var/www/

Ensuite, donnez les autorisations appropriées au répertoire nextcloud avec la commande suivante :

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

chmod -R 755 /var/www/nextcloud/

Créer une base de données et un utilisateur pour Nextcloud dans PostgreSQL

Installez le paquet Postgresql.

# apt install -y postgresql postgresql-contrib

Connectez-vous à PostgreSQL en tant qu’utilisateur.rice postgres.

# sudo -u postgres psql

Créez la base de données nextcloud.

CREATE DATABASE nextcloud TEMPLATE template0 ENCODING 'UNICODE' ;

Créez un utilisateur (nextclouduser) et définissez un mot de passe.

CREATE USER VOTREUSER WITH PASSWORD 'MOTDEPASSEACHANGER' ;

Accordez des permissions à l’utilisateur.rice de la base de données.

ALTER DATABASE nextcloud OWNER TO VOTREUSER ; 

Accordez tous les privilèges à la base de données.

nextcloud A nextclouduser ;

Appuyez sur Ctrl+D pour vous déconnecter de la console PostgreSQL. 

Configuration du serveur Web Nginx

Dans cet exemple, Nextcloud est installé dans le répertoire /var/www/nextcloud et on y accède via http(s)://cloud.example.com/

Créez le fichier de configuration du vhost cloud.example.com

vim /etc/nginx/sites-enabled/cloud.example.com

Puis coller le contenu suivant et adaptez le à votre nom de domaine :

upstream php-handler { server 127.0.0.1:9000; #server unix:/var/run/php/php7.4-fpm.sock; }

Définissez les options de contrôle du cache immuable uniquement pour les ressources avec un argument de destruction du cache.

map $arg_v $asset_immutable { «  » «  »; default « immutable »; }

server { listen 80; listen [::]:80; server_name cloud.example.com;

# Prevent nginx HTTP Server Detection
server_tokens off;

# Enforce HTTPS
return 301 https://$server_name$request_uri;

}

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

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

# Use Mozilla's guidelines for SSL/TLS settings
# https://mozilla.github.io/server-side-tls/ssl-config-generator/
ssl_certificate     /etc/ssl/nginx/cloud.example.com.crt;
ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;

# Prevent nginx HTTP Server Detection
server_tokens off;

# HSTS settings
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
# will add the domain to a hardcoded list that is shipped
# in all major browsers and getting removed from this list
# could take several months.
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;

# set max upload size and increase upload timeout:
client_max_body_size 512M;
client_body_timeout 300s;
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/wasm 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;

# Pagespeed is not supported by Nextcloud, so if your server is built
# with the `ngx_pagespeed` module, uncomment this line to disable it.
#pagespeed off;

# The settings allows you to optimize the HTTP2 bandwitdth.
# See https://blog.cloudflare.com/delivering-http-2-upload-speed-improvements/
# for tunning hints
client_body_buffer_size 512k;

# HTTP response headers borrowed from Nextcloud `.htaccess`
add_header Referrer-Policy                   "no-referrer"       always;
add_header X-Content-Type-Options            "nosniff"           always;
add_header X-Download-Options                "noopen"            always;
add_header X-Frame-Options                   "SAMEORIGIN"        always;
add_header X-Permitted-Cross-Domain-Policies "none"              always;
add_header X-Robots-Tag                      "noindex, nofollow" always;
add_header X-XSS-Protection                  "1; mode=block"     always;

# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;

# Specify how to handle directories -- specifying `/index.php$request_uri`
# here as the fallback means that Nginx always exhibits the desired behaviour
# when a client requests a path that corresponds to a directory that exists
# on the server. In particular, if that directory contains an index.php file,
# that file is correctly served; if it doesn't, then the request is passed to
# the front-end controller. This consistent behaviour means that we don't need
# to specify custom rules for certain paths (e.g. images and other assets,
# `/updater`, `/ocm-provider`, `/ocs-provider`), and thus
# `try_files $uri $uri/ /index.php$request_uri`
# always provides the desired behaviour.
index index.php index.html /index.php$request_uri;

# Rule borrowed from `.htaccess` to handle Microsoft DAV clients
location = / {
    if ( $http_user_agent ~ ^DavClnt ) {
        return 302 /remote.php/webdav/$is_args$args;
    }
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Make a regex exception for `/.well-known` so that clients can still
# access it despite the existence of the regex rule
# `location ~ /(\.|autotest|...)` which would otherwise handle requests
# for `/.well-known`.
location ^~ /.well-known {
    # The rules in this block are an adaptation of the rules
    # in `.htaccess` that concern `/.well-known`.

    location = /.well-known/carddav { return 301 /remote.php/dav/; }
    location = /.well-known/caldav  { return 301 /remote.php/dav/; }

    location /.well-known/acme-challenge    { try_files $uri $uri/ =404; }
    location /.well-known/pki-validation    { try_files $uri $uri/ =404; }

    # Let Nextcloud's API for `/.well-known` URIs handle all other
    # requests by passing them to the front-end controller.
    return 301 /index.php$request_uri;
}

# Rules borrowed from `.htaccess` to hide certain paths from clients
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/)  { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console)                { return 404; }

# Ensure this block, which passes PHP files to the PHP process, is above the blocks
# which handle static assets (as seen below). If this block is not declared first,
# then Nginx will encounter an infinite rewriting loop when it prepends `/index.php`
# to the URI, resulting in a HTTP 500 error response.
location ~ \.php(?:$|/) {
    # Required for legacy support
    rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;

    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    set $path_info $fastcgi_path_info;

    try_files $fastcgi_script_name =404;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $path_info;
    fastcgi_param HTTPS on;

    fastcgi_param modHeadersAvailable true;         # Avoid sending the security headers twice
    fastcgi_param front_controller_active true;     # Enable pretty urls
    fastcgi_pass php-handler;

    fastcgi_intercept_errors on;
    fastcgi_request_buffering off;

    fastcgi_max_temp_file_size 0;
}

location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
    try_files $uri /index.php$request_uri;
    add_header Cache-Control "public, max-age=15778463, $asset_immutable";
    access_log off;     # Optional: Don't log access to assets

    location ~ \.wasm$ {
        default_type application/wasm;
    }
}

location ~ \.woff2?$ {
    try_files $uri /index.php$request_uri;
    expires 7d;         # Cache-Control policy borrowed from `.htaccess`
    access_log off;     # Optional: Don't log access to assets
}

# Rule borrowed from `.htaccess`
location /remote {
    return 301 /remote.php$request_uri;
}

location / {
    try_files $uri $uri/ /index.php$request_uri;
}

}

Testez la configuration de Nginx :

 # nginx -t

Si le test est concluant, relancez Nginx sinon corrigez les éventuelles erreurs avant de tester à nouveau :

 # systemctl restart nginx

Installation de Nextcloud

Vous pouvez maintenant accéder à l’assistant d’installation web Nextcloud en vous rendant sur votre site web.

https://cloud.example.com

Pour terminer l’installation, vous devez :

  • Créer un compte administrateur
  • Entrer le chemin du dossier de données Nextcloud (/var/www/nextcloud/
  • Entrer les détails de la base de données que vous avez créée précédemment. Vous pouvez utiliser localhost:5432 comme adresse hôte.

Configuration de PHP

La limite de mémoire PHP par défaut est de 128MB. NextCloud recommande 512MB pour de meilleures performances. Pour modifier la limite de mémoire PHP, éditez le fichier php.ini.

Ouvrez le fichier /etc/php/7.4/fpm/php.ini :

 # vim /etc/php/7.4/fpm/php.ini

Trouvez la ligne suivante :

memory_limit = 128M

Et remplacez la valeur par :

memory_limit = 512M

Puis trouvez la ligne 

upload_max_filesize = 2M

Changez la valeur comme ci-dessous :

upload_max_filesize = 1024M

Puis recharger PHP-FPM pour prendre en compte la modification

# systemctl reload php7.4-fpm    

Installation d’un système de cache

Si vous allez dans vos paramètres d’administration de Nextcloud, vous pouvez voir l’avertissement suivant :

No memory cache has been configured. To enhance your performance please configure a memcache if available.

Nous allons activer la mise en cache de la mémoire pour Nextcloud en utilisant Redis. Exécutez la commande suivante pour installer le serveur Redis :

apt install redis-server    

Enfin éditez le fichier de configuration de Nextcloud :

vim /var/www/nextcloud/config/config.php

Ajoutez les lignes suivantes au-dessus de la dernière ligne );. 

'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
    'host' => 'localhost',
    'port' => 6379,
    ),

Enregistrez et fermez le fichier. Pour finir, redémarrez ensuite Nginx et PHP-FPM.

systemctl restart nginx php7.4-fpm        

Créez un compte Administrateur pour NextCloud et saisissez vos accès à votre base de données l’installation de Nextcloud est terminée. Vous pouvez désormais utiliser Nextcloud.

Pour aller plus loin : comment connecter Collabora Online sur Nextcloud ?

La suite bureautique Collabora Online, basée sur LibreOffice, permet d’éditer et manipuler les principaux formats de documents et surtout le travail en mode collaboratif.

L’acronyme CODE pour Collabora Online Developpement Edition, en version community est le serveur qui permet aux applications « clientes », comme le plugin NextCloud, de se connecter et d’accéder aux fonctionnalités.

Pour voir comment l’installer rapidement sur un Gandi VPS et ainsi pouvoir y connecter votre plugin NextCloud, c’est par ici : Comment installer CODE sur un VPS GandiCloud ?