Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Docker 09.08.2026 · 8 min Lesezeit Geprüft 30.09.2026

Trilium Notes mit Docker installieren: Hierarchisches Notizsystem für große persönliche Wissensdatenbanken

Trilium Notes (früher TriliumNext) als Docker-Server einrichten: compose.yaml mit festem Image-Tag, Ersteinrichtung, Reverse Proxy mit TLS, Backup und Updates Schritt für Schritt.

Werbung Mit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. Mehr dazu

Titelbild: Trilium Notes mit Docker installieren, Notizen, Baum, Wissen

Trilium Notes ist eine quelloffene Anwendung für hierarchische Notizen und große persönliche Wissensdatenbanken: Notizen liegen in einem beliebig tiefen Baum, unterstützen Rich-Text und Code, werden versioniert und lassen sich per JavaScript automatisieren. Das Projekt lief 2024 und 2025 als Fork unter dem Namen TriliumNext Notes und heißt seit der Rückführung wieder Trilium Notes; Repository und Docker-Image liegen weiterhin unter TriliumNext. Diese Anleitung installiert den Trilium-Server mit Docker Compose auf einem Linux-Host oder NAS und stellt ihn per Browser bereit.

Voraussetzungen

  • Docker Engine ab Version 24 mit Docker Compose Plugin v2 (docker compose version). Die Einrichtung beschreibt Docker und Docker Compose auf Linux installieren.
  • Architektur: amd64, arm64 oder armv7 (Multi-Arch-Image, auch Raspberry Pi und ARM-NAS). Für arm64 ab v0.105.0: Host mit libseccomp ab etwa 2.5, sonst startet der Container nicht (siehe Fehlerbehebung).
  • RAM: mindestens 512 MB frei, für große Datenbanken mit vielen Anhängen 1 GB.
  • Speicher: ein lokales Verzeichnis für die Daten; der Bedarf wächst mit Notizen und Anhängen. SMB/CIFS-Freigaben nur mit den Mount-Optionen nobrl und noperm.
  • Für Zugriff von außen: eine Domain und ein Reverse Proxy mit TLS, z. B. Caddy als Reverse Proxy mit automatischem HTTPS.

Schritt 1: Projektordner anlegen

Legen Sie Projektordner und Datenverzeichnis vor dem ersten Start an. Fehlt das Verzeichnis, legt Docker es als root an.

sudo mkdir -p /opt/trilium/trilium-data
cd /opt/trilium

Der Container startet als root, übergibt das Datenverzeichnis an den Benutzer node (UID/GID 1000 oder die Werte aus USER_UID/USER_GID) und führt Trilium als dieser Benutzer aus. Eine manuelle Rechtevergabe ist deshalb im Standardbetrieb nicht nötig.

ls -ld /opt/trilium/trilium-data zeigt das Verzeichnis.

Schritt 2: .env-Datei anlegen

Die .env hält Version, Datenpfad und Port. Ein Update ist dann eine Zeile.

# /opt/trilium/.env
# Festen Versions-Tag verwenden, nicht "latest": Server und Desktop-Clients
# müssen für die Synchronisation dieselbe Version haben.
TRILIUM_VERSION=v0.106.0

# Datenverzeichnis auf dem Host (relativ zur compose.yaml)
TRILIUM_DATA_DIR=./trilium-data

# Host-Port, falls 8080 belegt ist anpassen
HOST_PORT=8080

cat /opt/trilium/.env gibt alle drei Variablen aus.

Schritt 3: compose.yaml anlegen

Legen Sie /opt/trilium/compose.yaml an. Der Port ist an 127.0.0.1 gebunden; Docker-Portfreigaben umgehen ufw, eine Bindung an alle Schnittstellen wäre trotz Firewall-Regel von außen erreichbar.

services:
  trilium:
    image: triliumnext/trilium:${TRILIUM_VERSION:-v0.106.0}
    container_name: trilium
    restart: unless-stopped
    # Optional: Eigentümer der Daten auf einen anderen Host-Benutzer setzen
    # environment:
    #   - USER_UID=1000
    #   - USER_GID=1000
    ports:
      - "127.0.0.1:${HOST_PORT:-8080}:8080"
    volumes:
      # SQLite-Datenbank, Anhänge, config.ini, Backups
      - ${TRILIUM_DATA_DIR:-./trilium-data}:/home/node/trilium-data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

Verwenden Sie das Image triliumnext/trilium von Docker Hub. Das ältere Image triliumnext/notes endet bei v0.95.0 (Juni 2025) und erhält keine Updates mehr. Fehlt auf dem Host /etc/timezone (etwa auf manchen NAS-Systemen), entfernen Sie diese Zeile und setzen stattdessen TZ=Europe/Berlin als Umgebungsvariable.

docker compose config gibt die Konfiguration ohne Fehler aus und zeigt image: triliumnext/trilium:v0.106.0.

Schritt 4: Container starten

cd /opt/trilium
docker compose pull
docker compose up -d

