Zum Inhalt
NEXPAPER

Selbst hosten

Deine Papiere, auf deinem eigenen Server.

nexpaper läuft als ein einziger Container mit einem Ordner für alle Daten. Du brauchst einen Rechner mit Docker, etwa einen kleinen Heimserver oder eine NAS, und eine kurze Compose-Datei. Redis, Celery, Postgres oder einen eigenen Webserver braucht es nicht, und ein Konto bei jemand anderem auch nicht.

Starten in drei Schritten

Das Abbild liegt in der GitHub Container Registry, für amd64 und arm64. Es enthält Oberfläche, Server und Texterkennung zugleich in sechs Sprachen. Eine zweite Datenbank oder einen eigenen Webserver braucht nexpaper nicht.

  1. Die Compose-Datei anlegen

    Leg einen Ordner an, etwa nexpaper, und darin diese Datei.

    docker-compose.yml
    services:
      nexpaper:
        image: ghcr.io/derkezorm/nexpaper:latest
        container_name: nexpaper
        restart: unless-stopped
    
        ports:
          # Nur dieser Rechner erreicht nexpaper (127.0.0.1). Davor gehört ein
          # Reverse Proxy mit https, der an http://127.0.0.1:8560 weiterleitet.
          # Direkt im Heimnetz: "8560:8000" schreiben, aber nur in einem Netz,
          # dem du traust. Ohne https gehen Passwörter im Klartext hindurch.
          - "127.0.0.1:8560:8000"
    
        # Keine Rechte, die er nicht braucht: Der Start setzt nur die Besitzer
        # von /data und wechselt dann von root zum Benutzer nexpaper.
        security_opt:
          - no-new-privileges:true
        cap_drop:
          - ALL
        cap_add:
          - CHOWN
          - DAC_READ_SEARCH
          - SETUID
          - SETGID
    
        volumes:
          # Datenbank, Log, Sicherungen und eigene Sprachen. Eine lokale Platte,
          # nie eine SMB- oder NFS-Freigabe.
          - ./data:/data
          # Der Eingangsordner für einen Scanner (Einstellungen, Eingänge):
          # - /pfad/zu/scans:/data/eingang
    
        environment:
          PUID: 1000
          PGID: 1000
          TZ: Europe/Berlin
          # Hinter einem Proxy: die Adresse der Leute und die des Proxys.
          # NEXPAPER_PUBLIC_URL: https://papier.example.com
          # NEXPAPER_TRUSTED_PROXIES: 172.16.0.0/12
          # Den Einrichtungscode selbst wählen, statt ihn im Log zu suchen.
          # NEXPAPER_SETUP_TOKEN: such-dir-einen-langen-aus
  2. Starten
    Shell
    docker compose up -d
  3. Das erste Konto anlegen

    Öffne auf diesem Rechner http://127.0.0.1:8560. Die Seite „nexpaper einrichten“ fragt nach Name, Passwort und „Einrichtungscode“. Den Code schreibt nexpaper bei jedem Start ins Log, bis es eingerichtet ist:

    Shell
    docker logs nexpaper

    So nimmt niemand eine frische Instanz in Besitz, nur weil er sie zuerst gefunden hat. Wer das erste Konto anlegt, wird Betreiber. Das Passwort braucht mindestens zwölf Zeichen, und gleich danach richtet das Konto seinen zweiten Faktor ein. Danach zeigt nexpaper acht Wiederherstellungscodes, die du gut aufhebst.

nexpaper einrichten
Die Seite „nexpaper einrichten“ mit den Feldern Einrichtungscode, Name und Passwort und dem Knopf „Konto anlegen“.
Die Einrichtung des ersten Kontos.

Warum der Port nur an 127.0.0.1 hängt

