Zum Inhalt
NEXDIARY

Selbst hosten

Euer Tagebuch, auf eurem eigenen Server.

nexdiary 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. Ein Konto bei jemand anderem brauchst du nicht, und es gibt auch keins.

Starten in drei Schritten

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

  1. Die Compose-Datei anlegen

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

    docker-compose.yml
    services:
      nexdiary:
        image: ghcr.io/derkezorm/nexdiary:latest
        container_name: nexdiary
        restart: unless-stopped
    
        ports:
          # Nur dieser Rechner erreicht nexdiary (127.0.0.1). Davor gehört ein
          # Reverse Proxy mit https, der an http://127.0.0.1:8550 weiterleitet.
          # Direkt im Heimnetz: "8550:8000" schreiben, aber nur in einem Netz,
          # dem du traust. Ohne https gehen Passwörter im Klartext hindurch.
          - "127.0.0.1:8550:8000"
    
        # Keine Rechte, die er nicht braucht: Der Start setzt nur die Besitzer
        # von /data und wechselt dann von root zum Benutzer nexdiary.
        security_opt:
          - no-new-privileges:true
        cap_drop:
          - ALL
        cap_add:
          - CHOWN
          - DAC_READ_SEARCH
          - SETUID
          - SETGID
    
        volumes:
          # Eine lokale Platte, nie eine SMB- oder NFS-Freigabe.
          - ./data:/data
    
        environment:
          PUID: 1000
          PGID: 1000
          TZ: Europe/Berlin
          # Hinter einem Proxy: die Adresse der Leute und die des Proxys.
          # NEXDIARY_PUBLIC_URL: https://tagebuch.example.com
          # NEXDIARY_TRUSTED_PROXIES: 172.16.0.0/12
          # Den Einrichtungscode selbst wählen, statt ihn im Log zu suchen.
          # NEXDIARY_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:8550. Die Seite „nexdiary einrichten“ fragt nach Name, Passwort und Einrichtungscode. Den Code schreibt nexdiary bei jedem Start ins Log, bis es eingerichtet ist:

    Shell
    docker logs nexdiary

    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 nexdiary acht Wiederherstellungscodes, die du gut aufhebst.

Warum der Port nur an 127.0.0.1 hängt

Mit 127.0.0.1:8550:8000 erreicht nexdiary nur der Rechner selbst. Ein Tagebuch soll 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:8550 weiterleitet. Läuft der Proxy in einem anderen Container, steckst du beide in dasselbe Docker-Netz und leitest an http://nexdiary:8000 weiter.

Ein Server ohne Bildschirm

Wer auf dem Server keinen Browser hat, schreibt für das Heimnetz "8550:8000" und öffnet http://adresse-des-servers:8550 von einem anderen Gerät. Das ist für ein Netz gedacht, dem du traust. Erinnerungen per 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

nexdiary ist für einen Haushalt gebaut, nicht für ein Rechenzentrum. Einen gemessenen Mindestwert für den Arbeitsspeicher gibt es nicht; was viel braucht, steht hier mit Zahlen aus dem Code.

  • 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 kaputtgehen.
  • Arbeitsspeicher: Eine Passwortprüfung belegt bis zu 64 MiB, höchstens vier laufen zugleich. Ein Foto braucht beim Entpacken etwa 150 MB, und ab Werk wird immer nur eines entpackt (NEXDIARY_DECODE_SLOTS). Ein Jahr als Buch setzt der Server eines nach dem anderen.
  • Platz: Fotos speichert nexdiary neu gezeichnet als WebP, höchstens 2560 Pixel an der langen Seite, dazu eine kleine Vorschau. Jede Person darf ab Werk 5 GB belegen; das stellst du unter Einstellungen, Konten, „Speicher je Person“ ein, 0 heißt unbegrenzt.
  • https über einen Reverse Proxy, sobald jemand von außen kommt. Push und Passkeys brauchen es auch im Heimnetz.
  • Handys: nexdiary 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.

