Serveur Joplin en mode Docker

J’utilise depuis longtemps Joplin comme application de prise de notes. Elle est vraiment très complète, propose un client Android, et permet la synchronisation entre les appareils bien sûr. Tout ce qu’il me fallait entre le PC et le smartphone.

Puis j’ai vu qu’il était possible d’installer un serveur avec Docker pour synchroniser et partager les notes de manière plus efficace, j’ai donc décidé d’installer ce serveur sur mon joli NAS.

Joplin est vraiment très complet : il permet de créer des carnets dans lesquels on peut créer des notes (deux niveaux de classement donc, indispensable), il accepte tous types d’attachements aux notes (images, pdf, audio, etc…), propose un nombre impressionnants de plugins (+350 ?), dispose d’un éditeur markdown (le format de stockage des notes) mais aussi au format « rich text », ou encore d’utiliser un éditeur externe, etc, etc… Difficile de faire plus complet ! Et bien sûr disponible sur toutes les plateformes (Windows, Linux, Android, iOS). Sans oublier une caractéristique importante :

Joplin est « hors ligne d’abord », ce qui signifie que vous avez toujours toutes vos données sur votre téléphone ou votre ordinateur. Cela garantit que vos notes sont toujours accessibles, que vous ayez ou non une connexion Internet.

Enfin c’est un français, Laurent Cozic (un breton en plus ! 😎 ) qui en est le créateur. Il s’est lancé dans ce projet en 2016, ne trouvant pas ce qu’il voulait dans les solutions existantes : un logiciel open-source axé sur la sécurité et la vie privée. Bravo à lui ! On peut se dire que depuis preques 10 ans, Joplin est devenu un logiciel assez abouti avec plein de fonctionnalités.

Voilà l’interface du client sur Linux :

On peut mettre une icône à chaque Carnet, créer une Table of Content, etc…

Mais cet article concerne la mise en place du serveur : ça a été assez simple, mais voyons voir cela tout de même…

Configuration Nextcloud

Jusqu’ici, j’utilisais mon serveur Nextcloud pour stocker mes notes. Joplin propose un mode Nextcloud pour la synchronisation, mais j’utilisais plutôt le mode WebDAV car le premier ne fonctionnait pas ou mal (c’est pourtant du webdav dans les deux cas)). Et dans les deux cas, la synchronisation était très lente. Les notes étaient stockées dans un dossier, à plat et en mode texte, dans un format markdown classique (.md).

Et puis j’ai vu qu’il existait une version serveur pour stocker ses notes, et qu’elle existait au format Docker. L’intérêt de passer en mode serveur (outre celui de monter nouveau container Docker sur mon NAS ! 😛 ) est d’améliorer la vitesse de synchronisation et la sécurité avec une connexion HTTPS, une base de données pour les notes, mais aussi de gérer plusieurs utilisateurs, et même la possibilité de partager des notes entre eux.

Le container Docker

Comme toujours, j’utilise Dockge pour gérer mes containers. Voilà le contenu du fichier compose.yaml pour Joplin :

services:
  db:
    image: postgres:16
    volumes:
      - /srv/dev-disk-by-uuid-aaaa-bbbb-cccc-dddd/AppData/joplin/joplindb:/var/lib/postgresql/data
    ports:
      - 5432:5432
    restart: unless-stopped
    environment:
      - POSTGRES_PASSWORD=votremotdepasse
      - POSTGRES_USER=user
      - POSTGRES_DB=postgres
  app:
    image: joplin/server:latest
    depends_on:
      - db
    ports:
      - 22300:22300
    restart: unless-stopped
    environment:
      - APP_PORT=22300
      - APP_BASE_URL=https://adresse_externe_de_mon_serveur_joplin
      - DB_CLIENT=pg
      - POSTGRES_PASSWORD=votremotdepasse
      - POSTGRES_DATABASE=postgres
      - POSTGRES_USER=user
      - POSTGRES_PORT=5432
      - POSTGRES_HOST=db
networks: {}
  • On voit que l’on installe un container Postgres (version Docker de la base de données PostgreSQL) où le serveur Joplin ira stocker les notes.
  • Adapter les user, password et db de la base de données.
  • Pour Joplin, veiller à bien indiquer l’adresse externe par laquelle on accédera au serveur de l’extérieur.

Sous-domaine

Comme d’habitude, il faut commencer par créer un enregistrement CNAME pour le sous-domaine que l’on va utiliser pour Joplin. Cela se passe chez l’hébergeur web du blog, Infomaniak dans mon cas, et fait partie de l’offre. Et c’est toujours le même principe, petit rappel au cas où :

  • J’ai donc un domaine pour héberger mon blog (pled.fr) pour lequel je paie chaque année un peu moins de 10€.
  • Je crée sur le site de l’hébergeur un sous-domaine mon-nas.pled.fr (enregistrement de type A) qui pointe vers l’adresse IP de ma box.
  • Puis je crée autant de sous-domaines (enregistrement de type CNAME) pour tous mes services docker (nextcloud.mon-nas.pled.fr, joplin.mon-nas.pled.fr, etc…) qui tournent sur mon NAS, dont la valeur pointe vers mon premier sous-domaine de type A. Le routage vers les services sera traité par mon proxy (nginx ou swag en l’occurrence).

