Création d'un service de cloud personnel avec Nextcloud

Cette documentation est basée sur les articles suivants :

Si comme moi, vous préférez héberger votre propre cloud personnel plutôt que de faire appel à des services tels que Google Drive ou Microsoft OneDrive, je vous propose dans cet article d'installer une solution Nextcloud sur votre serveur. Nous verrons également comment synchroniser vos agendas et carnets d'adresses avec vos différents équipements.

Notre serveur utilisera Debian 11. La partie téléphone mobile se fera sur Android 12. Le serveur sera accessible via l'URL https://cloud.example.com.

Installation du serveur Nextcloud

Ajouter la ligne suivante au fichier /etc/hosts :

127.0.0.1   cloud.example.com
127.0.0.1   office.example.com

Installer le serveur Web et le serveur de base de données :

apt -y install apache2 mariadb-server php libapache2-mod-php php-curl php-gd php-json php-mbstring php-xml php-zip php-mysql php-bz2 php-intl php-apcu php-bcmath php-gmp php-imagick imagemagick

Modifier les lignes suivantes dans le fichier /etc/apache2/conf-enabled/security.conf :

ServerTokens Prod
ServerSignature Off
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

Télécharger et installer le serveur Nextcloud :

wget -O /tmp/nextcloud.tar.bz2 https://download.nextcloud.com/server/releases/latest.tar.bz2
cd /var/www/html
tar xjvf /tmp/nextcloud.tar.bz2
chown -R www-data:www-data /var/www/html/nextcloud
mkdir /var/www/html/office

Créer le fichier de configuration /etc/apache2/sites-available/nextcloud.conf :

<VirtualHost *:80>
	DocumentRoot /var/www/html/nextcloud/
	ServerName cloud.example.com

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

		<IfModule mod_dav.c>
			Dav off
		</IfModule>
		
		<IfModule mod_headers.c>
			Header always set Referrer-Policy "strict-origin"
			Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
		</IfModule>
	</Directory>
</VirtualHost>

Créer le fichier de configuration /etc/apache2/sites-available/office.conf :

<VirtualHost *:80>
        ServerAdmin antoine@example.com
        ServerName  office.example.com

        DocumentRoot /var/www/html/office

        AllowEncodedSlashes NoDecode

        SSLProxyEngine On
        ProxyPreserveHost On

        SSLProxyVerify None
        SSLProxyCheckPeerCN Off
        SSLProxyCheckPeerName Off

        ProxyPass           /browser https://127.0.0.1:9980/browser retry=0
        ProxyPassReverse    /browser https://127.0.0.1:9980/browser
        ProxyPass           /hosting/discovery https://127.0.0.1:9980/hosting/discovery retry=0
        ProxyPassReverse    /hosting/discovery https://127.0.0.1:9980/hosting/discovery
        ProxyPass           /hosting/capabilities https://127.0.0.1:9980/hosting/capabilities retry=0
        ProxyPassReverse    /hosting/capabilities https://127.0.0.1:9980/hosting/capabilities
        ProxyPassMatch      "/cool/(.*)/ws$"      wss://127.0.0.1:9980/cool/$1/ws nocanon
        ProxyPass           /cool/adminws wss://127.0.0.1:9980/cool/adminws
        ProxyPass           /cool https://127.0.0.1:9980/cool
        ProxyPassReverse    /cool https://127.0.0.1:9980/cool
        ProxyPass           /lool https://127.0.0.1:9980/cool
        ProxyPassReverse    /lool https://127.0.0.1:9980/cool

        <Directory /var/www/html/office>
                Options -Indexes +FollowSymLinks +MultiViews -Includes -ExecCGI
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>

Activer la configuration et les modules nécessaires :

a2ensite nextcloud.conf
a2enmod headers
a2enmod env
a2enmod rewrite
a2enmod dir
a2enmod mime
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_connect
a2enmod proxy_wstunnel

Modifier les lignes suivantes dans le fichier /etc/php/7.4/apache2/php.ini :

memory_limit = 512M

Ajouter la ligne suivante au fichier /etc/php/7.4/cli/php.ini :

apc.enable_cli = 1

Redémarrer Apache :

service apache2 restart

