Cómo instalar Paperless con Nginx en Debian

Paperless es una aplicación Python que ingiere documentos escaneados, los indexa y los presenta en una interfaz web fácil de usar. En este tutorial, instalaremos Paperless con un proxy inverso HTTPS Nginx en Debian 10.

Requisitos

  • Un sistema Debian 10 en el que tengas acceso root.
  • Un nombre de dominio registrado que apunte a tu servidor.

Todos los comandos mostrados en este documento deben ejecutarse como root a menos que se indique lo contrario.

Establece la variable de entorno $VISUAL en un editor de texto de tu elección. Por ejemplo, para utilizar nano:

echo "export VISUAL=nano" >> ~/.bashrc
. ~/.bashrc

Paso 1: Instalar dependencias

Paperless requiere varios componentes de software para su instalación y funcionamiento. Instálalos como se indica a continuación:

apt update
apt install -y gnupg2 python3 python3-dev python3-pip python3-virtualenv tesseract-ocr tesseract-ocr-eng unpaper imagemagick libpoppler-cpp-dev optipng git gcc g++

Si vas a trabajar con documentos en idiomas distintos del inglés, instala los archivos de idioma Tesseract correspondientes. Por ejemplo, para francés y español:

apt install -y tesseract-ocr-fra tesseract-ocr-spa

Puedes listar todos los paquetes tesseract disponibles utilizando:

apt list tesseract-ocr-*

Si no estás seguro de qué código de 3 letras corresponde al idioma deseado, consulta esta Lista de Códigos ISO 639-2.

Paso 2: Crear un usuario del sistema

Aunque es posible ejecutar paperless como root, se recomienda encarecidamente utilizar un usuario con privilegios bajos e inicio de sesión deshabilitado. Crea un usuario y un grupo llamados paperless :

useradd -d /opt/paperless -M -r -s /bin/bash -U -p x paperless

Paso 3: Instalar Paperless

Clona el repositorio Paperless de Github en /opt/paperless

git clone https://github.com/the-paperless-project/paperless.git /opt/paperless

Da al usuario paperless la propiedad de ese directorio:

chown -R paperless:paperless /opt/paperless

Copia el ejemplo de configuración incluido como punto de partida:

cp /opt/paperless/paperless.conf.example /etc/paperless.conf

Y ábrelo en tu editor de texto:

$VISUAL /etc/paperless.conf

Elige un directorio desde el que Paperless ingiera los documentos escaneados y establece el parámetro PAPERLESS_CONSUMPTION_DIR en consecuencia:

PAPERLESS_CONSUMPTION_DIR="/opt/paperless/paper_in"

