Markdown im Browser

Markdown im Browser

Obsidian ist eine leistungsstarke Wissensdatenbank und Notizanwendung, die auf lokalen Markdown-Dateien basiert. Durch die Nutzung von Docker-Containern, insbesondere des Images von LinuxServer.io, lässt sich Obsidian flexibel, isoliert und sicher betreiben, wobei der Zugriff bequem über einen Webbrowser erfolgen kann.

Was ist Obsidian?

Obsidian ist eine Anwendung, die es ermöglicht, Notizen in Form von Markdown-Dateien zu erstellen, zu organisieren und miteinander zu verknüpfen. Das Konzept basiert auf der Idee eines "zweiten Gehirns", bei dem Wissen nicht nur gesammelt, sondern aktiv vernetzt wird. Durch Backlinks, Graphenansichten und eine Vielzahl von Community-Plugins kann Obsidian an individuelle Bedürfnisse angepasst werden und dient als mächtiges Werkzeug für Wissensmanagement, Recherche, Projektplanung und das Schreiben von Texten. Die Datenhaltung erfolgt dabei stets lokal, was volle Kontrolle und Datenschutz gewährleistet.

Obsidian mit KI denkt beim Schreiben mit
KI schlägt die nächsten zwei Sätze während des Schreibens vor…

Ich nutze Obsidian vor allem deshalb gerne, weil man sich bei Markdown wenig mit optischer Gestaltung auseinandersetzen muss. Listen, Tabellen oder Hervorhebungen sind schnell mitgetippt. Und eine Konversion in Latex oder HTML etc. ist mit pandoc nicht mehr der Rede wert.

Nextcloud-Notizen automatisiert in DokuWiki veröffentlichen
Markdown zu DokuWiki: Automatische Konvertierung aus Nextcloud-Notizen

Warum Obsidian mit Docker betreiben?

Der Betrieb von Obsidian innerhalb eines Docker-Containers bietet mehrere signifikante Vorteile:

  • Einfache Installation und Updates: Docker-Images bündeln die Anwendung und alle ihre Abhängigkeiten. Die Installation beschränkt sich oft auf wenige Befehle, und Updates des Basis-Images oder der Anwendung können zentral verwaltet werden.
  • Portabilität und Konsistenz: Ein einmal konfiguriertes Docker-Image läuft auf jedem System, das Docker unterstützt, identisch. Dies erleichtert den Wechsel zwischen verschiedenen Hosts oder die gemeinsame Nutzung von Konfigurationen.
  • Isolation: Anwendungen in Docker-Containern sind vom Host-System und anderen Containern isoliert, was die Sicherheit erhöht und Konflikte zwischen verschiedenen Softwareversionen vermeidet.
  • Zugriff per Webbrowser: Spezielle Docker-Images, wie das hier vorgestellte, ermöglichen den Zugriff auf die Obsidian-GUI über einen beliebigen Webbrowser. Damit kann Obsidian von verschiedenen Geräten im Netzwerk genutzt werden, ohne dass eine lokale Installation erforderlich ist.
  • Zentralisierte Datenspeicherung: Die Vaults (Notizsammlungen) werden in meiner Nextcloud gespeichert. Der Hauptvorteil ist daher, dass die Konfiguration der Erweiterungen (z.B. lokale KI) auch im Browser synchronisiert ist. Füge ich eine weitere Erweiterung auf meinem Laptop hinzu, so ist diese im Browser ebenfalls konfiguriert.

Das empfohlene Docker-Image: linuxserver/obsidian

Während es verschiedene Ansätze gibt, Obsidian in Docker zu betreiben (wie z.B. die Projekte sytone/obsidian-remote oder Lanjelin/Obsidian-docker), hat sich das Image von LinuxServer.io (lscr.io/linuxserver/obsidian:latest) als eine robuste und gut gewartete Lösung etabliert. Es basiert auf KasmVNC, um eine vollständige Desktop-Umgebung im Browser bereitzustellen. LinuxServer.io ist bekannt für qualitativ hochwertige Docker-Images mit regelmäßigen Updates und einem Fokus auf Sicherheit und Benutzerfreundlichkeit.

Nach dem Start des Containers ist die Obsidian-Oberfläche standardmäßig erreichbar unter:

  • http://<yourhost>:3000/
  • https://<yourhost>:3001/

