Nextcloud et Syncthing

Pendant longtemps j’ai essayé de faire fonctionner Cozy Cloud en auto-hébergé sur mon Raspberry, sans succès (aucun connecteur, le point fort de Cozy Cloud, ne fonctionne en auto-hébergé).
Depuis j’ai changé mon fusil d’épaule et je suis parti chez Nextcloud, toujours auto-hébergé sur mon Raspberry.

Problème de Nextcloud, l’interface web est vraiment bien faite mais la partie synchronisation via webdav est moisie. Ca marche bien pour synchroniser 10 photos mais quand on arrive à plusieurs Go, il faut des jours à Nextcloud pour arriver à tout synchroniser et le client Android est pas top pour la synchronisation.
Un collègue de boulot m’avait conseillé il y a longtemps un logiciel de synchronisation, Syncthing, disponible sous Windows, Mac, Linux et Android. Et après de bonnes galères, j’ai réussi à intégrer Syncthing à Nextcloud.

1) Architecture

Mon but est d’avoir un cloud auto-hébergé afin d’avoir accès à mes documents (fichiers sensibles styles clé ssh, feuilles de paie, factures, etc) où que je sois, que ces fichiers soient chiffrés et que je puisse récupérer automatiquement via une synchronisation certains dossiers de mon téléphone (photo/vidéo principalement) et qui seront eux aussi chiffrés une fois récupérés par mon cloud.

Voici comment tout ça va s’agencer.
Sur mon raspberry :

  • On va installer Nextcloud qui ne fera aucune synchronisation (voir début d’article) et me servira juste d’interface pour accéder à mes fichiers.
  • On installera également Syncthing pour gérer les synchronisations avec mon téléphone et qui téléversera directement les fichiers synchronisés dans le répertoire data de Nextcloud.
  • A l’aide d’un script, les fichiers ajoutés via Syncthing seront scannés par Nextcloud puis chiffrés. Sans ce script, ces fichiers ne seraient jamais chiffrés car Nextcloud n’est pas vraiment conçu pour gérer correctement les fichiers rajoutés autrement que par son interface web ou un client Nextcloud.

Sur mon téléphone :

  • Il faut juste installer l’application Syncthing trouvable sur F-Droid ou le Play Store.

2) Configuration du Raspberry

2.1) Installation de Nextcloud

Nextcloud nécessite un serveur web, un serveur de base de donnée et PHP. J’ai utilisé Apache2 et MariaDB pour le serveur web et base de donnée (je ne vais pas expliquer la configuration globale de Apache et MariaDB mais juste la partie spécifique à Nextcloud et Syncthing). Vous pouvez installer tout ce qu’il faut avec la commande :

[pastacode lang=”bash” manual=”sudo%20aptitude%20install%20apache2%20mariadb-server%20libapache2-mod-php7.0%20php7.0-gd%20php7.0-json%20php7.0-mysql%20php7.0-curl%20php7.0-mbstring%20php7.0-intl%20php-imagick%20php7.0-xml%20php7.0-zip” message=”” highlight=”” provider=”manual”/]

Commençons par télécharger Nextcloud.  Placez-vous dans le répertoire /var/www avec la commande :

[pastacode lang=”bash” manual=”cd%20%2Fvar%2Fwww” message=”” highlight=”” provider=”manual”/]

Lancez la commander suivante pour télécharger Nextcloud :

[pastacode lang=”bash” manual=”sudo%20wget%20https%3A%2F%2Fdownload.nextcloud.com%2Fserver%2Freleases%2Fnextcloud-15.0.2.zip” message=”” highlight=”” provider=”manual”/]

Puis dézippez l’archive avec la commande suivante :

[pastacode lang=”bash” manual=”sudo%20unzip%20nextcloud-15.0.2.zip” message=”” highlight=”” provider=”manual”/]

On peut maintenant supprimer l’archive avec la commande :

[pastacode lang=”bash” manual=”sudo%20rm%20nextcloud-15.0.2.zip” message=”” highlight=”” provider=”manual”/]

Il faut que le propriétaire du répertoire Nextcloud soit www-data. Changez le propriétaire avec la commande :

[pastacode lang=”bash” manual=”sudo%20chown%20-R%20www-data%3Awww-data%20nextcloud” message=”” highlight=”” provider=”manual”/]

Il faut également que www-data soit le propriétaire du répertoire parent www. Si ce n’est pas le cas, lancez la commande :

[pastacode lang=”bash” manual=”sudo%20chown%20www-data%3Awww-data%20%2Fvar%2Fwww” message=”” highlight=”” provider=”manual”/]

Passons à la base de données.

2.2) Configuration de la base de données

Lancez la commande pour accéder à la console sql :

[pastacode lang=”bash” manual=”mysql%20-uroot%20-p” message=”” highlight=”” provider=”manual”/]

Le mot de passe root vous sera demandé. Une fois le mot de passe rentré, vous arriverez dans la console mysql.

On va commencer par créer un utilisateur, qui aura les droits admin sur la base de données de Nextcloud, avec la commande :

[pastacode lang=”sql” manual=”CREATE%20USER%20’username’%40’localhost’%20IDENTIFIED%20BY%20’password’%3B” message=”” highlight=”” provider=”manual”/]

Remplacez username par le nom que vous voulez et password par le mot de passe de votre choix, assez robuste de préférence.

Ensuite, on va créer la base de données, qui s’appellera nextcloud, avec la commande :