Busca, descomenta (eliminando el carácter # ) y cambia los valores de las siguientes líneas por algo seguro:

#PAPERLESS_PASSPHRASE="secret"
#PAPERLESS_SECRET_KEY="change-me"

Si tu escáner admite el envío de documentos escaneados por correo electrónico, puedes hacer que Paperless los ingiera automáticamente desde la bandeja de entrada de recepción. Para activar esta función, configura las opciones PAPERLESS_CONSUME_MAIL_*. Por razones de seguridad, se recomienda crear una cuenta de correo dedicada a Paperless. Por ejemplo:

PAPERLESS_CONSUME_MAIL_HOST="imap.example.com"
PAPERLESS_CONSUME_MAIL_PORT="993"
PAPERLESS_CONSUME_MAIL_USER="[email protected]"
PAPERLESS_CONSUME_MAIL_PASS="imap_password"

Guarda tus cambios y sal, luego cambia el propietario de este archivo a paperless y refuerza sus permisos:

chown paperless:paperless /etc/paperless.conf
chmod 0400 /etc/paperless.conf

Cambia al usuario paperless:

su - paperless

Crea el directorio de consumo:

mkdir /opt/paperless/paper_in

Crea un entorno virtual python. Esto nos proporcionará un entorno estable y aislado en el que podremos instalar los módulos y versiones específicos de python que necesita Paperless.

python3 -m virtualenv --python=/usr/bin/python3 venv

Actívalo:

. venv/bin/activate

Instala los módulos python requeridos por Paperless:

pip3 install -r requirements.txt

Este comando puede tardar un rato. Una vez que termine, ejecuta los siguientes comandos para inicializar la base de datos y crear los archivos estáticos para el servicio web:

cd src/
./manage.py migrate
./manage.py collectstatic

Crea las credenciales de acceso para la cuenta de administrador de la interfaz web ejecutando el siguiente comando y respondiendo a las indicaciones:

./manage.py createsuperuser

Paso 4: Pruebas iniciales

Antes de configurar un servidor web adecuado y los servicios systemd, probaremos a ejecutar Paperless manualmente. En este punto, aún deberías estar conectado como paperless en el entorno virtual python.

Inicia el servidor web y el consumidor de documentos en segundo plano:

./manage.py runserver 0.0.0.0:8000 &
./manage.py document_consumer &

Coloca cualquier documento escaneado en el directorio de consumo configurado en el Paso 3. Por ejemplo

wget https://i.imgur.com/DPr5wWG.jpg -O /opt/paperless/paper_in/test1.jpg

Ve a http://IP_or_DOMAIN:8000/ e inicia sesión con las credenciales elegidas en el Paso 3. En el menú «DOCUMENTOS», haz clic en «Documentos» para ver la lista de documentos. En unos minutos, el documento escaneado debería estar procesado y disponible.

Deja de escanear documentos antes de pasar al siguiente paso:

pkill -f manage.py

Paso 5: Servicios Systemd

Crearemos archivos de unidad systemd para poder gestionar correctamente los servicios web y de consumidor. Sal de nuevo a tu shell raíz:

exit

Crea un archivo de unidad para el servicio web:

$VISUAL /etc/systemd/system/paperless-webserver.service

E introduce lo siguiente:

[Unit]
Description=Paperless Gunicorn Web Server
Requires=network.target
[Service]
User=paperless
Group=paperless
ExecStart=/opt/paperless/venv/bin/gunicorn --pythonpath=/opt/paperless/src paperless.wsgi -w 3 -b 127.0.0.1:8000
Restart=on-failure
[Install]
WantedBy=multi-user.target

NOTA: Puede que quieras modificar el número de procesos trabajadores en el comando ExecStart. El servicio mostrado aquí inicia Gunicorn con 3 trabajadores(-w 3).

A continuación, crea otro archivo de unidad para el proceso consumidor de documentos:

$VISUAL /etc/systemd/system/paperless-consumer.service

E introduce lo siguiente

[Unit]
Description=Paperless Document Consumer
Requires=network.target
[Service]
User=paperless
Group=paperless
ExecStart=/opt/paperless/venv/bin/python3 /opt/paperless/src/manage.py document_consumer
Restart=on-failure
[Install]
WantedBy=multi-user.target

Inicia estos servicios:

systemctl daemon-reload
systemctl start paperless-webserver.service paperless-consumer.service

Asegúrate de que ambos se están ejecutando:

systemctl status paperless-webserver.service paperless-consumer.service

Si quieres que paperless se inicie automáticamente al arrancar el sistema, ejecuta el comando:

systemctl enable paperless-webserver.service paperless-consumer.service

Paso 6: Proxy inverso Nginx y HTTPS

Instala Nginx y certbot:

apt update
apt install -y nginx certbot

Asegúrate de que Nginx está activado y en ejecución:

systemctl enable --now nginx.service

Obtén un certificado Let’s Encrypt para tu dominio con certbot:

certbot certonly --webroot --webroot-path /var/www/html -d your_domain

Desactiva el archivo de configuración por defecto de Nginx y abre uno nuevo:

rm /etc/nginx/sites-enabled/default
$VISUAL /etc/nginx/sites-available/paperless

Introduce lo siguiente, sustituye tu_dominio por el nombre de tu dominio:

server {
    listen 80;
    server_name your_domain;
    return 301 https://$server_name$request_uri;
    access_log /var/log/nginx/paperless_access.log;
    error_log /var/log/nginx/paperless_error.log;
}
server {
    listen 443 ssl;
    server_name your_domain;
    index index.html index.htm index.php;
    access_log /var/log/nginx/paperless_access.log;
    error_log /var/log/nginx/paperless_error.log;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
    location /static {
        autoindex on;
        alias /opt/paperless/static;
    }
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8000;
    }
}

Habilita esta configuración enlazándola en el directorio Nginx de sitios habilitados, y comprueba si hay algún error:

ln -s /etc/nginx/sites-available/paperless /etc/nginx/sites-enabled
nginx -t

A continuación, carga los cambios:

systemctl reload nginx.service

Tu instancia Paperless debería estar ahora accesible en https://your_domain.

Paso 7: Mejoras

Dado que el usuario del sistema Paperless no necesita acceder a un shell de trabajo después de la configuración inicial, podemos cambiarlo a /usr/sbin/nologin:

usermod -s /usr/sbin/nologin paperless

Solución de problemas

Si el servidor web Gunicorn no se inicia con el mensaje de error [ERROR] Conexión en uso, comprueba si hay algún proceso ya vinculado al puerto 8000/tcp:

ss -lntp

Mata/desactiva el proceso en cuestión si es necesario, o modifica /etc/systemd/system/paperless-webserver.service y /etc/nginx/sites-enabled/paperless para utilizar otro puerto de red para Gunicorn.

También te podría gustar...