3.11 PaperMerge. Gestión documental

Imagen obtenida de https://twitter.com/papermerge
Esta herramienta sirve para...
realizar la gestión documental a través de una interface web sencilla de utilizar. Cuenta con OCR por lo que podremos buscar textos dentro de estos documentos.
Web de proyecto y otros enlaces de interés
Página web: https://papermerge.com/
Repositorio de los proyectos que componen esta herramienta https://github.com/papermerge
Puesta en marcha
La documentación del proyecto https://docs.papermerge.io/Installation/docker-compose.html recomienda no utilizar docker-compose para un sistema en producción.
Como en ocasiones anteriores vamos a hacer con docker-compose para ello accedemos al terminal y escribimos
cd $HOME
mkdir papermarge
cd papermarge
nano .env
y dentro del fichero copiaremos el siguiente contenido:
APP_IMAGE=papermerge/papermerge
APP_TAG=latest
PAPERMERGE_JS_IMAGE=papermerge/papermerge.js
PAPERMERGE_JS_TAG=latest

TIMEZONE=Europe/Madrid

DB_USER=postgres
DB_NAME=postgres
DB_PASSWORD=postgres
DB_HOST=db
DB_PORT=5432

USE_HOSTNAME=papermerge.local

REDIS_HOST=redis
REDIS_PORT=6379

SECRET_KEY=12345abcdxyz

SUPERUSER_USERNAME=admin
SUPERUSER_EMAIL=admin@example.com
SUPERUSER_PASSWORD=admin
como en ocasiones anteriores, para guardar los cambios pulsaremos 
control + x y cuando nos pregunte aceptaremos.
Hasta ahora nunca habíamos utilizado ningún fichero 
.env pero lo correcto es establecer determinadas configuraciones en los mismos. Los ficheros 
.env son ficheros que no se comparten en el respositorio de código mientras que los ficheros 
docker-compose.yml si. Lo que suele hacerse es compartirse algún fichero como 
env-sample o de nombre similar de modo que cualquier persona pueda ver ahí los parámetros que debe configurar pero sin ver tus valores reales y le basta con renombrarlo a 
.env.
Ahora si. Vamos a crear el fichero 
docker-compose.yml para ello escribimos en el terminal
nano docker-compose.yml
y dentro del fichero copiamos el siguiente contenido:
version: '3.7'
# Any top-level key starting with x- in a Docker Compose file will be
# ignored
x-backend: &backend  # yaml anchor definition
  image: ${APP_IMAGE}:${APP_TAG}
  volumes:
    - media_root:/app/media
    - xapian_index:/app/xapian_index
  environment:
    # PAPERMERGE__<section>__<variable>
    - PAPERMERGE__MAIN__SECRET_KEY=${SECRET_KEY}
    - PAPERMERGE__DATABASE__TYPE=postgres
    - PAPERMERGE__DATABASE__USER=${DB_USER}
    - PAPERMERGE__DATABASE__NAME=${DB_NAME}
    - PAPERMERGE__DATABASE__PASSWORD=${DB_PASSWORD}
    - PAPERMERGE__DATABASE__HOST=${DB_HOST}
    - PAPERMERGE__REDIS__HOST=${REDIS_HOST}
    - PAPERMERGE__REDIS__PORT=${REDIS_PORT}
    - PAPERMERGE__MAIN__TIMEZONE=${TIMEZONE}
    # path where xapian index data is stored
    - PAPERMERGE__SEARCH__PATH=/app/xapian_index
    - DJANGO_SUPERUSER_USERNAME=${SUPERUSER_USERNAME}
    - DJANGO_SUPERUSER_EMAIL=${SUPERUSER_EMAIL}
    - DJANGO_SUPERUSER_PASSWORD=${SUPERUSER_PASSWORD}
    - DJANGO_SETTINGS_MODULE=config.settings
services:
  worker: # celery worker
    <<: *backend
    command: worker
  ws_server:  # websockets server / daphne
    <<: *backend
    command: ws_server
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.ws_server.rule=Host(`${USE_HOSTNAME}`) && PathPrefix(`/ws/`)"
  backend:  # rest api backend / uwsgi
    <<: *backend
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.backend.rule=Host(`${USE_HOSTNAME}`) && PathPrefix(`/api/`)"
  db:
    image: postgres:14.4
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_DB=${DB_NAME}
      - POSTGRES_PASSWORD=${DB_PASSWORD}
  redis:
    image: 'redis:6'
    ports:
      - '6379:6379'
    volumes:
      - redis_data:/data
  traefik:
    image: "traefik:v2.6"
    command:
      #- "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
  frontend: # emberjs
    image: ${PAPERMERGE_JS_IMAGE}:${PAPERMERGE_JS_TAG}
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`${USE_HOSTNAME}`) && PathPrefix(`/`)"
volumes:
  postgres_data:
  media_root:
  xapian_index:
  redis_data:
como en ocasiones anteriores, para guardar los cambios pulsaremos 
control + x y cuando nos pregunte aceptaremos.
Ahora en el equipo desde el que vayamos a acceder al servicio en el terminal escribiremos:
sudo nano /etc/hosts
Y en dicho fichero añade al final del mismo el texto
192.168.0.201       papermerge.local
# En lugar de 192.168.0.201 vosotros/a pondréis la IP de vuestra Raspberry Pi
como en ocasiones anteriores, para guardar los cambios pulsaremos 
control + x y cuando nos pregunte aceptaremos.
Una vez volvamos a estar en el terminal de la Raspberry Pi, escribiremos 
docker compose -f docker-compose.yml --env-file .env up -d para lanzar los servicios ubicados dentro del fichero docker-compose. Le va a costar un buen rato extraer las imágenes y empezar el despliegue, paciencia. El resultado será similar al siguiente:

Elaboración propia
En esta ocasión, aprovechando que hemos modificado el fichero /etc/hosts vamos a acceder a este servicio a través de la dirección http://papermerge.local y veremos algo como:

Elaboración propia
El usuario y contraseña por defecto son 
admin y 
admin. Fíjate que vienen establecidos en el fichero .env en los valores SUPERUSER_USERNAME y  SUPERUSER_PASSWORD.
Este servicio está al limite en cuanto a la capacidad de la Raspberry Pi 4 modelo B de 4 GB.