docs
imap
dokumente · ocr · imap

Paperless-ngx —
Setup & IMAP-Integration

Paperless-ngx scannt, OCR-isiert und archiviert Dokumente automatisch. Mit IMAP-Integration landet jede E-Mail mit Anhang direkt im digitalen Archiv — Rechnung weiterleiten, fertig. Der kniffligste Teil dabei ist nicht Paperless selbst, sondern der Dovecot IMAP-Subfolder-Pfad der anders funktioniert als erwartet, und die FortiGate-Policy die ausgehende IMAP-Verbindungen erlauben muss.

Paperless-ngx Docker PostgreSQL Redis ✓ OCR automatisch ⚠ INBOX.paperless nicht INBOX/paperless ⚠ Port 995 = IMAP (Dovecot)
01 Architektur 02 Deployment 03 Nginx 04 IMAP-Postfach 05 FortiGate 06 Paperless IMAP 07 Scanner 08 Fallstricke
01 — Architektur

Wie Dokumente ins System kommen

Paperless-ngx kennt mehrere Wege wie Dokumente ins Archiv gelangen. Im Einsatz sind zwei davon: ein Konsumenten-Ordner den der Scanner direkt beschreiben kann, und ein IMAP-Abruf der ein E-Mail-Postfach überwacht und Anhänge automatisch importiert.

Dokument-Quellen

Weg 1: Scanner (eSCL/AirScan)
    Brother Scanner → consume/-Ordner (bind-mount)
    Paperless erkennt neue Dateien → OCR → Archiv

Weg 2: E-Mail IMAP
    Rechnung per E-Mail erhalten
    → an Paperless-Adresse weiterleiten
    → E-Mail landet in IMAP-Subfolder INBOX.paperless
    → Paperless-Scheduler fragt IMAP ab
    → PDF-Anhang → OCR → Archiv
    → E-Mail wird als gelesen markiert / gelöscht

Paperless auf Server2 (10.0.1.82)
    Stack: Paperless-ngx + PostgreSQL 15 + Redis
    Port: 8000 → Nginx → paperless.local
02 — Deployment

Docker Compose auf Server2

/opt/paperless/docker-compose.ymlServer2
services:
  paperless:
    image: ghcr.io/paperless-ngx/paperless-ngx:latest
    container_name: paperless
    restart: unless-stopped
    ports:
      - "10.0.1.82:8000:8000"
    depends_on:
      - paperless-db
      - paperless-redis
    volumes:
      - ./data:/usr/src/paperless/data
      - ./media:/usr/src/paperless/media
      - ./export:/usr/src/paperless/export
      - ./consume:/usr/src/paperless/consume
    environment:
      PAPERLESS_REDIS: redis://paperless-redis:6379
      PAPERLESS_DBHOST: paperless-db
      PAPERLESS_DBNAME: paperless
      PAPERLESS_DBUSER: paperless
      PAPERLESS_DBPASS: sicheres-passwort
      PAPERLESS_URL: https://paperless.local
      PAPERLESS_SECRET_KEY: langer-zufaelliger-string
      PAPERLESS_OCR_LANGUAGE: deu+eng
      PAPERLESS_TIME_ZONE: Europe/Berlin
      USERMAP_UID: "1000"
      USERMAP_GID: "1000"

  paperless-db:
    image: postgres:15
    container_name: paperless-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: paperless
      POSTGRES_USER: paperless
      POSTGRES_PASSWORD: sicheres-passwort
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  paperless-redis:
    image: redis:7-alpine
    container_name: paperless-redis
    restart: unless-stopped
    volumes:
      - ./redisdata:/data
bashServer2 — starten und Admin anlegen
mkdir -p /opt/paperless
cd /opt/paperless
docker compose up -d
docker compose logs -f paperless

# Admin-User anlegen
docker compose exec paperless python3 manage.py createsuperuser
03 — Nginx

paperless.local via Reverse Proxy

