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.
- Die Compose-Datei anlegen
Leg einen Ordner an, etwa
nexdiary, und darin diese Datei.docker-compose.ymlservices: 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 - StartenShell
docker compose up -d - 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:Shelldocker logs nexdiarySo 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.
- 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.
- https am Proxy, nexdiary nur über ihn
Lass den Port an
127.0.0.1oder halte Proxy und nexdiary in einem Docker-Netz ohne veröffentlichten Port. HSTS schickt der Proxy, nicht nexdiary. - Adresse und Proxy nennen
NEXDIARY_PUBLIC_URList 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_PROXIESnennt 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. - Cookies nur über https
NEXDIARY_COOKIE_SECUREsteht ab Werk aufautound erkennt https auch am KopfX-Forwarded-Protodes Proxys.onpasst, wenn nexdiary ausschließlich über https erreicht wird; über http kann sich dann niemand mehr anmelden. - 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.
- 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.
- 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 mitNEXDIARY_TRUSTED_PROXIES. - Eine Fassung festhalten
Nimm statt
latesteine feste Fassung wieghcr.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“
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
docker compose pull
docker compose up -dBeim 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.
docker exec -it -u nexdiary nexdiary python -m app.reset_link dein-nameGut 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.
| Variable | Ab Werk | Wofür |
|---|---|---|
NEXDIARY_DATA_DIR | /data | Datenbank, Log, Sicherungen, Schlüssel und Sprachen |
NEXDIARY_MEDIA_DIR | <data>/media | Die Fotos |
NEXDIARY_LOCALES_DIR | <data>/locales | Zusätzliche Sprachen, je eine JSON-Datei |
NEXDIARY_MASTER_KEY_FILE | <data>/keys/master.key | Wo der Hauptschlüssel liegt; außerhalb der Sicherungen halten |
NEXDIARY_SECRET_KEY | beim ersten Start erzeugt | Schützt Geheimnisse auf dem Server; gesetzt gewinnt er vor secret.key |
NEXDIARY_PUBLIC_URL | aus der Anfrage | Die Adresse der Familie, für Einladungslinks, Anmeldeanbieter, Passkeys und Push; die Einstellung in der Oberfläche gewinnt |
NEXDIARY_TRUSTED_PROXIES | keine | Adressen oder Netze von Proxys, deren X-Forwarded-For geglaubt wird, durch Komma getrennt |
NEXDIARY_SETUP_TOKEN | bei jedem Start erzeugt, bis eingerichtet | Der Code für das erste Konto |
NEXDIARY_OPERATOR_NETWORKS | keine | Netze, aus denen die Einstellungen des Betreibers geändert werden dürfen |
NEXDIARY_SESSION_DAYS | 30 | Nach so vielen Tagen ohne Nutzung endet eine Anmeldung mit „angemeldet bleiben“ |
NEXDIARY_COOKIE_SECURE | auto | on, off oder auto (aus der Anfrage oder X-Forwarded-Proto) |
NEXDIARY_COOKIE_SUFFIX | keiner | Ein Anhang an die Namen der Cookies, wenn zwei nexdiary auf einem Rechner laufen |
NEXDIARY_LOG_LEVEL | Einstellung | quiet, normal, detailed oder trace; überstimmt die Einstellung |
NEXDIARY_API_DOCS | false | Liefert /api/docs und /api/openapi.json aus |
NEXDIARY_DECODE_SLOTS | 1 | Wie viele Fotos zugleich entpackt werden, 1 bis 16, je Foto etwa 150 MB |
NEXDIARY_UPDATE_URL | GitHub | Wo nexdiary nach der neuesten Fassung fragt |
NEXDIARY_ARGON2_TIME, NEXDIARY_ARGON2_MEMORY_KIB, NEXDIARY_ARGON2_PARALLELISM | 3, 65536, 2 | Aufwand für das Speichern von Passwörtern; nur die Tests senken ihn |
NEXDIARY_FRONTEND_DIST | /app/static | Wo die fertige Oberfläche liegt; das Abbild setzt es |
NEXDIARY_DISABLE_BACKGROUND | false | Schaltet die Arbeit im Hintergrund ab, etwa Erinnerungen, Sicherungen und Zeitkapseln; nur für Tests |
NEXDIARY_PORT | 8000 | Der Port im Container, nur nötig, wenn der Container im Netzwerkmodus host läuft |
PUID, PGID | 1000 | Wem die Dateien im Datenordner gehören; 0 ist nicht erlaubt, nexdiary läuft nie als root |
TZ | im Beispiel Europe/Berlin | Die Zeitzone des Containers, für das Log und den Tag der Familienfrage; alles andere richtet sich nach der Zeitzone jeder Person |