Voilà donc ce qu’il faut avoir pour le service Joplin :

Type Nom Adresse Box
A mon-nas.pled.fr 1.2.3.4
Type Nom Alias de
CNAME joplin.mon-nas.pled.fr mon-nas.pled.fr

Toutes les requêtes vers les services Docker vont être adressées à l’enregistrement de type A, soit vers l’adresse IP de la box. C’est aussi simple que ça. C’est ensuite au proxy de gérer la distribution des messages vers chaque service, grâce au numéro de port.

Configuration du proxy

Le tri est donc gérée par le proxy. Dans mon cas, il s’agit de Swag, installé avec le container Nextcloud. C’est essentiellement un serveur web nginx avec php7, fail2ban (prévention des intrusions) et la validation de certificats Let’s Encrypt intégrée.

Comme pour chaque service Docker, j’ai créé un fichier joplin.subdomain.conf dans le dossier AppData/swag/nginx/proxy-confs :

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name joplin.mon-nas.pled.fr;

    client_max_body_size 20m;

location / {
    proxy_pass http://192.168.x.y:22300;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Le proxy écoute sur le port 443 (https) puis redirige les messages adressés au sous-domaine joplin vers le port 22300 indiqué dans le fichier compose.yaml plus haut.

Cette fois, j’ai du y ajouter quelques règles supplémentaires pour que l’accès au serveur Joplin soit possible. Sans les trois règles « proxy_set » ci-dessus, j’obtenais cette erreur :
Invalid origin: http://192.168.1.xx:22300
dans le navigateur.

Enfin, pour obtenir le certificat LetsEncrypt, il ne faut pas oublier d’ajouter joplin à la liste des sous-domaines dans le fichier concernant swag :

services :
...
  swag:
...
    environment:
...
      - SUBDOMAINS=nextcloud, joplin
...

Et on redémarre le proxy pour prendre ces modifications en compte.

Le serveur Joplin

Une fois le container Joplin démarré, on peut donc accéder à l’adresse du type https://joplin.mon-nas.mon-domaine.fr :

Pour la première connexion, utiliser :

Email : admin@localhost
Password : admin

Une fois identifié, il convient bien sûr de changer le mot de passe comme demandé :

Profitez-en pour changer à la fois l’adresse mail et le mot de passe. Un mail de confirmation va alors être envoyé. Comme nous n’avons pas configuré de serveur mail, tout se passe en interne à Joplin : il faut aller dans la partie Admin et sélectionner Emails dans le menu de gauche : puis ouvrir le mail intitulé « Confirm your new Joplin Server account email » :

Et enfin cliquer sur « Confirm email » :

Et voilà, le serveur Joplin est opérationnel.

Les clients

J’utilise deux clients pour l’instant, un sur le PC et l’autre sur le tel.

Linux

Sur le PC Debian, l’installation et la mise à jour se fait avec la même commande :

wget -O - https://raw.githubusercontent.com/laurent22/joplin/master/Joplin_install_and_update.sh | bash

Le script s’occupe de tout, il installe en fait l’application au format AppImage ici : /home/pascal/.joplin/Joplin.AppImage, ainsi que le fichier .desktop nécessaire pour l’intégration à Gnome (icône) là : .local/share/applications/appimagekit-joplin.desktop.

Ici il va détecter la version existante, et la mettre à jour :

Pour la synchronisation, il suffira d’aller dans Outils – Options, et d’y définir la nouvelle méthode de synchronisation avec l’adresse du serveur ainsi que l’adresse mail et le mot de passe définis précédemment :

Puis je lance une synchronisation (ou Ctrl-S) et toutes mes notes existantes seront immédiatement copiées vers le serveur. J’observe déjà le gain de vitesse par rapport à la synchro WebDAV utilisée précédemment.

Android

Côté Android, c’est la même chose. L’appli est disponible sur le Google Play Store mais aussi sur F-Droid.

Conclusion

Je vais désormais faire de Joplin mon unique logiciel de prises de notes.

Car j’avais commencé à utiliser en parallèle Nextcloud Notes, qui possède aussi sa propre application Android. Mais à l’usage, c’est beaucoup moins abouti que Joplin, et l’appli souffre de problèmes récurrents, comme la synchronisation que l’on doit parfois forcer, ou l’affichage en mode « text enrichi » qui ne fonctionne pas.

L’application Joplin est plus fiable et pratique à l’usage, et je crois qu’il y a en projet de refonte totale afin d’en améliorer l’ergonomie.

NAS

Voilà un serveur de plus d’ajouté à mon NAS ! Je peux commencer à parler sérieusement d’auto-hébergement ! 😎

Laisser un commentaire

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