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.