Installer nextcloud sur votre Raspberry Pi

Page mise à jour le : 04 décembre 2020

Introduction

Logo de NextCloud
Logo de NextCloud

Nextcloud propose sa plate-forme de collaboration de contenu open source et auto-hébergée, combinant ce qu’il décrit comme une interface utilisateur facile pour les solutions de cloud computing grand public avec les mesures de sécurité et de conformité dont les entreprises ont besoin.

Nextcloud offre un accès universel aux données via des interfaces mobiles, de bureau et web, ainsi que des fonctions de communication et de collaboration sécurisées de nouvelle génération sur site, comme l’édition de documents en temps réel, le chat et les appels vidéo, ce qui les place sous le contrôle direct de l’informatique et les intègre à l’infrastructure existante.

Site officiel : nextcloud.com
Documentation officiel : https://docs.nextcloud.com

Prérequis

Difficulté : moyen  –  Temps : 1h

  • Une Raspberry Pi 3b+ ou supérieur (La Raspberry Pi 4b est fortement recommandée)
  • Une carte SD de 16 Go ou plus
  • Raspberry Pi OS déjà installé
  • Une partition qui sera allouée au fichier data de nextcloud. Cela permet de faciliter l’ajout de HDD en cas de manque d’espace. (optionelle)
  • Deux ou trois tasses de café

Bien, maintenant que tout cela est prêt, nous pouvons commencer.

Installation

La première chose que nous devons faire, c’est installer un serveur Web. C’est lui qui va entrer en contact avec le navigateur du client. Il est là pour répondre aux requêtes qu’on lui donne. Il en existe une petite dizaine, mais les deux principaux sont :

  • Apache
  • Nginx

Nginx est connue pour sa capacité à gérer un grand nombre de connexions, ce qui l’a rendu très populaire. Il est d’ailleurs utilisé par la plupart des serveurs qui reçoivent plusieurs milliers de requêtes par seconde. Apache est le serveur Web le plus utilisé et personnalisable notamment avec les fichiers “.htaccess”.

Dans ce tutoriel, nous utiliserons Apache comme serveur Web pour des soucis de facilité.

Nous avons aussi besoin d’une base de données pour y stocker des informations comme les utilisateurs et les évènements du calendrier… Les plus connues sont Mysql et Mariadb.

Dans ce tutoriel, nous utiliserons Mariadb mais vous pouvez prendre Mysql si vous le désirez, les commandes étant 100% compatibles entre les deux logiciels.

Nous aurons aussi besoin de php, là rien à dire dessus.

Nous allons commencer par installer la base de donnée et le serveur Web :

apt-get install apache2 mariadb-server libapache2-mod-php7.3

Puis php et quelques modules :

apt-get install php7.3 php7.3-gd php7.3-json php7.3-mysql php7.3-curl php7.3-mbstring

apt-get install php7.3-intl php-imagick php7.3-xml php7.3-zip php7.3-gmp php7.3-bcmath

Apache2 Debian Default Page
Page Web par défaut après installation de Apache2

Nous allons vérifier qu’Apache s’est bien installé. Pour cela ouvrez votre naviguateur et tapez dans l’URL l’IP de votre serveur. Une page comme celle-ci devrait apparaître :Si ce n’est pas le cas, essayez de démarrer Apache avec sudo systemctl start apache2

Une fois installé, nous allons récupérer les fichiers Nextcloud.

Il suffit de se rendre sur cette page : https://nextcloud.com/install/#instructions-server et de faire un clic droit puis copier l’adresse lien.

Dans un terminal du serveur nous pouvons lancer la commande suivante :
wget https://download.nextcloud.com/server/releases/nextcloud-xxx.zip
(évidemment, utilisez la bonne adresse en remplaçant les “xxx” par la version idoine”)

Le fichier va alors se télécharger dans le répertoire où vous êtes.
Le fichier actuellement compressé est inutilisable, nous devons donc le décompresser et le changer de répertoire.

sudo unzip nextcloud-xxx.zip -d /var/www/

La commande unzip avec l’option -d permet d’extraire le fichier dans le répertoire donné, ici : /var/www/ qui est le dossier réservé aux sites-Web. Vous pouvez, si vous le souhaitez changer de répertoire, mais il n’y a pas d’obligation.
Maintenant que notre fichier est prêt, nous devons nous assurer qu’Apache puisse y avoir accès avec la commande suivante :
sudo chown -R www-data:www-data /var/www/

