Installer nextcloud sur votre Raspberry Pi

Page mise à jour le : 18 juillet 2021

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 4b
  • 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 (optionnel).
  • 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 install apache2 mariadb-server libapache2-mod-php7.3 openssl

Puis php et quelques modules :

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

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

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 :

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

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, il n’y a pas d’obligation, mais je vous recommande ce répertoire.
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/nextcloud

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 chaque module :

  • 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 propres à 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>
 # 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 ou votre IP dans le cas contraire.
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 doit ressembler à cela (j’ai supprimé les commentaires pour plus de visibilité) :

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>

    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

</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Puis nous activons notre configuration et redémarrons le service Apache pour appliquer les changements :
a2ensite nextcloud.conf #Permet d’activer notre fichier de configuration
sudo systemctl restart apache2 #Redémarre Apache

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

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

Set root password? [Y/n] Y
New password:
Re-enter new password:
 ... Success!
Remove anonymous users? [Y/n] Y
 ... Success!
Disallow root login remotely? [Y/n] Y
 ... Success!

Remove test database and access to it? [Y/n] Y
 ... Success!

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és :
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 ces informations complétées, 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ée, le serveur smpt pour l’envoi d’e-mail 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 (la chiffrer) afin que personne ne puisse la lire.

Générer une paire de clés publiques/privées

Commençons par générer une paire de clés RSA de 2 048 bits. Une clé plus petite, telle que 1 024 bits, n’est pas suffisamment résistante aux attaques par force brute. Une clé plus grande, telle que 4 096 bits, est exagérée.
Au fil du temps, la taille des clés augmente à mesure que le traitement informatique devient moins cher. 2 048 bits est actuellement la taille idéale.
Source : Enabling HTTPS on Your Servers
La commande pour générer la paire de clés RSA est la suivante :
openssl genrsa -out www.example.com.key 2048

Générer une demande de signature de certificat

Dans cette étape, nous intégrons notre clé publique et des informations sur notre organisation et notre site Web dans une demande de signature de certificat ou CSR. La commande openssl nous demande de manière interactive les métadonnées requises.
openssl req -new -sha256 -key www.example.com.key -out www.example.com.csr
Puis nous vérifions notre fichier avec :
openssl req -text -in www.example.com.csr -noout

La sorti doit ressembler à cela :

Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = FR, ST = FR, L = FR, O = FR, OU = FR, CN = FR,
emailAddress = FR
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public-Key: (2048 bit)
            Modulus:
                00:b0:81:14:f7:f4:8a:2a:21:7d:d0:01:64:d4:11:
                3e:08:f8:82:a0:53:7c:c7:76:f7:e5:aa:31:7c:d1:
                54:00:63:90:d3:9a:da:c9:35:e2:48:c5:4f:d6:df:
                6a:f1:61:8a:c5:6f:fb:c6:34:a7:3e:81:6d:3a:63:
                8f:02:e8:09:24:3e:a0:f5:58:53:97:d6:ff:41:7b:
                07:5b:33:69:ce:fc:9c:d8:ef:21:6f:86:06:11:99:
                25:d6:35:1e:2a:f5:86:a8:a7:a5:8f:80:33:50:f4:
                37:4e:8c:c5:06:4a:8c:78:fc:8e:2e:ad:1e:b7:a4:
                70:e0:f6:95:d4:90:4a:85:f9:1a:99:71:0b:a8:39:
                e0:f9:88:93:fe:71:f8:cc:b3:7c:bb:33:11:c8:76:
                ca:15:ed:92:68:41:98:1b:2e:49:19:08:84:a6:67:
                5a:df:23:6c:23:14:7f:2e:7b:d3:f5:99:e9:da:36:
                c2:99:af:09:06:4b:44:71:76:30:66:35:a0:c6:1d:
                a5:34:5f:d2:37:4d:48:e8:b5:c7:b1:e2:62:c6:80:
                74:4e:e5:f1:13:ec:c0:d5:e2:79:10:b4:2f:68:34:
                42:4c:fb:1f:f5:6f:30:4b:9b:9d:f4:a9:9f:4c:dc:
                98:28:c4:f0:b4:92:05:65:ef:5d:57:33:e3:d4:e1:
                ac:2d
...

Et enfin nous générons le certificat auto-signé valable pendant 365 jours :

sudo openssl x509 -req -days 365 -in www.example.com.csr -signkey
www.example.com.key -out www.example.com.crt

Maintenant, que nous avons généré notre certificat, nous pouvons le mettre en lieu sûr.

sudo cp www.example.com.crt /etc/ssl/www_example/www.example.com.crt
sudo cp www.example.com.key /etc/ssl/www_example/www.example.com.key

Vous pouvez noter les chemins, car nous devrons les renseigner un peu plus tard dans le fichier de configuration d’Apache.

Activer HTTPS sur notre serveur

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 ne 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>

    ServerName www.domaine.com
    Redirect permanent / https://votre-ip-ou-nom-de-domaine/
    ServerAdmin admin@domaine.com

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