/opt/docker/nginx/conf.d/paperless.local.confServer1
server {
    listen 443 ssl;
    server_name paperless.local;

    ssl_certificate     /etc/nginx/certs/homelab.pem;
    ssl_certificate_key /etc/nginx/certs/homelab-key.pem;

    # Für große Dokument-Uploads
    client_max_body_size 50M;

    location / {
        proxy_pass         http://10.0.1.82:8000;
        proxy_http_version 1.1;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 300;
    }
}
04 — IMAP-Postfach einrichten

Subfolder beim Hoster anlegen

Paperless überwacht ein IMAP-Postfach und importiert E-Mail-Anhänge. Damit nicht jede E-Mail importiert wird, legt man einen dedizierten Subfolder an und leitet nur gewünschte Mails dorthin weiter. Bei Dovecot-basierten Hostern (sehr verbreitet bei deutschen Hostern) gibt es eine Besonderheit beim Subfolder-Pfad — dazu mehr in Abschnitt 06.

1
Subfolder im Webmail anlegen
Im Webmail-Interface des Hosters (Roundcube o.ä.): Ordner erstellen → Name: paperless → als Unterordner von INBOX.
2
E-Mail-Weiterleitung einrichten
Filterregel im Webmail: E-Mails mit Anhang von bestimmten Absendern (Stromanbieter, Versicherung etc.) → in Ordner paperless verschieben. Oder: manuell Rechnungs-Mails in den Ordner ziehen.
3
IMAP-Verbindungsdaten notieren
Vom Hoster braucht man:
— IMAP-Server (z.B. imap.example.de)
— Port: 995 (bei Dovecot kann das IMAP über SSL sein, nicht POP3!)
— Benutzername: vollständige E-Mail-Adresse
— Passwort: E-Mail-Passwort
05 — FortiGate

Ausgehende IMAP-Verbindung erlauben

Paperless auf Server2 muss aktiv das IMAP-Postfach beim Hoster abfragen — das ist ausgehender Traffic von LAN nach WAN. Die Standard-Policy LAN-to-WAN erlaubt das normalerweise bereits, aber wenn nur bestimmte Ports erlaubt sind oder die Policy zu restriktiv ist, braucht man eine spezifische Regel.

FortiOS CLIAdressobjekte + Service für IMAP
# Adressobjekt für Server2
config firewall address
    edit "Server2"
        set subnet 10.0.1.82 255.255.255.255
    next
end

# Custom Service für IMAP SSL Port 995
config firewall service custom
    edit "IMAP-SSL-995"
        set protocol TCP
        set tcp-portrange 995
    next
end

# Firewall Policy: Server2 → IMAP-Server
config firewall policy
    edit 0
        set name     "Paperless-IMAP"
        set srcintf  "lan"
        set dstintf  "wan"
        set srcaddr  "Server2"
        set dstaddr  "all"
        set service  "IMAP-SSL-995"
        set action   accept
        set nat      enable
    next
end
Verbindung testen bevor Paperless konfiguriert wird

Direkt auf Server2 testen ob Port 995 erreichbar ist:
nc -zv imap.example.de 995
Ausgabe "Connection succeeded" → Firewall erlaubt die Verbindung. Dann mit openssl den Server-Banner prüfen:
openssl s_client -connect imap.example.de:995

06 — Paperless IMAP-Konfiguration

Der Dovecot-Subfolder-Fallstrick

In Paperless unter Settings → Mail Rules einen neuen Account anlegen, dann eine Mail Rule für den Subfolder. Hier lauert der wichtigste Fallstrick:

Dovecot nutzt Punkt-Notation — nicht Slash

Bei Dovecot-basierten IMAP-Servern (sehr verbreitet bei deutschen Hostern) werden Subfolder-Pfade mit einem Punkt getrennt, nicht mit einem Slash.

Falsch: INBOX/paperless
Richtig: INBOX.paperless

Mit dem falschen Trennzeichen findet Paperless den Ordner nicht und überspringt den Account still ohne Fehlermeldung — die Logs zeigen nur "no mails found".