Mit 127.0.0.1:8560:8000 erreicht nexpaper nur der Rechner selbst. Papiere sollen nicht ohne https im Netz stehen, denn ohne Verschlüsselung gehen Passwörter und Codes lesbar über die Leitung. Davor gehört deshalb ein Reverse Proxy mit https, der an http://127.0.0.1:8560 weiterleitet. Läuft der Proxy in einem anderen Container, steckst du beide in dasselbe Docker-Netz und leitest an http://nexpaper:8000 weiter.

Ein Server ohne Bildschirm

Wer auf dem Server keinen Browser hat, schreibt für das Heimnetz "8560:8000" und öffnet http://adresse-des-servers:8560 von einem anderen Gerät. Das ist für ein Netz gedacht, dem du traust. Kamera, Push und Passkeys gehen ohne https ohnehin nicht, außer auf dem Rechner selbst.

Gut zu wissenLieber aus den Quellen bauen? Klon das Repository. Dessen docker-compose.yml hat build: . statt image:, erklärt jede Option und startet mit docker compose up -d --build.

Was der Rechner braucht

nexpaper ist für einen Haushalt oder eine kleine Firma gebaut, nicht für ein Rechenzentrum. Einen festen Mindestwert nennt das Projekt nicht; hier steht, was gemessen oder im Code festgelegt ist.

  • Docker mit Compose auf Linux, amd64 oder arm64. Das passt zu einer NAS mit Intel, AMD oder ARM und zu einem Rechner mit 64-Bit-ARM.
  • Eine lokale Platte für den Datenordner. Auf einer SMB- oder NFS-Freigabe sperrt SQLite nicht zuverlässig, und dann kann die Datenbank Daten verlieren. nexpaper warnt davor in den Einstellungen und beim Start im Log.
  • Arbeitsspeicher: Im Leerlauf braucht nexpaper nach einer Messung auf einem Testserver etwa 100 MB, das ist nur ein ungefährer Wert. Das Abbild ist etwa 730 MB groß. Mehr kostet die Texterkennung. Sie liest immer nur ein Dokument auf einmal, und ein Bild braucht beim Entpacken etwa 150 MB (NEXPAPER_DECODE_SLOTS). Wie viel sie in Spitzen braucht, hängt von den Seiten ab und ist nicht neu gemessen. Der Betreiber kann den Speicher je Dokument begrenzen, ab Werk sind es 2.048 MB.
  • Platz: Die Dokumente liegen als ganz normale Dateien. Die Datenbank wächst mit: eine Messung ergab etwa 21 KB je Dokument für Text und Suchindex zusammen, ein Haushalt mit 1.000 Dokumenten im Jahr hat nach zehn Jahren also etwa 210 MB. Eine Grenze für den Platz je Person gibt es nicht.
  • https über einen Reverse Proxy, sobald jemand von außen kommt. Kamera, Push und Passkeys brauchen es auch im Heimnetz.
  • Handys: nexpaper ist eine Web-App und lässt sich aus dem Browser auf den Startbildschirm legen. Eine App aus einem Store gibt es nicht. Auf dem iPhone kommt Push nur in der App auf dem Startbildschirm an, ab iOS 16.4.

Was im Datenordner liegt

Alles liegt in /data, das im Beispiel oben als ./data neben der Compose-Datei steht.

WoWas
nexpaper.dbdie SQLite-Datenbank: Konten, Einstellungen, die Zuordnung, der erkannte Text und der Suchindex
secret.keydas Geheimnis des Servers, mit dem Mail- und KI-Zugänge und Ähnliches versiegelt sind
dokumente/die Dokumente selbst als lesbare Dateien
backups/, logs/, locales/Sicherungen, das Log und weitere Sprachen als JSON-Dateien
cache/, uploads/, exports/Bilder der Seiten (auf eine Größe gestutzt, die du einstellst), Uploads in Arbeit, ZIP-Dateien für den Steuerberater
eingang/der Eingangsordner, wenn er eingeschaltet ist: ein Unterordner je Person

Die Dokumente als ganz normale Dateien