</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 variables. 
        #     Per default this exportation is switched off for performance reasons, 
        #     because the extraction step is an expensive operation and is usually 
        #     useless for serving static content. So one usually enables the
        #     exportation for CGI and SSI requests only.
        #   o OptRenegotiate:
        #     This enables optimized SSL connection renegotiation handling when SSL 
                   #     directives are used in per-directory context.
                   #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
                   <FilesMatch "\.(cgi|shtml|phtml|php)$">
               SSLOptions +StdEnvVars
                  </FilesMatch>
                  <Directory /usr/lib/cgi-bin>
              SSLOptions +StdEnvVars
                  </Directory>
                  #   SSL Protocol Adjustments:
                  #   The safe and default but still SSL/TLS standard compliant shutdown
                  #   approach is that mod_ssl sends the close notify alert but doesn't wait for 
        #   the close notify alert from client. When you need a different shutdown 
        #   approach you can use one of the following variables:
        #   o ssl-unclean-shutdown:
        #     This forces an unclean shutdown when the connection is closed, i.e. no 
        #     SSL close notify alert is send or allowed to received.  This violates 
        #     the SSL/TLS standard but is needed for some brain-dead browsers. Use 
        #     this when you receive I/O errors because of the standard approach where
        #     mod_ssl sends the close notify alert.
        #   o ssl-accurate-shutdown:
        #     This forces an accurate shutdown when the connection is closed, i.e. a
        #     SSL close notify alert is send and mod_ssl waits for the close notify
        #     alert of the client. This is 100% SSL/TLS standard compliant, but in
        #     practice often causes hanging connections with brain-dead browsers. Use
        #     this only for browsers where you know that their SSL implementation
        #     works correctly.

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

Par défaut HTTP/2 n’est pas activé nous allons donc devoir l’activer un peu plus tard.

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

Utilisez Strict Transport Security pour indiquer aux clients qu’ils doivent toujours se connecter à votre serveur via HTTPS, même lorsqu’ils suivent une référence http://. Cela permet de déjouer des attaques telles que le SSL Stripping et d’éviter le coût de l’aller-retour de la redirection 301.

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

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

Je vous laisse ici modifier le chemin de vos clés que nous avons généré précédemment. Si je reprends l’exemple au-dessus de cela, donne :

SSLCertificateFile    /etc/ssl/www_example/www.example.com.crt
SSLCertificateKeyFile /etc/ssl/www_example/www.example.com.key

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>
    ServerName www.domaine.com
    Redirect permanent / https://votre-ip-ou-nom-de-domaine/
    ServerAdmin admin@domaine.com
    #DocumentRoot /var/www/nextcloud
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</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/www_example/www.example.crt
        SSLCertificateKeyFile /etc/ssl/www_example/www.example.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
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.

Signer 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]

!! Vous devez avoir un nom de domaine au préalable !!

Activer HTTP2 (optionnelle)

Les principaux objectifs de HTTP/2 sont de réduire la latence en permettant le multiplexage complet des demandes et des réponses, de minimiser la surcharge du protocole par une compression efficace des champs d’en-tête HTTP et d’ajouter la prise en charge de la hiérarchisation des demandes et du push serveur. Il existe un grand nombre d’autres améliorations du protocole, telles que de nouveaux mécanismes de contrôle de flux, de traitement des erreurs et de mise à niveau.

Source : [Introduction to HTTP/2](Introduction to HTTP/2 | Web Fundamentals | Google Developers)

Dans un premier temps, nous devons désactiver quelques modules qui ne sont pas compatibles avec HTTP2.

sudo a2dismod php7.3

Par défaut, Apache utilise le module MPM (module multi-processus) prefork. Ce MPM (module multi-processus) n’est pas compatible avec HTTP/2, nous devons donc le remplacer par le module mpm_event, plus moderne.

sudo a2enmod mpm_prefork
sudo a2enmod mpm_event 
sudo a2enmod php7.3-fpm
sudo a2enmod proxy_fcgi
sudo a2enmod http2
sudo systemctl restart apache2

Si vous obtenez une erreur essayé de redémarrer votre Raspberry Pi.

Expliquation des modules : prefork et event

Prefork

Ce module multi-processus (MPM) implémente un serveur web avec démarrage anticipé de processus. Chaque processus du serveur peut répondre aux requêtes entrantes, et un processus parent contrôle la taille du jeu de processus enfants. C’est également le MPM le plus approprié si l’on veut isoler les requêtes les unes des autres, de façon à ce qu’un problème concernant une requête n’affecte pas les autres.

Source : [Apache](prefork – Serveur HTTP Apache Version 2.4)

Event

Le module multi-processus (MPM) event est conçu pour permettre le traitement d’un nombre accru de requêtes simultanées en déléguant certaines tâches aux threads d’écoute, libérant par là-même les threads de travail et leur permettant de traiter les nouvelles requêtes.

Source : [Apache](event – Serveur HTTP Apache Version 2.4)

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.

Voici un lien pour plus d’informations : https://doc.ubuntu-fr.org/fail2ban.

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éfinie.

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.

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

  • Module php-imagick
Module php-imagick in this instance has no SVG support. For better
compatibility it is recommended to install it.

Exécutez la commande suivante :