Configurer Apache

Nous devons commencer par activer quelques modules nécessaire au bon fonctionnement de Nextcloud.
a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime

Petite explication de chaques modules :

  • rewrite : Permet de modifier les URLs.
  • headers : Permet de modifier les en-têtes des requêtes et des réponses HTTP.
  • env : Permet de modifier les variables propre à Apache.
  • dir : Permet la redirection d’url qui se termine avec un répertoire sans slash.
  • mime : Associe des métadonnées à chaque type de fichier.

Une fois les modules activés, nous pouvons nous occuper de la configuration d’Apache. Les fichiers de configurations d’Apache se trouvent généralement dans /etc/apache2.

Nous allons éditer le fichier suivant /etc/apache2/sites-available/000-default.conf mais avant de faire cela nous allons le renommer, car en effet “000-default.conf” ne veut pas dire grand chose.

sudo mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/nextcloud.conf

(ou mv signifie “mouv” donc “déplace”)

puis

sudo nano /etc/apache2/sites-available/nextcloud.conf

afin d’éditer ce fichier de configuration nouvellement renommé.

Il devrait contenir quelque chose de similaire à ça :

<VirtualHost *:80>
 # The ServerName directive sets the request scheme, hostname and port that
 # the server uses to identify itself. This is used when creating
 # redirection URLs. In the context of virtual hosts, the ServerName
 # specifies what hostname must appear in the request's Host: header to
 # match this virtual host. For the default virtual host (this file) this
 # value is not decisive as it is used as a last resort host regardless.
 # However, you must set it for any further virtual host explicitly.
 #ServerName www.example.com 

 ServerAdmin Webmaster@localhost 
 DocumentRoot /var/www/html

 # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
 # error, crit, alert, emerg.
 # It is also possible to configure the loglevel for particular
 # modules, e.g.
 #LogLevel info ssl:warn

 ErrorLog ${apache_LOG_DIR}/error.log
 CustomLog ${apache_LOG_DIR}/access.log combined

 # For most configuration files from conf-available/, which are
 # enabled or disabled at a global level, it is possible to
 # include a line for only one particular virtual host. For example the
 # following line enables the CGI configuration for this host only
 # after it has been globally disabled with "a2disconf".
 #Include conf-available/serve-cgi-bin.conf
</VirtualHost *:80>
 # vim: syntax=apache ts=4 sw=4 sts=4 sr noet

La balise <VirtualHost *:80> spécifie à Apache d’écouter sur le port 80 (http).
Je vous laisse décommenter la ligne suivante : ServerName www.example.com et mettre votre nom de domaine si vous en avez un.
ServerAdmin Correspond à votre email. DocumentRoot est le répertoire de nos fichiers Web, ici c’est /var/www/nextcloud/
Vous devez donc avoir un fichier qui ressemble à cela :

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    ServerName www.domaine.com
    ServerAdmin admin@domaine.com
    DocumentRoot /var/www/nextcloud
    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn
    ErrorLog ${apache_LOG_DIR}/error.log
    CustomLog ${apache_LOG_DIR}/access.log combined
    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Nous avons aussi besoin de rajouter quelques petites règles supplémentaires pour la sécurité de notre serveur qui s’appliquera sur le port 80 (http) et 443 (https).Pour cela, nous allons rajouter quelques lignes au début de notre fichier de configuration.

Alias /nextcloud "/var/www/nextcloud/"
<Directory /var/www/nextcloud/>
Require all granted
AllowOverride All
Options FollowSymLinks MultiViews
<IfModule mod_dav.c>
Dav off
</IfModule>
</Directory>

Penser à modifier les valeurs en fonction de votre configuration.
Require all granted
Permet d’autoriser toute les IP à s’y connecter.
AllowOverride All
Indique qu’il y a des fichiers de configuration externe ( fichier .htaccess) qui sont présents et qu’Apache doit les lire.

Votre fichier ressemble maintenant à ça :

Alias /nextcloud "/var/www/nextcloud/"
<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews
  <IfModule mod_dav.c>
    Dav off
  </IfModule>