[pastacode lang=”sql” manual=”CREATE%20DATABASE%20IF%20NOT%20EXISTS%20nextcloud%3B” message=”” highlight=”” provider=”manual”/]

Puis on donne les droits admin à l’utilisateur créé précédemment avec la commande :

[pastacode lang=”sql” manual=”GRANT%20SELECT%2C%20INSERT%2C%20UPDATE%2C%20DELETE%2C%20CREATE%2C%20DROP%2C%20INDEX%2C%20ALTER%2C%20CREATE%20TEMPORARY%20TABLES%20ON%20nextcloud.*%20TO%20’username’%40’localhost’%20IDENTIFIED%20BY%20’password’%3B” message=”” highlight=”” provider=”manual”/]

Là aussi, remplacez username et password par ceux que vous avez utilisé lors de la création de l’utilisateur.

Rechargez les privilèges utilisateurs avec la commande

[pastacode lang=”sql” manual=”FLUSH%20privileges%3B” message=”” highlight=”” provider=”manual”/]

Puis quittez la console mysql avec la commande

[pastacode lang=”sql” manual=”exit” message=”” highlight=”” provider=”manual”/]

2.3) Configuration de Nextcloud

Commençons par créer le fichier Apache. Lancez la commande suivante pour créer le fichier :

[pastacode lang=”bash” manual=”sudo%20nano%20%2Fetc%2Fapache2%2Fsites-available%2Fnextcloud.conf” message=”” highlight=”” provider=”manual”/]

Copiez les lignes suivantes dans le fichier :

[pastacode lang=”apacheconf” manual=”%3CVirtualHost%20*%3A80%3E%0A%0A%20%20%20%20%20%20%20%20DocumentRoot%20%2Fvar%2Fwww%2Fnextcloud%2F%0A%0A%20%20%20%20%20%20%20%20ServerName%20moncloud.memodugeek.info%0A%09%09ServerAdmin%20votreemail%0A%0A%20%20%20%20%20%20%20%20%3CLocation%20%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Redirect%20%2F%20https%3A%2F%2Fmoncloud.memodugeek.info%2F%0A%20%20%20%20%20%20%20%20%3C%2FLocation%3E%0A%0A%3C%2FVirtualHost%3E%0A%0A%0A%3CVirtualHost%20*%3A443%3E%0A%0A%20%20%20%20%20%20%20%20DocumentRoot%20%2Fvar%2Fwww%2Fnextcloud%2F%0A%0A%20%20%20%20%20%20%20%20ServerName%20moncloud.memodugeek.info%0A%20%20%20%20%20%20%20%20ServerAdmin%20votreemail%0A%0A%20%20%20%20%20%20%20%20LogLevel%20info%0A%20%20%20%20%20%20%20%20ErrorLog%20%24%7BAPACHE_LOG_DIR%7D%2Fnextcloud.error.log%0A%0A%20%20%20%20%20%20%20%20%3CIfModule%20mod_ssl.c%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SSLEngine%20on%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SSLCertificateFile%20%2Fetc%2Fletsencrypt%2Flive%2Fmemodugeek.info%2Ffullchain.pem%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SSLCertificateKeyFile%20%2Fetc%2Fletsencrypt%2Flive%2Fmemodugeek.info%2Fprivkey.pem%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20HSTS%20(mod_headers%20is%20required)%20(15768000%20seconds%20%3D%206%20months)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Header%20always%20set%20Strict-Transport-Security%20%22max-age%3D15768000%22%0A%0A%20%20%20%20%20%20%20%20%3C%2FIfModule%3E%0A%0A%0A%20%20%20%20%20%20%20%20%3CDirectory%20%2Fvar%2Fwww%2Fnextcloud%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Options%20%2BFollowSymlinks%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20AllowOverride%20All%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CIfModule%20mod_dav.c%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Dav%20off%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FIfModule%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SetEnv%20HOME%20%2Fvar%2Fwww%2Fnextcloud%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SetEnv%20HTTP_HOME%20%2Fvar%2Fwww%2Fnextcloud%0A%20%20%20%20%20%20%20%20%3C%2FDirectory%3E%0A%0A%3C%2FVirtualHost%3E%0A%0A%23%20modern%20configuration%2C%20tweak%20to%20your%20needs%0ASSLProtocol%20%20%20%20%20%20%20%20%20%20%20%20%20all%20-SSLv3%20-TLSv1%20-TLSv1.1%0ASSLCipherSuite%20%20%20%20%20%20%20%20%20%20ECDHE-ECDSA-AES256-GCM-SHA384%3AECDHE-RSA-AES256-GCM-SHA384%3AECDHE-ECDSA-CHACHA20-POLY1305%3AECDHE-RSA-CHACHA20-POLY1305%3AECDHE-ECDSA-AES128-GCM-SHA256%3AECDHE-RSA-AES128-GCM-SHA256%3AECDHE-ECDSA-AES256-SHA384%3AECDHE-RSA-AES256-SHA384%3AECDHE-ECDSA-AES128-SHA256%3AECDHE-RSA-AES128-SHA256%0ASSLHonorCipherOrder%20%20%20%20%20on%0ASSLCompression%20%20%20%20%20%20%20%20%20%20off%0ASSLSessionTickets%20%20%20%20%20%20%20off%0A%0A%23%20OCSP%20Stapling%2C%20only%20in%20httpd%202.3.3%20and%20later%0ASSLUseStapling%20%20%20%20%20%20%20%20%20%20on%0ASSLStaplingResponderTimeout%205%0ASSLStaplingReturnResponderErrors%20off%0ASSLStaplingCache%20%20%20%20%20%20%20%20shmcb%3A%2Fvar%2Frun%2Focsp(128000)%0A” message=”” highlight=”” provider=”manual”/]