Bei älteren Kerneln oder libseccomp-Versionen kann die Option --security-opt seccomp=unconfined erforderlich sein.

Sicherheitshinweise: Ein Muss vor der Inbetriebnahme

Dieser Abschnitt ist von entscheidender Bedeutung. Das linuxserver/obsidian Docker-Image bietet standardmäßig keine Authentifizierung.

Warnung: Ich rate dringend davon ab, diesen Container ohne angemessene Sicherheitsmaßnahmen direkt dem Internet auszusetzen. In KasmVNC befindet sich auch eine Shell, mit der sich ein Angreifer direkt im internen Netz umschauen kann!!!

Die optionalen Umgebungsvariablen CUSTOM_USER und PASSWORD aktivieren eine HTTP-Basic-Authentifizierung über den eingebetteten NGINX-Server. Diese sollte jedoch ausschließlich zur Absicherung des Containers im lokalen Netzwerk verwendet werden.

Für den Zugriff aus dem Internet wird dringend empfohlen, den Container hinter einem Reverse Proxy zu betreiben, wie beispielsweise NPM. Dabei muss dringend eine sichere Authentifizierungslösung implementiert werden. Ich habe NPM bereits mehrfach beschrieben.

Eigener Webserver mit offiziellen Zertifikaten
Der Basis-Artikel für alle folgenden Services, die ich hier demonstrieren werde…

Besondere Vorsicht ist geboten, da über die Web-Oberfläche ein Terminal gestartet werden kann, das für passwordless sudo konfiguriert ist. Jeder, der Zugriff auf die Web-Oberfläche erlangt, kann somit beliebige Befehle mit Root-Rechten im Container ausführen, Software installieren und potenziell das lokale Netzwerk sondieren.

Installation und Konfiguration mit Docker Compose

Die Verwendung von docker-compose ist die empfohlene Methode, um den linuxserver/obsidian Container zu verwalten. Weitere Informationen zu Docker Compose finden sich hier.

Eine beispielhafte docker-compose.yml Datei sieht wie folgt aus:

---
services:
  obsidian:
    image: lscr.io/linuxserver/obsidian:latest
    container_name: obsidian
    security_opt:
      - seccomp:unconfined #optional
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./obsidian/config:/config
      - /mnt/meine-nextcloud/Notizen:/vaults # Optional, wenn Vaults außerhalb von /config liegen sollen
    # ports:                          # Falls man ports im lokalen Netz öffnen will
    #   - 3000:3000
    #   - 3001:3001
    devices:
      - /dev/dri:/dev/dri #optional für GPU-Beschleunigung
    shm_size: "1gb" # Wichtig für Electron-basierte Anwendungen
    restart: unless-stopped

Erläuterung der docker-compose.yml:

  • image: lscr.io/linuxserver/obsidian:latest: Definiert das zu verwendende Docker-Image.
  • container_name: obsidian: Legt einen festen Namen für den Container fest.
  • security_opt: - seccomp:unconfined: Optional, kann bei Problemen mit Syscalls auf älteren Systemen notwendig sein.
  • environment: Hier werden Umgebungsvariablen gesetzt.
    • PUID=1000 und PGID=1000: Die User-ID und Group-ID, unter der der Prozess im Container laufen soll. Diese sollten an die Berechtigungen der gemappten Volumes auf dem Host angepasst werden (siehe unten).
    • TZ=Etc/UTC: Definiert die Zeitzone für den Container. Eine Liste valider Zeitzonen findet sich hier.
  • volumes: Mappt Verzeichnisse vom Host-System in den Container.
    • ./obsidian/config:/config: Das Verzeichnis /config im Container speichert die Anwendungseinstellungen und -dateien von Obsidian, einschließlich der obsidian.json und der Plugin-Konfigurationen. Es sollte auf ein persistentes Verzeichnis auf dem Host gemappt werden. Hier werden standardmäßig auch die Vaults abgelegt, wenn kein separater Volume-Eintrag für /vaults existiert.
    • /mnt/meine-nextcloud/Notizen:/vaults: Optional kann ein separates Verzeichnis für die Obsidian Vaults gemappt werden. Das linuxserver/obsidian Image verwendet /config als Haupt-Home-Verzeichnis. Ich kann hier meine Notizen bearbeiten, die auch meine Nextcloud für Notizen verwendet. Dies gestattet mir eine komfortablere Bearbeitung meiner Wissensdatenbank.
  • ports: Mappt Ports vom Host zum Container. Ich habe es auskommentiert, da ich über meinen Reverse-Proxy auf Obsidian zugreife.
    • 3000:3000: Mappt den HTTP-Port 3000 des Containers auf Port 3000 des Hosts.
    • 3001:3001: Mappt den HTTPS-Port 3001 des Containers auf Port 3001 des Hosts.
  • devices: - /dev/dri:/dev/dri: Optional, wird für die GPU-Beschleunigung (GL Support) auf Linux-Hosts benötigt.
  • shm_size: "1gb": Definiert die Größe des Shared Memory (/dev/shm). Dies ist für Electron-basierte Anwendungen wie Obsidian oft notwendig, um korrekt zu funktionieren.
  • restart: unless-stopped: Sorgt dafür, dass der Container nach einem Neustart ebenfalls automatisch neu gestartet wird, es sei denn, er wurde explizit gestoppt.