Hinter einem Proxy, mit https

Viele möchten nexdiary auch von unterwegs öffnen, und dafür ist es gemacht. Bevor du es nach draußen öffnest, geh 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, nexdiary nur über ihn

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

  3. Adresse und Proxy nennen

    NEXDIARY_PUBLIC_URL ist die Adresse, unter der die Familie nexdiary 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. NEXDIARY_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

    NEXDIARY_COOKIE_SECURE steht ab Werk auf auto und erkennt https auch am Kopf X-Forwarded-Proto des Proxys. on passt, wenn nexdiary 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

    KI, Immich und API-Token sind ab Werk aus, das automatische Ausformulieren am Morgen auch. Schalte nur ein, was die Familie wirklich nutzt.

  7. Betreiber-Einstellungen zu Hause lassen

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

  8. Eine Fassung festhalten

    Nimm statt latest eine feste Fassung wie ghcr.io/derkezorm/nexdiary:0.5.0, aktualisiere mit Absicht und sichere vorher.

nexdiary 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 nexdiary acht Punkte selbst und sagt bei jedem, was zu tun ist, wenn er nicht erfüllt ist.

  • „Öffentliche Adresse mit https“ und „Sitzungen und Cookies“
  • „Zweiter Faktor für alle“ und „Dein eigenes Konto“, also ob du selbst einen hast
  • „Schutz vor Raten“, den nexdiary an einer Kopie ausprobiert, und „Hinter dem Proxy“, ob die echten Adressen der Besucher ankommen
  • „Einträge verschlüsselt“ und „Hauptschlüssel gesichert“
Einstellungen
Einstellungen, Anmeldung: die Karte „Bereit fürs Internet?“ mit dem Zeichen „Alles erfüllt“ und grünen Haken bei öffentlicher Adresse mit https, zweitem Faktor für alle, eigenem Konto, Schutz vor Raten, verschlüsselten Einträgen, Sitzungen und Cookies und dem Proxy
Acht Punkte, die nexdiary bei jedem Öffnen selbst prüft.

Auf Unraid

nexdiary steht im Katalog von Unraid, den Community Apps. Such dort nach „nexdiary“ und installiere es. Die Vorlage legt den Datenordner nach /mnt/user/appdata/nexdiary, nimmt Port 8550 und setzt PUID 99 und PGID 100, die üblichen Werte von Unraid. Den Einrichtungscode findest du im Log: Klick auf das Symbol von nexdiary, dann auf „Logs“.

Anders als die Compose-Datei oben veröffentlicht die Vorlage den Port im ganzen Heimnetz, ohne https. Für den Weg nach draußen gehört auch hier ein Proxy davor. Adresse, Proxy und einen eigenen Einrichtungscode trägst du in der Vorlage unter „Public URL“, „Trusted Proxies“ und „Setup Code“ ein.

Gut zu wissenTrag bei „Time Zone“ deine Zeitzone ein, etwa Europe/Berlin. Leer heißt UTC, und nach der Zeitzone des Servers richtet sich der Tag der Familienfrage: Mit UTC wechselt sie im Sommer erst um zwei Uhr nachts.

Was du sichern musst

Zwei Dinge, getrennt voneinander: den Datenordner mit seinen Sicherungen und den Hauptschlüssel. Ohne den Hauptschlüssel lässt sich keine Sicherung lesen, auch nicht von dir.

Der Datenordner

Alles liegt in /data: die Datenbank nexdiary.db, der Ordner media/ mit den Fotos, der Hauptschlüssel keys/master.key, das Geheimnis des Servers secret.key, dazu backups/, logs/ und locales/ für zusätzliche Sprachen. Was die Familie schreibt, liegt verschlüsselt in der Datenbank und im Fotoordner, mit einem eigenen Schlüssel für jede Person. Diese Schlüssel sind mit dem Hauptschlüssel verpackt.

Der Hauptschlüssel