La première partie qui va de <VirtualHost *:80> à </VirtualHost> gère l’accès au serveur Nextcloud en http. Tout ce qu’on fait dans ce cas c’est rediriger la connexion vers le https afin de forcer la connexion en https.
Dans ma configuration j’ai fait un sous-domaine qui redirige vers Nextcloud (toutes les lignes avec moncloud.memodugeek.info). Il faudra donc l’adapter à votre nom de domaine et que ce sous-domaine soit créé au niveau du serveur DNS.

Dans la seconde partie, <VirtualHost *:443>, on gère les connexions https. Il vous faudra remplacer les lignes “SSLCertificateFile /etc/letsencrypt/live/memodugeek.info/fullchain.pem” et
“SSLCertificateKeyFile /etc/letsencrypt/live/memodugeek.info/privkey.pem” par le chemin vers vos certificats. Pour générer des certificats ssl, je vous renvoi à cet article.

Idem pour l’adresse mail après ServerAdmin.

Pour sauvegarder sous nano, il faut faire CTRL+x puis appuyer sur la touche “O” puis Entrée. Rappelez vous de cette manipulation car on va modifier par mal de fichier avec nano.

Un certain nombre de modules Apache doivent être actif pour que Nextcloud fonctionne correctement. Lancez la commande suivante pour les activer :

[pastacode lang=”bash” manual=”sudo%20a2enmod%20rewrite%20headers%20env%20dir%20mime%20proxy_http%20proxy_http2%20proxy” message=”” highlight=”” provider=”manual”/]

Il ne nous reste plus qu’à redémarrer Apache avec la commande

[pastacode lang=”bash” manual=”sudo%20systemctl%20restart%20apache2″ message=”” highlight=”” provider=”manual”/]

Vous pouvez maintenant accéder à votre instance Nextcloud en vous rendant à l’adresse https://moncloud.votrenomdedomaine où il vous sera demandé de créer un compte administrateur et de rentrer les informations pour configurer la base de donnée mysql (nom de la base de données, nom de l’utilisateur et mot de passe de l’utilisateur).

Une fois que vous avez accès à votre instance Nextcloud, activez le module “Default encryption module”. Une fois activé, allez dans les paramètres administrateur puis dans le menu “Sécurité” puis activez le chiffrement côté serveur

A partir de maintenant, tous les fichiers envoyés via Nextcloud seront automatiquement chiffrés une fois sur le serveur. Les clés de chiffrement se trouvent dans le répertoire “/var/www/data/files_encryption/OC_DEFAULT_MODULE/”. Pensez à en faire une sauvegarde car si vous perdez ces clés ils vous sera impossible de déchiffrez vos données.

2.4) Optimisation de Nextcloud (optionnel)

Nextcloud n’est pas parfait sur un PC léger comme le Raspberry, il va donc falloir l’optimiser un peu.

Par défaut, Nextcloud génère une miniature de chaque image dans l’interface web. Autant ça fonctionne très bien quand vous avez 10 images, mais quand il y a 50 ou 100 images ça met des plombes, quelque soit la puissance du serveur hébergeant Nextcloud. Il faut plusieurs dizaines de minutes (voir beaucoup plus) si vous avez beaucoup de photos, pour que Nextcloud génère toutes les miniatures.

C’est un problème connu depuis longtemps et pour lequel aucune solution  n’a été trouvée. Il existe une application qui pré-génère les miniatures mais qui ne fonctionne évidemment pas lorsque le chiffrement est activé.

On va donc désactiver cette fonction, même si l’expérience utilisateur va en prendre un sacré coup vu que vous n’aurez plus aucun aperçu des images sur l’interface web.
Mais de mon point de vue ça vaut toujours mieux que d’avoir le Raspberry complètement à genoux dés que vous voulez visualiser plusieurs dizaines d’images.
Lancez la commande suivante pour éditer le fichier de configuration :

[pastacode lang=”bash” manual=”%20sudo%20nano%20%2Fvar%2Fwww%2Fnextcloud%2Fconfig%2Fconfig.php” message=”” highlight=”” provider=”manual”/]

Ajoutez la ligne :

[pastacode lang=”bash” manual=”‘enable_previews’%20%3D%3E%20false” message=”” highlight=”” provider=”manual”/]

Puis sauvegardez.

On va également activer le cache pour accélérer Nextcloud. Il y a plusieurs systèmes de cache disponibles pour Nextcloud. Pour notre utilisation, on va utiliser APCu. Installez APCu avec la commande :

[pastacode lang=”bash” manual=”sudo%20aptitude%20install%20php7.0-apcu” message=”” highlight=”” provider=”manual”/]

Ouvrez le fichier de config de Nextcloud avec la commande :

[pastacode lang=”bash” manual=”%20sudo%20nano%20%2Fvar%2Fwww%2Fnextcloud%2Fconfig%2Fconfig.php” message=”” highlight=”” provider=”manual”/]

Ajoutez la ligne :