Nachdem die docker-compose.yml Datei erstellt und angepasst wurde (insbesondere die Pfade für die Volumes), kann der Container mit folgendem Befehl gestartet werden:

docker compose up -d

KasmVNC Umgebungsvariablen

Zusätzlich zu den oben genannten gibt es weitere KasmVNC-spezifische Variablen, die einen genaueren Blick wert sind:

  • CUSTOM_PORT: Interner HTTP-Port (Standard: 3000).
  • CUSTOM_HTTPS_PORT: Interner HTTPS-Port (Standard: 3001).
  • TITLE: Seitentitel im Browser (Standard: "KasmVNC Client").
  • FM_HOME: Startverzeichnis des Dateimanagers (Standard: /config).
  • START_DOCKER: Wenn auf false gesetzt, wird Docker-in-Docker nicht automatisch gestartet (benötigt --privileged).
  • DISABLE_IPV6: Deaktiviert IPv6, wenn auf true gesetzt.
  • LC_ALL: Stellt die Sprache für den Container ein (z.B. fr_FR.UTF-8).
  • NO_DECOR: Startet Anwendungen ohne Fensterrahmen (für PWA-Nutzung).
  • NO_FULL: Verhindert automatischen Vollbildmodus von Anwendungen.

Sprachunterstützung und Fonts

Die Umgebungsvariable LC_ALL (z.B. LC_ALL=de_DE.UTF-8) kann verwendet werden, um die Desktopsitzung in einer anderen Sprache zu starten. Für Sprachen wie Chinesisch, Japanisch oder Koreanisch (CJK) müssen möglicherweise zusätzliche Fonts installiert werden. Dies kann über Docker Mods geschehen:

# In docker-compose.yml
environment:
  - LC_ALL=de_DE.UTF-8
  - DOCKER_MODS=linuxserver/mods:universal-package-install
  - INSTALL_PACKAGES=nerd-fonts-dejavu-complete

Die Weboberfläche bietet unter "Settings" die Option "IME Input Mode", um die Eingabe von nicht-englischen Zeichen zu ermöglichen.

Anwendungsmanagement (PRoot Apps)

Software, die nativ im Container installiert wird (z.B. via apt-get install), geht beim Neuerstellen des Containers verloren. PRoot Apps ermöglichen die Installation portabler Anwendungen in persistentem Speicher im $HOME-Verzeichnis des Benutzers. Diese bleiben über Container-Updates hinweg erhalten.
Beispiel: proot-apps install filezilla
Eine Liste unterstützter Anwendungen findet sich hier. Alternativ können Pakete über den universal-package-install Mod installiert werden, was jedoch die Startzeit erhöhen kann.

Fazit

Der Betrieb von Obsidian in einem Docker-Container mit dem linuxserver/obsidian Image bietet eine ausgezeichnete Möglichkeit, diese flexible Notizanwendung zentralisiert, plattformunabhängig und mit Web-Zugriff zu nutzen. Durch die vielfältigen Konfigurationsoptionen und die Möglichkeit, Erweiterungen wie Git über Docker Mods zu integrieren, lässt sich eine maßgeschneiderte und robuste Wissensmanagement-Lösung aufbauen. Besondere Aufmerksamkeit muss jedoch stets den Sicherheitsaspekten gewidmet werden, insbesondere wenn ein Zugriff von außerhalb des lokalen Netzwerks geplant ist.