Unter dokumente/ liegt jedes Dokument als Datei in einem Ordner nach Tresor, Jahr und Absender, benannt nach Datum und Art, etwa Zuhause/2026/Stadtwerke Wiesental/2026-03-14 Rechnung.pdf. Das Original bleibt genau so, wie es hereinkam, mit einer Prüfsumme. Daneben liegt die durchsuchbare Fassung mit dem Zusatz (searchable) und jede ältere Fassung mit (version 1). Ändert jemand Absender, Art, Datum oder Tresor, zieht die Datei im Hintergrund mit.

Die Namen der Ordner für Fehlendes sind englisch, auch bei deutscher Oberfläche: ohne Datum undated, ohne Absender no sender, ohne Art Document. Wer nexpaper eines Tages nicht mehr nutzt, hat seine Ordner.

Dokumente auf der NAS, die Datenbank nicht

Die Datenbank gehört auf eine lokale Platte. Die Dokumente selbst dürfen auf einer Netzwerkfreigabe liegen: Dafür hängst du /data/dokumente als eigenes Volume aus der Freigabe ein. nexpaper (PUID) muss dort lesen, schreiben und löschen dürfen. In den Einstellungen sagt die Karte „Speicher“, ob die Datenbank lokal liegt und ob die Dokumente auf einer Freigabe liegen („Das ist in Ordnung“).

Hinter einem Proxy, mit https

Am besten bleibt nexpaper im eigenen Netz, und gehst du unterwegs über ein VPN hinein. Wer es doch aus dem Internet öffnet, geht diese Liste durch.

  1. Erst einrichten, dann freigeben

    Leg das erste Konto aus deinem eigenen Netz an, mit dem Code aus dem Log. Erst danach leitest du einen Port weiter.

  2. https am Proxy, nexpaper nur über ihn

    Lass den Port an 127.0.0.1 oder halte Proxy und nexpaper in einem Docker-Netz ohne veröffentlichten Port. HSTS schickt der Proxy, nicht nexpaper.

  3. Adresse und Proxy nennen

    NEXPAPER_PUBLIC_URL ist die Adresse, unter der man nexpaper erreicht. Daraus entstehen Einladungslinks, die Rückkehr vom Anmeldeanbieter, Passkeys und der Kontakt für Push; die Einstellung „Öffentliche Adresse“ in der Oberfläche gewinnt, wenn sie gesetzt ist. NEXPAPER_TRUSTED_PROXIES nennt die Adresse oder das Netz des Proxys. Ohne diese Angabe scheint jede Anmeldung vom Proxy zu kommen, und der Schutz vor Raten hält alle für eine Person.

  4. Cookies nur über https

    NEXPAPER_COOKIE_SECURE steht ab Werk auf auto und erkennt https auch am Kopf X-Forwarded-Proto des Proxys. on passt, wenn nexpaper ausschließlich über https erreicht wird; über http kann sich dann niemand mehr anmelden.

  5. Der zweite Faktor bleibt Pflicht

    Ab Werk richtet jedes Konto mit Passwort direkt nach der Anmeldung einen ein, einen Code aus einer Authenticator-App; einen Passkey kann es danach dazulegen. Der Betreiber könnte das abschalten. Für einen Server im Internet lass es an.

  6. Zu lassen, was du nicht brauchst

    API-Schlüssel und die KI sind ab Werk aus. Schalte nur ein, was du wirklich nutzt.

  7. Betreiber-Einstellungen zu Hause lassen

    Mit NEXPAPER_OPERATOR_NETWORKS: "192.168.0.0/16" nimmt nexpaper Änderungen an den Einstellungen des Betreibers nur aus diesem Netz an, hinter einem Proxy zusammen mit NEXPAPER_TRUSTED_PROXIES.

  8. Eine Fassung festhalten

    Nimm statt latest eine feste Fassung wie ghcr.io/derkezorm/nexpaper:1.1.0, aktualisiere mit Absicht und sichere vorher. Es gibt auch den Tag 1.1, der bei Fehlerkorrekturen mitwandert.

nexpaper prüft sich selbst