[pastacode lang=”bash” manual=”%20’memcache.local’%20%3D%3E%20’%5COC%5CMemcache%5CAPCu'” message=”” highlight=”” provider=”manual”/]

Puis sauvegardez.

Ensuite, ouvrez le fichier php.ini avec la commande :

[pastacode lang=”bash” manual=”sudo%20nano%20%2Fetc%2Fphp%2F7.0%2Fapache2%2Fphp.ini” message=”” highlight=”” provider=”manual”/]

Ajoutez les lignes suivantes :

[pastacode lang=”bash” manual=”opcache.enable%3D1%0Aopcache.enable_cli%3D1%0Aopcache.interned_strings_buffer%3D8%0Aopcache.max_accelerated_files%3D10000%0Aopcache.memory_consumption%3D128%0Aopcache.save_comments%3D1%0Aopcache.revalidate_freq%3D1″ message=”” highlight=”” provider=”manual”/]

Pour prendre en compte les modifications, redémarrez Apache avec la commande :

[pastacode lang=”bash” manual=”sudo%20systemctl%20restart%20apache2″ message=”” highlight=”” provider=”manual”/]

Si vous utilisez php-fpm, il vous faudra également le redémarrer avec la commande suivante sous peine d’avoir une erreur quand vous accéderez à l’interface de Nextcloud :

[pastacode lang=”bash” manual=”sudo%20systemctl%20restart%20php7.0-fpm.service” message=”” highlight=”” provider=”manual”/]

C’est terminé, passons à Syncthing qui va aller beaucoup plus vite.

2.5) Syncthing

Récupérez la dernière version, 1.0.0 au moment où j’écris ces lignes, avec la commande :

[pastacode lang=”bash” manual=”wget%20https%3A%2F%2Fgithub.com%2Fsyncthing%2Fsyncthing%2Freleases%2Fdownload%2Fv1.0.1%2Fsyncthing-linux-arm-v1.0.1.tar.gz” message=”” highlight=”” provider=”manual”/]

Extrayez-la avec la commande :

[pastacode lang=”bash” manual=”tar%20xzfv%20syncthing-linux-arm-v1.0.1.tar.gz” message=”” highlight=”” provider=”manual”/]

Allez dans le répertoire créé avec la commande :

[pastacode lang=”bash” manual=”cd%20syncthing*” message=”” highlight=”” provider=”manual”/]

Puis copiez l’exécutable dans le dossier /var/www avec la commande :

[pastacode lang=”bash” manual=”sudo%20cp%20syncthing%20%2Fvar%2Fwww%2F” message=”” highlight=”” provider=”manual”/]

Il ne nous reste plus qu’a mettre www-data propriétaire du fichier avec la commande :

[pastacode lang=”bash” manual=”sudo%20chown%20www-data%3Awww-data%20%2Fvar%2Fwww%2Fsyncthing” message=”” highlight=”” provider=”manual”/]

C’est important que www-data en soit propriétaire afin de pouvoir faire les mises à jours automatiques.

On peut maintenant supprimer l’archive et le répertoire Syncthing dont nous n’avons plus besoin avec la commande :

[pastacode lang=”bash” manual=”rm%20-r%20syncthing*” message=”” highlight=”” provider=”manual”/]

Lancez Syncthing avec l’utilisateur www-data à l’aide de la commande :

[pastacode lang=”bash” manual=”sudo%20-u%20www-data%20syncthing” message=”” highlight=”” provider=”manual”/]

Quand vous verrez la ligne “Access the GUI via the following URL: http://127.0.0.1:8384/”, appuyez sur CTRL+C pour arrêtez Syncthing.

On va maintenant créer le fichier de configuration Apache afin de pouvoir accéder à l’interface web.
Lancez la commande suivante pour créer le fichier :

[pastacode lang=”bash” manual=”sudo%20nano%20%2Fetc%2Fapache2%2Fsites-available%2Fsync.memodugeek.info.conf” message=”” highlight=”” provider=”manual”/]

Collez-y les lignes suivantes :

