TriliumNext Notes mit Docker installieren: Hierarchisches Notizsystem für große persönliche Wissensdatenbanken
TriliumNext ist mit über 36.000 Stars das mächtigste hierarchische Notizsystem für komplexe Wissensdatenbanken – skriptierbar per JavaScript, mit REST-API und nativer Synchronisation. Diese Anleitung zeigt die Docker-Installation in unter 15 Minuten.

TriliumNext Notes ist die aktiv gepflegte Community-Fortsetzung des ursprünglichen Trilium-Projekts und mit über 36.400 GitHub-Stars das mächtigste Open-Source-Werkzeug für hierarchische, persönliche Wissensdatenbanken. Notizen werden als beliebig tiefer Baum organisiert, unterstützen Rich-Text und Code-Editing, sind versioniert, optional Ende-zu-Ende-verschlüsselt und per JavaScript-API skriptierbar. Als Docker-Server stellt TriliumNext ein Web-UI bereit, das im Browser erreichbar ist – kein Desktop-Client nötig. Diese Anleitung richtet sich an Entwickler, Wissensarbeiter und Selfhoster, die eine strukturierte, langfristig wartbare Wissensdatenbank auf eigenem Server oder NAS betreiben wollen.
Voraussetzungen
- Docker Engine >= 20.10 und Docker Compose Plugin >= 2.0 (
docker composeals Subcommand) auf einem Linux-Host, einer VM oder einem NAS mit Docker-Unterstützung. Wie du Docker und Compose auf Ubuntu/Debian einrichtest, erklärt die Grundanleitung Docker und Docker Compose auf Linux installieren. - Architektur: x86_64, ARM64 oder ARMv7 – das Multi-Arch-Image unterstützt alle drei Plattformen, also auch Raspberry Pi und ARM-NAS-Systeme.
- RAM: Mindestens 512 MB; für große Wissensdatenbanken mit vielen Anhängen empfiehlt sich 1 GB oder mehr (TriliumNext ist Node.js-basiert).
- Persistenter Speicher: Ein lokales Verzeichnis für
./trilium-data; der Platzbedarf wächst mit der Datenbankgröße und Anhängen. - Netzwerk: Port 8080 auf dem Host erreichbar (oder ein eigener Host-Port per
.env). - Optional für HTTPS: Einen vorgelagerten Reverse Proxy (Caddy, nginx, Traefik). Direkte Internet-Exposition ohne TLS ist ein Sicherheitsrisiko – Trilium bietet kein natives HTTPS und kein Rate-Limiting. Einen schnellen Einstieg bietet Caddy als Reverse Proxy mit automatischem HTTPS.
Schritt 1: Projektordner anlegen
Alle projektbezogenen Dateien – compose.yaml, .env und das Datenverzeichnis – landen in einem gemeinsamen Ordner. Wähle einen Ort, der auf persistentem Speicher liegt.
mkdir -p /opt/trilium
cd /opt/trilium
mkdir -p ./trilium-dataDas Datenverzeichnis muss vor dem ersten Start vorhanden sein, da Docker es sonst als Root-Verzeichnis mit falschen Berechtigungen anlegt. Wenn du UID/GID-Anpassung via USER_UID/USER_GID nutzt, stelle sicher, dass der Ordner dem entsprechenden Host-User gehört:
# Nur nötig, wenn USER_UID/USER_GID in der .env gesetzt werden
chown 1000:1000 ./trilium-dataVerifizieren: Der Ordner /opt/trilium/trilium-data muss existieren.
ls -la /opt/trilium/Erwartete Ausgabe: Verzeichnis trilium-data ist sichtbar.
Schritt 2: .env-Datei anlegen
Die .env-Datei entkoppelt konfigurierbare Werte von der compose.yaml und macht Upgrades auf eine neue Version zu einem einzeiligen Eingriff.
# /opt/trilium/.env
# Versions-Tag explizit angeben – NIEMALS "latest" verwenden.
# Ein unbeabsichtigtes Minor-Upgrade kann laufende Sync-Setups
# zwischen Desktop-Client und Server-Instanz beschädigen.
TRILIUM_VERSION=v0.103.0
# Bind-Mount-Pfad auf dem Host (relativ zum compose.yaml-Verzeichnis)
TRILIUM_DATA_DIR=./trilium-data
# Host-Port: 8080 für lokalen Zugriff; anpassen falls belegt
HOST_PORT=8080Verifizieren:
cat /opt/trilium/.envAlle drei Variablen müssen ausgegeben werden.
Schritt 3: compose.yaml anlegen
Lege die folgende Datei unter /opt/trilium/compose.yaml ab. Die Zeitzone wird über Volume-Mounts vom Host eingebunden – das ist die empfohlene Methode in Compose.
# TriliumNext Trilium – docker compose Konfiguration
# Aktives Image: triliumnext/trilium (Docker Hub)
# NICHT mehr: ghcr.io/triliumnext/notes (archiviert, letztes Release v0.95.0)
services:
trilium:
# Versions-Tag aus .env; Fallback auf v0.103.0
image: triliumnext/trilium:${TRILIUM_VERSION:-v0.103.0}
container_name: trilium
restart: unless-stopped
environment:
- TRILIUM_DATA_DIR=/home/node/trilium-data
# Optional: Datei-Eigentümerschaft auf Host-User anpassen
# - USER_UID=1000
# - USER_GID=1000
ports:
# Für ausschließlich lokalen Zugriff (empfohlen ohne Reverse Proxy):
# - "127.0.0.1:${HOST_PORT:-8080}:8080"
# Für Netzwerkzugriff (z. B. hinter Reverse Proxy):
- "${HOST_PORT:-8080}:8080"
volumes:
# Persistente Daten: SQLite-DB, Anhänge, Konfiguration
- ${TRILIUM_DATA_DIR:-./trilium-data}:/home/node/trilium-data
# Zeitzone vom Host einbinden (read-only)
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:roEin wichtiger Hinweis zum Image: Viele ältere Anleitungen und die offizielle Dokumentation unter triliumnext.github.io/Docs verweisen noch auf triliumnext/notes oder ghcr.io/triliumnext/notes. Dieses Image stammt aus dem archivierten Repository und ist bei Version 0.95.0 eingefroren. Für alle Neuinstallationen gilt: triliumnext/trilium von Docker Hub verwenden.
Verifizieren: Syntaxprüfung der compose.yaml:
docker compose -f /opt/trilium/compose.yaml configErwartete Ausgabe: Die aufgelöste Konfiguration ohne Fehlermeldung. Variablen aus .env müssen korrekt eingesetzt sein (z. B. image: triliumnext/trilium:v0.103.0).
Schritt 4: Container starten
Wechsle ins Projektverzeichnis und starte den Stack:
cd /opt/trilium
docker compose pull
docker compose up -dDas Image wird beim ersten Start von Docker Hub heruntergeladen (ca. 200–300 MB je nach Architektur). Der Pull-Schritt vor dem Start stellt sicher, dass stets der korrekte Tag gezogen wird.
Verifizieren – Containerstatus:
docker compose psErwartete Ausgabe: Spalte STATUS zeigt Up (z. B. Up 30 seconds). Kein Restarting oder Exited.
docker compose logs --tail=30Erwartete Ausgabe: Keine Fehler zu Image, Port oder Volume. TriliumNext protokolliert beim Start typischerweise Zeilen wie Listening on port 8080.
Verifizieren – HTTP-Erreichbarkeit:
curl -I http://localhost:8080Erwartete Ausgabe: HTTP/1.1 200 OK oder eine 302-Weiterleitung – in beiden Fällen antwortet Trilium korrekt.
Schritt 5: Erst-Einrichtung im Browser
Öffne http://localhost:8080 (oder http://SERVER-IP:8080) im Browser. Beim allerersten Start erscheint der Setup-Wizard mit drei Optionen:
- Neue Datenbank anlegen: Standardfall für eine frische Installation. Du vergibst ein Passwort und entscheidest, ob du die optionale Ende-zu-Ende-Verschlüsselung der Datenbank aktivieren möchtest.
- Synchronisation mit bestehender Instanz: Für den Fall, dass du bereits eine andere Trilium-Instanz (z. B. einen Desktop-Client) betreibst und die Daten synchronisieren willst.
- Backup wiederherstellen: Zum Einlesen einer exportierten Datenbank.
Zum Thema Verschlüsselung ein wichtiger Hinweis: Die optionale Datenbankverschlüsselung ist komfortabel, aber das Passwort wird nicht serverseitig gespeichert. Ein verlorenes Passwort bedeutet unwiederbringlichen Datenverlust. Aktiviere die Verschlüsselung nur, wenn du das Passwort sicher in einem Passwortmanager verwahren kannst.
Verifizieren: Nach dem Durchlaufen des Wizards solltest du das Trilium-Hauptinterface mit dem Notizbaummenü auf der linken Seite sehen. Lege eine Testnotiz an und prüfe, ob sie nach einem Browser-Reload noch vorhanden ist.
Schritt 6: HTTPS mit Reverse Proxy (empfohlen)
Trilium bietet kein natives HTTPS. Für den Zugriff außerhalb des lokalen Netzwerks oder über das Internet ist ein vorgelagerter Reverse Proxy mit TLS zwingend empfohlen. Außerdem ist bekannt, dass UFW (Uncomplicated Firewall) in Kombination mit Standard-Docker-Installationen nicht zuverlässig zur Portabsicherung funktioniert, da Docker iptables direkt manipuliert und UFW-Regeln umgeht.
Ändere in diesem Fall den Port-Eintrag in der .env auf lokalen Zugriff und passe die compose.yaml entsprechend an:
ports:
- "127.0.0.1:${HOST_PORT:-8080}:8080"Caddy eignet sich als einfachste Lösung, da es automatisch Let's-Encrypt-Zertifikate verwaltet. Eine umfassende Anleitung bietet Traefik als Docker-Reverse-Proxy mit automatischem HTTPS.
Verifizieren: Nach Einrichtung des Reverse Proxy unter einer Domain (z. B. https://trilium.example.com):
curl -I https://trilium.example.comErwartete Ausgabe: HTTP/2 200 oder HTTP/2 302 mit gültigem TLS-Zertifikat.
Schritt 7: Backup und Updates
Backup
TriliumNext legt automatisch Datenbank-Backups im Unterordner backup/ innerhalb des Datenverzeichnisses an. Das schützt jedoch nicht gegen den Verlust des gesamten Hosts. Sichere das Bind-Mount-Verzeichnis zusätzlich extern:
# Manuelles Backup per rsync auf ein anderes Volume
rsync -av --delete /opt/trilium/trilium-data/ /mnt/backup/trilium-data/Für automatisierte, verschlüsselte Offsite-Backups bietet sich Restic an. Die vollständige Backup-Strategie beschreibt 3-2-1-Backup-Strategie umsetzen.
Update auf eine neue Version
Passe in der .env den Versions-Tag an (z. B. von v0.103.0 auf v0.104.0), sichere vorher das Datenverzeichnis und führe dann aus:
cd /opt/trilium
# 1. Backup erstellen
rsync -av /opt/trilium/trilium-data/ /mnt/backup/trilium-data-pre-update/
# 2. Versions-Tag in .env anpassen, dann:
docker compose pull
docker compose up -dWichtig: Wenn du neben dem Server auch Trilium Desktop-Clients betreibst, aktualisiere alle Instanzen gleichzeitig. Unterschiedliche Hauptversionen führen zu Sync-Fehlern, da Datenbankschema-Änderungen nicht rückwärtskompatibel sind.
Verifizieren nach Update:
docker compose ps
docker compose logs --tail=20Erwartete Ausgabe: Container läuft stabil, keine Fehler zu Datenbankmigrationen. Im Trilium-Web-UI unter Menü → Über die neue Versionsnummer bestätigen.
Eckdaten im Überblick
| Parameter | Wert | Hinweis |
|---|---|---|
| Image | triliumnext/trilium:v0.103.0 | Docker Hub; nie latest verwenden |
| Port | 8080 (HTTP) | Kein natives HTTPS; Reverse Proxy empfohlen |
| Datenvolume (Standard) | ./trilium-data:/home/node/trilium-data | SQLite-DB, Anhänge, Konfig |
| Datenvolume (rootless) | ./trilium-data:/home/trilium/trilium-data | Nur beim rootless-Image-Tag |
| Zeitzone | /etc/timezone + /etc/localtime (ro) | Volume-Mount bevorzugt |
| Architekturen | amd64, arm64/v8, arm/v7 | Multi-Arch-Image |
| Lizenz | AGPL-3.0 | Open Source, kostenlos |
| Umgebungsvariable | Pflicht? | Beschreibung |
|---|---|---|
TRILIUM_DATA_DIR | Empfohlen | Datenpfad im Container (/home/node/trilium-data) |
USER_UID | Optional | UID des Prozesses (Standard: root) |
USER_GID | Optional | GID des Prozesses (Standard: root-Gruppe) |
TRILIUM_UID | Optional (rootless) | UID im rootless-Container |
TRILIUM_GID | Optional (rootless) | GID im rootless-Container |
Troubleshooting / Typische Fehler
- Falsches Image verwendet (
ghcr.io/triliumnext/notes): Dieses Image ist beim archivierten Repository geblieben und bei v0.95.0 eingefroren. Es erscheinen keine neueren Tags. Lösung: Incompose.yamlauftriliumnext/trilium:v0.103.0(Docker Hub) wechseln unddocker compose pull && docker compose up -dausführen. - Container startet, Daten werden nicht gespeichert (leere DB nach Neustart): Volume-Pfad stimmt nicht. Beim rootless-Image lautet der Container-Pfad
/home/trilium/trilium-data, nicht/home/node/trilium-data. Incompose.yamlanpassen. - Berechtigungsfehler beim Schreiben ins Datenverzeichnis: Nach Aktivierung von
USER_UID=1000/USER_GID=1000gehört das Host-Verzeichnis möglicherweise noch Root. Behebung:chown 1000:1000 ./trilium-data. user:-Direktive in compose.yaml führt zu Fehler: TriliumNext unterstützt die Docker-user-Direktive ausdrücklich nicht. Der Container läuft als Root; UID/GID-Anpassung erfolgt ausschließlich über die UmgebungsvariablenUSER_UID/USER_GID.- Sync-Bruch nach Update: Wenn Desktop-Client und Server auf unterschiedlichen Hauptversionen laufen, schlägt die Synchronisation fehl. Lösung: Alle Instanzen gleichzeitig aktualisieren. Vor jedem Update Backup erstellen.
- Port 8080 trotz UFW-Regel von außen erreichbar: UFW funktioniert bekannterweise nicht korrekt mit Standard-Docker-Installationen. Docker manipuliert iptables direkt und umgeht UFW-Regeln. Lösung: Port auf
127.0.0.1:8080:8080begrenzen und Zugriff ausschließlich über einen Reverse Proxy erlauben. - SQLite-Datenbankkorruption bei NAS-Netzlaufwerk: SMB/CIFS-Shares als Datenspeicher erfordern zwingend die Mount-Optionen
nobrlundnoperm. Ohne diese Optionen können SQLite-Sperrmechanismen fehlschlagen. Empfehlung: Lokalen Speicher für das Datenverzeichnis verwenden. - Setup-Wizard erscheint nach Neustart erneut: Das Datenverzeichnis ist leer oder der Container findet es nicht.
docker compose logs triliumzeigt den tatsächlich verwendeten Pfad. Volumedeklaration incompose.yamlund den Wert vonTRILIUM_DATA_DIRprüfen.
Häufige Fragen
Brauche ich eine externe Datenbank wie PostgreSQL oder MySQL?
Nein. TriliumNext verwendet intern SQLite. Alle Notizen, Anhänge und Konfiguration landen in einer einzigen Datei im Datenverzeichnis. Eine separate Datenbankinstanz ist nicht erforderlich und wird auch nicht unterstützt.
Was ist der Unterschied zwischen Standard- und rootless-Image?
Das Standard-Image (triliumnext/trilium:VERSION) läuft als Root-Prozess im Container – das ist beabsichtigt und offiziell dokumentiert. Das rootless-Image (Tag rootless oder rootless-alpine) läuft als eingeschränkter User, verwendet aber einen abweichenden Datenpfad (/home/trilium/trilium-data) und andere Umgebungsvariablen (TRILIUM_UID, TRILIUM_GID). Für die meisten Heiminstallationen und interne Server ist das Standard-Image ausreichend.
Wie sichere ich meine Trilium-Daten zuverlässig?
Das gesamte Bind-Mount-Verzeichnis (./trilium-data) enthält alles – die SQLite-Datenbank und alle Anhänge. TriliumNext legt automatisch Datenbank-Backups in einem Unterordner backup/ an, aber für externe Ausfallsicherheit ist eine regelmäßige Sicherung auf ein anderes Medium nötig. Bewährt hat sich restic für automatisierte, verschlüsselte Backups.
Kann ich Trilium mit HTTPS betreiben?
Trilium selbst bietet kein natives HTTPS. Empfehlung: Einen Reverse Proxy (Caddy, nginx, Traefik) vorschalten, der TLS terminiert und Anfragen an Trilium auf Port 8080 weiterleitet. Caddy eignet sich besonders gut für Einsteiger, da es automatisch Let's-Encrypt-Zertifikate verwaltet.
Wie aktualisiere ich auf eine neue Version?
Den Versions-Tag in der .env anpassen, dann docker compose pull && docker compose up -d ausführen. Vorher unbedingt das Datenverzeichnis sichern. Alle Trilium-Instanzen (Desktop-Clients + Server) sollten gleichzeitig aktualisiert werden, um Sync-Probleme zu vermeiden.
Kann ich Trilium mit mehreren Geräten synchronisieren?
Ja. TriliumNext hat eine eingebaute Synchronisation zwischen Server-Instanz und Desktop-Clients sowie zwischen mehreren Server-Instanzen. Die Synchronisation setzt gleiche Hauptversionen auf allen Instanzen voraus.
Was passiert, wenn ich das Verschlüsselungspasswort vergesse?
Das Passwort für die optionale Datenbankverschlüsselung wird nicht serverseitig gespeichert. Geht es verloren, gibt es keine Wiederherstellungsmöglichkeit – alle Notizen sind unwiederbringlich verloren. Das Passwort unbedingt in einem Passwortmanager hinterlegen, bevor die Verschlüsselung aktiviert wird.
Fazit
TriliumNext Notes ist unter den hierarchischen Notizsystemen eine Klasse für sich: Die Kombination aus unbegrenzt tiefer Baumstruktur, JavaScript-Scripting, eingebautem REST-API-Server und nativer Synchronisation macht es zur Plattform für komplexe persönliche Wissensdatenbanken. Als Docker-Server läuft TriliumNext plattformneutral auf jedem Linux-Host, NAS oder ARM-Board und ist in unter 15 Minuten einsatzbereit. Das Setup ist simpel – ein Datenverzeichnis, eine SQLite-Datenbank, keine externe Abhängigkeit. Wichtig ist, die richtigen Weichen von Anfang an zu stellen: das aktive Image triliumnext/trilium verwenden, niemals den latest-Tag nutzen und Backups des Datenverzeichnisses von Beginn an automatisieren. Für den Produktivbetrieb mit Zugriff von außen ist ein Reverse Proxy mit TLS unerlässlich.
Weiterführende Anleitungen und Quellen
- Docker Compose: Multi-Container-Stacks aufbauen – Grundlagen zu Compose-Syntax und Stack-Aufbau
- Docker-Netzwerke und Volumes richtig nutzen – Bind Mounts, Named Volumes und Netzwerkkonfiguration verstehen
- Caddy als Reverse Proxy einrichten: Anfänger-Anleitung mit automatischem HTTPS – TLS für selbstgehostete Dienste
- Restic Backup auf Linux automatisieren – verschlüsselte Offsite-Backups des Datenverzeichnisses
- Paperless-ngx mit Docker einrichten – ergänzendes Werkzeug für strukturierte Dokumentenverwaltung
Offizielle Quellen: TriliumNext/Trilium auf GitHub (aktives Repository ab 2025), TriliumNext Docker-Installationsdokumentation, triliumnext/trilium auf Docker Hub.