sudo apt install libmagickcore-6.q16-6-extra
  • Module php-imagick
Your installation has no default phone region set.
This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add "default_phone_region" with the respective ISO 3166-1 code ↗ of the region to your config file.

Editer le fichier suivant /var/www/nextcloud/config/config.php, et ajouter cette ligne :

 'default_phone_region' => 'FR'

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.

Toujours plus d’espace

Même s’il existe des cartes SD de 250 Go, un jour vous vous sentirez sûrement à l’étroit. Il existe 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 🙂

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

  1. Bonjour,
    Merci beaucoup pour le tuto j’ai enfin réussi grâce a lui a installer nextcloud du premier coup.
    J’ai une question avec du retard j’aurais du le faire avant l’installation. Je voudrais utiliser un autre port d’écouter que le 80 pour pouvoir utiliser nginx-proxy-manager qui lui doit écouter sur le 80 et 443, est ce qu’il me suffit de modifier la ligne dans /etc/apache2/sites-available/nextcloud.conf ? ou cela va être beaucoup plus compliqué que ça ?

    • Bonjour David !
      Merci pour votre retour !

      Oui, il suffit simplement de modifier le port dans : /etc/apache2/sites-available/nextcloud.conf et le remplacer par celui souhaité. N’oubliez pas de changer aussi la ligne suivante : Redirect permanent / https://votre-ip-ou-nom-de-domaine/:
      Faut supprimer les .

      Si cela ne fonctionne pas ou si vous avez des questions n’hésitez pas à répondre à ce message.

      • Merci Adrien pour la confirmation.
        Une fois fait j’avais une erreur, en cherchant j’ai vu qu’il faut aussi modifier un autre fichier.
        Si cela peut aider d’autre personne je post ici la solution.
        1 – Modif ports.conf
        sudo nano /etc/apache2/ports.conf
        Modifiez les numéros de port selon les besoins ou ajoutez de nouveaux
        2 – Modif nextcloud.conf
        sudo nano /etc/apache2/sites-available/nextcloud.conf
        Modifiez la ligne VirtualHost *:80 par les mêmes port que le fichier précèdent.
        3 – Redémarrer Apache
        sudo service apache2 restart

        Merci encore pour le Tuto

  2. Bonjour,

    J’ai suivi votre tuto à la lettre, sauf pour le /var/www/ que j’ai remplacé par /media/pi/…, pour pouvoir stocker Nextcloud directement sur un SSD branché en USB, sur mon Raspberry pi 4.

    Cependant lorsque j’arrive au “Si c’est le cas bravo … sinon … c’est que vous avez loupé un truc.”, bah j’arrive sur la page d’accueil de desbian, en tapant ip/nextcloud dans mon navigateur, j’ai l’erreur 403 “You don’t have permission to access this resource.Server unable to read htaccess file, denying access to be safe”, déclarant qu’apache n’a pas accès au fichier .htaccess de Nextcloud.
    J’ai réussi à trouver le fichier .httaccess dans le répertoire nextcloud sur mon SSD, auquel j’ai donné le droit à Apache, par la commande “sudo chown -R www-data:www-data /media/pi/…/nextcloud .

    Merci d’avance par l’aide que vous m’apporterez,

    Cordialement

    • Bonjour Aubin !

      Merci beaucoup pour votre retour !

      Il semblerait que le problème vienne de la configuration d’Apache, est-il possible d’avoir le fichier ? Afin de vous aider à résoudre votre problème.

      Cordialement,
      Adrien

  3. J’adore la phrase.
    Si c’est le cas bravo … sinon … c’est que vous avez loupé un truc.

    En faite rien ne marche.
    Une fois arriver sur l’écran de création d’un compte administrateur on rentre les infos suivante
    – Utilisateur de la base de donnée :
    – Mot de passe de l’utilisateur :
    – Nom de la base de donnée : nextcloud_db
    localhost
    – dossier /var/www/nexcloud/data

    – On clique sur validé
    – On attend un peu et il nous met sur la page login
    – On rentre notre nom utilisateur administrateur créer précédemment
    – On rentre le mot de passe utilisateur administrateur créer précédemment
    – On clique sur se connecter

    Et résultat ben rien il nous redemande de s’identifié

    • Oui je copie colle la ligne :
      CREATE USER ‘nextcloud_user’@’localhost’ IDENTIFIED BY ‘password’;
      et je remplace “password” par mon mot de passe.

      Je précise qu’avant de rentrer dans mysql je dois taper :
      sudo su

      Sinon il me dit que je n’ai pas les droits de superutilisateur, je ne sais pas si cela a une importance

      Je répond aussi à Alban avec ce message

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

    Bah j’ai louper un truc, j’ai une erreur à l’étape pour créé un utilisateur : “ERROR 1396 (HY000): Operation CREATE USER failed for ‘nextcloud_user’@’localhost’

    Que faire ?

    • Salut,

      Je pense que l’erreur vient de cette ligne qui doit bien être complète et se terminer par “;”
      CREATE USER 'nextcloud_user'@'localhost' IDENTIFIED BY 'password';

      Redis-nous,

  5. 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 e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.