[pastacode lang=”apacheconf” manual=”%3CVirtualHost%20*%3A80%3E%0A%0A%20%20%20%20%20%20%20%20ServerName%20sync.memodugeek.info%0A%20%20%20%20%20%20%20%20ServerAdmin%20votreemail%0A%0A%20%20%20%20%20%20%20%20%3CLocation%20%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Redirect%20%2F%20https%3A%2F%2Fsync.memodugeek.info%2F%0A%20%20%20%20%20%20%20%20%3C%2FLocation%3E%0A%0A%3C%2FVirtualHost%3E%0A%0A%0A%3CVirtualHost%20*%3A443%3E%0A%0A%20%20%20%20%20%20%20%20ServerName%20sync.memodugeek.info%0A%20%20%20%20%20%20%20%20ServerAdmin%20votreemail%0A%0A%20%20%20%20%20%20%20%20LogLevel%20info%0A%20%20%20%20%20%20%20%20ErrorLog%20%24%7BAPACHE_LOG_DIR%7D%2Fsyncthing.error.log%0A%0A%20%20%20%20%20%20%20%20%3CIfModule%20mod_ssl.c%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SSLEngine%20on%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SSLCertificateFile%20%2Fetc%2Fletsencrypt%2Flive%2Fmemodugeek.info%2Ffullchain.pem%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20SSLCertificateKeyFile%20%2Fetc%2Fletsencrypt%2Flive%2Fmemodugeek.info%2Fprivkey.pem%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20HSTS%20(mod_headers%20is%20required)%20(15768000%20seconds%20%3D%206%20months)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Header%20always%20set%20Strict-Transport-Security%20%22max-age%3D15768000%22%0A%0A%20%20%20%20%20%20%20%20%3C%2FIfModule%3E%0A%0A%20%20%20%20%20%20%20%20ProxyPass%20%2F%20http%3A%2F%2Flocalhost%3A8384%2F%0A%20%20%20%20%20%20%20%20%3CLocation%20%2F%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ProxyPassReverse%20http%3A%2F%2Flocalhost%3A8384%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Require%20all%20granted%0A%20%20%20%20%20%20%20%20%3C%2FLocation%3E%0A%0A%3C%2FVirtualHost%3E%0A%0A%23%20modern%20configuration%2C%20tweak%20to%20your%20needs%0ASSLProtocol%20%20%20%20%20%20%20%20%20%20%20%20%20all%20-SSLv3%20-TLSv1%20-TLSv1.1%0ASSLCipherSuite%20%20%20%20%20%20%20%20%20%20ECDHE-ECDSA-AES256-GCM-SHA384%3AECDHE-RSA-AES256-GCM-SHA384%3AECDHE-ECDSA-CHACHA20-POLY1305%3AECDHE-RSA-CHACHA20-POLY1305%3AECDHE-ECDSA-AES128-GCM-SHA256%3AECDHE-RSA-AES128-GCM-SHA256%3AECDHE-ECDSA-AES256-SHA384%3AECDHE-RSA-AES256-SHA384%3AECDHE-ECDSA-AES128-SHA256%3AECDHE-RSA-AES128-SHA256%0ASSLHonorCipherOrder%20%20%20%20%20on%0ASSLCompression%20%20%20%20%20%20%20%20%20%20off%0ASSLSessionTickets%20%20%20%20%20%20%20off%0A%0A%23%20OCSP%20Stapling%2C%20only%20in%20httpd%202.3.3%20and%20later%0ASSLUseStapling%20%20%20%20%20%20%20%20%20%20on%0ASSLStaplingResponderTimeout%205%0ASSLStaplingReturnResponderErrors%20off%0ASSLStaplingCache%20%20%20%20%20%20%20%20shmcb%3A%2Fvar%2Frun%2Focsp(128000)%0A” message=”” highlight=”” provider=”manual”/]

Comme pour le fichier de config Apache de Nextcloud, il vous faudra l’adapter pour votre serveur.

Sauvegardez.

Il vous faut maintenant ouvrir le port 8384, pour que l’interface soit accessible, avec la commande :

[pastacode lang=”bash” manual=”sudo%20ufw%20allow%208384%20comment%20syncthing” message=”” highlight=”” provider=”manual”/]

Il ne nous reste plus qu’à lancer Syncthing automatiquement au démarrage. Pour cela, créez le fichier syncthing.service avec la commande :

[pastacode lang=”bash” manual=”sudo%20nano%20%2Fetc%2Fsystemd%2Fsystem%2Fsyncthing.service” message=”” highlight=”” provider=”manual”/]

Ajoutez les lignes suivantes dedans :

[pastacode lang=”bash” manual=”%5BUnit%5D%0ADescription%3DSyncthing%20-%20Open%20Source%20Continuous%20File%20Synchronization%20for%20%25I%0ADocumentation%3Dman%3Asyncthing(1)%0AAfter%3Dnetwork.target%0A%0A%5BService%5D%0AUser%3Dwww-data%0AExecStart%3D%2Fusr%2Flocal%2Fbin%2Fsyncthing%20-no-browser%20-no-restart%20-logflags%3D0%0ARestart%3Don-failure%0ASuccessExitStatus%3D3%204%0ARestartForceExitStatus%3D3%204%0A%0A%23%20Hardening%0AProtectSystem%3Dfull%0APrivateTmp%3Dtrue%0ASystemCallArchitectures%3Dnative%0AMemoryDenyWriteExecute%3Dtrue%0ANoNewPrivileges%3Dtrue%0A%0A%5BInstall%5D%0AWantedBy%3Dmulti-user.target” message=”” highlight=”” provider=”manual”/]

Sauvegardez.
Pour que Syncthing soit automatiquement lancé au démarrage, lancez la commande :

[pastacode lang=”bash” manual=”sudo%20systemctl%20enable%20syncthing.service” message=”” highlight=”” provider=”manual”/]

Puis on va démarrer Syncthing manuellement, afin de ne pas avoir à redémarrer le serveur, avec la commande :

[pastacode lang=”bash” manual=”sudo%20systemctl%20start%20syncthing.service” message=”” highlight=”” provider=”manual”/]

Si vous vous rendez à l’adresse https://sync.votrenomdedomaine vous arrivez sur l’interface web de Syncthing. Changez la langue en French.

La première chose à faire est d’aller dans le menu Actions > Configuration > Interface graphique puis d’ajouter un utilisateur et un mot de passe.

Ensuite, toujours dans le menu Configuration, allez dans l’onglet Général et dans le champ “Chemin parent par défaut pour les nouveaux partages” mettez “/var/www/nextcloud/data/admin/files/”. Les partages synchronisés iront ainsi automatiquement dans le répertoire contenant les données de l’utilisateur Nextcloud.
Choisissez un nom pour l’appareil puis sauvegardez les modifications.

Le problème qui va se poser est que les fichiers synchronisés vont s’ajouter à Nextcloud via Syncthing et du coup Nextcloud ne les chiffrera jamais car ils n’ont pas été ajoutés en passant par lui. On va donc devoir remédier à ça.