Unter „Einstellungen“, „Anmeldung“ steht ganz oben die Karte „Bereit fürs Internet?“. Jedes Mal, wenn du die Seite öffnest, prüft nexpaper acht Punkte selbst und sagt bei jedem, was zu tun ist, wenn er nicht erfüllt ist: die Adresse mit https, den zweiten Faktor für alle und für dich selbst, den Schutz vor Raten, Sitzungen und Cookies, den Proxy, die Server-Geheimnisse und die Sicherung. Mehr dazu auf der Seite Sicherheit.

Auf Unraid und TrueNAS

Für Unraid gibt es eine Vorlage. Sie braucht dieselben Angaben wie die Compose-Datei: den Port (im Container 8000, im Beispiel 8560), einen Ordner für /data und die Besitzer der Dateien. PUID und PGID sind unter Unraid üblicherweise 99 und 100. Den Einrichtungscode findest du im Log des Containers.

Veröffentlicht die Vorlage den Port im ganzen Heimnetz, wie es unter Unraid üblich ist, gilt dasselbe wie bei „8560:8000“ oben: nur in einem Netz, dem du traust, und für den Weg nach draußen mit einem Proxy davor.

Für TrueNAS ist ein Eintrag im Katalog eingereicht. Ob und wann er dort erscheint, entscheiden die Betreuer des Katalogs; bis dahin läuft nexpaper dort wie überall als Container aus dem Abbild.

Gut zu wissenTrag deine Zeitzone ein, etwa Europe/Berlin. TZ bestimmt die Zeit im Log des Containers. Die Zeitzonen der Leute kommen aus ihren Browsern.

Was du sichern musst

Zwei Dinge, die zusammengehören: die Sicherung von nexpaper und der Ordner mit den Dokumenten. Eins allein reicht nicht.

Die Sicherung, die nexpaper selbst macht

Ab Werk legt nexpaper jede Nacht zwischen drei und sechs Uhr (nach der Zeit des Containers) eine Sicherung an und behält die letzten sieben. Unter „Einstellungen“, „Sicherung“ stellst du „Wöchentlich“ oder „Aus“ ein und machst mit „Jetzt sichern“ eine von Hand. Eine Sicherung ist eine ZIP-Datei mit der Datenbank, den Einstellungen und secret.key, im laufenden Betrieb sauber kopiert. Den Suchindex enthält sie nicht, der wird nach dem Zurückspielen neu gebaut.

Die Sicherungen liegen in /data/backups, also auf derselben Platte. Lade ab und zu eine herunter und leg sie woanders hin.

Die Dokumente, die nicht darin sind

Die Dokumente selbst sind nicht in der Sicherung. Sie liegen als normale Dateien in /data/dokumente und gehören in die Sicherung, die dein Server ohnehin macht, etwa Hyper Backup, restic oder Snapshots. Wer nur die ZIP-Datei von nexpaper sichert, hat nach einem Plattenschaden eine Zuordnung ohne Dokumente.

Einmal in der Woche vergleicht nexpaper alle Dateien mit ihren Prüfsummen und warnt, wenn eine fehlt oder sich verändert hat. „Dateien prüfen“ steht auf derselben Seite.

Prüfen, zurückspielen, umziehen

„Prüfen“ macht einen Probelauf an einer Kopie und sagt, ob die Sicherung heil ist, wie viele Dokumente sie kennt, welche Dateien auf der Platte fehlen und was ein Zurückspielen ändern würde. „Wiederherstellen“ sichert zuerst den jetzigen Stand und startet nexpaper danach neu. Eine Sicherung aus einer neueren Fassung weist nexpaper ab.

Für einen Umzug lädst du eine Sicherung herunter, lädst sie auf dem neuen Server hoch, prüfst und stellst sie wieder her, und kopierst den Dokumentenordner mit.

Gut zu wissenDie ZIP-Datei ist nicht verschlüsselt. Mit secret.key darin lassen sich die Zugänge für Mail und KI und die Adressen offener Links lesen. Heb heruntergeladene Sicherungen deshalb auf wie ein Passwort. Die Schritte stehen in der Anleitung unter Betrieb.