docker compose ps zeigt den Status Up und nach kurzer Zeit (healthy), nicht Restarting. docker compose logs --tail=30 enthält keine Fehler zu Port oder Datenverzeichnis. curl -I http://127.0.0.1:8080 antwortet mit 200 oder 302.

Schritt 5: Ersteinrichtung im Browser

Öffnen Sie http://127.0.0.1:8080 auf dem Host oder per SSH-Tunnel (ssh -L 8080:127.0.0.1:8080 benutzer@server). Der Setup-Assistent bietet drei Wege:

  1. Neues Dokument anlegen: Standard für eine frische Installation. Anschließend vergeben Sie das Anmeldepasswort.
  2. Synchronisation von einer Desktop-Instanz: übernimmt die Daten eines vorhandenen Trilium-Desktop-Clients.
  3. Synchronisation von einer anderen Server-Instanz: übernimmt die Daten eines bestehenden Servers.

Einzelne Notizen können Sie als „geschützt“ markieren. Trilium verschlüsselt sie mit einem aus Ihrem Passwort abgeleiteten Schlüssel (scrypt). Ohne das Passwort sind geschützte Notizen nicht wiederherstellbar; hinterlegen Sie es in einem Passwortmanager.

Nach der Anmeldung sehen Sie links den Notizbaum. Legen Sie eine Testnotiz an und prüfen Sie nach docker compose restart, dass sie noch vorhanden ist.

Schritt 6: HTTPS mit Reverse Proxy

Trilium liefert kein HTTPS. Für Zugriff außerhalb des Hosts schalten Sie einen Reverse Proxy mit TLS vor, der auf 127.0.0.1:8080 weiterleitet. Läuft der Proxy selbst als Container, verbinden Sie beide über ein gemeinsames Docker-Netzwerk statt über einen Host-Port. Anleitungen: Caddy oder Traefik als Docker-Reverse-Proxy mit automatischem HTTPS.

Damit Trilium hinter dem Proxy die echte Client-IP für Anmeldung und Rate-Limiting erkennt, setzen Sie in trilium-data/config.ini im Abschnitt [Network] den Wert trustedReverseProxy=true (oder die IP des Proxys) und starten den Container neu.

curl -I https://trilium.example.com antwortet mit HTTP/2 200 oder 302 und gültigem Zertifikat; von einem anderen Rechner ist http://SERVER-IP:8080 nicht erreichbar.

Schritt 7: Backup und Updates

Backup

Trilium legt im Datenverzeichnis unter backup/ automatisch Kopien der Datenbank an: täglich, wöchentlich, monatlich und vor jeder Datenbankmigration. Diese liegen auf demselben Datenträger. Sichern Sie deshalb das gesamte Datenverzeichnis zusätzlich auf ein anderes Medium:

rsync -a --delete /opt/trilium/trilium-data/ /mnt/backup/trilium-data/

Für automatische, verschlüsselte Offsite-Sicherungen eignet sich Restic; das Gesamtkonzept beschreibt 3-2-1-Backup-Strategie umsetzen. Für eine konsistente Kopie im laufenden Betrieb lösen Sie vorher unter Einstellungen → Backup „Backup Now“ aus oder stoppen den Container kurz.

ls /mnt/backup/trilium-data/ zeigt document.db und den Ordner backup.

Update auf eine neue Version

Lesen Sie vor jedem Update die Release Notes auf GitHub: v0.106.0 etwa stellt den Server auf ESM um (main.mjs statt main.cjs) und ändert die Attributsuche #label=value auf exakte Gleichheit.

cd /opt/trilium
docker compose stop
rsync -a trilium-data/ /mnt/backup/trilium-data-pre-update/
# TRILIUM_VERSION in .env anpassen, dann:
docker compose pull
docker compose up -d

Aktualisieren Sie Desktop-Clients auf dieselbe Version; bei abweichenden Versionen verweigert die Synchronisation den Abgleich.

docker compose ps zeigt (healthy), das Log keine Migrationsfehler. Unter Menü → Über Trilium Notes steht die neue Version.

Eckdaten im Überblick

ParameterWertHinweis
Imagetriliumnext/trilium:v0.106.0Docker Hub, Stand 30.09.2026; festen Tag verwenden
Port8080 (HTTP)an 127.0.0.1 binden, TLS per Reverse Proxy
Datenpfad im Container/home/node/trilium-dataSQLite-DB, Anhänge, config.ini, Backups
Prozessbenutzernode (UID/GID 1000)änderbar per USER_UID/USER_GID
Architekturenamd64, arm64, armv7Multi-Arch-Image
LizenzAGPL-3.0Open Source
UmgebungsvariablePflicht?Beschreibung
USER_UIDOptionalUID, der das Datenverzeichnis gehört (Standard 1000)
USER_GIDOptionalGID, der das Datenverzeichnis gehört (Standard 1000)
TZOptionalZeitzone, falls /etc/timezone nicht eingebunden wird

Typische Fehler und Lösungen

Kein Update über v0.95.0 hinaus

Sie verwenden das eingestellte Image triliumnext/notes. Tragen Sie in compose.yaml triliumnext/trilium ein und führen Sie docker compose pull && docker compose up -d aus; das Datenverzeichnis bleibt gleich.

