Joplin
Modifié par john le 2026/09/18 23:20
Prise de notes : un serveur de synchronisation pour les clients Joplin (ordinateur, mobile), et l'application de bureau Joplin utilisable dans le navigateur. Deux stacks distinctes.
Serveur de synchronisation
| Conteneur | Rôle |
|---|---|
| joplin-server | Serveur Joplin |
| joplin-db | Base PostgreSQL 16 |
services:
joplin-db:
image: postgres:16
container_name: joplin-db
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d joplin -U joplin"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- <DOSSIER_BASE>:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: <MOT_DE_PASSE>
POSTGRES_USER: joplin
POSTGRES_DB: joplin
networks:
- joplin-net
joplin:
image: joplin/server:latest
container_name: joplin-server
restart: unless-stopped
depends_on:
joplin-db:
condition: service_healthy
ports:
- "22300:22300"
environment:
- APP_BASE_URL=<URL_JOPLIN>
- APP_PORT=22300
- POSTGRES_PASSWORD=<MOT_DE_PASSE>
- POSTGRES_DATABASE=joplin
- POSTGRES_USER=joplin
- POSTGRES_PORT=5432
- POSTGRES_HOST=joplin-db
- DB_CLIENT=pg
- STORAGE_DRIVER=Type=Filesystem;Path=/data/content_storage
volumes:
- <DOSSIER_CONTENU>:/data/content_storage
networks:
- joplin-net
networks:
joplin-net:
driver: bridge
joplin-db:
image: postgres:16
container_name: joplin-db
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d joplin -U joplin"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- <DOSSIER_BASE>:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: <MOT_DE_PASSE>
POSTGRES_USER: joplin
POSTGRES_DB: joplin
networks:
- joplin-net
joplin:
image: joplin/server:latest
container_name: joplin-server
restart: unless-stopped
depends_on:
joplin-db:
condition: service_healthy
ports:
- "22300:22300"
environment:
- APP_BASE_URL=<URL_JOPLIN>
- APP_PORT=22300
- POSTGRES_PASSWORD=<MOT_DE_PASSE>
- POSTGRES_DATABASE=joplin
- POSTGRES_USER=joplin
- POSTGRES_PORT=5432
- POSTGRES_HOST=joplin-db
- DB_CLIENT=pg
- STORAGE_DRIVER=Type=Filesystem;Path=/data/content_storage
volumes:
- <DOSSIER_CONTENU>:/data/content_storage
networks:
- joplin-net
networks:
joplin-net:
driver: bridge
- La base n'a aucun port publié : seul le serveur Joplin y accède, par le réseau interne joplin-net.
- STORAGE_DRIVER=Type=Filesystem : le contenu des notes et des pièces jointes est stocké en fichiers dans <DOSSIER_CONTENU>, pas dans la base. Les éléments antérieurs au passage à ce mode sont restés dans la base.
- Le serveur est publié sur le port 22300 de l'hôte, que SWAG relaie.
Application dans le navigateur
Image LinuxServer.io de l'application de bureau Joplin, affichée dans le navigateur.
name: joplin-desktop
services:
joplin-app:
image: lscr.io/linuxserver/joplin:latest
container_name: joplin-app
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- LC_ALL=fr_FR.UTF-8
volumes:
- <APPDATA>/joplin-app:/config
security_opt:
- seccomp:unconfined
shm_size: "1gb"
restart: unless-stopped
networks:
- proxy
networks:
proxy:
external: true
services:
joplin-app:
image: lscr.io/linuxserver/joplin:latest
container_name: joplin-app
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Paris
- LC_ALL=fr_FR.UTF-8
volumes:
- <APPDATA>/joplin-app:/config
security_opt:
- seccomp:unconfined
shm_size: "1gb"
restart: unless-stopped
networks:
- proxy
networks:
proxy:
external: true
- seccomp:unconfined et shm_size sont requis par l'application Electron dans le conteneur.
- L'application peut produire des fichiers core.* volumineux en cas de plantage : ils sont exclus de la sauvegarde.
Sauvegarde
- Base : dump SQL de joplin-db par le script de Sauvegarde.
- Contenu des notes : <DOSSIER_CONTENU>, ajouté comme chemin source du script car il est hors du dossier des conteneurs.
- Application : <APPDATA>/joplin-app, sans les fichiers core.*.