Der neue Paperless-NGX v1.8.0 Server
Ich habe nun etliche Tage damit verbracht die für mich in Betracht kommenden Dokumenten Management Systeme zu betrachten, testen, bewerten und auf Herz und Nieren zu prüfen. Der Gedanke ein DMS zu nutzen ist also nun ausreichend genährt und es geht an das Aufsetzen des DMS. In meinem Falle also Paperless-NGX in der aktuell als „latest“ deklarierten Version 1.8.0 auf GitHub – also die Version vom 29 Juli 2022. Sicherlich könnte ich jetzt von einige Tage warten auf den gerade im Stadium Beta3 befindlichen Release Candidat v1.9.0. Doch mit dieser Denke kann man immer fröhlich Warten und verpaßt den ganzen Update-Spaß. 😉
Wie möchte das Frame-Work am Ende haben war eine in den Tests immer wieder hoch kommende Frage und ich denke für mich eine Lösung gefunden zu haben, die wie folgt aussieht.
Doch Moment, bevor wir damit Anfangen ziehen wir erst einmal das Server OS zurecht und bauen uns die Plattform auf. Ich selber mag es an den Files und dem System herum zu Basteln und zu Schrauben. Ist sicherlich nicht jedermanns Sache, wer eher einen Ansible oder anders gearteten Aufbaupfad sehen möchte, wir hier leider enttäuscht.
Werfen wir einen Blick auf Hardware dieses all ways on Servers. Es handelt sich dabei um eine möglichst sparsam gewählte Plattform, gerade mit Fokus auf den Energie-Fußabdruck. Ich erwarte jetzt keine Weltrekorde beim Bitcoin-Crunshen, sondern eine solide, leise und vor allem sparsame Plattform.
Beim Betriebssystem habe ich mich auch für die konservative Linie entschieden und bin für den Paperless-NGX Server, entgegen meiner sonstigen Gewohnheit für Linux Arch, zum Ubuntu Server 22.04lts geschwenkt. Der Server soll ja über einen langen Zeitraum seinen Dienst verrichten und da habe ich dann keine Lust die auf dem Desktop alle Monate übliche Debugging-Session durch zu ziehen, nur weil mal wieder eine Config oder sonst irgend etwas aus der Kurve geflogen ist. Es soll also rock-solid und ohne große Schnörkel werden.
HDD/NVME-Setup
Ich hab bei den DMS-Tests festgestellt, dass es sich positiv bemerkbar macht, wenn die Datenbanken, die Tools und das ganze Webgerassel schnell ausgeliefert. Bei dem Filearchiv war da kein großer Unterschied in der „Fluptizität“ zu spüren. Aus diesem Grunde werde ich die Files und alles was damit zusammenhängt auf der großen langsamen HDD speichern und die ganzen kleinteiligen Dinge auf der NVME. Ich denke ich werde keine B-Tree Filesystem benötigen, da ich aus derzeitiger Sicht keine Snapshots ziehen werde. Bei den DMS-Tests wurde auch kein Filesystem mit erweiterter Filesystem-Rechtestruktur genutzt, also werde ich mit XFS auch verkneifen und alles mit EXT4 aufsetzen.
Nach dem initialen Setup von Ubuntu 22.04lts Server stellt sich das Root-Filesystem wie folgt dar.
eric@bammbamm:~$ sudo parted /dev/sda mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes
eric@bammbamm:~$ sudo parted -a optimal /dev/sda mkpart primary ext4 0% 100%
Information: You may need to update /etc/fstab.
eric@bammbamm:~$ sudo mkfs.ext4 -b 4096 -L STORAGE /dev/sda1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 244190208 4k blocks and 61054976 inodes
Filesystem UUID: 12beb674-c713-41e5-9802-1a7092075492
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848
Allocating group tables: 0/7453
done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done
eric@bammbamm:~$ lsblk -f /dev/sda
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
└─sda1 ext4 1.0 STORAGE 12beb674-c713-41e5-9802-1a7092075492
eric@bammbamm:~$
Die Partion ist angelegt. Um diese auch nutzen zu können müssen fehlt mir noch ein schöner Mountpoint und der passende Eintrag in der /etc/fstab, um sie auch automatisch nach dem nächsten Booten wieder eingebunden zu haben. Ich lege mir den Mountpoint storage in das Verzeichnis /mnt als /mnt/storage und binde ihn in der FSTAB per UUID ein. Das erscheint mir persönlich sinnvoll und robust. Nach dem Anlegen und Eintragen werde ich rebooten und sehen, ob er alles artig anzieht… also ich keinen Bock geschossen habe. 🙂
eric@bammbamm:~$ sudo mkdir /mnt/storage
eric@bammbamm:~$ lsblk -f /dev/sda1
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda1 ext4 1.0 STORAGE 12beb674-c713-41e5-9802-1a7092075492
eric@bammbamm:~$ sudo nano /etc/fstab
eric@bammbamm:~$ more /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/nvme0n1p2 during curtin installation
/dev/disk/by-uuid/01722866-3e02-4014-ab3a-d456639a9e41 / ext4 defaults 0 1
# /boot/efi was on /dev/nvme0n1p1 during curtin installation
/dev/disk/by-uuid/2844-66F9 /boot/efi vfat defaults 0 1
/swap.img none swap sw 0 0
# /mnt/storage hand made in germany
/dev/disk/by-uuid/12beb674-c713-41e5-9802-1a7092075492 /mnt/storage ext4 defaults 0 1
eric@bammbamm:~$ sudo reboot
Mal sehen, ob er die EXT4 Partionen auch alle sauber angezogen hat…
eric@bammbamm:~$ lsblk -f | grep -E "NAME|ext4"
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
└─sda1 ext4 1.0 STORAGE 12beb674-c713-41e5-9802-1a7092075492 869,2G 0% /mnt/storage
└─nvme0n1p2 ext4 1.0 01722866-3e02-4014-ab3a-d456639a9e41 208,8G 3% /
eric@bammbamm:~$
Einige magische BASH Zeilen später steht das gewünschte Setup, wie im folgenden Bild dargestellt.
User anlegen
Aus den vorherigen Paperless-NGX Installationen weiß ich, daß ein User mit der Gruppe paperless benötigt wird. Für diesen User paperless lege ich mal ein Home-Verzeichnis an, zugegeben an einem ungewöhnlichen Ort – nämlich /opt/paperless-ngx. Da der User paperless selber nur ein maschinen User ist, stellt das für mich kein Beinbruch dar.
eric@bammbamm:~$ sudo adduser paperless --system --home /opt/paperless-ngx --group
[sudo] password for eric:
Adding system user `paperless' (UID 113) ...
Adding new group `paperless' (GID 118) ...
Adding new user `paperless' (UID 113) with group `paperless' ...
Creating home directory `/opt/paperless-ngx' ...
eric@bammbamm:~$ ls -la /opt/
total 12
drwxr-xr-x 3 root root 4096 Sep 26 13:45 .
drwxr-xr-x 19 root root 4096 Sep 26 08:32 ..
drwxr-x--- 2 paperless paperless 4096 Sep 26 13:45 paperless-ngx
eric@bammbamm:~$ ls -la /opt/paperless-ngx/
ls: cannot open directory '/opt/paperless-ngx/': Permission denied
eric@bammbamm:~$ sudo ls -la /opt/paperless-ngx/
total 8
drwxr-x--- 2 paperless paperless 4096 Sep 26 13:45 .
drwxr-xr-x 3 root root 4096 Sep 26 13:45 ..
eric@bammbamm:~$
Die Rechte stimmen auch, nur user paperless oder halt root können in sein Home-Verzeichnis luschern. Na dann werden dir mal die Tool Dependencies installieren.
Installieren der Tool Dependencies
Die Dependencies sind in der Anleitung an zwei stellen angegeben mit etwas Text dazwischen. Mir persönlich reicht es aus, daß ich die einfach installiere.
eric@bammbamm:~$ sudo apt update
eric@bammbamm:~$ sudo apt upgrade
<snip>
eric@bammbamm:~$ sudo apt install python3 python3-pip python3-dev imagemagick fonts-liberation gnupg libpq-dev libmagic-dev mime-support libzbar0 poppler-utils unpaper ghostscript icc-profiles-free qpdf liblept5 libxml2 pngquant zlib1g tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng optipng
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
<snip>
eric@bammbamm:~$ sudo reboot
Installieren von Redis
Das Setup von paperless-NGX benötigt zwingend den Key-Value Store Redis. diesen werde ich jetzt ohne weitere Sicherungsmechanismen installieren. Wenn ich die GitHUB Pull-Requests richtig deute, sind die super fleissigen Coder da allerdings schon dran, um das ggf. in späteren Versionen zu härten.
eric@bammbamm:~$ sudo apt install redis-server
[sudo] password for eric:
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
<snip>
eric@bammbamm:~$ redis-server -v
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6
eric@bammbamm:~$ sudo systemctl start redis-server
eric@bammbamm:~$ sudo systemctl enable redis-server
Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable redis-server
eric@bammbamm:~$ redis-cli ping
PONG
eric@bammbamm:~$ sudo systemctl status redis-server
● redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-09-26 14:01:18 UTC; 52s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Main PID: 1360 (redis-server)
Status: "Ready to accept connections"
Tasks: 5 (limit: 18326)
Memory: 2.6M
CPU: 273ms
CGroup: /system.slice/redis-server.service
└─1360 "/usr/bin/redis-server 127.0.0.1:6379" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" >
Sep 26 14:01:18 bammbamm systemd[1]: Starting Advanced key-value store...
Sep 26 14:01:18 bammbamm systemd[1]: Started Advanced key-value store.
eric@bammbamm:~$
Super, der Redis läuft und antwortet auch.
Installieren und Einrichten von PostgreSQL
Was ich im GitHUB gesehen habe bei Version 1.8.0 stimmt mich zuversichtlich, daß ich anstelle von SQLite3 endlich PostgreSQL nutzen kann. Also werde ich dann mal installieren und einrichten.
eric@bammbamm:~$ sudo apt install postgresql
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
<snip>
eric@bammbamm:~$ sudo systemctl start postgresql
eric@bammbamm:~$ sudo systemctl enable postgresql
Synchronizing state of postgresql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable postgresql
eric@bammbamm:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-09-26 14:05:40 UTC; 35s ago
Main PID: 3717 (code=exited, status=0/SUCCESS)
CPU: 2ms
Sep 26 14:05:40 bammbamm systemd[1]: Starting PostgreSQL RDBMS...
Sep 26 14:05:40 bammbamm systemd[1]: Finished PostgreSQL RDBMS
eric@bammbamm:~$ sudo -u postgres psql
could not change directory to "/home/eric": Permission denied
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
Type "help" for help.
postgres=# CREATE DATABASE paperless;
CREATE DATABASE
postgres=# CREATE USER paperless WITH PASSWORD 'super sicher';
CREATE ROLE
postgres=# GRANT ALL PRIVILEGES ON DATABASE paperless TO paperless;
GRANT
postgres=# \q
eric@bammbamm:~$ psql --username paperless --password --host localhost paperless
Password: 'super sicher'
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
paperless=> \conninfo
You are connected to database "paperless" as user "paperless" on host "localhost" (address "127.0.0.1") at port "5432".
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
paperless=> \q
eric@bammbamm:~$
Okay, die Datenbank paperless für den User paperless ist angelegt, läuft und antwortet.
Installieren und Einrichten von Paperless-NGX v1.8.0
Kommen wir zur eigentlichen Aufgabe der Server Installation, das Paperless-NGX Paket wartet schon. 🙂 Okay, dann gehen wir mal als ROOT in das Home-Verzeichnis von User paperless /opt/paperless-ngx und installieren mal etwas…
eric@bammbamm:~$ sudo -i
[sudo] password for eric: 'super super geheim'
root@bammbamm:~# cd /opt/paperless-ngx/
root@bammbamm:/opt/paperless-ngx# wget https://github.com/paperless-ngx/paperless-ngx/releases/download/v1.8.0/paperless-ngx-v1.8.0.tar.xz
--2022-09-26 14:30:50-- https://github.com/paperless-ngx/paperless-ngx/releases/download/v1.8.0/paperless-ngx-v1.8.0.tar.xz
Resolving github.com (github.com)... 140.82.121.3
Connecting to github.com (github.com)|140.82.121.3|:443... connected.
<snip>
paperless-ngx-v1.8.0.tar.xz 100%[==============================================================================>] 21,44M 22,6MB/s in 0,9s
2022-09-26 14:30:51 (22,6 MB/s) - ‘paperless-ngx-v1.8.0.tar.xz’ saved [22482684/22482684]#
root@bammbamm:/opt/paperless-ngx# tar -xvf paperless-ngx-v1.8.0.tar.xz -C /opt
root@bammbamm:/opt/paperless-ngx# ls -la
total 22212
drwxr-xr-x 8 1001 postgres 4096 Jul 28 23:33 .
drwxr-xr-x 3 root root 4096 Sep 26 13:45 ..
drwxr-xr-x 3 1001 postgres 4096 Jul 28 23:33 data
drwxr-xr-x 3 1001 postgres 4096 Jul 28 23:33 docker
-rw-r--r-- 1 1001 postgres 7458 Jul 28 23:33 Dockerfile
-rw-r--r-- 1 1001 postgres 220 Jul 28 23:33 .dockerignore
drwxr-xr-x 5 1001 postgres 4096 Jul 28 23:33 docs
-rw-r--r-- 1 1001 postgres 72 Jul 28 23:33 .env
-rw-r--r-- 1 1001 postgres 1108 Jul 28 23:33 gunicorn.conf.py
-rw-r--r-- 1 1001 postgres 35142 Jul 28 23:33 LICENSE
-rw-r--r-- 1 1001 postgres 2559 Jul 28 23:33 paperless.conf
-rw-r--r-- 1 root root 22482684 Jul 28 23:34 paperless-ngx-v1.8.0.tar.xz
-rw-r--r-- 1 1001 postgres 1659 Jul 28 23:33 Pipfile
-rw-r--r-- 1 1001 postgres 145133 Jul 28 23:33 Pipfile.lock
-rw-r--r-- 1 1001 postgres 8812 Jul 28 23:33 README.md
-rw-r--r-- 1 1001 postgres 3972 Jul 28 23:33 requirements.txt
drwxr-xr-x 2 1001 postgres 4096 Jul 28 23:33 scripts
drwxr-xr-x 10 1001 postgres 4096 Jul 28 23:33 src
drwxr-xr-x 7 1001 postgres 4096 Jul 28 23:33 static
Und da ist das Paket auch schon gelandet im Home Verzeichnis von paperless. Was allerdings ziemlich schräg ist sind die Eingentümer und Gruppen Rechte. Das müssen wir glatt ziehen, sonst fliegt uns das alles aus der Kurve.
root@bammbamm:/opt/paperless-ngx# chown paperless:paperless -Rfv /opt/paperless-ngx
<snip>
changed ownership of '/opt/paperless-ngx/docs' from 1001:postgres to paperless:paperless
changed ownership of '/opt/paperless-ngx' from 1001:postgres to paperless:paperless
root@bammbamm:/opt/paperless-ngx# ls -la
total 22212
drwxr-xr-x 8 paperless paperless 4096 Jul 28 23:33 .
drwxr-xr-x 3 root root 4096 Sep 26 13:45 ..
drwxr-xr-x 3 paperless paperless 4096 Jul 28 23:33 data
drwxr-xr-x 3 paperless paperless 4096 Jul 28 23:33 docker
-rw-r--r-- 1 paperless paperless 7458 Jul 28 23:33 Dockerfile
-rw-r--r-- 1 paperless paperless 220 Jul 28 23:33 .dockerignore
drwxr-xr-x 5 paperless paperless 4096 Jul 28 23:33 docs
-rw-r--r-- 1 paperless paperless 72 Jul 28 23:33 .env
-rw-r--r-- 1 paperless paperless 1108 Jul 28 23:33 gunicorn.conf.py
-rw-r--r-- 1 paperless paperless 35142 Jul 28 23:33 LICENSE
-rw-r--r-- 1 paperless paperless 2559 Jul 28 23:33 paperless.conf
-rw-r--r-- 1 paperless paperless 22482684 Jul 28 23:34 paperless-ngx-v1.8.0.tar.xz
-rw-r--r-- 1 paperless paperless 1659 Jul 28 23:33 Pipfile
-rw-r--r-- 1 paperless paperless 145133 Jul 28 23:33 Pipfile.lock
-rw-r--r-- 1 paperless paperless 8812 Jul 28 23:33 README.md
-rw-r--r-- 1 paperless paperless 3972 Jul 28 23:33 requirements.txt
drwxr-xr-x 2 paperless paperless 4096 Jul 28 23:33 scripts
drwxr-xr-x 10 paperless paperless 4096 Jul 28 23:33 src
drwxr-xr-x 7 paperless paperless 4096 Jul 28 23:33 static
root@bammbamm:/opt/paperless-ngx#
So sieht das gleich viel besser aus. Jetzt fehlen uns noch die im Anschluß zu konfigurierenden Verzeichnisse consume + data + trash + media. Hier mache ich es jetzt wie folgt. Ich lege diese von Paperless-NGX benötigten Verzeichnisse unter /mnt/storage an und mache mir Symlinks in das Homeverzeichnis von paperless, dann sieht das in der Konfig schön sauber aus und die Daten liegen trotzdem auf unterschiedlichen Speichermedien. Ich denke mir das so, wie in der folgenden Darstellung.
Zeit ein paar Verzeichnisse anzulegen, die Symbolic Links zu setzen und die Rechte glatt zu ziehen. Wobei ich zwischendurch noch die bereits aus dem Paket gehüpften Verzeichnisse data/ und data/log/ löschen werde, sonst wird das nix mit den SymLinks. 😉
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/data
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/data/log
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/media
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/consume
root@bammbamm:/opt/paperless-ngx# mkdir /mnt/storage/trash
root@bammbamm:/opt/paperless-ngx# rm -Rfv data
removed directory 'data/log'
removed directory 'data'
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/data/ /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/media /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/trash /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ln -s /mnt/storage/consume /opt/paperless-ngx
root@bammbamm:/opt/paperless-ngx# ls -la
total 22208
drwxr-xr-x 7 paperless paperless 4096 Sep 26 15:02 .
drwxr-xr-x 3 root root 4096 Sep 26 13:45 ..
lrwxrwxrwx 1 root root 20 Sep 26 15:02 consume -> /mnt/storage/consume
lrwxrwxrwx 1 root root 18 Sep 26 15:01 data -> /mnt/storage/data/
<snip>
lrwxrwxrwx 1 root root 18 Sep 26 15:01 media -> /mnt/storage/media
<snip>
lrwxrwxrwx 1 root root 18 Sep 26 15:01 trash -> /mnt/storage/trash
root@bammbamm:/opt/paperless-ngx# chown paperless:paperless -Rfv /opt/paperless-ngx
ownership of '/opt/paperless-ngx/static' retained as paperless:paperless
changed ownership of '/opt/paperless-ngx/consume' from root:root to paperless:paperless
<snip>
root@bammbamm:/opt/paperless-ngx# ls -la
total 22208
drwxr-xr-x 7 paperless paperless 4096 Sep 26 15:02 .
drwxr-xr-x 3 root root 4096 Sep 26 13:45 ..
lrwxrwxrwx 1 paperless paperless 20 Sep 26 15:02 consume -> /mnt/storage/consume
lrwxrwxrwx 1 paperless paperless 18 Sep 26 15:01 data -> /mnt/storage/data/
<snip>
lrwxrwxrwx 1 paperless paperless 18 Sep 26 15:01 media -> /mnt/storage/media
<snip>
lrwxrwxrwx 1 paperless paperless 18 Sep 26 15:01 trash -> /mnt/storage/trash
root@bammbamm:/opt/paperless-ngx#
root@bammbamm:~# chown paperless:paperless /opt/paperless-ngx/data/log
root@bammbamm:~# ls -la /opt/paperless-ngx/data/
total 12
drwxr-xr-x 3 root root 4096 Sep 26 15:10 .
drwxr-xr-x 7 root root 4096 Sep 26 14:53 ..
drwxr-xr-x 2 paperless paperless 4096 Sep 26 14:53 log
root@bammbamm:/opt/paperless-ngx# sudo chmod 777 -Rfv /mnt/storage/*
Damit sind die Verzeichnisse sauber anglegt und verlinkt. Es ist an der Zeit sich der Konfiguration von Paperless-NGX zuzuwenden. Um sicher zu gehen, daß ich im Zweifelsfalle eine orginal Konfingtemplate habe, mache ich davon aber zu erst ein Backup.
root@bammbamm:/opt/paperless-ngx# cp paperless.conf paperless.conf.org
root@bammbamm:/opt/paperless-ngx# nano paperless.conf
root@bammbamm:/opt/paperless-ngx# more paperless.conf
#PAPERLESS_DEBUG=false
# Required services
PAPERLESS_REDIS=redis://localhost:6379
PAPERLESS_DBHOST=localhost
PAPERLESS_DBPORT=5432
PAPERLESS_DBNAME=paperless
PAPERLESS_DBUSER=paperless
PAPERLESS_DBPASS='super sicher'
PAPERLESS_DBSSLMODE=prefer
# Paths and folders
PAPERLESS_CONSUMPTION_DIR=/opt/paperless-ngx/consume
PAPERLESS_DATA_DIR=/opt/paperless-ngx/data
PAPERLESS_TRASH_DIR=/opt/paperless-ngx/trash
PAPERLESS_MEDIA_ROOT=/opt/paperless-ngx/media
PAPERLESS_STATICDIR=/opt/paperless-ngx/static
#PAPERLESS_FILENAME_FORMAT=
#PAPERLESS_FILENAME_FORMAT_REMOVE_NONE=
# Security and hosting
PAPERLESS_SECRET_KEY='noch viel viel geheimer'
#PAPERLESS_URL=https://example.com
#PAPERLESS_CSRF_TRUSTED_ORIGINS=https://example.com # can be set using PAPERLESS_URL
#PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL
#PAPERLESS_CORS_ALLOWED_HOSTS=https://localhost:8080,https://example.com # can be set using PAPERLESS_URL
#PAPERLESS_FORCE_SCRIPT_NAME=
#PAPERLESS_STATIC_URL=/static/
#PAPERLESS_AUTO_LOGIN_USERNAME=
#PAPERLESS_COOKIE_PREFIX=
#PAPERLESS_ENABLE_HTTP_REMOTE_USER=false
# OCR settings
PAPERLESS_OCR_LANGUAGE=deu+eng
PAPERLESS_OCR_MODE=skip
PAPERLESS_OCR_OUTPUT_TYPE=pdfa
PAPERLESS_OCR_PAGES=0
#PAPERLESS_OCR_IMAGE_DPI=300
PAPERLESS_OCR_CLEAN=clean
PAPERLESS_OCR_DESKEW=true
PAPERLESS_OCR_ROTATE_PAGES=true
PAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=12.0
#PAPERLESS_OCR_USER_ARGS={}
PAPERLESS_CONVERT_MEMORY_LIMIT=0
PAPERLESS_CONVERT_TMPDIR=/var/tmp/paperless
# Software tweaks
PAPERLESS_TASK_WORKERS=2
PAPERLESS_THREADS_PER_WORKER=2
PAPERLESS_TIME_ZONE=Europe/Berlin
#PAPERLESS_CONSUMER_POLLING=10
PAPERLESS_CONSUMER_DELETE_DUPLICATES=false
PAPERLESS_CONSUMER_RECURSIVE=false
PAPERLESS_CONSUMER_IGNORE_PATTERNS=[".DS_STORE/*", "._*", ".stfolder/*", ".stversions/*", ".localized/*", "desktop.ini"]
PAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false
PAPERLESS_CONSUMER_ENABLE_BARCODES=false
PAPERLESS_CONSUMER_ENABLE_BARCODES=PATCHT
#PAPERLESS_PRE_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh
#PAPERLESS_POST_CONSUME_SCRIPT=/path/to/an/arbitrary/script.sh
PAPERLESS_FILENAME_DATE_ORDER=YMD# Tika settings
PAPERLESS_TIKA_ENABLED=false
#PAPERLESS_TIKA_ENDPOINT=http://localhost:9998
#PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://localhost:3000
# Binaries
PAPERLESS_CONVERT_BINARY=/usr/bin/convert
PAPERLESS_GS_BINARY=/usr/bin/gs
PAPERLESS_OPTIPNG_BINARY=/usr/bin/optipng
#PAPERLESS_FILENAME_PARSE_TRANSFORMS=[]
#PAPERLESS_THUMBNAIL_FONT_NAME=
#PAPERLESS_IGNORE_DATES=
#PAPERLESS_ENABLE_UPDATE_CHECK=
Das sollte zum Initialisieren fürs erste reichen. Dann werden wir mal die Paperless-NGX Rakete auf die Rampe schieben und ihre Requirements installieren. Damit wir so langsam aber sicher Startklar kriegen.
root@bammbamm:/opt/paperless-ngx# sudo -Hu paperless pip3 install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
<snip>
Successfully installed pip-22.2.2
root@bammbamm:/opt/paperless-ngx# sudo -Hu paperless pip3 install -r requirements.txt
Defaulting to user installation because normal site-packages is not writeable
Looking in indexes: https://pypi.python.org/simple, https://www.piwheels.org/simple
Ignoring backports.zoneinfo: markers 'python_version < "3.9"' don't match your environment
Obtaining django-q from git+https://github.com/paperless-ngx/django-q.git@bf20d57f859a7d872d5979cd8879fac9c9df981c#egg=django-q (from -r requirements.txt (line 32))
<snip>
Successfully installed aioredis-1.3.1 anyio-3.6.1 arrow-1.2.2 asgiref-3.5.2 async-timeout-4.0.2 attrs-21.4.0 autobahn-22.6.1 blessed-1.19.1 certifi-2022.6.15 cffi-1.15.1 channels-3.0.5 channels-redis-3.4.1 charset-normalizer-2.1.0 click-8.1.3 coloredlogs-15.0.1 concurrent-log-handler-0.9.20 cryptography-37.0.4 daphne-3.0.2 dateparser-1.1.1 deprecated-1.2.13 deprecation-2.1.0 django-4.0.6 django-cors-headers-3.13.0 django-extensions-3.2.0 django-filter-22.1 django-picklefield-3.1 django-q-1.3.9 djangorestframework-3.13.1 filelock-3.7.1 fuzzywuzzy-0.18.0 gunicorn-20.1.0 h11-0.13.0 hiredis-2.0.0 httptools-0.4.0 humanfriendly-10.0 imap-tools-0.56.0 img2pdf-0.4.4 inotify-simple-1.3.5 inotifyrecursive-0.3.5 joblib-1.1.0 langdetect-1.0.9 lxml-4.9.1 msgpack-1.0.4 numpy-1.23.1 ocrmypdf-13.6.1 packaging-21.3 pathvalidate-2.5.0 pdf2image-1.16.0 pdfminer.six-20220524 pikepdf-5.4.0 pillow-9.2.0 pluggy-1.0.0 portalocker-2.5.1 psycopg2-2.9.3 pyasn1-modules-0.2.8 pycparser-2.21 pyopenssl-22.0.0 pyparsing-3.0.9 python-dateutil-2.8.2 python-dotenv-0.20.0 python-gnupg-0.4.9 python-levenshtein-0.12.2 python-magic-0.4.27 pytz-deprecation-shim-0.1.0.post0 pyyaml-6.0 pyzbar-0.1.9 redis-4.3.4 regex-2022.3.2 reportlab-3.6.11 requests-2.28.1 scikit-learn-1.1.1 scipy-1.8.1 service-identity-21.1.0 setuptools-63.2.0 sniffio-1.2.0 sqlparse-0.4.2 threadpoolctl-3.1.0 tika-1.24 tqdm-4.64.0 twisted-22.4.0 txaio-22.2.1 typing-extensions-4.3.0 tzdata-2022.1 tzlocal-4.2 urllib3-1.26.10 uvicorn-0.18.2 uvloop-0.16.0 watchdog-2.1.9 watchfiles-0.16.0 wcwidth-0.2.5 websockets-10.3 whitenoise-6.2.0 whoosh-2.7.4 wrapt-1.14.1
root@bammbamm:/opt/paperless-ngx#
Bei einer Rakete wären wir jetzt quasi ready for ignition. Dann werde ich jetzt mal das startenden manage.py mit den Optionen migrate, createsuperuser und runserver nacheinander ausführen und gucken, ob die Rakete bockt oder startet.
root@bammbamm:/opt/paperless-ngx# cd src/
root@bammbamm:/opt/paperless-ngx/src# ls -la
total 48
drwxr-xr-x 10 paperless paperless 4096 Jul 28 23:33 .
drwxr-xr-x 9 paperless paperless 4096 Sep 26 15:27 ..
<snip>
-rw-r--r-- 1 paperless paperless 254 Jul 28 23:33 manage.py
<snip>
root@bammbamm:/opt/paperless-ngx/src# sudo -Hu paperless python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, authtoken, contenttypes, django_q, documents, paperless_mail, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying authtoken.0001_initial... OK
Applying authtoken.0002_auto_20160226_1747... OK
Applying authtoken.0003_tokenproxy... OK
Applying django_q.0001_initial... OK
Applying django_q.0002_auto_20150630_1624... OK
Applying django_q.0003_auto_20150708_1326... OK
Applying django_q.0004_auto_20150710_1043... OK
Applying django_q.0005_auto_20150718_1506... OK
Applying django_q.0006_auto_20150805_1817... OK
Applying django_q.0007_ormq... OK
Applying django_q.0008_auto_20160224_1026... OK
Applying django_q.0009_auto_20171009_0915... OK
Applying django_q.0010_auto_20200610_0856... OK
Applying django_q.0011_auto_20200628_1055... OK
Applying django_q.0012_auto_20200702_1608... OK
Applying django_q.0013_task_attempt_count... OK
Applying django_q.0014_schedule_cluster... OK
Applying documents.0001_initial... OK
Applying documents.0002_auto_20151226_1316... OK
Applying documents.0003_sender... OK
Applying documents.0004_auto_20160114_1844... OK
Applying documents.0005_auto_20160123_0313... OK
Applying documents.0006_auto_20160123_0430... OK
Applying documents.0007_auto_20160126_2114... OK
Applying documents.0008_document_file_type... OK
Applying documents.0009_auto_20160214_0040... OK
Applying documents.0010_log... OK
Applying documents.0011_auto_20160303_1929... OK
Applying documents.0012_auto_20160305_0040... OK
Applying documents.0013_auto_20160325_2111... OK
Applying documents.0014_document_checksum... OK
Applying documents.0015_add_insensitive_to_match... OK
Applying documents.0016_auto_20170325_1558... OK
Applying documents.0017_auto_20170512_0507... OK
Applying documents.0018_auto_20170715_1712... OK
Applying documents.0019_add_consumer_user... OK
Applying documents.0020_document_added... OK
Applying documents.0021_document_storage_type... OK
Applying documents.0022_auto_20181007_1420... OK
Applying documents.0023_document_current_filename... OK
Applying documents.1000_update_paperless_all... OK
Applying documents.1001_auto_20201109_1636... OK
Applying documents.1002_auto_20201111_1105... OK
Applying documents.1003_mime_types... OK
Applying documents.1004_sanity_check_schedule... OK
Applying documents.1005_checksums... OK
Applying documents.1006_auto_20201208_2209... OK
Applying documents.1007_savedview_savedviewfilterrule... OK
Applying documents.1008_auto_20201216_1736... OK
Applying documents.1009_auto_20201216_2005... OK
Applying documents.1010_auto_20210101_2159... OK
Applying documents.1011_auto_20210101_2340... OK
Applying documents.1012_fix_archive_files... OK
Applying documents.1013_migrate_tag_colour... OK
Applying documents.1014_auto_20210228_1614... OK
Applying documents.1015_remove_null_characters... OK
Applying documents.1016_auto_20210317_1351... OK
Applying documents.1017_alter_savedviewfilterrule_rule_type... OK
Applying documents.1018_alter_savedviewfilterrule_value... OK
Applying documents.1019_uisettings... OK
Applying documents.1019_storagepath_document_storage_path... OK
Applying documents.1020_merge_20220518_1839... OK
Applying documents.1021_webp_thumbnail_conversion... OK
Applying documents.1022_paperlesstask... OK
Applying paperless_mail.0001_initial... OK
Applying paperless_mail.0002_auto_20201117_1334... OK
Applying paperless_mail.0003_auto_20201118_1940... OK
Applying paperless_mail.0004_mailrule_order... OK
Applying paperless_mail.0005_help_texts... OK
Applying paperless_mail.0006_auto_20210101_2340... OK
Applying paperless_mail.0007_auto_20210106_0138... OK
Applying paperless_mail.0008_auto_20210516_0940... OK
Applying paperless_mail.0009_mailrule_assign_tags... OK
Applying paperless_mail.0010_auto_20220311_1602... OK
Applying paperless_mail.0011_remove_mailrule_assign_tag... OK
Applying paperless_mail.0012_alter_mailrule_assign_tags... OK
Applying paperless_mail.0009_alter_mailrule_action_alter_mailrule_folder... OK
Applying paperless_mail.0013_merge_20220412_1051... OK
Applying paperless_mail.0014_alter_mailrule_action... OK
Applying paperless_mail.0015_alter_mailrule_action... OK
Applying sessions.0001_initial... OK
root@bammbamm:/opt/paperless-ngx/src# sudo -Hu paperless python3 manage.py createsuperuser
Username (leave blank to use 'paperless'): admin
Email address:
Password: 'ober mega super geheim'
Password (again): 'ober mega super geheim'
Superuser created successfully.
Dann werden wir die Rakete mal für einen kleinen Funktionstest an der Leine abheben lassen und von außen betrachten, ob sie ruhig in der Luft liegt.
root@bammbamm:/opt/paperless-ngx/src# sudo -Hu paperless python3 manage.py runserver
[2022-09-26 17:42:57,898] [INFO] [django.utils.autoreload] Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
September 26, 2022 - 17:42:58
Django version 4.0.6, using settings 'paperless.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
eric@bammbamm:~$ wget http://127.0.0.1:8000/home
--2022-09-26 15:43:51-- http://127.0.0.1:8000/home
Connecting to 127.0.0.1:8000... connected.
HTTP request sent, awaiting response... 302 Found
Location: /accounts/login/?next=/home [following]
--2022-09-26 15:43:51-- http://127.0.0.1:8000/accounts/login/?next=/home
Reusing existing connection to 127.0.0.1:8000.
HTTP request sent, awaiting response... 200 OK
Length: 8284 (8,1K) [text/html]
Saving to: ‘home’
home 100%[==============================================================================>] 8,09K --.-KB/s in 0s
2022-09-26 15:43:51 (109 MB/s) - ‘home’ saved [8284/8284]
Fliegt gut, liegt ruhig in der Luft und gibt auf einen Klopfen an http:8000 eine Website (home.html) raus. Dann werden sie mal für den echten Start auf die Rampe schieben und die notwendigen systemd service definitions schreiben. Glücklicherweise wird das Paket bereits mit drei nur leicht modifizierungsbedürftigen Definitionen ausgeliefert. Diese liegen unter /opt/paperless-ngx/scripts und fangen alle mit paperless-*. Ich kopiere die alle in das passende systemd Verzeichnis /etc/systemd/system und editiere die dann dort an Ort und Stelle.
root@bammbamm:/opt/paperless-ngx/src# cd ..
root@bammbamm:/opt/paperless-ngx# cd scripts/
root@bammbamm:/opt/paperless-ngx/scripts# ls -la
total 28
drwxr-xr-x 2 paperless paperless 4096 Jul 28 23:33 .
drwxr-xr-x 9 paperless paperless 4096 Sep 26 15:27 ..
-rw-r--r-- 1 paperless paperless 223 Jul 28 23:33 paperless-consumer.service
-rw-r--r-- 1 paperless paperless 215 Jul 28 23:33 paperless-scheduler.service
-rw-r--r-- 1 paperless paperless 364 Jul 28 23:33 paperless-webserver.service
<snip>
root@bammbamm:/opt/paperless-ngx/scripts# cp -v paperless-* /etc/systemd/system/
'paperless-consumer.service' -> '/etc/systemd/system/paperless-consumer.service'
'paperless-scheduler.service' -> '/etc/systemd/system/paperless-scheduler.service'
'paperless-webserver.service' -> '/etc/systemd/system/paperless-webserver.service'
root@bammbamm:/opt/paperless-ngx/scripts# nano /etc/systemd/system/paperless-webserver.service
root@bammbamm:/opt/paperless-ngx/scripts# more /etc/systemd/system/paperless-webserver.service
[Unit]
Description=Paperless webserver
After=network.target
Wants=network.target
Requires=redis.service
#Requires=paperless-webserver.socket
[Service]
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless-ngx/src
ExecStart=/opt/paperless-ngx/.local/bin/gunicorn -c /opt/paperless-ngx/gunicorn.conf.py paperless.asgi:application
[Install]
WantedBy=multi-user.target
root@bammbamm:/opt/paperless-ngx/scripts# nano /etc/systemd/system/paperless-scheduler.service
root@bammbamm:/opt/paperless-ngx/scripts# more /etc/systemd/system/paperless-scheduler.service
[Unit]
Description=Paperless scheduler
Requires=redis.service
[Service]
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless-ngx/src
ExecStart=python3 manage.py qcluster
[Install]
WantedBy=multi-user.target
root@bammbamm:/opt/paperless-ngx/scripts# nano /etc/systemd/system/paperless-consumer.service
root@bammbamm:/opt/paperless-ngx/scripts# more /etc/systemd/system/paperless-consumer.service
[Unit]
Description=Paperless consumer
Requires=redis.service
[Service]
User=paperless
Group=paperless
WorkingDirectory=/opt/paperless-ngx/src
ExecStart=python3 manage.py document_consumer
[Install]
WantedBy=multi-user.target
Zeit für den eigentlich Start von Paperless-NGX. Ich werde jetzt alle Services von Paperless-NGX starten und enablen, sowie anschließend einen reboot ausführen. Das hat sich bei den Tests als positiv heraus gestellt, damit alles in der richtigen Reihenfolge gestartet wird; anderfalls war das Ergbnis nicht immer klar…
root@bammbamm:/opt/paperless-ngx/scripts# systemctl start paperless-scheduler.service
root@bammbamm:/opt/paperless-ngx/scripts# systemctl enable paperless-scheduler.service
Created symlink /etc/systemd/system/multi-user.target.wants/paperless-scheduler.service → /etc/systemd/system/paperless-scheduler.service.
root@bammbamm:/opt/paperless-ngx/scripts# systemctl start paperless-consumer.service
root@bammbamm:/opt/paperless-ngx/scripts# systemctl enable paperless-consumer.service
Created symlink /etc/systemd/system/multi-user.target.wants/paperless-consumer.service → /etc/systemd/system/paperless-consumer.service.
root@bammbamm:/opt/paperless-ngx/scripts# systemctl start paperless-webserver.service
root@bammbamm:/opt/paperless-ngx/scripts# systemctl enable paperless-webserver.service
Created symlink /etc/systemd/system/multi-user.target.wants/paperless-webserver.service → /etc/systemd/system/paperless-webserver.service.
root@bammbamm:/opt/paperless-ngx/scripts# reboot
Houston, we got a lift off… Die Rakete hat den Orbiot erfolgreich erreicht. Machen wir die ersten vorsichtigen Funktionstest, bevor sie ihre weitere Module verpassen und sie zur vollständigen DMS-Station ausbauen. Aus persönlicher Lust an der Freude habe ich den Paperless-NGX ein meinem IPv6 ULA-Adressspace hoch gezogen. 😉 Falls also jemand Fragen haben sollte, ob Paperless-NGX IPv6 ready ist und auch läuft: JA macht es
Was brauche ich für den ersten echten Test? Einen User und eine PDF Dateien zum hinein werfen, um zu sehen was passiert. Also lege ich zu erst einmal einen User Namens Eric an.
Erster Funktionstest Paperless-NGX v1.8.0
Dann legen wir mal den User Eric an und geben ihm ein Passwort.
Die Rakete ist wirklich sauber im Orbit. Mit diesem kleinen Test wollte ich sicher gehen, dass die PostgreSQL auch sauber arbeitet, denn hier werden die User Themen gespeichert. Der Redis macht saubere Zuweisungen der Key-Values und der Tesseract hat ordentlich seinen OCR gemacht. Da freue ich mich erst einmal wie ein Schnitzel und mache dann mal weiter mit den zusätzlichen Modulen Tika und Gotenberg.
Tika und Gotenberg Installieren
Diese Services sind für mich zwar essentiell, jedoch werde ich sie der Austauschbarkeit bei späteren Updates dieser Services als Docker Container anlegen. Also holen wir mal die Pakete für eine Docker Umgebung ab und ziehen Docker hoch.
eric@bammbamm:~$ sudo apt-get install ca-certificates curl gnupg lsb-release
Paketlisten werden gelesen… Fertig
<snip>
eric@bammbamm:~$ sudo mkdir -p /etc/apt/keyrings
eric@bammbamm:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
eric@bammbamm:~$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
eric@bammbamm:~$ more /etc/apt/sources.list.d/docker.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable
eric@bammbamm:~$ sudo apt-get update
OK:1 http://de.archive.ubuntu.com/ubuntu jammy InRelease
<snip>
eric@bammbamm:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
<snip>
eric@bammbamm:~$ sudo service docker status
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-09-26 16:34:32 UTC; 20s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 2566 (dockerd)
Tasks: 9
Memory: 23.9M
CPU: 428ms
CGroup: /system.slice/docker.service
└─2566 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
<snip>
Dann werde ich mal Tika und Gotenberg aus dem DockerHub holen, installieren, starten und reboot fest einrichten.
eric@bammbamm:~$ sudo docker pull apache/tika
Using default tag: latest
latest: Pulling from apache/tika
d5fd17ec1767: Pull complete
3d74ce657280: Pull complete
8b587b148104: Extracting [==================> ] 36.21MB/96.1MB
a7ee74c4130d: Download complete
cf5c1973ef27: Download complete
eric@bammbamm:~$ sudo docker pull gotenberg/gotenberg
Using default tag: latest
latest: Pulling from gotenberg/gotenberg
7a6db449b51b: Pull complete
9b3d1a56e5be: Pull complete
8fbdaff3aac4: Pull complete
1f65ba53270c: Pull complete
e9035e1d0bab: Downloading [===========================> ] 343.7MB/623.8MB
e9a3914669f1: Download complete
4f4fb700ef54: Download complete
eric@bammbamm:~$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gotenberg/gotenberg latest f153df718e41 3 weeks ago 1.51GB
apache/tika latest 3a8c80c1ea4c 4 months ago 435MB
eric@bammbamm:~$ sudo docker run -d -p 9998:9998 --restart unless-stopped apache/tika
2d364bf6f654f2bc9ae1b5317429b7aac76342bd81e894cca6e167d76ca52eea
eric@bammbamm:~$ sudo docker run -d -p 3000:3000 --restart unless-stopped gotenberg/gotenberg
b58ef6f37dce7331189fba83c042556c857080a6e949bd7852ca69673c50910a
eric@bammbamm:~$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b58ef6f37dce gotenberg/gotenberg "/usr/bin/tini -- go…" 9 seconds ago Up 8 seconds 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp jovial_cannon
2d364bf6f654 apache/tika "/bin/sh -c 'exec ja…" 19 seconds ago Up 18 seconds 0.0.0.0:9998->9998/tcp, :::9998->9998/tcp festive_perlman
eric@bammbamm:~$ sudo reboot
Connection to 2a02:8108:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx closed by remote host
Damit diese beide Module nun auch vom Paperless-NGX genutzt werden ist eine Anpassung der /opt/paperless-ngx/paperles.conf notwendig und ein weiterer Reboot, damit Paperless-NGX diese Änderung auch einbindet und nutzt. Na dann werde ich mal Hand anlegen.
eric@bammbamm:~$ sudo nano /opt/paperless-ngx/paperless.conf
eric@bammbamm:~$ sudo grep -A 4 "Tika" /opt/paperless-ngx/paperless.conf
# Tika settings
PAPERLESS_TIKA_ENABLED=true
PAPERLESS_TIKA_ENDPOINT=http://localhost:9998
PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http://localhost:3000
eric@bammbamm:~$ sudo reboot
Connection to 2a02:8108:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx closed by remote host
Funktionstest Tike und Gotenberg
Aus dem DMS-Vergleich heraus habe ich noch 85 Dateien zum Prüfen da. Diese werde ich jetzt mal dem neuen Paperless-NGX Server zum Importieren geben und sehen was er daraus macht, wohl wissend das er davon nicht alle verarbeiten können wird. 😉
Augenscheinlich arbeiten Tika und Gotenberg sehr gut in diesem Setup zusammen. Da nutze ich doch gerne den Satz, welchen ich auf Youtube beim Klaus grillt Kanal zu erst gehört habe: Das sieht doch nach einem gültigen Versuch aus!
Hallo Eric,
wieder super dargestellt.
Hattest Du als Basis OS auch ein Red Hat Derivat betrachtet, 10 Jahre Support haben die?
Hier bei denke ich an AlmaLinux 9 oder Oracle Linux 9, Oracle Linux 9 kann Kernelupdates ohne Reboot.
Warum hast Du dich nicht für eine vollständige Containerlösung entschieden?
So ein Flussdiargramm vermisse ich noch. 🙂 Beispiel: https://blog.armbruster-it.de/wp-content/uploads/2018/12/paperless-1024×539.jpg
Dann ist deine Darstellung noch perfekter.
Welchen Scanner willst Du benutzen?
Danke fürs Sharen.
VG
Michael
Moin Micha,
ich muss zugeben, dass ich vor Jahren mit Ubuntu angefangen habe und danach zu Linux Arch gewechselt bin.
Für den Desktop bevorzuge ich Arch/KDE und bei Servern nehme ich gerne die Stabilität von Ubuntu.
Ich hatte noch keine Überlappung mit Red Hat und Oracle Linux.. was vermutlich auich so bleiben wird.
Allerdings glaube ich, dass mit geringen Anpassungen bei den Paketnamen das ganze auch unter Oracle und Red Hat funktionieren sollte.
Beim Scanner bin ich mir noch nicht ganz sicher… ich bin gerade am studierender Specs. Stay tuned. 😉
VG, Eric
Hallo Erik,
hier werde ich einen Dokumenten Duplexdokumentenscanner auswählen:
http://www.sane-project.org/sane-mfgs.html#Z-FUJITSU
https://github.com/paperless-ngx/paperless-ngx/wiki/Scanner-&-Software-Recommendations
Vermutlich wird es ein Fujitsu werden. Die Brother Duplexsanner sind mir zu teuer.
Für Android schau dir evtl. vFlat https://play.google.com/store/apps/details?id=com.voyagerx.scanner&hl=de&gl=US an, evtl. genügt es ja. Wobei, wohin gehen die OCR Daten?????
VG
Michael
Hallo Michael,
ich danke dir für dein Feedback!
Bin gerade am aufstellen eines Artikels für die Scanner und nehme deinen Input ganz klar als Anregung mit.
Die Preislage der Scanner die ich mir vorstellen kann ist ja irgendwo bei ~250-350€ .
Ein bisschen blöd bei meinem Vergleich wird ja, dass ich quasi trocken schwimmen übe.
Denn ich treffe schreibe auf ja Bases der Specifics – kann also bei dem sich dann anschließenden Kauf immer noch tief ins Klo greifen..
So wie ich die drei DMS Systeme verstanden habe gint es jeweils so etwas wie ein Importverzeichnis,
aus dem sich das DMS dann in zeitlich definierten Abständen den Content hinein saugt.
Meint also das Verzeichnis muss auf dem Server per FTP/SMB/NFS/etc. für den Scanner als beschreibbar von außen angelegt werden.
Je nachdem, welches Protokoll der Scanner zum Export des Contents unterstützt.
VG, Eric
Hi Erik,
super Anleitung soweit. Lief auch alles gut bis auf das starten der Dienste.. diese starten irgendwie nicht.
Ich habe soweit alles genau gemacht wie du. Hast du eine Idee?
archon@shw-vm-docs-01:~$ systemctl –failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● paperless-consumer.service loaded failed failed Paperless consumer
● paperless-scheduler.service loaded failed failed Paperless scheduler
● paperless-webserver.service loaded failed failed Paperless webserver
Wäre dankbar für eine Antwort.
Grüße Jan
Hallo Jan,
puh – da hab ich bei exakt der gleichen Reihenfolge auch keine Idee.
Versuch es bitte im Chatromm der Paperless-NGX Programmierer unter folgender URL https://matrix.to/#/#paperless:matrix.org
Viele liebe Grüße, Eric