Nous allons créer la base de données. Pour cela, exécuter la commande suivante pour lancer un terminal SQL :

mysql -u root

Créer la base de données en modifiant son mot de passe :

CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'MonMotDePasseBaseDeDonnees';
GRANT ALL ON nextcloud.* TO 'nextcloud'@'localhost';
EXIT;

Finaliser l'installation du serveur Nextcloud. Pour cela, aller sur http://cloud.example.com à l'aide de votre navigateur Web et compléter les champs comme suit :

Créer un compte administrateur
Saisir un identifiant et un mot de passe
Répertoire des données
/var/www/html/nextcloud/data
Utilisateur de la base de données
nextcloud
Mot de passe de la base de données
Le mot de passe de la base de données
Nom de la base de données
nextcloud
Hôte de la base de données
localhost
Installer les applications recommandées
Oui

Pour raccourcir les URL de partage, ajouter les deux lignes suivantes au fichier /var/www/html/nextcloud/config/config.php avant la parenthèse fermante :

'overwrite.cli.url' => 'http://cloud.example.com/',
'htaccess.RewriteBase' => '/',

Puis, exécuter la commande suivante :

sudo -u www-data php /var/www/html/nextcloud/occ maintenance:update:htaccess

Ajouter l'indicatif régional et le cache mémoire dans le fichier /var/www/html/nextcloud/config/config.php avant la parenthèse fermante :

'default_language' => 'fr_FR',
'default_phone_region' => 'FR',
'memcache.local' => '\OC\Memcache\APCu',

Nous allons modifier la configuration des tâches de fond. Pour cela, aller sur http://cloud.example.com/settings/admin et cocher Cron.

Éditer la crontab de www-data :

crontab -u www-data -e

Ajouter la ligne suivante et sauvegarder :

*/5 * * * * php -f /var/www/html/nextcloud/cron.php

Toujours sur la page http://cloud.example.com/settings/admin, à la rubrique Serveur e-mail, paramétrer un compte courriel. Vous pouvez utiliser n'importe quel compte courriel ou créer votre propre serveur courriel.

Création du certificat SSL par Let's Encrypt

Si vous n'avez pas encore de certificat SSL, vous pouvez utiliser les certificats SSL gratuits fournis par Let's Encrypt. C'est ce que nous allons détailler ici.

Installer certbot :

apt install certbot python3-certbot-apache

Lancer certbot et suivre les instructions :

certbot --redirect --apache

Activer le renouvellement automatique du certificat en éditant la crontab de root :

crontab -e

Ajouter la ligne suivante (ici, la commande est exécutée tous les dimanches à 3 heures du matin) :

0 3 * * 0 certbot renew

L'outil certbot a modifié les configurations Apache de sorte que toute requête en HTTP soit redirigée vers HTTPS. Nous devons alors modifier la configuration de Nextcloud pour que ce changement soit pris en compte.

Modifier le fichier /var/www/html/nextcloud/config/config.php comme suit :

'overwrite.cli.url' => 'https://cloud.example.com/',

Vous pouvez dès à présent installer et configurer le client Nextcloud sur votre ordinateur.

Installation de la suite bureautique

L'outil Collabora Online permet de créer et de modifier des documents LibreOffice directement depuis l'interface Web de Nextcloud.

Télécharger la clef privée du dépôt :

cd /usr/share/keyrings
wget https://collaboraoffice.com/downloads/gpg/collaboraonline-release-keyring.gpg

Ajouter le dépôt pour Debian 11 dans le fichier /etc/apt/sources.list.d/collaboraonline.sources :

Types: deb
URIs: https://www.collaboraoffice.com/repos/CollaboraOnline/CODE-debian11
Suites: ./
Signed-By: /usr/share/keyrings/collaboraonline-release-keyring.gpg

Mettre à jour le catalogue des paquets et installer la suite bureautique :

apt update
apt install coolwsd code-brand

Configurer le nom de domaine et ajouter l'adresse IPv6 du serveur parmi les hôtes acceptés dans le fichier /etc/coolwsd/coolwsd.xml :