2.6) Script d’ajout des fichiers synchronisés

On va créer un script qui va forcer Nextcloud à scanner régulièrement le dossier data afin d’ajouter les nouveaux fichiers puis à chiffrer tous les nouveaux fichiers. Pour ce script, on va avoir besoin du programme Expect qui permet de répondre automatiquement à des questions, typiquement Oui/Non, posées par des programmes.
Installez-le avec la commande :

[pastacode lang=”bash” manual=”sudo%20aptitude%20install%20expect.” message=”” highlight=”” provider=”manual”/]

On va ensuite devoir créer un utilisateur qui ai le droit de vider la table nextcloud.oc_file_lock.
Lancez la commande :

[pastacode lang=”bash” manual=”mysql%20-uroot%20-p” message=”” highlight=”” provider=”manual”/]

Le mot de passe root vous sera demandé. Une fois le mot de passe rentré, vous arriverez dans la console mysql.
Lancez ensuite la commande :

[pastacode lang=”sql” manual=”%20GRANT%20SELECT%2CDELETE%20ON%20nextcloud.oc_file_locks%20TO%20nomutilisateur%40localhost%20IDENTIFIED%20BY%20’motdepasse’%3B” message=”” highlight=”” provider=”manual”/]

Remplacez “nomutilisateur” et “motdepasse” par le nom d’utilisateur de votre choix et un mot de passe un peu robuste.

Rechargez les privilèges utilisateurs avec la commande

[pastacode lang=”sql” manual=”FLUSH%20privileges%3B” message=”” highlight=”” provider=”manual”/]

Puis quittez la console mysql avec la commande :

[pastacode lang=”sql” manual=”exit” message=”” highlight=”” provider=”manual”/]

Maintenant, créez le script Expect avec la commande :

[pastacode lang=”bash” manual=”sudo%20-u%20www-data%20nano%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.exp” message=”” highlight=”” provider=”manual”/]

Copiez-y les lignes suivantes :

[pastacode lang=”bash” manual=”%23!%2Fusr%2Fbin%2Fexpect%20-f%0A%23%0Aset%20timeout%20-1%0A%0A%23Unlock%20all%20files%0Aspawn%20mysql%20–user%3Dnomutilisateur%20%7B–password%3Dmotdepasse%7D%20–database%3Dnextcloud%20%7B–execute%3DDELETE%20FROM%20nextcloud.oc_file_locks%20WHERE%201%7D%20–verbose%0Amatch_max%20100000%0Aexpect%20%22DELETE%20FROM%20nextcloud.oc_file_locks%20WHERE%201%22%0A%0A%23scan%20admin’s%20files%0Aspawn%20php%20%2Fvar%2Fwww%2Fnextcloud%2Focc%20files%3Ascan%20–path%3D%2Fadmin%2Ffiles%2F%20–verbose%0Amatch_max%20100000%0Aexpect%20%22%7C%20Folders%20%7C%20Files%20%7C%20Elapsed%20time%20%7C%22%0A%0A%23Encrypt%20all%20new%20files%0Aspawn%20php%20%2Fvar%2Fwww%2Fnextcloud%2Focc%20encryption%3Aencrypt-all%0Amatch_max%20100000%0Aexpect%20-exact%20%22%5Cr%0A%5Cr%0AYou%20are%20about%20to%20encrypt%20all%20files%20stored%20in%20your%20Nextcloud%20installation.%5Cr%0ADepending%20on%20the%20number%20of%20available%20files%2C%20and%20their%20size%2C%20this%20may%20take%20quite%20some%20time.%5Cr%0APlease%20ensure%20that%20no%20user%20accesses%20their%20files%20during%20this%20time!%5Cr%0ANote%3A%20The%20encryption%20module%20you%20use%20determines%20which%20files%20get%20encrypted.%5Cr%0A%5Cr%0ADo%20you%20really%20want%20to%20continue%3F%20(y%2Fn)%20%22%0Asend%20–%20%22y%5Cr%22%0Aexpect%20eof%0A” message=”” highlight=”” provider=”manual”/]

Passons à l’explication du script. Ce n’est pas un script Bash mais un script Expect, d’où la ligne “#!/usr/bin/expect -f” au début du fichier. Expect fonctionne de la manière suivante : on lui donne la commande à lancer, le texte que doit retourner le programme lancé puis la réponse qu’il doit automatiquement donner. On verra ça un peu plus en détail pendant l’explication du script.

“set timeout -1” sert à configurer un temps d’attente infini afin qu’il attende indéfiniment le texte qu’est censé retourner le programme lancé par Expect.

Les lignes situées après “#Unlock all files” servent à vider la table de verrouillage des fichiers de Nextcloud. Il arrive régulièrement que des fichiers restent verrouillés par Nextcloud, sans que je comprenne vraiment pourquoi, ce qui bloque la commande scannant les nouveaux fichiers. C’est pour ça que je la vide en début de script pour déverrouiller tous les fichiers. C’est un peu sale mais ça fonctionne. Voyons les lignes en détails :

  • spawn mysql –user=nomutilisateur {–password=motdepasse} –database=nextcloud {–execute=DELETE FROM nextcloud.oc_file_locks WHERE 1} –verbose lance la commande sql pour vider la table.
    Spaw permet de lancer la commande via Expect, condition obligatoire pour que la commande puisse être lancée. Pensez à changer “nomutilisateur” et “motdepasse” par le nom utilisateur et le mot de passe que vous avec utilisé en début de chapitre.
  • match_max 100000 défini la taille de la mémoire tampon dans laquelle sera stockée le texte retourné par la commande lancée précédemment.
  • expect “DELETE FROM nextcloud.oc_file_locks WHERE 1” permet d’informer Expect quel message doit être rendu par la commande lancée. Une fois qu’il détecte le texte “DELETE FROM nextcloud.oc_file_locks WHERE 1”, il passe à la suite du script.