Unter Einstellungen, Sicherung, Karte „Verschlüsselung“ lädst du mit „Hauptschlüssel sichern“ die Datei nexdiary-master.key herunter. nexdiary fragt dafür dein Passwort und deinen zweiten Faktor. Bewahr sie getrennt von den Sicherungen auf, so sorgfältig wie ein Passwort. Geht sie verloren, sind alle Sicherungen nur noch Zeichensalat, und fehlt die Datei auf dem Server, gilt das auch für die laufende Datenbank.

Sicherungen, die nexdiary selbst macht

Ab Werk legt nexdiary jede Nacht zwischen drei und sechs Uhr eine Sicherung an und behält die letzten sieben. Unter Einstellungen, Sicherung stellst du „jede Woche“ oder „aus“ ein und machst mit „Jetzt sichern“ eine von Hand. Eine Sicherung ist eine ZIP-Datei mit der Datenbank, die nexdiary im laufenden Betrieb sauber kopiert, mit den Fotos und mit secret.key. Der Hauptschlüssel ist nie dabei.

Die Sicherungen liegen in /data/backups, also auf derselben Platte. Kopier ab und zu eine woandershin.

Prüfen, zurückspielen, umziehen

„Prüfen“ öffnet eine Sicherung und sagt, ob sie vollständig ist und was ein Zurückspielen hinzufügen und entfernen würde. „Wiederherstellen“ sichert zuerst den jetzigen Stand und startet nexdiary danach neu. Eine Sicherung von einer neueren Fassung oder von einem Server mit anderem Hauptschlüssel weist nexdiary ab und sagt warum.

Für einen Umzug lädst du eine Sicherung und den Hauptschlüssel herunter, legst den Schlüssel auf dem neuen Server als keys/master.key in den Datenordner, bevor nexdiary dort zum ersten Mal startet, richtest es ein, lädst die Sicherung mit „Sicherung hochladen“ hoch, prüfst sie und stellst sie wieder her.

Gut zu wissenDie Tagebücher in einer Sicherung sind verschlüsselt, die ZIP-Datei selbst ist es nicht. Darin stehen lesbar die Kontonamen, Mailadressen, Zeitpunkte, wer wem welchen Tag geteilt hat, und secret.key, mit dem sich das Passwort des Mailservers und der Schlüssel des KI-Dienstes öffnen lassen. Ältere Sicherungen enthalten auch die Schlüssel inzwischen gelöschter Konten. Heb heruntergeladene Sicherungen deshalb auf wie ein Passwort.

Updaten

Shell
docker compose pull
docker compose up -d

Beim Start ergänzt nexdiary, 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. Eine Datenbank aus einer neueren Fassung öffnet eine ältere nexdiary nicht; der Start sagt es dann.

nexdiary aktualisiert sich nie selbst. Unter „Über nexdiary“ steht, wenn eine neue Fassung erschienen ist. Dafür fragt nexdiary bei GitHub nach, sobald 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 mit Neuem zeigt nexdiary jedem Konto einmal ein Fenster „Neu in nexdiary“ mit dem, was dazugekommen ist. Für reine Fehlerkorrekturen gibt es keins.

Wenn jemand sein Passwort vergessen hat

Niemand setzt das Passwort für jemand anderen, auch der Betreiber nicht. Wer seines vergessen hat, bekommt einen Link und wählt damit selbst ein neues. Der Link gilt einmal und 24 Stunden.

Für die Familie

Der Betreiber schickt den Link unter Einstellungen, Konten mit „Link zum Zurücksetzen schicken“. Mit eingerichtetem Mailserver geht er per Mail hinaus, wenn das Konto eine Mailadresse hat; sonst zeigt nexdiary ihn einmal zum Weitergeben. Sind Mailserver, öffentliche Adresse und Anmeldung mit Passwort eingerichtet, steht auf der Anmeldeseite außerdem „Passwort vergessen?“.

Der zweite Faktor bleibt, wie er war, und das Tagebuch auch. Es ist nicht mit dem Passwort verschlüsselt, ein neues Passwort verliert also nichts.