<server_name desc="External hostname:port of the server running coolwsd. If empty, it's derived from the request (please set it if this doesn't work). May be specified when behind a reverse-proxy or when the hostname is not reachable directly." type="string" default="">office.example.com</server_name>
<net desc="Network settings">
	<post_allow desc="Allow/deny client IP address for POST(REST)." allow="true">
		<host desc="Local server">XXXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX</host>
	</post_allow>
</net>

Créer le certificat autosigné chiffrant la liaison entre Nextcloud et la suite bureautique :

mkdir -p /opt/ssl/
cd /opt/ssl/
mkdir -p certs/ca
openssl genrsa -out certs/ca/root.key.pem 4096
openssl req -x509 -new -nodes -key certs/ca/root.key.pem -out certs/ca/root.crt.pem -subj "/C=FR/ST=FR/L=Troyes/O=Cloud Example/CN=Cloud Example"
mkdir -p certs/{servers,tmp}
mkdir -p "certs/servers/office.example.com"
openssl genrsa -out "certs/servers/office.example.com/privkey.pem" 4096 -key "certs/servers/office.example.com/privkey.pem"
openssl req -key "certs/servers/office.example.com/privkey.pem" -new -sha256 -out "certs/tmp/office.example.com.csr.pem" -subj "/C=FR/ST=FR/L=Troyes/O=Cloud Example/CN=office.example.com"
openssl x509 -req -in certs/tmp/office.example.com.csr.pem -CA certs/ca/root.crt.pem -CAkey certs/ca/root.key.pem -CAcreateserial -out certs/servers/office.example.com/cert.pem
mv certs/servers/office.example.com/privkey.pem /etc/coolwsd/key.pem
mv certs/servers/office.example.com/cert.pem /etc/coolwsd/cert.pem
mv certs/ca/root.crt.pem /etc/coolwsd/ca-chain.cert.pem

Configurer Nextcloud pour utiliser le serveur bureautique. Pour cela, aller sur https://cloud.example.com/settings/apps/office/richdocuments et installer le module. Une fois ceci fait, aller sur https://cloud.example.com/settings/admin/richdocuments et renseigner les champs comme suit :

Type de serveur
Utiliser votre propre serveur
URL (et port) du serveur Collabora Online
https://office.example.com:9980
Désactiver la vérification du certificat (non sur)
Coché

Sauvegarder et vérifier le bon fonctionnement du service.

Configuration de Thunderbird

Nous allons configurer Thunderbird afin qu'il utilise notre Nextcloud comme serveur de carnet d'adresses (CardDAV) et agenda (CalDAV). Pour cela, nous allons installer les extensions suivantes :

Pour paramétrer le compte, ouvrir ÉditionParamètres de synchronisation (TbSync), puis ajouter un compte CardDav/CalDAV :

Configuration du compte CardDAV / CalDAV

Sélectionner Configuration manuelle, puis remplir les champs comme suit :

Nom du compte
Un nom de votre choix (exemple: Cloud perso)
Nom d'utilisateur
Votre nom d'utilisateur Nextcloud
Mot de passe
Votre mot de passe Nextcloud
Adresse du serveur CalDAV
https://cloud.example.com/remote.php/dav
Adresse du serveur CardDAV
https://cloud.example.com/remote.php/dav

Valider, puis une fois la configuration effectuée, cocher Activer et synchroniser ce compte. Cocher ensuite les éléments à synchroniser et définir une synchronisation périodique (pour ma part, je la définis à 10 minutes) :

Configuration du compte CardDAV / CalDAV

Configuration d'un téléphone mobile Android

Installer les applications suivantes, dans cet ordre, sur le téléphone :

  1. Nextcloud
  2. OpenTasks
  3. DAVx⁵

Connecter l'application Nextcloud au serveur en suivant les instructions à l'écran. Il est possible de configurer l'envoi automatique des photos et vidéos prises vers le cloud dans les options ParamètresEnvoi automatique.

Lancer ensuite DAVx⁵ et paramétrer comme suit :

Capture d'écran de DAVx⁵ Capture d'écran de DAVx⁵ Capture d'écran de DAVx⁵
Captures d'écran de DAVx⁵

Selon le modèle de votre appareil, il peut être nécessaire de modifier les paramètres de gestion de batterie afin de permettre la synchronisation en arrière-plan.