Trilium: Deine hierarchische Wissensdatenbank im Browser
Notizen, die wie ein Baum wachsen statt in unendlichen Ordnern zu versinken: Trilium organisiert dein Wissen in einer hierarchischen Struktur – mit Markdown, Code-Blöcken, Verknüpfungen, Skripten und optionaler Ende-zu-Ende-Verschlüsselung. In diesem Artikel richtest du Trilium als Docker-Container ein, schützt es per Reverse Proxy und bindest Backups aus der Debian-13-Serie ein.
Was ist Trilium? (TriliumNext)
Trilium ist eine Open-Source-Notiz-App, die Notizen nicht in flachen Listen, sondern in einem Baum aus beliebig verschachtelten Notizen organisiert. Das Original von zadam wird seit 2023 als TriliumNext aktiv weiterentwickelt – mit Sync-Verbesserungen, Mobile-Optimierung und neuen Features.
- Hierarchie: Notizen frei verschachteln, klonen und über Relationen verknüpfen
- Editor: Markdown, Code mit Syntax-Highlighting, Tabellen, Formeln, Diagramme (Mermaid)
- Attribute & Skripte: Notizen mit Metadaten versehen und über eingebautes JavaScript automatisieren
- Verschlüsselung: einzelne Notizen optional Ende-zu-Ende-verschlüsseln
- Sync: mehrere Geräte über den eigenen Server synchronisieren
- Web & Mobile: Bedienung komplett im Browser, PWA für unterwegs
zadam/trilium – es funktioniert weiterhin. Die aktive Entwicklung läuft aber bei TriliumNext. Deren Image heißt triliumnext/trilium (Docker Hub) bzw. ghcr.io/triliumnext/trilium, das Datenverzeichnis ist kompatibel. Ein Umstieg ist also jederzeit ohne Datenverlust möglich (vorher Backup machen).Voraussetzungen
- Debian-13-Server mit Docker & Compose (Teil 5)
- Optional: Domain + Reverse Proxy (Nginx) für den Zugriff von unterwegs
- Für Sync zwischen Geräten: zusätzliche Trilium-Instanzen bzw. Clients auf deinen Endgeräten
Installation mit Docker Compose
Verzeichnis anlegen und in den Stack wechseln:
mkdir -p /opt/stacks/trilium
cd /opt/stacks/trilium
Die docker-compose.yml:
services:
trilium:
container_name: trilium
hostname: trilium
image: zadam/trilium
restart: unless-stopped
security_opt:
- no-new-privileges:true
network_mode: bridge
ports:
- 127.0.0.1:50548:8080
volumes:
- ./data:/home/node/trilium-data
environment:
- USER_UID=1000
- USER_GID=1000
TZ: Europe/Berlin
Starten und den Status prüfen:
docker compose up -d
docker compose ps
Danach öffnest du Trilium im Browser: http://127.0.0.1:50548 – auf dich wartet die leere Baumstruktur, die erste Notiz heißt „Hello Trilium“.
Was macht die Config?
| Baustein | Bedeutung |
|---|---|
./data:/home/node/trilium-data | Alle Notizen, Dokumente & Backups liegen hier – der wichtigste Ordner des Stacks. |
USER_UID/USER_GID | Dateien gehören dem Standard-Benutzer (1000) aus Teil 1 der Serie. |
TZ | Zeitzone für Zeitstempel (Europe/Berlin). |
no-new-privileges | Verhindert, dass Prozesse im Container neue Privilegien erlangen – Standard-Härtung aus Teil 5. |
127.0.0.1:50548:8080 | Nur localhost erreichbar – der Reverse Proxy stellt die Verbindung nach außen her. |
data und ein Netzwerk net deklariert, die aber gar nicht genutzt werden (Bind-Mount + network_mode: bridge). Du kannst beide Blöcke ersatzlos entfernen – Compose wird übersichtlicher.Reverse Proxy: Trilium nach außen bringen
Trilium ist eine Web-App ohne eigenes Login (Standard) – der Zugangsschutz gehört also an den Proxy:
server {
listen 443 ssl http2;
server_name notes.deine-domain.de;
ssl_certificate /etc/letsencrypt/live/notes.deine-domain.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/notes.deine-domain.de/privkey.pem;
auth_basic "Trilium";
auth_basic_user_file /etc/nginx/htpasswd-trilium;
location / {
proxy_pass http://127.0.0.1:50548;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600s;
}
}
sudo htpasswd -c /etc/nginx/htpasswd-trilium admin
sudo nginx -t
sudo systemctl reload nginx
Konfiguration & erste Schritte
Datenverzeichnis & automatische Backups
Trilium legt in ./data neben der Datenbank (document.db) automatisch tägliche Sicherungen unter ./data/backup an. Diese „internen“ Backups schützen dich vor versehentlichem Löschen – sie ersetzen aber kein externes Backup (dazu weiter unten).
Wichtige Umgebungsvariablen (optional)
| Variable | Wirkung |
|---|---|
TRILIUM_PORT | Interner Port (Standard 8080, im Compose-Mapping schon berücksichtigt). |
TRILIUM_DISABLE_TLS | Bei manchen Images nötig, wenn TLS im Container deaktiviert werden soll – Standard-Betrieb über Reverse Proxy braucht das nicht. |
TRILIUM_STARTUP_SCRIPT | Pfad zu einem Skript, das beim Start ausgeführt wird (fortgeschritten). |
Sync einrichten
Trilium synchronisiert mehrere Instanzen über deinen Server. Dazu erzeugst du in den Optionen einen Sync-Server-Token und trägst ihn auf deinen weiteren Geräten (Desktop-App, Mobile) ein. Wichtig: Vor der ersten Synchronisation unbedingt ein Backup der bestehenden Instanz anlegen.
Sicherheits-Check
- localhost-Bindung:
127.0.0.1:50548statt0.0.0.0– Firewall und UFW bleiben wirksam (Teil 3). - Basic Auth am Proxy – oder integrierte Authentifizierung aktivieren, wenn du mehrere Nutzer hast.
- Sensible Notizen verschlüsseln: Rechtsklick auf die Notiz → „Schützen“. Der Schlüssel wird in deinem Browser gehalten.
- Kein Root im Container: Trilium läuft als normaler User (
node),no-new-privilegesist aktiv. - Zugriff prüfen: Wer Zugriff auf den Server hat, hat Zugriff auf alle Notizen –
./dataalso nie in Web-Ordnern teilen.
Betrieb, Updates & Backups
Updates
cd /opt/stacks/trilium
docker compose pull
docker compose up -d
./data kostet Sekunden und macht Updates gefahrlos – gerade bei einem Wechsel von zadam/trilium auf triliumnext/trilium.Backup mit Borg
Der komplette Stack-Zustand liegt in ./data – das Backup-Muster aus Teil 4/5 passt 1:1:
#!/bin/sh
cd /opt/stacks/trilium || exit 1
docker compose stop
trap 'docker compose start' EXIT
borg create /mnt/backup/borg-repo::trilium-$(date +%Y-%m-%d) /opt/stacks/trilium/data
borg prune --keep-daily 7 --keep-weekly 4 --keep-monthly 6
Restore: Stack stoppen, ./data aus dem Archiv zurückspielen, Stack starten. Fertig – inklusive aller Notizen, Attribute und Sync-Einstellungen.
Häufige Probleme (FAQ)
| Problem | Lösung |
|---|---|
| Seite ist nicht erreichbar | Status prüfen (docker compose ps) und Port testen: curl -I http://127.0.0.1:50548. Nach Config-Änderungen neu erstellen: docker compose up -d --force-recreate. |
| Wo liegen meine Daten? | Im Bind-Mount ./data (= /home/node/trilium-data im Container). Achtung: Das deklarierte Named Volume data in der Vorlage ist ungenutzt – nicht verwechseln. |
| Login / Passwort gefragt? | Trilium hat im Standard keinen Login. Erscheint trotzdem eine Abfrage, kommt sie vom Reverse Proxy (Basic Auth) – Zugangsdaten aus der htpasswd-Datei. |
| Sync funktioniert nicht | Token prüfen, Server-URL mit https:// eintragen und sicherstellen, dass alle Instanzen dieselbe Trilium-Version nutzen. Vor dem ersten Sync unbedingt Backups anlegen. |
| Verschlüsselte Notiz nicht lesbar | Der Schlüssel liegt nur im Browser, in dem die Notiz verschlüsselt wurde – nicht im Container. Passwort des Schutz-Schlüssels notieren, sonst ist die Notiz unwiederbringlich verloren. |
| Image-Frage: zadam oder TriliumNext? | Beide nutzen dasselbe Datenformat. Aktive Entwicklung: TriliumNext (triliumnext/trilium). Vor dem Wechsel Backup machen und danach die Version prüfen. |
Fazit
Trilium bringt Ordnung in Notizen, die sonst in zwanzig Markdown-Dateien und drei Cloud-Apps verstreut liegen. Die Merksätze:
- Ein Ordner, ein Backup:
./dataenthält alles – externe Sicherung nie vergessen. - Zugangsschutz am Proxy: Basic Auth oder integrierte Authentifizierung – Notizen gehören nicht ins offene Internet.
- Vor Updates und Sync-Ersteinrichtung Backups anlegen – das schützt vor Format- und Migrationsfehlern.
- Verschlüsselte Notizen haben ihren Schlüssel nur im Browser – Schlüssel-Passwort sicher verwahren.
Damit wächst dein Wissen ab sofort wie ein Baum statt wie ein Papierstapel.