Updaten

Shell
docker compose pull
docker compose up -d

Beim Start ergänzt nexpaper, was der Datenbank fehlt, Schritt für Schritt. Bevor sich ihr Aufbau ändert, legt es selbst eine Sicherung an, in der Liste als „vor einer Änderung“. Der Weg zurück führt über „Einstellungen“, „Sicherung“.

nexpaper aktualisiert sich nie selbst. Unter „Über nexpaper“ steht, wenn eine neue Fassung erschienen ist. Dafür fragt nexpaper bei GitHub nach, wenn jemand diese Seite öffnet und die letzte Antwort älter als einen Tag ist. Das ist ab Werk an, nur der Betreiber schaltet „Einmal am Tag nachsehen“ dort ab.

Nach einem Update zeigt nexpaper jedem Konto einen Hinweis mit dem Knopf „Was ist neu?“.

Alle Umgebungsvariablen

Hier steht nur, was vor dem ersten Start feststehen muss. Alles andere stellt der Betreiber in der Oberfläche ein.

VariableAb WerkWofür
NEXPAPER_DATA_DIR/dataDatenbank, Dokumente, Log, Sicherungen, Geheimnisse und Sprachen
NEXPAPER_LOCALES_DIR<data>/localesZusätzliche Sprachen, je eine JSON-Datei
NEXPAPER_SECRET_KEYbeim ersten Start erzeugtSchützt Geheimnisse auf dem Server; gesetzt gewinnt er vor secret.key
NEXPAPER_PUBLIC_URLaus der AnfrageDie Adresse, unter der man nexpaper erreicht, für Einladungslinks, Anmeldeanbieter, Passkeys und Push; die Einstellung in der Oberfläche gewinnt
NEXPAPER_TRUSTED_PROXIESkeineAdressen oder Netze von Proxys, deren X-Forwarded-For geglaubt wird, durch Komma getrennt
NEXPAPER_SETUP_TOKENbei jedem Start erzeugt, bis eingerichtetDer Code für das erste Konto
NEXPAPER_OPERATOR_NETWORKSkeineNetze, aus denen die Einstellungen des Betreibers geändert werden dürfen
NEXPAPER_SESSION_DAYS30Nach so vielen Tagen ohne Nutzung endet eine Anmeldung mit „angemeldet bleiben“
NEXPAPER_COOKIE_SECUREautoon, off oder auto (aus der Anfrage oder X-Forwarded-Proto)
NEXPAPER_COOKIE_SUFFIXkeinerEin Anhang an die Namen der Cookies, wenn zwei nexpaper auf einem Rechner laufen
NEXPAPER_LOG_LEVELEinstellungquiet, normal, detailed oder trace; überstimmt die Einstellung
NEXPAPER_DECODE_SLOTS1Wie viele Bilder zugleich entpackt werden, je Bild etwa 150 MB
NEXPAPER_UPDATE_URLGitHubWo nexpaper nach der neuesten Fassung fragt
NEXPAPER_ARGON2_TIME, NEXPAPER_ARGON2_MEMORY_KIB, NEXPAPER_ARGON2_PARALLELISM3, 65536, 2Aufwand für das Speichern von Passwörtern; nur die Tests senken ihn
NEXPAPER_FRONTEND_DIST/app/staticWo die fertige Oberfläche liegt; das Abbild setzt es
NEXPAPER_DISABLE_BACKGROUNDfalseSchaltet die Arbeit im Hintergrund ab; nur für Tests
NEXPAPER_PORT8000Der Port im Container, nur nötig, wenn der Container im Netzwerkmodus host läuft
PUID, PGID1000Wem die Dateien im Datenordner gehören; 0 ist nicht erlaubt, nexpaper läuft nie als root
TZim Beispiel Europe/BerlinDie Zeitzone des Containers, für das Log; die Zeitzonen der Leute kommen aus ihren Browsern