FeldWertNotiz
IMAP Serverimap.example.deHoster-spezifisch
Port995IMAP mit SSL — nicht POP3!
SicherheitSSL/TLS
Benutzernamevollständige E-Mail-Adresse
OrdnerINBOX.paperlessPunkt, nicht Slash!
AktionMark as read / Deletenach Import
1
Mail Account in Paperless anlegen
Admin-UI → Settings → Mail → Accounts → Add
Server, Port, Credentials eintragen, Verbindung testen.
2
Mail Rule anlegen
Settings → Mail → Rules → Add
— Account: der gerade angelegte
— Folder: INBOX.paperless (mit Punkt!)
— Action: Consume attachments
— After consumption: Mark as read (oder Delete)
3
Test-E-Mail schicken
Eine E-Mail mit PDF-Anhang manuell in den paperless-Ordner verschieben. Paperless prüft standardmäßig alle 10 Minuten — oder manuell anstoßen:
docker compose exec paperless python3 manage.py mail_fetcher
Port 995 ist bei Dovecot IMAP — nicht POP3

Port 995 ist offiziell POP3S — aber Dovecot kann auf diesem Port auch IMAP betreiben. Das openssl s_client-Banner zeigt +OK Dovecot ready was nach POP3 aussieht, aber IMAP funktioniert trotzdem wenn man in Paperless IMAP als Protokoll wählt. Wer unsicher ist: einfach IMAP wählen und testen — es klappt.

07 — Scanner-Integration

Brother Scanner via eSCL / AirScan

Moderne Brother-Scanner unterstützen das eSCL-Protokoll (auch AirScan genannt). Damit kann der Scanner direkt in den Paperless-Konsumenten-Ordner scannen — kein Treiber auf dem Server nötig, keine spezielle Software.

bashKonsumenten-Ordner als SMB-Share verfügbar machen
# Option 1: Samba-Share auf den consume/-Ordner
# Dann am Scanner als Scan-to-SMB-Ziel eintragen

# Option 2: Scanner scannt direkt über eSCL
# Paperless consume-Ordner via bind-mount:
# ./consume:/usr/src/paperless/consume (in docker-compose)
#
# eSCL-fähiges Tool auf dem Server:
sudo apt install sane-utils

# Scanner-IP prüfen
scanimage -L
Einfachste Lösung: Scan-to-Email

Viele Brother-Scanner können direkt an eine E-Mail-Adresse scannen. Wenn das Scan-Ziel auf die Paperless-IMAP-Adresse zeigt und die Mail automatisch in den paperless-Subfolder einsortiert wird, ist keine weitere Konfiguration nötig — IMAP-Integration übernimmt den Rest.

08 — Fallstricke

Was schiefgehen kann

IMAP: Paperless überspringt Account — keine Fehlermeldung
Häufigste Ursache: keine Mail Rules konfiguriert. Paperless importiert nur wenn eine aktive Rule für den Account existiert. Auch wenn der Account angelegt ist und die Verbindung klappt — ohne Rule passiert nichts. Zweite Ursache: falscher Ordnerpfad (INBOX/paperless statt INBOX.paperless).
Subfolder-Pfad funktioniert nicht trotz korrekter Schreibweise
Den genauen Pfad mit openssl s_client -connect imap.server.de:995 verifizieren, dann IMAP-Befehle manuell eingeben:
A LOGIN user@domain.de passwort
A LIST "" "*"
Die Ausgabe zeigt alle verfügbaren Ordner mit exakten Pfadnamen.
OCR erkennt deutschen Text schlecht
PAPERLESS_OCR_LANGUAGE in der docker-compose.yml prüfen. Für deutsche Dokumente: deu+eng setzen. Nur eng (Standard) erkennt Umlaute und deutschsprachigen Text deutlich schlechter.
Server2 nicht erreichbar — paperless.local lädt nicht
Server2 (OptiPlex) ist on-demand und muss eingeschaltet sein. Paperless ist nicht always-on wie AliasVault oder Joplin. Entweder Server2 einschalten oder einen Wake-on-LAN/Smart-Plug-Trigger einrichten.
Dokument-Upload schlägt fehl — 413 Request Entity Too Large
Nginx begrenzt die Upload-Größe. In der Nginx-Config für paperless.local: client_max_body_size 50M setzen und Nginx neu laden: docker exec nginx nginx -s reload.