{"id":1812,"date":"2022-09-26T19:08:41","date_gmt":"2022-09-26T17:08:41","guid":{"rendered":"https:\/\/www.fotoandnet.de\/wp\/?p=1812"},"modified":"2022-09-26T19:08:43","modified_gmt":"2022-09-26T17:08:43","slug":"der-neue-paperless-ngx-v1-8-0-server","status":"publish","type":"post","link":"http:\/\/www.fotoandnet.de\/wp\/?p=1812","title":{"rendered":"Der neue Paperless-NGX v1.8.0 Server"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Ich habe nun etliche Tage damit verbracht die f\u00fcr mich in Betracht kommenden Dokumenten Management Systeme zu betrachten, testen, bewerten und auf Herz und Nieren zu pr\u00fcfen. Der Gedanke ein DMS zu nutzen ist also nun ausreichend gen\u00e4hrt und es geht an das Aufsetzen des DMS. In meinem Falle also Paperless-NGX in der aktuell als <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/paperless-ngx\/paperless-ngx\" target=\"_blank\">&#8222;latest&#8220; deklarierten Version 1.8.0 auf GitHub<\/a> &#8211; also die Version vom 29 Juli 2022. Sicherlich k\u00f6nnte 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\u00f6hlich Warten und verpa\u00dft den ganzen Update-Spa\u00df. \ud83d\ude09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie m\u00f6chte das Frame-Work am Ende haben war eine in den Tests immer wieder hoch kommende Frage und ich denke f\u00fcr mich eine L\u00f6sung gefunden zu haben, die wie folgt aussieht.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"561\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Screenshot_20220926_111524-1024x561.jpg\" alt=\"\" class=\"wp-image-1815\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Screenshot_20220926_111524-1024x561.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Screenshot_20220926_111524-300x164.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Screenshot_20220926_111524-768x421.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Screenshot_20220926_111524.jpg 1153w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Framework meines Paperless-NGX Servers<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00f6chte, wir hier leider entt\u00e4uscht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Werfen wir einen Blick auf Hardware dieses all ways on Servers. Es handelt sich dabei um eine m\u00f6glichst sparsam gew\u00e4hlte Plattform, gerade mit Fokus auf den Energie-Fu\u00dfabdruck. Ich erwarte jetzt keine Weltrekorde beim Bitcoin-Crunshen, sondern eine solide, leise und vor allem sparsame Plattform.    <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"495\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/HW-Plattform-1024x495.jpg\" alt=\"\" class=\"wp-image-1818\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/HW-Plattform-1024x495.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/HW-Plattform-300x145.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/HW-Plattform-768x372.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/HW-Plattform.jpg 1358w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Hardwareplattform<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Beim Betriebssystem habe ich mich auch f\u00fcr die konservative Linie entschieden und bin f\u00fcr den Paperless-NGX Server, entgegen meiner sonstigen Gewohnheit f\u00fcr Linux Arch, zum Ubuntu Server 22.04lts geschwenkt. Der Server soll ja \u00fcber einen langen Zeitraum seinen Dienst verrichten und da habe ich dann keine Lust die auf dem Desktop alle Monate \u00fcbliche 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\u00dfe Schn\u00f6rkel werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">HDD\/NVME-Setup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"> 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\u00dfer Unterschied in der &#8222;Fluptizit\u00e4t&#8220; zu sp\u00fcren. Aus diesem Grunde werde ich die Files und alles was damit zusammenh\u00e4ngt auf der gro\u00dfen langsamen HDD speichern und die ganzen kleinteiligen Dinge auf der NVME. Ich denke ich werde keine B-Tree Filesystem ben\u00f6tigen, 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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach dem initialen Setup von Ubuntu 22.04lts Server stellt sich das Root-Filesystem wie folgt dar.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"459\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/root-filesystem-1024x459.jpg\" alt=\"\" class=\"wp-image-1823\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/root-filesystem-1024x459.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/root-filesystem-300x135.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/root-filesystem-768x345.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/root-filesystem-1536x689.jpg 1536w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/root-filesystem.jpg 1935w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Die HDD ist noch nicht gemountet und h\u00e4ngt in der Luft. Ich werde dieser zuerst einmal eine Partitontabling nach GPT verpassen und anschlie\u00dfend eine EXT4 Partition (mit STORAGE als Name) mit einer logischen Blocksize von 4096 Bytes anlegen.<\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo parted \/dev\/sda mklabel gpt<\/em><\/strong>\nWarning: The existing disk label on \/dev\/sda will be destroyed and all data on this disk will be lost. Do you want to continue?\nYes\/No? yes\n\neric@bammbamm:~$ <strong><em>sudo parted -a optimal \/dev\/sda mkpart primary ext4 0% 100%<\/em><\/strong>\nInformation: You may need to update \/etc\/fstab.\n\neric@bammbamm:~$ <strong><em>sudo mkfs.ext4 -b 4096 -L STORAGE \/dev\/sda1<\/em><\/strong>\nmke2fs 1.46.5 (30-Dec-2021)\nCreating filesystem with 244190208 4k blocks and 61054976 inodes\nFilesystem UUID: 12beb674-c713-41e5-9802-1a7092075492\nSuperblock backups stored on blocks: \n\t32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, \n\t4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, \n\t102400000, 214990848\n\nAllocating group tables:    0\/7453\ndone                            \nWriting inode tables: done                            \nCreating journal (262144 blocks): done\nWriting superblocks and filesystem accounting information: done     \n\neric@bammbamm:~$ <strong><em>lsblk -f \/dev\/sda<\/em><\/strong>\nNAME   FSTYPE FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS\nsda                                                                             \n\u2514\u2500sda1 ext4   1.0   STORAGE 12beb674-c713-41e5-9802-1a7092075492                \neric@bammbamm:~$\n   <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Partion ist angelegt. Um diese auch nutzen zu k\u00f6nnen m\u00fcssen fehlt mir noch ein sch\u00f6ner Mountpoint und der passende Eintrag in der \/etc\/fstab, um sie auch automatisch nach dem n\u00e4chsten 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\u00f6nlich sinnvoll und robust. Nach dem Anlegen und Eintragen werde ich rebooten und sehen, ob er alles artig anzieht&#8230; also ich keinen Bock geschossen habe. \ud83d\ude42<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo mkdir \/mnt\/storage<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>lsblk -f \/dev\/sda1<\/em><\/strong>\nNAME FSTYPE FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS\nsda1 ext4   1.0   STORAGE <strong><em>12beb674-c713-41e5-9802-1a7092075492<\/em><\/strong>       \n       \neric@bammbamm:~$ <strong><em>sudo nano \/etc\/fstab<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>more \/etc\/fstab<\/em><\/strong>\n# \/etc\/fstab: static file system information.\n#\n# Use 'blkid' to print the universally unique identifier for a\n# device; this may be used with UUID= as a more robust way to name devices\n# that works even if disks are added and removed. See fstab(5).\n#\n# &lt;file system&gt; \t\t\t\t\t\t&lt;mount point&gt;   &lt;type&gt;  &lt;options&gt;       &lt;dump&gt;  &lt;pass&gt;\n# \/ was on \/dev\/nvme0n1p2 during curtin installation\n\/dev\/disk\/by-uuid\/01722866-3e02-4014-ab3a-d456639a9e41 \t\t\/ \t\text4 \tdefaults \t0 \t1\n\n# \/boot\/efi was on \/dev\/nvme0n1p1 during curtin installation\n\/dev\/disk\/by-uuid\/2844-66F9 \t\t\t\t\t\/boot\/efi \tvfat \tdefaults \t0 \t1\n\/swap.img\t\t\t\t\t\t\tnone\t\tswap\tsw\t\t0\t0\n\n# \/mnt\/storage hand made in germany\n<strong><em>\/dev\/disk\/by-uuid\/12beb674-c713-41e5-9802-1a7092075492\t\t\/mnt\/storage\text4\tdefaults\t0\t1<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>sudo reboot<\/em><\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mal sehen, ob er die EXT4 Partionen auch alle sauber angezogen hat&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>lsblk -f | grep -E \"NAME|ext4\"<\/em><\/strong>\nNAME        FSTYPE   FSVER LABEL   UUID                                 FSAVAIL FSUSE% MOUNTPOINTS\n\u2514\u2500sda1      ext4     1.0   STORAGE 12beb674-c713-41e5-9802-1a7092075492  869,2G     0% \/mnt\/storage\n\u2514\u2500nvme0n1p2 ext4     1.0           01722866-3e02-4014-ab3a-d456639a9e41  208,8G     3% \/\neric@bammbamm:~$ <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Einige magische BASH Zeilen sp\u00e4ter steht das gew\u00fcnschte Setup, wie im folgenden Bild dargestellt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"402\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/mounted-partitions-1024x402.jpg\" alt=\"\" class=\"wp-image-1827\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/mounted-partitions-1024x402.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/mounted-partitions-300x118.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/mounted-partitions-768x302.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/mounted-partitions-1536x604.jpg 1536w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/mounted-partitions.jpg 1924w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">User anlegen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aus den vorherigen Paperless-NGX Installationen wei\u00df ich, da\u00df ein User mit der Gruppe paperless ben\u00f6tigt wird. F\u00fcr diesen User paperless lege ich mal ein Home-Verzeichnis an, zugegeben an einem ungew\u00f6hnlichen Ort &#8211; n\u00e4mlich \/opt\/paperless-ngx. Da der User paperless selber nur ein maschinen User ist, stellt das f\u00fcr mich kein Beinbruch dar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo adduser paperless --system --home \/opt\/paperless-ngx --group<\/em><\/strong>\n&#91;sudo] password for eric: \nAdding system user `paperless' (UID 113) ...\nAdding new group `paperless' (GID 118) ...\nAdding new user `paperless' (UID 113) with group `paperless' ...\nCreating home directory `\/opt\/paperless-ngx' ...\n\neric@bammbamm:~$ <strong><em>ls -la \/opt\/<\/em><\/strong>\ntotal 12\ndrwxr-xr-x  3 root      root      4096 Sep 26 13:45 .\ndrwxr-xr-x 19 root      root      4096 Sep 26 08:32 ..\ndrwxr-x---  2 paperless paperless 4096 Sep 26 13:45 paperless-ngx\n\neric@bammbamm:~$ <strong><em>ls -la \/opt\/paperless-ngx\/<\/em><\/strong>\n<em>ls: cannot open directory '\/opt\/paperless-ngx\/': Permission denied<\/em>\n\neric@bammbamm:~$ <strong><em>sudo ls -la \/opt\/paperless-ngx\/<\/em><\/strong>\ntotal 8\ndrwxr-x--- 2 paperless paperless 4096 Sep 26 13:45 .\ndrwxr-xr-x 3 root      root      4096 Sep 26 13:45 ..\neric@bammbamm:~$ <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Rechte stimmen auch, nur user paperless oder halt root k\u00f6nnen in sein Home-Verzeichnis luschern. Na dann werden dir mal die Tool Dependencies installieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installieren der Tool Dependencies<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Dependencies sind in der Anleitung an zwei stellen angegeben mit etwas Text dazwischen. Mir pers\u00f6nlich reicht es aus, da\u00df ich die einfach installiere.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo apt update<\/em><\/strong>\n\n\neric@bammbamm:~$ <strong><em>sudo apt upgrade<\/em><\/strong>\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>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<\/em><\/strong>\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>sudo reboot<\/em><\/strong>\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Installieren von Redis<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das Setup von paperless-NGX ben\u00f6tigt 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\u00e4teren Versionen zu h\u00e4rten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo apt install redis-server<\/em><\/strong>\n&#91;sudo] password for eric: \nPaketlisten werden gelesen\u2026 Fertig\nAbh\u00e4ngigkeitsbaum wird aufgebaut\u2026 Fertig\nStatusinformationen werden eingelesen\u2026 Fertig\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>redis-server -v<\/em><\/strong>\nRedis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6\n\neric@bammbamm:~$ <strong><em>sudo systemctl start redis-server<\/em><\/strong>\neric@bammbamm:~$ <strong><em>sudo systemctl enable redis-server<\/em><\/strong>\nSynchronizing state of redis-server.service with SysV service script with \/lib\/systemd\/systemd-sysv-install.\nExecuting: \/lib\/systemd\/systemd-sysv-install enable redis-server\n\neric@bammbamm:~$ <strong><em>redis-cli ping<\/em><\/strong>\nPONG\n\neric@bammbamm:~$ <strong><em>sudo systemctl status redis-server<\/em><\/strong>\n\u25cf redis-server.service - Advanced key-value store\n     Loaded: loaded (\/lib\/systemd\/system\/redis-server.service; enabled; vendor preset: enabled)\n     Active: active (running) since Mon 2022-09-26 14:01:18 UTC; 52s ago\n       Docs: http:\/\/redis.io\/documentation,\n             man:redis-server(1)\n   Main PID: 1360 (redis-server)\n     Status: \"Ready to accept connections\"\n      Tasks: 5 (limit: 18326)\n     Memory: 2.6M\n        CPU: 273ms\n     CGroup: \/system.slice\/redis-server.service\n             \u2514\u25001360 \"\/usr\/bin\/redis-server 127.0.0.1:6379\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" \"\" &gt;\n\nSep 26 14:01:18 bammbamm systemd&#91;1]: Starting Advanced key-value store...\nSep 26 14:01:18 bammbamm systemd&#91;1]: Started Advanced key-value store.\neric@bammbamm:~$ <\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Super, der Redis l\u00e4uft und antwortet auch. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installieren und Einrichten von PostgreSQL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Was ich im GitHUB gesehen habe bei Version 1.8.0 stimmt mich zuversichtlich, da\u00df ich anstelle von SQLite3 endlich PostgreSQL nutzen kann. Also werde ich dann mal installieren und einrichten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo apt install postgresql<\/em><\/strong>\nPaketlisten werden gelesen\u2026 Fertig\nAbh\u00e4ngigkeitsbaum wird aufgebaut\u2026 Fertig\nStatusinformationen werden eingelesen\u2026 Fertig\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>sudo systemctl start postgresql<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>sudo systemctl enable postgresql<\/em><\/strong>\nSynchronizing state of postgresql.service with SysV service script with \/lib\/systemd\/systemd-sysv-install.\nExecuting: \/lib\/systemd\/systemd-sysv-install enable postgresql\n\neric@bammbamm:~$ <strong><em>sudo systemctl status postgresql<\/em><\/strong>\n\u25cf postgresql.service - PostgreSQL RDBMS\n     Loaded: loaded (\/lib\/systemd\/system\/postgresql.service; enabled; vendor preset: enabled)\n     Active: active (exited) since Mon 2022-09-26 14:05:40 UTC; 35s ago\n   Main PID: 3717 (code=exited, status=0\/SUCCESS)\n        CPU: 2ms\n\nSep 26 14:05:40 bammbamm systemd&#91;1]: Starting PostgreSQL RDBMS...\nSep 26 14:05:40 bammbamm systemd&#91;1]: Finished PostgreSQL RDBMS\n\neric@bammbamm:~$ <strong><em>sudo -u postgres psql<\/em><\/strong>\ncould not change directory to \"\/home\/eric\": Permission denied\npsql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))\nType \"help\" for help.\n\npostgres=# <strong><em>CREATE DATABASE paperless;<\/em><\/strong>\nCREATE DATABASE\npostgres=# <strong><em>CREATE USER paperless WITH PASSWORD 'super sicher';<\/em><\/strong>\nCREATE ROLE\npostgres=# <strong><em>GRANT ALL PRIVILEGES ON DATABASE paperless TO paperless;<\/em><\/strong>\nGRANT\npostgres=# <strong><em>\\q<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>psql --username paperless --password --host localhost paperless <\/em><\/strong>  \nPassword: 'super sicher'\npsql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1))\nSSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)\nType \"help\" for help.\n\npaperless=&gt; <strong><em>\\conninfo<\/em><\/strong>\nYou are connected to database \"paperless\" as user \"paperless\" on host \"localhost\" (address \"127.0.0.1\") at port \"5432\".\nSSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)\n\npaperless=&gt; <strong><em>\\q<\/em><\/strong>\neric@bammbamm:~$ \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Okay, die Datenbank paperless f\u00fcr den User paperless ist angelegt, l\u00e4uft und antwortet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Installieren und Einrichten von Paperless-NGX v1.8.0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Kommen wir zur eigentlichen Aufgabe der Server Installation, das Paperless-NGX Paket wartet schon. \ud83d\ude42 Okay, dann gehen wir mal als ROOT in das Home-Verzeichnis von User paperless \/opt\/paperless-ngx und installieren mal etwas&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo -i<\/em><\/strong>\n&#91;sudo] password for eric: 'super super geheim'\n\nroot@bammbamm:~# <strong><em>cd \/opt\/paperless-ngx\/<\/em><\/strong>\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>wget https:\/\/github.com\/paperless-ngx\/paperless-ngx\/releases\/download\/v1.8.0\/paperless-ngx-v1.8.0.tar.xz<\/em><\/strong>\n--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\nResolving github.com (github.com)... 140.82.121.3\nConnecting to github.com (github.com)|140.82.121.3|:443... connected.\n&lt;snip&gt;\npaperless-ngx-v1.8.0.tar.xz             100%&#91;==============================================================================&gt;]  21,44M  22,6MB\/s    in 0,9s    \n\n2022-09-26 14:30:51 (22,6 MB\/s) - \u2018paperless-ngx-v1.8.0.tar.xz\u2019 saved &#91;22482684\/22482684]#\n\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>tar -xvf paperless-ngx-v1.8.0.tar.xz -C \/opt<\/em><\/strong>\n\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ls -la<\/em><\/strong>\ntotal 22212\ndrwxr-xr-x  8 1001 postgres     4096 Jul 28 23:33 .\ndrwxr-xr-x  3 root root         4096 Sep 26 13:45 ..\ndrwxr-xr-x  3 1001 postgres     4096 Jul 28 23:33 data\ndrwxr-xr-x  3 1001 postgres     4096 Jul 28 23:33 docker\n-rw-r--r--  1 1001 postgres     7458 Jul 28 23:33 Dockerfile\n-rw-r--r--  1 1001 postgres      220 Jul 28 23:33 .dockerignore\ndrwxr-xr-x  5 1001 postgres     4096 Jul 28 23:33 docs\n-rw-r--r--  1 1001 postgres       72 Jul 28 23:33 .env\n-rw-r--r--  1 1001 postgres     1108 Jul 28 23:33 gunicorn.conf.py\n-rw-r--r--  1 1001 postgres    35142 Jul 28 23:33 LICENSE\n-rw-r--r--  1 1001 postgres     2559 Jul 28 23:33 paperless.conf\n-rw-r--r--  1 root root     22482684 Jul 28 23:34 paperless-ngx-v1.8.0.tar.xz\n-rw-r--r--  1 1001 postgres     1659 Jul 28 23:33 Pipfile\n-rw-r--r--  1 1001 postgres   145133 Jul 28 23:33 Pipfile.lock\n-rw-r--r--  1 1001 postgres     8812 Jul 28 23:33 README.md\n-rw-r--r--  1 1001 postgres     3972 Jul 28 23:33 requirements.txt\ndrwxr-xr-x  2 1001 postgres     4096 Jul 28 23:33 scripts\ndrwxr-xr-x 10 1001 postgres     4096 Jul 28 23:33 src\ndrwxr-xr-x  7 1001 postgres     4096 Jul 28 23:33 static\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und da ist das Paket auch schon gelandet im Home Verzeichnis von paperless. Was allerdings ziemlich schr\u00e4g ist sind die Eingent\u00fcmer und Gruppen Rechte. Das m\u00fcssen wir glatt ziehen, sonst fliegt uns das alles aus der Kurve.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx# <strong><em>chown paperless:paperless -Rfv \/opt\/paperless-ngx<\/em><\/strong>\n&lt;snip&gt;\nchanged ownership of '\/opt\/paperless-ngx\/docs' from 1001:postgres to paperless:paperless\nchanged ownership of '\/opt\/paperless-ngx' from 1001:postgres to paperless:paperless\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ls -la<\/em><\/strong>\ntotal 22212\ndrwxr-xr-x  8 paperless paperless     4096 Jul 28 23:33 .\ndrwxr-xr-x  3 root      root          4096 Sep 26 13:45 ..\ndrwxr-xr-x  3 paperless paperless     4096 Jul 28 23:33 data\ndrwxr-xr-x  3 paperless paperless     4096 Jul 28 23:33 docker\n-rw-r--r--  1 paperless paperless     7458 Jul 28 23:33 Dockerfile\n-rw-r--r--  1 paperless paperless      220 Jul 28 23:33 .dockerignore\ndrwxr-xr-x  5 paperless paperless     4096 Jul 28 23:33 docs\n-rw-r--r--  1 paperless paperless       72 Jul 28 23:33 .env\n-rw-r--r--  1 paperless paperless     1108 Jul 28 23:33 gunicorn.conf.py\n-rw-r--r--  1 paperless paperless    35142 Jul 28 23:33 LICENSE\n-rw-r--r--  1 paperless paperless     2559 Jul 28 23:33 paperless.conf\n-rw-r--r--  1 paperless paperless 22482684 Jul 28 23:34 paperless-ngx-v1.8.0.tar.xz\n-rw-r--r--  1 paperless paperless     1659 Jul 28 23:33 Pipfile\n-rw-r--r--  1 paperless paperless   145133 Jul 28 23:33 Pipfile.lock\n-rw-r--r--  1 paperless paperless     8812 Jul 28 23:33 README.md\n-rw-r--r--  1 paperless paperless     3972 Jul 28 23:33 requirements.txt\ndrwxr-xr-x  2 paperless paperless     4096 Jul 28 23:33 scripts\ndrwxr-xr-x 10 paperless paperless     4096 Jul 28 23:33 src\ndrwxr-xr-x  7 paperless paperless     4096 Jul 28 23:33 static\nroot@bammbamm:\/opt\/paperless-ngx# \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So sieht das gleich viel besser aus. Jetzt fehlen uns noch die im Anschlu\u00df zu konfigurierenden Verzeichnisse consume + data + trash + media. Hier mache ich es jetzt wie folgt. Ich lege diese von Paperless-NGX ben\u00f6tigten Verzeichnisse unter \/mnt\/storage an und mache mir Symlinks in das Homeverzeichnis von paperless, dann sieht das in der Konfig sch\u00f6n sauber aus und die Daten liegen trotzdem auf unterschiedlichen Speichermedien. Ich denke mir das so, wie in der folgenden Darstellung.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"286\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Symbolic-Links-1024x286.jpg\" alt=\"\" class=\"wp-image-1846\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Symbolic-Links-1024x286.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Symbolic-Links-300x84.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Symbolic-Links-768x214.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Symbolic-Links-1536x429.jpg 1536w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/Symbolic-Links.jpg 1870w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Symbolic Links<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00fcpften Verzeichnisse data\/ und data\/log\/ l\u00f6schen werde, sonst wird das nix mit den SymLinks. \ud83d\ude09 <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx# <strong><em>mkdir \/mnt\/storage\/data<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>mkdir \/mnt\/storage\/data\/log<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>mkdir \/mnt\/storage\/media<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>mkdir \/mnt\/storage\/consume<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>mkdir \/mnt\/storage\/trash<\/em><\/strong>\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>rm -Rfv data<\/em><\/strong>\nremoved directory 'data\/log'\nremoved directory 'data'\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ln -s \/mnt\/storage\/data\/ \/opt\/paperless-ngx<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ln -s \/mnt\/storage\/media \/opt\/paperless-ngx<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ln -s \/mnt\/storage\/trash \/opt\/paperless-ngx<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ln -s \/mnt\/storage\/consume \/opt\/paperless-ngx<\/em><\/strong>\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ls -la<\/em><\/strong>\ntotal 22208\ndrwxr-xr-x  7 paperless paperless     4096 Sep 26 15:02 .\ndrwxr-xr-x  3 root      root          4096 Sep 26 13:45 ..\nlrwxrwxrwx  1 <em>root      root<\/em>            20 Sep 26 15:02 consume -&gt; \/mnt\/storage\/consume\nlrwxrwxrwx  1<em> root      root <\/em>           18 Sep 26 15:01 data -&gt; \/mnt\/storage\/data\/\n&lt;snip&gt;\nlrwxrwxrwx  1 <em>root      root<\/em>            18 Sep 26 15:01 media -&gt; \/mnt\/storage\/media\n&lt;snip&gt;\nlrwxrwxrwx  1 <em>root      root<\/em>            18 Sep 26 15:01 trash -&gt; \/mnt\/storage\/trash\n\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>chown paperless:paperless -Rfv \/opt\/paperless-ngx<\/em><\/strong>\nownership of '\/opt\/paperless-ngx\/static' retained as paperless:paperless\nchanged ownership of '\/opt\/paperless-ngx\/consume' from root:root to paperless:paperless\n&lt;snip&gt;\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>ls -la<\/em><\/strong>\ntotal 22208\ndrwxr-xr-x  7 paperless paperless     4096 Sep 26 15:02 .\ndrwxr-xr-x  3 root      root          4096 Sep 26 13:45 ..\nlrwxrwxrwx  1 paperless paperless       20 Sep 26 15:02 consume -&gt; \/mnt\/storage\/consume\nlrwxrwxrwx  1 paperless paperless       18 Sep 26 15:01 data -&gt; \/mnt\/storage\/data\/\n&lt;snip&gt;\nlrwxrwxrwx  1 paperless paperless       18 Sep 26 15:01 media -&gt; \/mnt\/storage\/media\n&lt;snip&gt;\nlrwxrwxrwx  1 paperless paperless       18 Sep 26 15:01 trash -&gt; \/mnt\/storage\/trash\nroot@bammbamm:\/opt\/paperless-ngx#\n\nroot@bammbamm:~# <strong><em>chown paperless:paperless \/opt\/paperless-ngx\/data\/log<\/em><\/strong>\n\nroot@bammbamm:~# <strong><em>ls -la \/opt\/paperless-ngx\/data\/<\/em><\/strong>\ntotal 12\ndrwxr-xr-x 3 root      root      4096 Sep 26 15:10 .\ndrwxr-xr-x 7 root      root      4096 Sep 26 14:53 ..\ndrwxr-xr-x 2 paperless paperless 4096 Sep 26 14:53 log\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>sudo chmod 777 -Rfv \/mnt\/storage\/*<\/em><\/strong>\n\n\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00df ich im Zweifelsfalle eine orginal Konfingtemplate habe, mache ich davon aber zu erst ein Backup.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx# cp paperless.conf paperless.conf.org\n\nroot@bammbamm:\/opt\/paperless-ngx# nano paperless.conf\n\nroot@bammbamm:\/opt\/paperless-ngx# more paperless.conf\n#PAPERLESS_DEBUG=false\n# Required services\n\nPAPERLESS_REDIS=redis:\/\/localhost:6379\nPAPERLESS_DBHOST=localhost\nPAPERLESS_DBPORT=5432\nPAPERLESS_DBNAME=paperless\nPAPERLESS_DBUSER=paperless\nPAPERLESS_DBPASS='super sicher'\nPAPERLESS_DBSSLMODE=prefer\n\n# Paths and folders\nPAPERLESS_CONSUMPTION_DIR=\/opt\/paperless-ngx\/consume\nPAPERLESS_DATA_DIR=\/opt\/paperless-ngx\/data\nPAPERLESS_TRASH_DIR=\/opt\/paperless-ngx\/trash\nPAPERLESS_MEDIA_ROOT=\/opt\/paperless-ngx\/media\nPAPERLESS_STATICDIR=\/opt\/paperless-ngx\/static\n#PAPERLESS_FILENAME_FORMAT=\n#PAPERLESS_FILENAME_FORMAT_REMOVE_NONE=\n\n# Security and hosting\nPAPERLESS_SECRET_KEY='noch viel viel geheimer'\n#PAPERLESS_URL=https:\/\/example.com\n#PAPERLESS_CSRF_TRUSTED_ORIGINS=https:\/\/example.com # can be set using PAPERLESS_URL\n#PAPERLESS_ALLOWED_HOSTS=example.com,www.example.com # can be set using PAPERLESS_URL\n#PAPERLESS_CORS_ALLOWED_HOSTS=https:\/\/localhost:8080,https:\/\/example.com # can be set using PAPERLESS_URL\n#PAPERLESS_FORCE_SCRIPT_NAME=\n#PAPERLESS_STATIC_URL=\/static\/\n#PAPERLESS_AUTO_LOGIN_USERNAME=\n#PAPERLESS_COOKIE_PREFIX=\n#PAPERLESS_ENABLE_HTTP_REMOTE_USER=false\n\n# OCR settings\nPAPERLESS_OCR_LANGUAGE=deu+eng\nPAPERLESS_OCR_MODE=skip\nPAPERLESS_OCR_OUTPUT_TYPE=pdfa\nPAPERLESS_OCR_PAGES=0\n#PAPERLESS_OCR_IMAGE_DPI=300\nPAPERLESS_OCR_CLEAN=clean\nPAPERLESS_OCR_DESKEW=true\nPAPERLESS_OCR_ROTATE_PAGES=true\nPAPERLESS_OCR_ROTATE_PAGES_THRESHOLD=12.0\n#PAPERLESS_OCR_USER_ARGS={}\nPAPERLESS_CONVERT_MEMORY_LIMIT=0\nPAPERLESS_CONVERT_TMPDIR=\/var\/tmp\/paperless\n\n# Software tweaks\nPAPERLESS_TASK_WORKERS=2\nPAPERLESS_THREADS_PER_WORKER=2\nPAPERLESS_TIME_ZONE=Europe\/Berlin\n#PAPERLESS_CONSUMER_POLLING=10\nPAPERLESS_CONSUMER_DELETE_DUPLICATES=false\nPAPERLESS_CONSUMER_RECURSIVE=false\nPAPERLESS_CONSUMER_IGNORE_PATTERNS=&#91;\".DS_STORE\/*\", \"._*\", \".stfolder\/*\", \".stversions\/*\", \".localized\/*\", \"desktop.ini\"]\nPAPERLESS_CONSUMER_SUBDIRS_AS_TAGS=false\nPAPERLESS_CONSUMER_ENABLE_BARCODES=false\nPAPERLESS_CONSUMER_ENABLE_BARCODES=PATCHT\n#PAPERLESS_PRE_CONSUME_SCRIPT=\/path\/to\/an\/arbitrary\/script.sh\n#PAPERLESS_POST_CONSUME_SCRIPT=\/path\/to\/an\/arbitrary\/script.sh\nPAPERLESS_FILENAME_DATE_ORDER=YMD# Tika settings\nPAPERLESS_TIKA_ENABLED=false\n#PAPERLESS_TIKA_ENDPOINT=http:\/\/localhost:9998\n#PAPERLESS_TIKA_GOTENBERG_ENDPOINT=http:\/\/localhost:3000\n\n# Binaries\nPAPERLESS_CONVERT_BINARY=\/usr\/bin\/convert\nPAPERLESS_GS_BINARY=\/usr\/bin\/gs\nPAPERLESS_OPTIPNG_BINARY=\/usr\/bin\/optipng\n\n#PAPERLESS_FILENAME_PARSE_TRANSFORMS=&#91;]\n#PAPERLESS_THUMBNAIL_FONT_NAME=\n#PAPERLESS_IGNORE_DATES=\n#PAPERLESS_ENABLE_UPDATE_CHECK=\n\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das sollte zum Initialisieren f\u00fcrs 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.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx# <strong><em>sudo -Hu paperless pip3 install --upgrade pip<\/em><\/strong>\nDefaulting to user installation because normal site-packages is not writeable\n&lt;snip&gt;\nSuccessfully installed pip-22.2.2\n\n\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>sudo -Hu paperless pip3 install -r requirements.txt<\/em><\/strong>\nDefaulting to user installation because normal site-packages is not writeable\nLooking in indexes: https:\/\/pypi.python.org\/simple, https:\/\/www.piwheels.org\/simple\nIgnoring backports.zoneinfo: markers 'python_version &lt; \"3.9\"' don't match your environment\nObtaining django-q from git+https:\/\/github.com\/paperless-ngx\/django-q.git@bf20d57f859a7d872d5979cd8879fac9c9df981c#egg=django-q (from -r requirements.txt (line 32))\n&lt;snip&gt;\nSuccessfully 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\nroot@bammbamm:\/opt\/paperless-ngx# \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bei einer Rakete w\u00e4ren wir jetzt quasi ready for ignition. Dann werde ich jetzt mal das startenden manage.py mit den Optionen migrate,  createsuperuser und runserver nacheinander ausf\u00fchren und gucken, ob die Rakete bockt oder startet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx# <em><strong>cd src\/<\/strong><\/em>\nroot@bammbamm:\/opt\/paperless-ngx\/src# <strong><em>ls -la<\/em><\/strong>\ntotal 48\ndrwxr-xr-x 10 paperless paperless 4096 Jul 28 23:33 .\ndrwxr-xr-x  9 paperless paperless 4096 Sep 26 15:27 ..\n&lt;snip&gt;\n-rw-r--r--  1 paperless paperless  254 Jul 28 23:33 <em>manage.py<\/em>\n&lt;snip&gt;\n\nroot@bammbamm:\/opt\/paperless-ngx\/src# <strong><em>sudo -Hu paperless python3 manage.py migrate<\/em><\/strong>\nOperations to perform:\n  Apply all migrations: admin, auth, authtoken, contenttypes, django_q, documents, paperless_mail, sessions\nRunning migrations:\n  Applying contenttypes.0001_initial... OK\n  Applying auth.0001_initial... OK\n  Applying admin.0001_initial... OK\n  Applying admin.0002_logentry_remove_auto_add... OK\n  Applying admin.0003_logentry_add_action_flag_choices... OK\n  Applying contenttypes.0002_remove_content_type_name... OK\n  Applying auth.0002_alter_permission_name_max_length... OK\n  Applying auth.0003_alter_user_email_max_length... OK\n  Applying auth.0004_alter_user_username_opts... OK\n  Applying auth.0005_alter_user_last_login_null... OK\n  Applying auth.0006_require_contenttypes_0002... OK\n  Applying auth.0007_alter_validators_add_error_messages... OK\n  Applying auth.0008_alter_user_username_max_length... OK\n  Applying auth.0009_alter_user_last_name_max_length... OK\n  Applying auth.0010_alter_group_name_max_length... OK\n  Applying auth.0011_update_proxy_permissions... OK\n  Applying auth.0012_alter_user_first_name_max_length... OK\n  Applying authtoken.0001_initial... OK\n  Applying authtoken.0002_auto_20160226_1747... OK\n  Applying authtoken.0003_tokenproxy... OK\n  Applying django_q.0001_initial... OK\n  Applying django_q.0002_auto_20150630_1624... OK\n  Applying django_q.0003_auto_20150708_1326... OK\n  Applying django_q.0004_auto_20150710_1043... OK\n  Applying django_q.0005_auto_20150718_1506... OK\n  Applying django_q.0006_auto_20150805_1817... OK\n  Applying django_q.0007_ormq... OK\n  Applying django_q.0008_auto_20160224_1026... OK\n  Applying django_q.0009_auto_20171009_0915... OK\n  Applying django_q.0010_auto_20200610_0856... OK\n  Applying django_q.0011_auto_20200628_1055... OK\n  Applying django_q.0012_auto_20200702_1608... OK\n  Applying django_q.0013_task_attempt_count... OK\n  Applying django_q.0014_schedule_cluster... OK\n  Applying documents.0001_initial... OK\n  Applying documents.0002_auto_20151226_1316... OK\n  Applying documents.0003_sender... OK\n  Applying documents.0004_auto_20160114_1844... OK\n  Applying documents.0005_auto_20160123_0313... OK\n  Applying documents.0006_auto_20160123_0430... OK\n  Applying documents.0007_auto_20160126_2114... OK\n  Applying documents.0008_document_file_type... OK\n  Applying documents.0009_auto_20160214_0040... OK\n  Applying documents.0010_log... OK\n  Applying documents.0011_auto_20160303_1929... OK\n  Applying documents.0012_auto_20160305_0040... OK\n  Applying documents.0013_auto_20160325_2111... OK\n  Applying documents.0014_document_checksum... OK\n  Applying documents.0015_add_insensitive_to_match... OK\n  Applying documents.0016_auto_20170325_1558... OK\n  Applying documents.0017_auto_20170512_0507... OK\n  Applying documents.0018_auto_20170715_1712... OK\n  Applying documents.0019_add_consumer_user... OK\n  Applying documents.0020_document_added... OK\n  Applying documents.0021_document_storage_type... OK\n  Applying documents.0022_auto_20181007_1420... OK\n  Applying documents.0023_document_current_filename... OK\n  Applying documents.1000_update_paperless_all... OK\n  Applying documents.1001_auto_20201109_1636... OK\n  Applying documents.1002_auto_20201111_1105... OK\n  Applying documents.1003_mime_types... OK\n  Applying documents.1004_sanity_check_schedule... OK\n  Applying documents.1005_checksums... OK\n  Applying documents.1006_auto_20201208_2209... OK\n  Applying documents.1007_savedview_savedviewfilterrule... OK\n  Applying documents.1008_auto_20201216_1736... OK\n  Applying documents.1009_auto_20201216_2005... OK\n  Applying documents.1010_auto_20210101_2159... OK\n  Applying documents.1011_auto_20210101_2340... OK\n  Applying documents.1012_fix_archive_files... OK\n  Applying documents.1013_migrate_tag_colour... OK\n  Applying documents.1014_auto_20210228_1614... OK\n  Applying documents.1015_remove_null_characters... OK\n  Applying documents.1016_auto_20210317_1351... OK\n  Applying documents.1017_alter_savedviewfilterrule_rule_type... OK\n  Applying documents.1018_alter_savedviewfilterrule_value... OK\n  Applying documents.1019_uisettings... OK\n  Applying documents.1019_storagepath_document_storage_path... OK\n  Applying documents.1020_merge_20220518_1839... OK\n  Applying documents.1021_webp_thumbnail_conversion... OK\n  Applying documents.1022_paperlesstask... OK\n  Applying paperless_mail.0001_initial... OK\n  Applying paperless_mail.0002_auto_20201117_1334... OK\n  Applying paperless_mail.0003_auto_20201118_1940... OK\n  Applying paperless_mail.0004_mailrule_order... OK\n  Applying paperless_mail.0005_help_texts... OK\n  Applying paperless_mail.0006_auto_20210101_2340... OK\n  Applying paperless_mail.0007_auto_20210106_0138... OK\n  Applying paperless_mail.0008_auto_20210516_0940... OK\n  Applying paperless_mail.0009_mailrule_assign_tags... OK\n  Applying paperless_mail.0010_auto_20220311_1602... OK\n  Applying paperless_mail.0011_remove_mailrule_assign_tag... OK\n  Applying paperless_mail.0012_alter_mailrule_assign_tags... OK\n  Applying paperless_mail.0009_alter_mailrule_action_alter_mailrule_folder... OK\n  Applying paperless_mail.0013_merge_20220412_1051... OK\n  Applying paperless_mail.0014_alter_mailrule_action... OK\n  Applying paperless_mail.0015_alter_mailrule_action... OK\n  Applying sessions.0001_initial... OK\n\nroot@bammbamm:\/opt\/paperless-ngx\/src# <strong><em>sudo -Hu paperless python3 manage.py createsuperuser\n<\/em><\/strong>Username (leave blank to use 'paperless'): admin\nEmail address: \nPassword: 'ober mega super geheim'\nPassword (again): 'ober mega super geheim' \nSuperuser created successfully.\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann werden wir die Rakete mal f\u00fcr einen kleinen Funktionstest an der Leine abheben lassen und von au\u00dfen betrachten, ob sie ruhig in der Luft liegt.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx\/src# <strong><em>sudo -Hu paperless python3 manage.py runserver<\/em><\/strong>\n&#91;2022-09-26 17:42:57,898] &#91;INFO] &#91;django.utils.autoreload] Watching for file changes with StatReloader\nPerforming system checks...\n\nSystem check identified no issues (0 silenced).\nSeptember 26, 2022 - 17:42:58\nDjango version 4.0.6, using settings 'paperless.settings'\nStarting development server at http:\/\/127.0.0.1:8000\/\nQuit the server with CONTROL-C.\n\neric@bammbamm:~$ <strong><em>wget http:\/\/127.0.0.1:8000\/home<\/em><\/strong>\n--2022-09-26 15:43:51--  http:\/\/127.0.0.1:8000\/home\nConnecting to 127.0.0.1:8000... connected.\nHTTP request sent, awaiting response... 302 Found\nLocation: \/accounts\/login\/?next=\/home &#91;following]\n--2022-09-26 15:43:51--  http:\/\/127.0.0.1:8000\/accounts\/login\/?next=\/home\nReusing existing connection to 127.0.0.1:8000.\nHTTP request sent, awaiting response... 200 OK\nLength: 8284 (8,1K) &#91;text\/html]\nSaving to: \u2018home\u2019\n\nhome                                    100%&#91;==============================================================================&gt;]   8,09K  --.-KB\/s    in 0s      \n\n2022-09-26 15:43:51 (109 MB\/s) - \u2018home\u2019 saved &#91;8284\/8284]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00fcr den echten Start auf die Rampe schieben und die notwendigen systemd service definitions schreiben. Gl\u00fccklicherweise wird das Paket bereits mit drei nur leicht modifizierungsbed\u00fcrftigen 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.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx\/src# <strong><em>cd ..<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx# <strong><em>cd scripts\/<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>ls -la<\/em><\/strong>\ntotal 28\ndrwxr-xr-x 2 paperless paperless 4096 Jul 28 23:33 .\ndrwxr-xr-x 9 paperless paperless 4096 Sep 26 15:27 ..\n-rw-r--r-- 1 paperless paperless  223 Jul 28 23:33 <em>paperless-consumer.service<\/em>\n-rw-r--r-- 1 paperless paperless  215 Jul 28 23:33 <em>paperless-scheduler.service<\/em>\n-rw-r--r-- 1 paperless paperless  364 Jul 28 23:33 <em>paperless-webserver.service<\/em>\n&lt;snip&gt;\n\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>cp -v paperless-* \/etc\/systemd\/system\/<\/em><\/strong>\n'paperless-consumer.service' -&gt; '\/etc\/systemd\/system\/paperless-consumer.service'\n'paperless-scheduler.service' -&gt; '\/etc\/systemd\/system\/paperless-scheduler.service'\n'paperless-webserver.service' -&gt; '\/etc\/systemd\/system\/paperless-webserver.service'\n\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>nano \/etc\/systemd\/system\/paperless-webserver.service<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>more \/etc\/systemd\/system\/paperless-webserver.service<\/em><\/strong>\n&#91;Unit]\nDescription=Paperless webserver\nAfter=network.target\nWants=network.target\nRequires=redis.service\n#Requires=paperless-webserver.socket\n\n&#91;Service]\nUser=paperless\nGroup=paperless\nWorkingDirectory=\/opt\/paperless-ngx\/src\nExecStart=\/opt\/paperless-ngx\/.local\/bin\/gunicorn -c \/opt\/paperless-ngx\/gunicorn.conf.py paperless.asgi:application\n\n&#91;Install]\nWantedBy=multi-user.target\n\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>nano \/etc\/systemd\/system\/paperless-scheduler.service<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>more \/etc\/systemd\/system\/paperless-scheduler.service<\/em><\/strong>\n&#91;Unit]\nDescription=Paperless scheduler\nRequires=redis.service\n\n&#91;Service]\nUser=paperless\nGroup=paperless\nWorkingDirectory=\/opt\/paperless-ngx\/src\nExecStart=python3 manage.py qcluster\n\n&#91;Install]\nWantedBy=multi-user.target\n\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>nano \/etc\/systemd\/system\/paperless-consumer.service<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>more \/etc\/systemd\/system\/paperless-consumer.service<\/em><\/strong>\n&#91;Unit]\nDescription=Paperless consumer\nRequires=redis.service\n\n&#91;Service]\nUser=paperless\nGroup=paperless\nWorkingDirectory=\/opt\/paperless-ngx\/src\nExecStart=python3 manage.py document_consumer\n\n&#91;Install]\nWantedBy=multi-user.target\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zeit f\u00fcr den eigentlich Start von Paperless-NGX. Ich werde jetzt alle Services von Paperless-NGX starten und enablen, sowie anschlie\u00dfend einen reboot ausf\u00fchren. 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&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>systemctl start paperless-scheduler.service<\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>systemctl enable paperless-scheduler.servic<\/em><\/strong>e\nCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/paperless-scheduler.service \u2192 \/etc\/systemd\/system\/paperless-scheduler.service.\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>systemctl start paperless-consumer.service <\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>systemctl enable paperless-consumer.service <\/em><\/strong>\nCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/paperless-consumer.service \u2192 \/etc\/systemd\/system\/paperless-consumer.service.\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>systemctl start paperless-webserver.service <\/em><\/strong>\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>systemctl enable paperless-webserver.service<\/em><\/strong> \nCreated symlink \/etc\/systemd\/system\/multi-user.target.wants\/paperless-webserver.service \u2192 \/etc\/systemd\/system\/paperless-webserver.service.\nroot@bammbamm:\/opt\/paperless-ngx\/scripts# <strong><em>reboot<\/em><\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Houston, we got a lift off&#8230; Die Rakete hat den Orbiot erfolgreich erreicht. Machen wir die ersten vorsichtigen Funktionstest, bevor sie ihre weitere Module verpassen und sie zur vollst\u00e4ndigen DMS-Station ausbauen. Aus pers\u00f6nlicher Lust an der Freude habe ich den Paperless-NGX ein meinem IPv6 ULA-Adressspace hoch gezogen. \ud83d\ude09 Falls also jemand Fragen haben sollte, ob Paperless-NGX IPv6 ready ist und auch l\u00e4uft: <strong><em>JA macht es<\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"974\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/1st-start-1024x974.jpg\" alt=\"\" class=\"wp-image-1875\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/1st-start-1024x974.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/1st-start-300x285.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/1st-start-768x730.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/1st-start.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>1st Login @ Paperless-NGX Server v1.8.0<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Was brauche ich f\u00fcr 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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Erster Funktionstest Paperless-NGX v1.8.0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dann legen wir mal den User Eric an und geben ihm ein Passwort.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"571\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/01_admin-1024x571.jpg\" alt=\"\" class=\"wp-image-1885\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/01_admin-1024x571.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/01_admin-300x167.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/01_admin-768x428.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/01_admin.jpg 1278w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Auf die Admin-Eintrag in der linken Seitenleiste clicken.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/02_admin-1024x683.jpg\" alt=\"\" class=\"wp-image-1886\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/02_admin-1024x683.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/02_admin-300x200.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/02_admin-768x512.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/02_admin.jpg 1286w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Dort unter Benutzer +Hinzuf\u00fcgen clicken<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"686\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/03_admin-1024x686.jpg\" alt=\"\" class=\"wp-image-1887\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/03_admin-1024x686.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/03_admin-300x201.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/03_admin-768x515.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/03_admin.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Den Benutzer Eric mit einem sicheren Passwort anlegen.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"680\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/04_admin-1024x680.jpg\" alt=\"\" class=\"wp-image-1888\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/04_admin-1024x680.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/04_admin-300x199.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/04_admin-768x510.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/04_admin.jpg 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Der Admin loggt sich dann oben rechts mit Abmelden mal aus.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"320\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/05_login_eric.jpg\" alt=\"\" class=\"wp-image-1889\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/05_login_eric.jpg 683w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/05_login_eric-300x141.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/05_login_eric-520x245.jpg 520w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><figcaption>Der User Eric loggt sich mit seinem Passwort einmal ein.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"686\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/06_pdf-import-1024x686.jpg\" alt=\"\" class=\"wp-image-1890\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/06_pdf-import-1024x686.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/06_pdf-import-300x201.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/06_pdf-import-768x515.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/06_pdf-import.jpg 1282w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Dann geben wir ihm doch mal eine PDF vom OpenZFS Symposium 2019 zum Verarbeiten.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"687\" src=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/07_pdf-imported-1024x687.jpg\" alt=\"\" class=\"wp-image-1891\" srcset=\"http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/07_pdf-imported-1024x687.jpg 1024w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/07_pdf-imported-300x201.jpg 300w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/07_pdf-imported-768x515.jpg 768w, http:\/\/www.fotoandnet.de\/wp\/wp-content\/uploads\/2022\/09\/07_pdf-imported.jpg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Er hat es importiert, den Content extrahiert und alles l\u00e4uft sauber.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00e4tzlichen Modulen Tika und Gotenberg.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tika und Gotenberg Installieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Services sind f\u00fcr mich zwar essentiell, jedoch werde ich sie der Austauschbarkeit bei sp\u00e4teren Updates dieser Services als Docker Container anlegen. Also holen wir mal die Pakete f\u00fcr eine Docker Umgebung ab und ziehen Docker hoch.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo apt-get install ca-certificates curl gnupg lsb-release<\/em><\/strong>\nPaketlisten werden gelesen\u2026 Fertig\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>sudo mkdir -p \/etc\/apt\/keyrings<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>curl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>echo \"deb &#91;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 &gt; \/dev\/null<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>more \/etc\/apt\/sources.list.d\/docker.list<\/em><\/strong>\ndeb &#91;arch=amd64 signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu jammy stable\n\neric@bammbamm:~$ <strong><em>sudo apt-get update<\/em><\/strong>\nOK:1 http:\/\/de.archive.ubuntu.com\/ubuntu jammy InRelease\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin<\/em><\/strong>\nPaketlisten werden gelesen\u2026 Fertig\nAbh\u00e4ngigkeitsbaum wird aufgebaut\u2026 Fertig\nStatusinformationen werden eingelesen\u2026 Fertig\n&lt;snip&gt;\n\neric@bammbamm:~$ <strong><em>sudo service docker status<\/em><\/strong>\n\u25cf docker.service - Docker Application Container Engine\n     Loaded: loaded (\/lib\/systemd\/system\/docker.service; enabled; vendor preset: enabled)\n     Active: active (running) since Mon 2022-09-26 16:34:32 UTC; 20s ago\nTriggeredBy: \u25cf docker.socket\n       Docs: https:\/\/docs.docker.com\n   Main PID: 2566 (dockerd)\n      Tasks: 9\n     Memory: 23.9M\n        CPU: 428ms\n     CGroup: \/system.slice\/docker.service\n             \u2514\u25002566 \/usr\/bin\/dockerd -H fd:\/\/ --containerd=\/run\/containerd\/containerd.sock\n&lt;snip&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dann werde ich mal Tika und Gotenberg aus dem DockerHub holen, installieren, starten und reboot fest einrichten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo docker pull apache\/tika<\/em><\/strong>\nUsing default tag: latest\nlatest: Pulling from apache\/tika\nd5fd17ec1767: Pull complete \n3d74ce657280: Pull complete \n8b587b148104: Extracting &#91;==================&gt;                                ]  36.21MB\/96.1MB\na7ee74c4130d: Download complete \ncf5c1973ef27: Download complete \n\neric@bammbamm:~$ <strong><em>sudo docker pull gotenberg\/gotenberg<\/em><\/strong>\nUsing default tag: latest\nlatest: Pulling from gotenberg\/gotenberg\n7a6db449b51b: Pull complete \n9b3d1a56e5be: Pull complete \n8fbdaff3aac4: Pull complete \n1f65ba53270c: Pull complete \ne9035e1d0bab: Downloading &#91;===========================&gt;                       ]  343.7MB\/623.8MB\ne9a3914669f1: Download complete \n4f4fb700ef54: Download complete \n\n\neric@bammbamm:~$ <strong><em>sudo docker images<\/em><\/strong>\nREPOSITORY            TAG       IMAGE ID       CREATED        SIZE\ngotenberg\/gotenberg   latest    f153df718e41   3 weeks ago    1.51GB\napache\/tika           latest    3a8c80c1ea4c   4 months ago   435MB\n\neric@bammbamm:~$ <strong><em>sudo docker run -d -p 9998:9998 --restart unless-stopped apache\/tika<\/em><\/strong>\n2d364bf6f654f2bc9ae1b5317429b7aac76342bd81e894cca6e167d76ca52eea\n\neric@bammbamm:~$ <strong><em>sudo docker run -d -p 3000:3000 --restart unless-stopped gotenberg\/gotenberg<\/em><\/strong>\nb58ef6f37dce7331189fba83c042556c857080a6e949bd7852ca69673c50910a\n\neric@bammbamm:~$ <strong><em>sudo docker container ls<\/em><\/strong>\nCONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                       NAMES\nb58ef6f37dce   gotenberg\/gotenberg   \"\/usr\/bin\/tini -- go\u2026\"   9 seconds ago    Up 8 seconds    0.0.0.0:3000-&gt;3000\/tcp, :::3000-&gt;3000\/tcp   jovial_cannon\n2d364bf6f654   apache\/tika           \"\/bin\/sh -c 'exec ja\u2026\"   19 seconds ago   Up 18 seconds   0.0.0.0:9998-&gt;9998\/tcp, :::9998-&gt;9998\/tcp   festive_perlman\n\neric@bammbamm:~$ <strong><em>sudo reboot<\/em><\/strong>\nConnection to 2a02:8108:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx closed by remote host<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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 \u00c4nderung auch einbindet und nutzt. Na dann werde ich mal Hand anlegen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eric@bammbamm:~$ <strong><em>sudo nano \/opt\/paperless-ngx\/paperless.conf<\/em><\/strong>\n\neric@bammbamm:~$ <strong><em>sudo grep -A 4 \"Tika\" \/opt\/paperless-ngx\/paperless.conf<\/em><\/strong>\n# Tika settings\nPAPERLESS_TIKA_ENABLED=true\nPAPERLESS_TIKA_ENDPOINT=http:\/\/localhost:9998\nPAPERLESS_TIKA_GOTENBERG_ENDPOINT=http:\/\/localhost:3000\n\neric@bammbamm:~$ <strong><em>sudo reboot<\/em><\/strong>\nConnection to 2a02:8108:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx closed by remote host\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Funktionstest Tike und Gotenberg<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aus dem DMS-Vergleich heraus habe ich noch 85 Dateien zum Pr\u00fcfen 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\u00f6nnen wird. \ud83d\ude09<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00f6rt habe: Das sieht doch nach einem g\u00fcltigen Versuch aus!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich habe nun etliche Tage damit verbracht die f\u00fcr mich in Betracht kommenden Dokumenten Management Systeme zu betrachten, testen, bewerten und auf Herz und Nieren zu pr\u00fcfen. Der Gedanke ein DMS zu nutzen ist&#46;&#46;&#46;<\/p>\n","protected":false},"author":2,"featured_media":1909,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[87,81],"class_list":["post-1812","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","tag-document-management-system","tag-paperless-ngx"],"_links":{"self":[{"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1812"}],"version-history":[{"count":57,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1812\/revisions"}],"predecessor-version":[{"id":1910,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1812\/revisions\/1910"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=\/wp\/v2\/media\/1909"}],"wp:attachment":[{"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1812"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fotoandnet.de\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}