In dieser Anleitung wir die IP: 192.168.2.158 und der Hostname der VM: paperless-vm-1 verwendet. Natürlich müssen diese Daten in der gesamten Anleitung angepasst werden, wenn sie auf ihren eigenen IP-Bereich sind. Den hostname empfehle ich erst mal zu belassen, bis Sie verstanden haben, wo dieser überall geändert werden muss. #ComputerRalle
Ausgangspunkt: Debian 13 Minimal. Es sind nur Standardsystemkomponenten und SSH Server installiert. debian-13.1.0-amd64-netinst.iso.
Interfaces Datei der VM bearbeiten IP Adresse vergeben
nano /etc/network/interfaces
IP und Gateway müssen sich natürlich in Ihrem Netzwerk befinden. Hier in der Anleitung ist die IP: 192.168.2.158 – diese findet sich an verschiedenen Stellen. Überall wo hier in dieser Anleitung diese IP steht, muss die Ihre anstatt eingetragen werden!
allow-hotplug ens18
auto ens18
iface ens18 inet static
address 192.168.2.158/24
gateway 192.168.2.1
dns-nameservers 8.8.8.8
nano /etc/hosts
Hier muss Ihre IP auch rein (belassen Sie den Hostname: paperless-vm-1 vorerst so):
127.0.0.1 localhost
127.0.1.1 paperless-vm-1
192.168.2.158 paperless-vm-1
nano /etc/hostname
paperless-vm-1
SSH Zugriff aktivieren
nano /etc/ssh/sshd_config
Diesen Eintrag in die configdatei einfügen:
PermitRootLogin Yes
reboot
Nun kann via SSH z.B. KiTTY der Server betreten werden.
Docker auf Debian installieren
apt update && apt upgrade -y
apt install -y docker.io docker-compose curl
systemctl enable --now docker
Paperless mit docker compose installieren
Ordner für Paperlessinstallation erstellen:
mkdir -p /opt/paperless
cd /opt/paperless
docker-compose.yml Datei erstellen:
nano /opt/paperless/docker-compose.yml
Diese compose kopieren und in die docker-compose.yml einfügen. Beachten Sie, dass hier in dieser Datei IP und Hostname mehrfach auftauchen. Wenn Sie IP und Hostname geändert haben, dann auch hier.
# compose Datei von #ComputerRalle
# ralf-peter-kleinert.de
# Name des Containers, wird vor die Volumes gesetzt:
name: paperless-ngx
services:
broker:
# Version 7 festgesetzt:
image: redis:7
restart: always
db:
# Datenbankversion auf 17 festgesetzt:
image: postgres:17
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_DB: paperless
POSTGRES_USER: paperless
POSTGRES_PASSWORD: paperless
gotenberg:
# gotenberg auf Version 8 festgesetzt:
image: gotenberg/gotenberg:8
restart: always
environment:
DISABLE_GOOGLE_CHROME: "1"
tika:
image: apache/tika:latest
restart: always
# alpine zum zurueckspielen von Paperless Backup Program Backups:
alpine:
image: alpine:3
container_name: alpine_helper
entrypoint: sh
stdin_open: true
tty: true
paperless:
# Paperless auf Version 2.19.3 festgesetzt:
image: ghcr.io/paperless-ngx/paperless-ngx:2.19.4
depends_on:
- db
- broker
- gotenberg
- tika
ports:
- "8000:8000"
restart: always
volumes:
- data:/usr/src/paperless/data
- media:/usr/src/paperless/media
# diese beiden Ordner werden ueber Samba freigegeben:
- ./export:/usr/src/paperless/export
- ./consume:/usr/src/paperless/consume
env_file:
# in die email-versand.env werden Serveradresse, Mailadresse, Ports, User, PW usw eingetragen
# hier koennen dann aus Paperless Dokumente via Mail versendet werden
# muss vor start von docker-compose up -d vorhanden sein:
- ./email-versand.env
environment:
PAPERLESS_REDIS: redis://broker:6379
PAPERLESS_DBHOST: db
PAPERLESS_DBNAME: paperless
PAPERLESS_DBUSER: paperless
PAPERLESS_DBPASS: paperless
PAPERLESS_TIME_ZONE: Europe/Berlin
PAPERLESS_SECRET_KEY: aksjd@Kfhs87H/(&986jlk-Klunihgiu87659zol
PAPERLESS_CONSUMPTION_DIR: /usr/src/paperless/consume
PAPERLESS_MEDIA_ROOT: /usr/src/paperless/media
PAPERLESS_EXPORT_DIR: /usr/src/paperless/export
PAPERLESS_TIKA_ENABLED: "1"
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
# Cosume Abruf alle 30 Sekunden:
PAPERLESS_CONSUMER_POLLING: "30"
PAPERLESS_CONSUMER_POLLING_DELAY: "30"
PAPERLESS_CONSUMER_POLLING_RETRY_COUNT: "3"
PAPERLESS_CONSUMER_DELETE_DUPLICATES: "true"
PAPERLESS_CONSUMER_RECURSIVE: "true"
# Mülleimer Zeit:
PAPERLESS_EMPTY_TRASH_DELAY: "365"
PAPERLESS_OCR_LANGUAGE: deu+eng
# Dokument Export benennt die Doks Nach Jahr, Monat, Tag, Name:
PAPERLESS_FILENAME_FORMAT: "{{ created_year }}-{{ created_month }}-{{ created_day }}_{{ title }}"
PAPERLESS_ALLOWED_HOSTS: "paperless-vm-1,192.168.2.158,localhost"
PAPERLESS_CSRF_TRUSTED_ORIGINS: "https://paperless-vm-1,https://192.168.2.158"
volumes:
data:
media:
export:
db_data:
Email Datei für Versand
nano /opt/paperless/email-versand.env
PAPERLESS_EMAIL_HOST=
PAPERLESS_EMAIL_PORT=25
PAPERLESS_EMAIL_HOST_USER=
PAPERLESS_EMAIL_HOST_PASSWORD=
PAPERLESS_EMAIL_FROM=
PAPERLESS_EMAIL_USE_TLS=
PAPERLESS_EMAIL_USE_SSL=
SSL-Zertifikat erstellen
VM-lokalen Ordner für das Zertifikat erstellen:
mkdir -p /etc/ssl/localcerts
cd /etc/ssl/localcerts
Befehl Um Zertifikat zu erzeugen, hier -days 3650 = 10 Jahre. Beachten Sie, dass auch hier IP und hostname im Zertifikat enthalten sind!
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout paperless-vm-1.key -out paperless-vm-1.crt -subj "/C=DE/ST=Berlin/L=Berlin/O=Local/OU=IT/CN=paperless-vm-1" -addext "subjectAltName=DNS:paperless-vm-1,IP:192.168.2.158"
Zertifikat aufrufen, dann markieren und mit STRG+Shift+c kopieren:
cat /etc/ssl/localcerts/paperless-vm-1.crt
Zertifikat in Windows installieren
Neue Textdatei auf Windows PC erstellen. Am besten mit Notepadd++. Umbenennen in: paperless-vm-1.crt, dann das kopierte Zetifikat einfügen und speichern.
Doppelklick auf das Zert paperless-vm-1.crt -> Zertifikat installieren -> Lokaler Computer -> Alle Zertifikate in folgendem Speicher speichern, Durchsuchen -> Vertrauenswürdige Stammzertifizierungstellen -> Weiter -> Fertigstellen
In die Windows hosts-Datei IP und Hostname eintragen unter:
C:\Windows\System32\drivers\etc\hosts
Ganz unten zufügen und speichern:
192.168.2.158 paperless-vm-1
############## OPTIONAL Start ##############
Backup aus dem Paperless Backup Programm einspielen – optional
Falls Paperless schon läuft:
docker compose down
Backup von Windows Paperless Backup Programm in die VM kopieren, mit Powershell:
scp -r "H:\Paperless-Backup\2025-10-28_12-15-01 - klein" root@192.168.2.158:/opt/paperless-backup
Paperless Ordner nach frischer Installation löschen:
rm -rf /opt/paperless/data
rm -rf /opt/paperless/media
rm -rf /opt/paperless/export
Backups wiederherstellen:
docker run --rm -v paperless-ngx_data:/restore -v /opt/paperless-backup:/backup alpine tar -xzf /backup/paperless-ngx_data.tar.gz -C /restore
docker run --rm -v paperless-ngx_media:/restore -v /opt/paperless-backup:/backup alpine tar -xzf /backup/paperless-ngx_media.tar.gz -C /restore
docker run --rm -v paperless-ngx_export:/restore -v /opt/paperless-backup:/backup alpine tar -xzf /backup/paperless-ngx_export.tar.gz -C /restore
docker run --rm -v paperless-ngx_db_data:/restore -v /opt/paperless-backup:/backup alpine tar -xzf /backup/paperless-ngx_db_data.tar.gz -C /restore
docker-compose up -d
Testen mit:
http://192.168.2.158:8000
############## OPTIONAL Ende ##############
cd /opt/paperless
Paperless hochfahren, alle Container werden heruntergeladen (gepullt) und aktiviert:
docker compose up -d
stunnel4 für SSL Zugriff installieren
stunnel ist ein kleines, mächtiges Werkzeug. Es kann eine unverschlüsselte TCP-Verbindung entgegennehmen, sie per SSL oder TLS verschlüsseln und an den Zielserver weiterleiten.
Umgekehrt kann es auch eine verschlüsselte Verbindung annehmen und sie intern wieder unverschlüsselt bereitstellen. Auf diese Weise lässt sich jeder beliebige Netzwerkdienst, der selbst keine Verschlüsselung unterstützt, sicher betreiben. Man kann sich stunnel wie einen Verschlüsselungs-Adapter vorstellen. Das Programm packt Datenströme in einen sicheren Tunnel ohne, dass die entsprechende Anwendung etwas davon wissen muss.
apt install stunnel4 -y
stunnel Konfigurieren
stunnel.conf erstellen / öffnen:
nano /etc/stunnel/stunnel.conf
Eintrag:
pid = /var/run/stunnel4/paperless.pid
include = /etc/stunnel/paperless.conf
paperless.conf erstellen / öffnen:
nano /etc/stunnel/paperless.conf
Eintrag:
pid = /var/run/stunnel4/paperless.pid
[paperless]
accept = 443
connect = 8000
cert = /etc/ssl/localcerts/paperless-vm-1.crt
key = /etc/ssl/localcerts/paperless-vm-1.key
default auf ENABLED=1 setzen:
nano /etc/default/stunnel4
ENABLED=1
stunnel aktivieren und checken:
systemctl enable --now stunnel4
systemctl restart stunnel4
systemctl status stunnel4
Samba installieren Paperless consume und export freigeben
apt install samba -y
Samba config Datei öffnen:
nano /etc/samba/smb.conf
Ganz am Ende der Datei einfügen:
[global]
workgroup = WORKGROUP
server string = Paperless Server
security = user
map to guest = never
smb encrypt = required
server signing = mandatory
log file = /var/log/samba/log.%m
max log size = 1000
[paperless-consume]
path = /opt/paperless/consume
browseable = yes
writable = yes
guest ok = no
public = no
valid users = paperless
force user = paperless
create mask = 0775
directory mask = 0775
[paperless-export]
path = /opt/paperless/export
browseable = yes
writable = yes
guest ok = no
public = no
valid users = paperless
force user = paperless
create mask = 0775
directory mask = 0775
Rechte setzen:
chmod -R 777 /opt/paperless/consume
chmod -R 777 /opt/paperless/export
adduser paperless
smbpasswd -a paperless
systemctl restart smbd
reboot
Windows auch einmal neustarten.
Die Rechner und der paperless Server müssen sich im selben Netzwerk befinden! Auf Windows oder Netzwerkrechner können diese Ordner nun aufgerufen werden:
\\192.168.2.158\paperless-consume
\\paperless-vm-1\paperless-consume
\\192.168.2.158\paperless-export
\\paperless-vm-1\paperless-export
Paperless im Browser aufrufen
Paperless-ngx ohne SSL im Browser öffnen:
http://192.168.2.158:8000
Paperless aufrufen mit SSL:
https://paperless-vm-1
Paperless läuft.

Hallo,
prima Anleitung! Funktioniert Bestens!
Wie kann ich ein Update auf die aktuelle Version machen?
Gruß,
Dirk
Ja das geht.
In der Compose Datei diese Zeilen suchen:
paperless:
# Paperless auf Version 2.19.3 festgesetzt:
image: ghcr.io/paperless-ngx/paperless-ngx:2.19.4
Dann die Nummer: 2.19.4 auf die gewünschte Version setzen.
Dann:
docker-compose down
docker-compose up -d
bzw:
docker compose down
docker compose up -d
Moins,
ich danke ebenfalls für die Anleitung!
Eine Frage, die sich gar nicht so sehr um paperless sondern um docker dreht (würde ja auch gern verstehen, was ich hier kopiere) ist folgende: warum legen Sie die named volumes an, die dann, nach meinem Verständnis, gar keinen Einsatz mehr finden
„`
volumes:
– data:/usr/src/paperless/data
– media:/usr/src/paperless/media
# diese beiden Ordner werden ueber Samba freigegeben:
– ./export:/usr/src/paperless/export
– ./consume:/usr/src/paperless/consume
„`
und werden sie offensichtlich doch, weil ich einen Fehler bekomme, wenn ich was ändere
Hallo. Wie kommen Sie darauf, dass die Volumes nicht verwendet werden? Paperless braucht diese Volumes.
Hallo,
danke für die Anleitung. Kann man die anderen Container genau so updaten wie im ersten Kommentar?
Gruß
Rolf
Hallo Ralf-Peter,
danke Dir für die Arbeit, die Du hier in diese Videos und den Blog reingesteckt hast. Ich habe gem. Deines Blogs versucht, Paperless auf einem Mini-Asus zu installieren. Dabei habe ich nacheinander jeden Schritt explizit abgearbeitet. Jedoch habe ich die neueste stable-Version von Debian benutzt und auch die neueste stable-Version von paperless.
Habe alle IP’s Deiner Anleitung gegen die meines Servers ausgetauscht. Jetzt konnte ich Proxmox in neuester Ausgabe per USB-Stick installieren. Auch die VM für Debian anzulegen funktionierte, und ich kann auch mit https://meine IP:8006 darauf zugreifen. Alle Schritte aus dem Blog nachvollzogen, aber kein Zugriff über http://meine IP:8000 auf paperless. Firewall abgeschaltet. Auch kein Erfolg ! Ist wohl alles bischen zu kompliziert für einen alten Mann.
Ich habe vor das nochmal mit Debian 13.5 durchzuspielen. Aber ich sehe erst mal keinen Grund, warum das nicht funktionieren sollte.
Leider ist mein Kommentar von gestern scheinbar rausgeflogen. Es stand da er müßte erst genehmigt werden. Ich habe die Anleitung schritt für Schritt nachvollzogen,komme aber nicht in Paperless rein. VM wird erreicht unter https://192 … … … :8006 Unter der gleichen IP-Adresse mit Port 8000 > http://192. … … … :8000/ komme ich jedoch nicht auf Paperless. Müssen die IP’s denn unterschiedlich sein ? Ich lege aber doch nur eine VM an?
Hallo Franz-Jürgen,
dein Proxmox Server hat eine IP z.B. 192.168.1.xxx über den Port 8006 greifst zu auf das Proxmox WEB-UI zu.. Deine Paperless-VM hat eine eigene IP z.B. 192.168.1.yyy und da kannst du Dich dann den Port 8000 von Paperless-UI einloggen.. Siehe es als zwei unterschiedlichen Server an.. Good Luck
Gruß Kurt
Gerade vor einer halben Stunde einen neuen Kommentar geschrieben und auch der ist wieder weg. Das sind jetzt 2 Kommentare in 2 Tagen die weggekommen sind.
Hallo Ralf-Peter
ich kann machen was ich will, bekomme das Paperless nicht ans Laufen. Wenn ich richtig gelesen habe, hattest Du ja auch schon erhebliche Probleme mit Deinem Backup-System.
Warum geht man nicht einfach hin und bietet Konsumern nicht einfach das Programm mit einer einfachen Installationsroutine, einer einfachen Backup-Variante und einer automatischen Update-Funktion an. Die Idee, die dahinter steckt, Dokumente vernünftig verwalten zu können scheint mir eminent wichtig und up-to-date zu sein. Da wäre sicher der Eine oder Andere bereit etwas dafür zu bezahlen
Hallo Franz-Jürgen. Zu den Kommentaren. Ich bekomme am Tag 50 Spam-Kommentrare und muss alles händisch freigeben.
Deine Paperless VM braucht eine eigene feste IP und ist ein eigener Server. Ich sehe keinen Grund, weshalb das nicht funktionieren sollte.
Die Installation scheitert schon am Punkt wo Kitty seinen Auftritt beginnt. Bei apt update && apt upgrade -y kann er schon einige Pakete nicht runterladen. Mit dem Befehl apt-get probiert, dasselbe Spiel. Docker.io und docker-compose lassen sich nicht installieren. systemctl enable –now docker funktioniert dann folgerichtig auch nicht. Ist alles so umständlich. Ich bin jetzt 71 Jahre alt. Gibt es für nen Hunny „betreutes Installieren?“
Ich schreibe Sie mal an.
Hi,
Das Problem hatte ich auch – lag (nach einigem googeln) wohl an der Minimalinstallation, so dass einige Pakete, u.a. Resolv.conf (bin Anfänger, es gibt mehrere ähnlich lautende Dateien) nicht installiert werden. Das führt zu dem DNS-Fehler.
Und weil das inzwischen wohl ein „dynamischer Verweis“ ist, lässt sich die Datei nicht einfach per nano ergänzen, sondern muss erst entfernt und dann neu erstellt werden.
Danach lässt sich „Nameserver 8.8.8.8“ speichern
Dann klappten die Updates.
Bin noch dabei, den Rest nachzuvollziehen. Vielen Dank bis hierhin!!
Nachdem ich mit mehreren Versuchen über Debian das Ding nicht ans Laufen bekommen habe, hatte ich nun die Schn. …voll und wollte schon alles hinschmeißen. Dann hab ich einen letzten Versuch mit einer anderen Distribution > aktuellste Ubuntu Live-Version angestoßen. Und siehe da, „es läuft!“. Augenscheinlich war das Update und Upgraden über SSL in den Trixie_Versionen nicht möglich. Warum auch immer.
Hallo liebe Nutzer,
nach langem hin und her hab ich ja paperless über eine Ubuntu-Distribution ans Laufen bekommen. Der eingebundene Dokumentendrucker Brother ADS-4700W tut auch seinen Dienst, hab jetzt 132 Dokumente schon eingescannt und gespeichert. Und auch die Netzwerkfreigaben über Samba tun ihren Dienst. Also alles gut. Habe aber bewußt den optionalen Teil fürs Backup weggelassen, weil es da wohl einige Schwierigkeiten gab. Ich möchte aber doch eine Backup-Funktion nutzen und diese Daten dann auf einer Nextcloud nur mit lokalen Zugang ablegen.
Aber ich finde die Datei-Ordner media, den Datenbank-Ordner usw. nicht. Welche Dateien muss ich sichern, um ein komplettes Backup zu bekommen? Und wo finde ich diese ?
In vielen Beschreibungen liegen die relevanten Ordner alle in einem Verzeichnis Paperless-ngx
moin, Deine letzten Worte in „Gottes Gehör“, habe version 2.20.15 nach Deiner Anleitung installiert und was soll ich sagen … es hat funktioniert! Danke!!!
Es funktioniert mit der letzten Debian 13 version, Probleme hatte ich mit meine UniFi- Netzwerk und der statischen IP-Adresse. Letzlich habe ich die VM auf DHCP umgestellt und in der UDM feste IP-Adresse vergeben. Läuft …
Demnächst mach ich das Update auf version 3.x, hoffe das funktioniert genauso 😉 …