Les lignes situées après “#scan admin’s files” forcent Nextcloud, via le programme “occ”, à analyser le dossier data de l’utilisateur admin afin d’ajouter automatiquement les nouveaux fichiers ajoutés via Syncthing. Les différentes lignes ont le même principe que pour les précédentes.

Les lignes situées après “#Encrypt all new files” forcent Nextcloud, toujours via le programme “occ”, à chiffrer tous les nouveau fichiers.
Il y a une ligne en plus par rapport aux précédent blocs, c’est “send — “y\r””.
Cette ligne demande à Expect de répondre “y” puis de faire un appui sur la touche Entrée lorsque le texte de la ligne précédente est détecté. Le programme “occ” oblige l’utilisateur à répondre “yes” ou “y” lorsqu’on lance un chiffrement des nouveaux fichiers, c’est pour cela que l’on a besoin du programme Expect.

Il ne vous reste plus qu’à sauvegarder.

Rendez le script exécutable avec la commande :

[pastacode lang=”bash” manual=”sudo%20chmod%20%2Bx%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.exp” message=”” highlight=”” provider=”manual”/]

On va maintenant créer un second script, Bash ce coup-ci, qui exécutera le script Expect. Lancez la commande :

[pastacode lang=”bash” manual=”sudo%20-u%20www-data%20nano%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.sh” message=”” highlight=”” provider=”manual”/]

Puis copiez-y les lignes suivantes :

[pastacode lang=”bash” manual=”%23!%2Fbin%2Fbash%0Aif%20%5B%5B%20-f%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.lock%20%5D%5D%20%3B%20then%0A%20%20%20%20exit%0Aelse%0A%20%20%20%20%20%20%20%20touch%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.lock%0A%20%20%20%20%20%20%20%20expect%20-f%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.exp%0A%20%20%20%20%20%20%20%20rm%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.lock%0Afi%0A” message=”” highlight=”” provider=”manual”/]

Sauvegardez.

Ce script vérifie, grâce à la ligne “if [[ -f /var/www/syncthing_nextcloud.lock ]] ; then” si un fichier “syncthing_nextcloud.lock” existe :

  • S’il n’existe pas, il le crée avec la commande “touch /var/www/syncthing_nextcloud.lock”, puis lance le script Expect.
    Une fois le script Except exécuté, il supprime le fichier lock.
  • S’il existe, le script s’arrête

Grâce à cette partie, il est impossible de lancer le script Expect s’il est déjà en cours d’utilisation. J’ai rajouté cette sécurité car le script se lancera toutes les deux heures et si vous ajoutez beaucoup de fichiers (plusieurs centaines par exemple) en une fois via Syncthing, le programme “occ” peut prendre très longtemps sur un Raspberry pour chiffrer tous les nouveaux fichiers. Avec cette sécurité, on est couvert.

Rendez le script exécutable avec la commande :

[pastacode lang=”bash” manual=”sudo%20chmod%20%2Bx%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.sh” message=”” highlight=”” provider=”manual”/]

On va ajouter ce script au Cron de l’utilisateur www-data afin qu’il soit lancé régulièrement. Lancez la commande :

[pastacode lang=”bash” manual=”sudo%20-u%20www-data%20crontab%20-e” message=”” highlight=”” provider=”manual”/]

Ajoutez à la fin du fichier la ligne :

[pastacode lang=”bash” manual=”0%20*%2F2%20*%20*%20*%20%2Fvar%2Fwww%2Fsyncthing_nextcloud.sh%20%3E%20%2Fdev%2Fnull” message=”” highlight=”” provider=”manual”/]

Sauvegardez.

Cette ligne va exécuter le script toutes les deux heures.

3) Configuration du téléphone

Ca va aller extrêmement vite.

Installez l’application Syncthing via F-Droid ou le Play Store.

Fin

4) Synchronisation des fichiers

Maintenant que tout est bien configuré, on va pouvoir mettre en place la synchronisation des fichiers entre le téléphone et le serveur Nextcloud.
Je vais sauvegarder sur mon serveur Nextcloud le dossier Galerie de mon téléphone qui contient toutes mes photos et vidéos prisent avec mon téléphones.

Il faut commencer par présenter le Syncthing du serveur Nextcloud (que j’appellerai Syncthing Nextcloud) au Syncthing du téléphone (que j’appellerai Syncthing téléphone). Suivez ces étapes :

  1. Sur l’interface web du Syncthing Nextcloud, cliquez sur “Ajouter un appareil”, une popup va apparaître.
  2. Sur le téléphone, lancez l’application Syncthing et allez dans le menu “Afficher l’ID de l’appareil”.
  3. Copiez l’ID dans le champ ID de l’appareil sur la popup de l’interface web du Syncthing Nexcloud.
  4. Choisissez un nom à mettre dans le “Nom convivial local de l’appareil” (j’ai mis le modèle de mon téléphone), puis cliquez sur “Enregistrer”. Le Syncthing Nextcloud connait maintenant le Syncthing téléphone mais l’inverse n’est pas encore vrai.
  5. Sur l’interface web du Syncthing Nextcloud, allez dans le menu Actions > Afficher mon ID.
  6. Sur l’application Syncthing du téléphone, allez dans l’onglet “Appareils” puis cliquez sur le “+” en haut à droite. Une nouvelle fenêtre s’ouvre
  7. Renseignez l’ID du Syncthing Nextcloud (vous pouvez photographiez le QR code du Syncthing Nextcloud avec le téléphone en cliquant sur l’icône en forme de QR code à droite du champ “Mon ID” sur l’application Syncthing)
  8. Donnez un nom puis validez.