</Directory>

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    ServerName www.domaine.com
    ServerAdmin admin@domaine.com

    DocumentRoot /var/www/nextcloud

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.

    #LogLevel info ssl:warn

    ErrorLog ${apache_LOG_DIR}/error.log
    CustomLog ${apache_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Nous devons ensuite activer la nouvelle configuration avec :
a2ensite nextcloud.conf
Mais aussi redémarrer le service Apache pour appliquer les changements :
sudo systemctl restart apache2

Maintenant que la configuration d’Apache est finie (pour le moment) nous pouvons nous attaquer à mariadb 🙂

Configurer Mariadb

Maintenant que la configuration d’Apache nous pouvons nous attaquer à mariadb 🙂
Nous allons commencer par terminer la configuration de mariadb avec la commande ci-dessous :
mysql_secure_installation

Mysql va alors nous poser tout un tas de question auquel il va falloir répondre.
Set root password? [Y/n] :
Y

Remove anonymous users? [Y/n] :
Y

Disallow root login remotely? [Y/n] :
Y

Remove test database and access to it? [Y/n] :
Y

Reload privilege tables now? [Y/n] :
Y

Voici le résumé des réponses :

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

Nous avons aussi besoin de créer un autre utilisateur spécifique à Nextcloud. Rentrons pour cela dans mysql en rentrant simplement :  mysql

Puis nous pouvons créer l’utilisateur avec :
CREATE USER 'nextcloud_user'@'localhost' IDENTIFIED BY
'password';

Bien sûr, n’oubliez pas de changer de mot de passe 🙂

Puis la base de donnée :
CREATE DATABASE IF NOT EXISTS nextcloud_db CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci;

Puis nous donnons les droits à notre utilisateur Nextcloud :
GRANT ALL PRIVILEGES ON nextcloud_db.* TO 'nextcloud_user'@'localhost';

Et, enfin, on applique les changements :
FLUSH PRIVILEGES;

Configurer Nextcloud

Bien, maintenant il ne reste plus qu’à nous connecter sur notre site Web 🙂
Rentrer l’adresse IP de votre serveur dans votre naviguateur et… magie cette page devrait apparaître :

Page de configuration de NextCloud
Page de configuration de NextCloud

Si c’est le cas bravo … sinon … c’est que vous avez loupé un truc. 🙂

Là, rien de plus simple. Entrez votre nouvel identifiant et mot de passe (Ce compte est un compte administrateur. Ne l’utilisez pas comme un compte personnel !!)
Pour le dossier data, deux possibilitées :
Soit vous avez créé une autre partition pour le dossier data, dans ce cas changez le répertoire du dossier (N’oubliez pas de donner les droits à Apache avec sudo chown -R www-data:www- data /votre/partition !!) ou sinon vous pouvez laisser par défaut.

Pour le reste, mettez les infos qu’il nous demande :
Utilisateur de la base de donnée : nextcloud_user
Mot de passe de l'utilisateur : password
Nom de la base de donnée : nextcloud_db

Ce n’est là qu’un exemple, mettez les informations que vous avez défini plus haut !! Une fois complété, vous pouvez valider. Remarquez que Nextcloud vous demande si vous voulez installer des plugins comme le calendrier, only-office et autre ; à vous de choisir.

Roulement de tambour …

Première connexion à NextCloud
Première connexion à NextCloud

OUI !!!!!
Cependant ce n’est que le commencement 🙂

Configurer le cache

Pour que Nextcloud soit plus performant, il est recommandé de configurer une mémoire cache. Elle permet de faciliter l’accès aux fichiers dans le temps.
Pour cela il suffit d’installer le module php suivant : php-apcu
Puis de rajouter cette ligne 'memcache.local' => '\OC\Memcache\APCu', dans le config.php présent dans la racine de votre installation dans le dossier config, soit
/var/www/nextcloud/config/config.php dans notre exemple.

Le fichier config.php est un fichier de configuration, c’est là où tous les paramètres de Nextcloud comme la base de donnée utilisé, le serveur smpt pour l’envoi d’email et encore plein d’autres paramètres y sont stockés.
Puis sudo systemctl restart apache2 pour appliquer.

Basculer en https

Comme vous avez pu le remarquer, il y a en haut à gauche dans votre naviguateur un petit message vous indiquant que votre connection n’est pas sécurisée. En effet pour le moment toute les informations circulent en clair, ce qui veut dire que, dans la théorie, tout le monde peut voir ce qui ce passe. Ce qui n’est pas franchement génial.
La solution : passer en https afin de rendre illisible l’information afin que personne ne puisse la lire.
Nous allons commencer par activer le module ssl dans Apache :
a2enmod ssl
Puis modifier le fichier /etc/apache2/site-available/000-default.conf et rajouter la ligne suivante :

Redirect permanent / https://votre-ip-ou-nom-de-domaine/

Redirect permanent va permettre de rediriger le flux http vers l’https, ainsi si un utilisateur rentre l’adresse du serveur sans le https celui-ci sera redirigé dessus.

La ligne ci-dessous nous intéressant plus, nous pouvons la commenter (ajouter #)

#DocumentRoot /var/www/nextcloud

Votre fichier doit maintenant ressembler à ceci :

Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews
  <IfModule mod_dav.c>
    Dav off
  </IfModule>

</Directory>

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    ServerName www.domaine.com
    ServerAdmin admin@domaine.com
    Redirect permanent / https://127.0.0.1/
    #DocumentRoot /var/www/nextcloud
    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn
    ErrorLog ${apache_LOG_DIR}/error.log
    CustomLog ${apache_LOG_DIR}/access.log combined
    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Bien, nous avons fait une redirection, mais elle pointe nul part, ce n’est pas très pratique 🙂

Pour une configuration https Apache nous donne un exemple dans

/etc/apache2/site-available/default-ssl.conf

nous n’allons pas l’utiliser directement, mais nous allons nous en inspirer.
Vous pouvez l’ouvrir avec :
nano /etc/apache2/site-available/default-ssl.conf

Vous devriez avoir ceci :

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin Webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${apache_LOG_DIR}/error.log
CustomLog ${apache_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
# Server Certificate Chain:
# Point SSLCertificateChainFile at a file containing the
# concatenation of PEM encoded CA certificates which form the
# certificate chain for the server certificate. Alternatively
# the referenced file can be the same as SSLCertificateFile
# when the CA certificates are directly appended to the server
# certificate for convinience.
#SSLCertificateChainFile /etc/apache2/ssl.crt/server-ca.crt
# Certificate Authority (CA):
# Set the CA certificate verification path where to find CA
# certificates for client authentication or alternatively one
# huge file containing all of them (file must be PEM encoded)
# Note: Inside SSLCACertificatePath you need hash symlinks
# to point to the certificate files. Use the provided
# Makefile to update the hash symlinks after changes.
#SSLCACertificatePath /etc/ssl/certs/
#SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt
# Certificate Revocation Lists (CRL):
# Set the CA revocation path where to find CA CRLs for client
# authentication or alternatively one huge file containing all
# of them (file must be PEM encoded)
# Note: Inside SSLCARevocationPath you need hash symlinks
# to point to the certificate files. Use the provided
# Makefile to update the hash symlinks after changes.
#SSLCARevocationPath /etc/apache2/ssl.crl/
#SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl

# Client Authentication (Type):
# Client certificate verification type and depth. Types are
# none, optional, require and optional_no_ca. Depth is a
# number which specifies how deeply to verify the certificate
# issuer chain before deciding the certificate is not valid.
#SSLVerifyClient require
#SSLVerifyDepth 10

# SSL Engine Options:
# Set various options for the SSL engine.
# o FakeBasicAuth:
# Translate the client X.509 into a Basic Authorisation. This means that
# the standard Auth/DBMAuth methods can be used for access control. The
# user name is the `one line' version of the client's X.509 certificate.
# Note that no password is obtained from the user. Every entry in the user
# file needs this password: `xxj31ZMTZzkVA'.
# o ExportCertData:
# This exports two additional environment variables:
SSL_CLIENT_CERT and
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
# server (always existing) and the client (only existing when client
# authentication is used). This can be used to import the certificates
# into CGI scripts.
# o StdEnvVars:
# This exports the standard SSL/TLS related `SSL_*' environment
# Notice: Most problems of broken clients are also related to the HTTP
# keep-alive facility, so you usually additionally want to disable
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
# "force-response-1.0" for this.
# BrowserMatch "MSIE [2-6]" \
# nokeepalive ssl-unclean-shutdown \
# downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noe
<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ...
        SSLEngine on
        ...
    </VirtualHost>
</IfModule>

Nous retrouvons un VirtualHost mais qui écoute sur le port 443 (https) et la balise <IfModule mod_ssl.c> qui permet d’initialiser le module ssl. Nous retrouvons aussi la directive SSLEngine on pour activer le support de ssl.

Je vous laisse ajouter tout cela à votre nextcloud.conf en n’oubliant pas de rajouter votre DocumentRoot, ServerName et ServerAdmin.

Bien que votre serveur fonctionne en https il est loin d’être entièrement sécurisé, en effet il reste compatible avec de vieux algorithmes de chiffrement qui ne sont plus utilisé aujourd’hui, leur niveau de sécurité étant trop faible. Pour remédier à cela je vous invite à visiter le site ssl-config.mozilla, pour vous aider à renforcer la sécurité de votre serveur.

Dans le cas d’une configuration moderne quelques ligne nous sont pour le moment inconnues.

Protocols h2 http/1.1

Cette ligne permet simplement de spécifier à Apache d’utiliser HTTP/2 et s’il n’est pas disponnible HTTP/1.1.

 Header always set Strict-Transport-Security "max-age=63072000"

Cette ligne spécifie aux clients de n’accepter aucune connexion en http et ainsi éviter les attaques du type “main in the middle”

# modern configuration
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLHonorCipherOrder     off
SSLSessionTickets       off

Nous autorisons uniquement les protocoles les plus forts en excluant SSLv3 TLSv1 TLSv1.1 TLSv1.2.

Votre fichier nextcoud.conf doit maintenant ressembler à cela :

Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>

</Directory>

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    ServerName www.domaine.com    

    Redirect permanent / https://votre-ip-ou-nom-de-domaine/

    ServerAdmin admin@domaine.com
    #DocumentRoot /var/www/nextcloud

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${apache_LOG_DIR}/error.log
    CustomLog ${apache_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>

        SSLEngine on

        Protocols h2 http/1.1

        Header always set Strict-Transport-Security "max-age=63072000"

        ServerName www.domaine.com
        ServerAdmin admin@domaine.com

        DocumentRoot "/var/www/nextcloud/"

        ErrorLog ${apache_LOG_DIR}/error.log
        CustomLog ${apache_LOG_DIR}/access.log combined

        SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

    </VirtualHost>
</IfModule>

# modern configuration
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLHonorCipherOrder     off
SSLSessionTickets       off

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Rechargez la configuration avec : sudo systemctl restart apache2

Configurer Fail2ban (optionelle)

Si vous décidez de rendre accessible votre serveur depuis l’extérieur il est fortement probable qu’il devienne une cible pour des personnes malveillantes. Pour se prémunir contre d’éventuelles attaques de ce type nous allons utiliser le logiciel Fail2ban qui utilise les tables iptables pour bannir les éventuelles IPs qui chercheraient à se connecter de manière répétée et avec sans succès.

Dans un premier temps, nous devons installer le logiciel :

sudo apt install fail2ban

Nous allons maintenant créer le filtre de configuration propre à nextcloud :

nano /etc/fail2ban/filter.d/nextcloud.conf

Et y mettre ceci :

[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"

Cela permet de définir les règles de bannissement pour identifier les authentifications ratées depuis les logs de nextcloud. Cela s’applique pour l’interface Web, WebDav et les sous domaine non autorisés.

Nous devons maitenant créer un autre fichier pour définir les règles du bannisement.

nano /etc/fail2ban/jail.d/nextcloud.conf

Pour y mettre :

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /var/www/nextcloud/data/nextcloud.log

Ici, rien à modifier, sauf si vous utilisez des ports différents. Le bantime est le temps que le serveur sera indisponible pour l’attaquant, ici 86400s soit 24h. Le findtime correspond au nombre d’essais maximum (maxretry) sur la pèriode défini.

Nous pouvons appliquer les changements avec :

sudo systemctl restart fail2ban

Bien, nous pouvons vérifier que tout fonctionne correctement avec :

fail2ban-client status nextcloud

Nous en avons finit avec fail2ban, il est temps de nous rendre sur notre serveur depuis le navigateur.

Vous pouvez (maintenant) vous connecter à votre serveur en https.

Image montrant une erreur du fait du certificat auto-signé
Avertissement en lien avec le certificat auto-signé

Oups !!!

Non, c’est normal ! Et oui, nous sommes avec un certificat auto-signé c’est donc à nous de le certifier. Nous avons juste besoin d’aller dans “avancé” puis accepter le certificat. Et voilà nous somme sur Nextcloud en https.

Problèmes connus

  • database is missing some indexes
The database is missing some indexes. Due to the fact that adding
indexes on big tables could take some time they were not added
automatically. By running "occ db:add-missing-indices" those missing
indexes could be added manually while the instance keeps running.
Once the indexes are added queries to those tables are usually much faster.
- Missing index "calendarobject_calid_index" in table "oc_calendarobjects_props".
- Missing index "schedulobj_principuri_index" in table "oc_schedulingobjects".

Exécutez la commande suivante :
sudo -u www-data php /votre/dossier/nextcloud/occ db:add-missing-indices

  • Some columns in the database are missing
Some columns in the database are missing a conversion to big int.
Due to the fact that changing column types on big tables could take some
time they were not changed automatically. By running 'occ db:convert-filecache-
bigint'
those pending changes could be applied manually. This operation needs to
be made while the instance is offline. For further details read the
documentation page about this.

    mounts.storage_id
    mounts.root_id
    mounts.mount_id

Exécutez la commande suivante :
sudo -u www-data php /votre/dossier/nextcloud/occ db:convert-filecache-bigint

  • PHP memory limit is below
The PHP memory limit is below the recommended value of 512MB.

Editer le fichier suivant /etc/php/7.3/apache2/php.ini, chercher la ligne memory_limit (CTRL + w avec nano) puis remplacer la valeur par 512M.
Redémarrer Apache avec :
sudo systemctl restart apache2

Aller plus loin

Nextcloud depuis l’extérieur

Avoir accès à votre serveur Nextcloud en local c’est bien, mais depuis l’extérieur c’est mieux. 🙂
Ce n’est pas ici l’objet de ce tuto de vous montrer comment faire, car les manipulation varie en fonction de votre opérateur et des box. Une chose est sûre, c’est qu’il faut ouvrir les ports 80/tcp et 443/tcp dans les tables NAT/PAT, avoir une IP statique afin d’éviter de se connecter chez le voisin à chaque fois que votre box redémarre (c’est un service qui peut être payant selon votre opérateur) et n’oubliez pas d’autoriser l’IP dans le config.php de votre serveur Nextcloud.

Certifier le certificat

Bien, maintenant que votre serveur fonctionne à merveille, vous voudriez peut-être le rendre plus facile d’accès. Par exemple quand vous vous connectez, autoriser à chaque fois le certificat peut-être redondant, dans ce cas la certification du certificat s’impose. Là encore ce n’est pas le but de ce tuto de vous montrer comment faire mais il y a des solutions comme Let’s encrypt qui le propose gratuitement. Je vous renvoie vers ce tuto : tutoriel:securiser_apache2_avec_ssl [Wiki ubuntu-fr]

Toujours plus d’espace

Même s’ il éxiste des cartes SD de 250 Go, un jour vous vous sentirez sûrement à l’étroit. Il éxiste des outils comme mhddfs qui vont vous permettre de fusionner les partitions entre-elles. Je vous renvoie vers ce tuto pour plus d’informations : Mhddfs – Combine Several Smaller Partition into One Large Virtual Storage

Fin 🙂

4 commentaires à propos de “Installer nextcloud sur votre Raspberry Pi”

  1. Si c’est le cas bravo … sinon … c’est que vous avez loupé un truc. => les droits le répertoire et les sous-répertoires via /var/www/nextcloud
    sinon impossible d’avoir cette écran 😉

    Sinon merci pour le tuto.
    @++

    • Bonjour Patrice,
      Merci pour ce complément d’information.
      Personnellement, je n’ai pas testé ce tuto puisque j’utilise NextCloud … mais … via YunoHost qui est vraiment un truc génial.
      Comme ça j’ai un nom de domaine en https qui pointe vers un seul serveur servant à NextCloud, à Ampache, à …
      @+

Laisser un commentaire

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

*