Setup-Assistent erscheint nach Neustart erneut

Der Volume-Pfad stimmt nicht, der Container schreibt in ein leeres Verzeichnis. Der Pfad hinter dem Doppelpunkt muss /home/node/trilium-data lauten; docker compose config zeigt den tatsächlich eingebundenen Host-Pfad.

Berechtigungsfehler mit user: in compose.yaml

Mit user: "1000:1000" läuft der Container vollständig ohne root und ignoriert USER_UID/USER_GID. Das Host-Verzeichnis muss dann vorher diesem Benutzer gehören: sudo chown -R 1000:1000 /opt/trilium/trilium-data.

arm64: Container startet nach Update auf v0.105.0 oder neuer nicht

Das Image basiert jetzt auf Debian 13 und benötigt auf dem Host libseccomp ab etwa 2.5. Aktualisieren Sie das Host-System; als Notlösung nennt das Projekt security_opt: [seccomp:unconfined], was den Syscall-Filter abschaltet.

Container nach Update „unhealthy“

Entfernen Sie eigene healthcheck-Einträge aus compose.yaml und erstellen Sie den Container mit docker compose up -d --force-recreate neu.

Port trotz ufw-Regel von außen erreichbar

Docker schreibt eigene iptables-Regeln und umgeht ufw. Binden Sie den Port an 127.0.0.1 wie in Schritt 3.

Datenbankfehler auf SMB/CIFS-Freigabe

SQLite-Sperren funktionieren dort nur mit den Mount-Optionen nobrl und noperm. Lokaler Speicher ist die robustere Wahl.

Häufige Fragen

Brauchen Sie eine externe Datenbank wie PostgreSQL oder MySQL?

Nein. Trilium speichert alles in einer SQLite-Datei (document.db) im Datenverzeichnis; externe Datenbanken werden nicht unterstützt.

Kann Trilium vollständig ohne root laufen?

Ja. Ein eigenes rootless-Image gibt es nicht mehr; Sie setzen im Standard-Image user: "1000:1000" in compose.yaml. Das Datenverzeichnis muss vorher diesem Benutzer gehören, USER_UID/USER_GID werden dann ignoriert. Zusätzlich sind read_only: true mit tmpfs: /tmp und cap_drop: [ALL] möglich.

Können Sie Trilium mit HTTPS betreiben?

Ja, über einen vorgeschalteten Reverse Proxy, der TLS terminiert (Schritt 6). Trilium selbst spricht im Docker-Betrieb nur HTTP.

Ist TriliumNext dasselbe wie Trilium Notes?

Ja. TriliumNext war der Community-Fork, nachdem der ursprüngliche Entwickler die Pflege beendet hatte. Das Projekt führt heute wieder den Namen Trilium Notes; Repository (TriliumNext/Trilium) und Image (triliumnext/trilium) behalten den Namensraum.

Wie sichern Sie Ihre Trilium-Daten zuverlässig?

Sichern Sie das gesamte Datenverzeichnis regelmäßig auf ein anderes Medium, idealerweise verschlüsselt und extern, wie in Schritt 7 beschrieben. Die internen Backups schützen nur vor Fehlern in der Datenbank, nicht vor dem Ausfall des Datenträgers.

Können Sie Trilium mit mehreren Geräten synchronisieren?

Ja. Desktop-Clients synchronisieren mit dem Server als zentralem Sync-Server; alle Instanzen benötigen dieselbe Version. Mobil nutzen Sie die Weboberfläche im Browser.

Was passiert, wenn Sie das Passwort vergessen?

Geschützte Notizen sind ohne das Passwort nicht mehr lesbar, weil ihr Schlüssel aus dem Passwort abgeleitet wird. Sichern Sie es deshalb in einem Passwortmanager.

Fazit

Mit festem Image-Tag, an 127.0.0.1 gebundenem Port und einem Reverse Proxy mit TLS läuft Trilium Notes als Server für eine private Wissensdatenbank. Entscheidend für den Dauerbetrieb sind externe Backups des Datenverzeichnisses und Updates nach Lektüre der Release Notes, bei denen Server und Desktop-Clients dieselbe Version erhalten.

Weiterführende Anleitungen und Quellen

  1. Docker Compose: Multi-Container-Stacks aufbauen – Grundlagen zu Compose-Syntax und Stack-Aufbau
  2. Docker-Netzwerke und Volumes richtig nutzen – Bind Mounts, Named Volumes und Netzwerkkonfiguration verstehen
  3. Caddy als Reverse Proxy einrichten: Anfänger-Anleitung mit automatischem HTTPS – TLS für selbstgehostete Dienste
  4. Restic Backup auf Linux automatisieren – verschlüsselte Offsite-Backups des Datenverzeichnisses
  5. Paperless-ngx mit Docker einrichten – ergänzendes Werkzeug für strukturierte Dokumentenverwaltung

Offizielle Quellen: Trilium Notes auf GitHub, Trilium-Dokumentation (Server-Installation mit Docker), triliumnext/trilium auf Docker Hub.