Für den Betreiber selbst

Das erste Konto hat keine Mailadresse, und es gibt niemanden, der ihm einen Link schickt. Darum macht sich der Betreiber den Link auf dem Server, mit dem Befehl unten. Ohne Namen listet er die Konten. Er druckt den Link, oder einen Pfad, wenn keine öffentliche Adresse gesetzt ist; den öffnest du unter der Adresse, unter der du nexdiary erreichst. Der Link hebt auch die Wartezeit nach zu vielen Fehlversuchen auf.

Shell
docker exec -it -u nexdiary nexdiary python -m app.reset_link dein-name

Gut zu wissenAuf Unraid öffnest du stattdessen die Konsole des Containers und gibst gosu nexdiary python -m app.reset_link dein-name ein. Als root weigert sich der Befehl, denn Dateien, die root in /data anlegt, könnte nexdiary danach nicht mehr öffnen. Deshalb das -u nexdiary und das gosu.

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
NEXDIARY_DATA_DIR/dataDatenbank, Log, Sicherungen, Schlüssel und Sprachen
NEXDIARY_MEDIA_DIR<data>/mediaDie Fotos
NEXDIARY_LOCALES_DIR<data>/localesZusätzliche Sprachen, je eine JSON-Datei
NEXDIARY_MASTER_KEY_FILE<data>/keys/master.keyWo der Hauptschlüssel liegt; außerhalb der Sicherungen halten
NEXDIARY_SECRET_KEYbeim ersten Start erzeugtSchützt Geheimnisse auf dem Server; gesetzt gewinnt er vor secret.key
NEXDIARY_PUBLIC_URLaus der AnfrageDie Adresse der Familie, für Einladungslinks, Anmeldeanbieter, Passkeys und Push; die Einstellung in der Oberfläche gewinnt
NEXDIARY_TRUSTED_PROXIESkeineAdressen oder Netze von Proxys, deren X-Forwarded-For geglaubt wird, durch Komma getrennt
NEXDIARY_SETUP_TOKENbei jedem Start erzeugt, bis eingerichtetDer Code für das erste Konto
NEXDIARY_OPERATOR_NETWORKSkeineNetze, aus denen die Einstellungen des Betreibers geändert werden dürfen
NEXDIARY_SESSION_DAYS30Nach so vielen Tagen ohne Nutzung endet eine Anmeldung mit „angemeldet bleiben“
NEXDIARY_COOKIE_SECUREautoon, off oder auto (aus der Anfrage oder X-Forwarded-Proto)
NEXDIARY_COOKIE_SUFFIXkeinerEin Anhang an die Namen der Cookies, wenn zwei nexdiary auf einem Rechner laufen
NEXDIARY_LOG_LEVELEinstellungquiet, normal, detailed oder trace; überstimmt die Einstellung
NEXDIARY_API_DOCSfalseLiefert /api/docs und /api/openapi.json aus
NEXDIARY_DECODE_SLOTS1Wie viele Fotos zugleich entpackt werden, 1 bis 16, je Foto etwa 150 MB
NEXDIARY_UPDATE_URLGitHubWo nexdiary nach der neuesten Fassung fragt
NEXDIARY_ARGON2_TIME, NEXDIARY_ARGON2_MEMORY_KIB, NEXDIARY_ARGON2_PARALLELISM3, 65536, 2Aufwand für das Speichern von Passwörtern; nur die Tests senken ihn
NEXDIARY_FRONTEND_DIST/app/staticWo die fertige Oberfläche liegt; das Abbild setzt es
NEXDIARY_DISABLE_BACKGROUNDfalseSchaltet die Arbeit im Hintergrund ab, etwa Erinnerungen, Sicherungen und Zeitkapseln; nur für Tests
NEXDIARY_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, nexdiary läuft nie als root
TZim Beispiel Europe/BerlinDie Zeitzone des Containers, für das Log und den Tag der Familienfrage; alles andere richtet sich nach der Zeitzone jeder Person