Voilà, nos deux Syncthing se connaissent maintenant. On va donc pouvoir synchroniser le dossier Galerie du téléphone.

Sur l’application Syncthing du téléphone, allez dans l’onglet “Partages” puis cliquez sur le “+” en haut à droite. Une nouvelle fenêtre s’ouvre.
Donnez un nom au partage, choisissez le répertoire à partager (mon dossier Galerie dans mon cas), activez le bouton en face du champ portant le nom du Syncthing Nextcloud puis validez.
Par défaut, la synchronisation ne se fera que depuis le téléphone vers Nextcloud et jamais l’inverse. Ne modifiez jamais ce comportement sinon vos fichiers sur le téléphone vont être remplacés par les fichiers chiffrés de Nextcloud.

Sur l’interface web du Syncthing Nextcloud, vous allez avoir un message vous indiquant qu’un appareil veut synchroniser un partage. Cliquez sur le bouton “Ajouter”.

Le chemin où sera stocké le partage sera automatiquement “var/www/nextcloud/data/admin/files/”. Cliquez sur “Enregister”.

Le Syncthing du téléphone va maintenant envoyer le contenu du dossier partagé sur le Syncthing Nextcloud. Vous verrez un pourcentage de la synchronisation.

Il n’y a plus qu’à attendre que cron lance automatiquement le script pour ajouter les fichiers à Nextcloud puis les chiffrer.

Voilà la fin de ce long article consacré à Nextcloud et Syncthing.

 

Sources : https://wiki.debian-fr.xyz/Nextcloud_sur_une_Debian_9_Stretch_Apache2_%2B_SQLite_MariaDB_MySQL_%2B_certificat_SSL_et_https, https://docs.nextcloud.com/server/15/admin_manual/contents.html et https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-syncthing-to-synchronize-directories-on-ubuntu-14-04

5 réponses pour “Nextcloud et Syncthing”

  1. totoleouf21 avril 2021 à 7 h 35 minRépondre

    article intéressant
    je m’intéresse à nextcloud et cherchais une solution pour mon téléphone Android car l’apk est vraiment naze…
    j’utilise syncthing pour backup le dossier data de nextcloud entre 2 serveurs.

    pour Android j’ai trouvé mieux que t’as solution.

    l’application foldersync sur playstore.
    elle gère nativement nextcloud
    il faut ce logger à nextcloud dans l’application
    et ont peu gérer la syncro des dossiers tel/serveur

    1. fate23 avril 2021 à 7 h 30 minRépondre

      Depuis la rédaction de cet article (purée, 2 ans déjà que je n’ai plus rien écrit…), j’ai abandonné Syncthing pour la synchronisation avec Nextcloud. Une fois que tout mes dossier ont été synchronisé, l’appli Nextcloud arrive correctement à gérer la synchronisation vu que je ne rajoute jamais 1 Go de photo à synchroniser.
      Mais je suis d’accord avec toi que l’appli android n’est pas terrible.

  2. totoleouf23 avril 2021 à 11 h 10 minRépondre

    essais l’apk foldersync sur android elle est pas mal du tout et gratuite (pub mais avec pihole pas de pub)

  3. Wes26 octobre 2022 à 17 h 55 minRépondre

    Bonjour,

    Merci pour cet article très intéressant. Je suppose cependant qu’il est impossible d’utiliser Syncthing pour synchroniser automatiquement un dossier présent sur mon PC vers un dossier spécifique Nextcloud s’il n’a pas été installé via Docker ?

    J’ai un serveur mut’ où j’ai installé Nextcloud via softaculous. J’ai besoin de synchroniser un dossier PC vers ce nextcloud mais j’ai peur que ce ne soit pas possible dans mon cas de figure :/ Je ne souhaite pas utiliser Nextcloud for Windows pour le faire, c’est pas hyper stable. Je préfère Syncthing que j’utilise déjà pour synchroniser des dossiers entre Pc et smartphones.

    Une idée ?

    1. fate26 octobre 2022 à 20 h 01 minRépondre

      Bonjour Wes,

      Docker n’a rien à voir dans l’histoire. Pour faire ce que tu veux faire il te suffit de suivre cet article et au lieu de synchroniser les fichiers depuis un téléphone, tu installes syncthing sur ton Windows et synchronise les fichiers entre ton serveur et ton PC sous Windows.
      Le script se chargera ensuite de les rajouter à Nextcloud.
      Après, comme je disais dans un précédent commentaire, je n’utilise plus ce script et synchronise directement mes fichiers via le client Nextcloud. Donc je n’ai aucune idée si la méthode expliquée dans cet article (Nextcloud + Syncthing) fonctionne toujours.

Répondre à Wes Annuler la réponse

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