260614 - procedure Joplin-compression
260614
Contexte -— Instructionsinstructions pour Claude parde Julien
(260614)
J'utilise l'application Joplin sur tous mes appareils. C'est ma mémoire de tout (travail, hobbies, maison...) et donc à force, la base de données se remplit. Elle se compose de notes à l'intérieur desquelles on trouve des images. Or, mêmeMême en faisantne attention à n’importerimportant que des mages de type capturecaptures d'écran, le poids de ces images est devenu important -— de l'ordre de 300 Mo initialement estimé (476 Mo.
Mo constatés en réalité, voir ci-dessous).
Appareils synchronisés sous Joplin -:
- VPS Juxjux.OVH
-(serveur de sync)
Objectif de transformer un png de 3 Mo en un fichier de 550 ko octets sans que l'on s’aperçoive de rien.C'est là qu'intervient la procédure Joplin-Compression:
Principes -définis 1/par tenirJulien :
Exploration technique — Claude, 14/06/2026
Infrastructure Joplin sur le VPS
Contrairement à ce qu'on pourrait attendre, Joplin Server n'utilise pas SQLite mais PostgreSQL.
joplin
joplin/server:latest
Serveur de sync Joplin
joplin-db
postgres:15-alpine
Base de données
joplin-nginx
nginx:alpine
Reverse proxy interne
joplin_to_obsidian
image custom
Container migration (actif, sans impact)
Volume de données : /home/debian/joplin-data → /home/joplin/.config/joplin (bind mount)
Connexion DB : POSTGRES_HOST=joplin-db, POSTGRES_DATABASE=joplin, POSTGRES_USER=joplin
Important : le port 5432 de joplin-db n'est pas exposé à l'originalextérieur du réseau Docker. Tout script de manipulation doit tourner sur le VPS et se connecter via l'IP interne Docker.
Structure de la base de données
La table centrale est items (23 tables au total). Chaque note, ressource et paramètre Joplin est une procédureligne dans cette table.
Colonnes clés :
content (bytea) — données binaires brutes
content_size (integer) — taille en octets
content_storage_id = 1 → stockage de Database jop_type — type d'item Joplin
updated_time — timestamp de dernière modification (utilisé par les clients pour détecter les changements à sync)
Répartition par type :
Analyse des appareilsressources synchronisés(jop_type sous= Joplin0)
Les ressources sont stockées comme bytes bruts dans la colonne content. Le format est détectable via les magic bytes :
\x89PNG) — majorité des ressources
JPEG (\xff\xd8) — portion significative
ZIP (PK\x03\x04) — cas particulier : ZIP contenant plusieurs images page_1.png, page_2.png... (documents multi-pages)
La colonne mime_type est vide pour toutes les ressources — le type est implicite dans les bytes du contenu.
260614Top -20 ressources les réponsesplus delourdes Claude(état La page pose le cahier des charges mais ne décrit pas encore l'implémentation technique. On démarre de zéro sur l'architecture. Quelques questions pour caler le designinitial) :1.
Architecture proposée
Phase 1 — Observatoire
Script joplin_observatoire.py sur le VPS —:
Phase 2 — Compression (script principal)
Script joplin_compress.py sur le VPS ?:
Connexion BDD: SQLitepsycopg2 → IP Docker interne de joplin-db : 5432 (credentials dans les variables d'environnement du container, mot de passe récupéré via docker inspect)
Traitement par ressource :
content depuis items (jop_type=0)
Détecter le format (magic bytes)
Ouvrir avec Pillow :
optimize=True, compress_level=9 (lossless)
JPEG → re-save en JPEG qualité 80, optimize=True (légèrement lossy)
ZIP multi-pages → dézipper, compresser chaque image interne, reconstruire le ZIP
Si le gain est content, content_size, updated_time en Tracking des items traités : fichier JSON local /home/debian/joplin_compress_log.json pour ne pas retraiter les ressources déjà compressées.
Propagation sync : Joplin estdétecte unles containeurchangements sousvia Dockerupdated_time. etLors de la BDsqliteprochaine estsynchronisation accessiblede enchaque SSSH.client, Elleles faitressources déjàcompressées sont re-téléchargées automatiquement (le client compare l'objetupdated_time d'uneserveur sauvegardeavec quotidiennesa sanscopie imagelocale).
Phase Format des pièces jointes3 — PNGService principalement,systemd ou(cron aussiquotidien)
Timer ?systemd unjoplin-compress.timer peu→ desjoplin-compress.service 2:
Question ouverte
Choix de compression côtépour VPSles — Caesium n'a pas de version headless Linux. Tu veux utiliser quoiPNG :
compress_level=9
Pour des captures d'écran contenant du texte, la conversion PNG→JPEG peut introduire des artefacts visuels aux contours nets. Julien doit confirmer son choix avant que lesClaude PDFs) ? Surcode le VPSscript.