From 3f6a3475c8726e83d51a653c51ffc0d76bff32fb Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Thu, 20 Aug 2026 14:45:21 +0200 Subject: [PATCH] feat(paperless): move consume and export to own volume --- stacks/paperless.opytex.org/README.md | 30 +++++++++++-------- .../paperless.opytex.org/docker-compose.yml | 13 +++++--- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/stacks/paperless.opytex.org/README.md b/stacks/paperless.opytex.org/README.md index c122dca..8a27a41 100644 --- a/stacks/paperless.opytex.org/README.md +++ b/stacks/paperless.opytex.org/README.md @@ -77,23 +77,27 @@ exception : il n'est pas dans `env_file`, il vient de SOPS via ## `consume` et `export` -Deux bind mounts **relatifs à ce dossier**, donc situés dans le dépôt : - -| Montage | Rôle | +| Volume | Rôle | |---|---| -| `./consume` | tout fichier déposé ici est ingéré puis supprimé | -| `./export` | destination de `document_exporter` | +| `consume` | tout fichier déposé ici est ingéré puis supprimé | +| `export` | destination de `document_exporter` | -Ce sont des données, pas de la configuration : le `.gitignore` local les -exclut du dépôt. Ne pas retirer ces règles, ce sont des documents personnels. +Ce sont des volumes Docker et non des dossiers de ce dépôt : les données +restent hors de l'arbre versionné, et un déplacement du dépôt ne les emmène +pas. Ils naissent avec l'UID/GID du chemin correspondant dans l'image (1000), +donc sans `chown` à faire. -Ces dossiers doivent appartenir à l'UID/GID déclaré dans `env_file` -(`USERMAP_UID` / `USERMAP_GID`, 1000) : Docker les crée en `root` s'ils -n'existent pas, et Paperless ne peut alors plus supprimer les fichiers qu'il a -consommés. +Déposer un fichier à ingérer passe par l'UI, ou : ```bash -mkdir -p consume export && chown 1000:1000 consume export +docker cp fichier.pdf paperlessopytexorg-webserver-1:/usr/src/paperless/consume/ +``` + +Générer une archive lisible sans Paperless : + +```bash +sops exec-env secrets.env.yaml \ + 'docker compose exec webserver document_exporter ../export' ``` ## Volumes @@ -104,6 +108,8 @@ mkdir -p consume export && chown 1000:1000 consume export | `paperless-media` | **les documents originaux et leurs archives PDF** | label `backup.enable=true` + `MANUAL_VOLUMES` | | `paperless-pg-data` | base PostgreSQL | dump SQL (`backup.type=postgres` sur le conteneur `db`) | | `paperlessopytexorg_valkeydata` | file de tâches Celery (Valkey) | non sauvegardé, volontairement — reconstruit | +| `paperlessopytexorg_export` | archive `document_exporter`, lisible sans Paperless | label `backup.enable=true` sur le volume | +| `paperlessopytexorg_consume` | sas d'ingestion | non sauvegardé, volontairement — transitoire | Les trois premiers portent un `name:` explicite, sans préfixe de projet. diff --git a/stacks/paperless.opytex.org/docker-compose.yml b/stacks/paperless.opytex.org/docker-compose.yml index c8ec5c2..2d51618 100644 --- a/stacks/paperless.opytex.org/docker-compose.yml +++ b/stacks/paperless.opytex.org/docker-compose.yml @@ -59,10 +59,8 @@ services: volumes: - data:/usr/src/paperless/data - media:/usr/src/paperless/media - # Bind mounts relatifs au dossier de la stack : leur chemin sur l'hôte - # change avec le déplacement du dépôt. Voir README.md. - - ./export:/usr/src/paperless/export - - ./consume:/usr/src/paperless/consume + - export:/usr/src/paperless/export + - consume:/usr/src/paperless/consume networks: - default - traefik-proxy @@ -115,6 +113,13 @@ volumes: # zéro plutôt que de convertir. L'ancien `paperlessopytexorg_redisdata` # subsiste, inutilisé : c'est le chemin de retour vers `redis:7`. valkeydata: + # Volumes neufs : le label s'applique donc, contrairement aux quatre + # au-dessus. `consume` n'en porte pas — un fichier n'y séjourne que le temps + # d'être ingéré, après quoi il est dans `media`. + export: + labels: + backup.enable: true + consume: networks: traefik-proxy: