Hosten Sie Ihren eigenen KI-Agenten mit OpenClaw - kostenlose 1-Klick-Installation!

NoteDiscovery auf einem VPS mit Docker selbst hosten

Kurz gesagt. NoteDiscovery ist eine quelloffene, selbstgehostete Notiz-App, die Notizen als reine Markdown-Dateien speichert. Diese Anleitung bringt sie auf einem Contabo VPS mit Docker Compose zum Laufen, hinter einem Caddy Reverse Proxy mit automatischem HTTPS. Du richtest einen Cloud VPS 4 ein (4 vCPU-Kerne, 8 GB RAM), holst das offizielle Image ghcr.io/gamosoft/notediscovery, aktivierst den Passwortschutz, verbindest einen KI-Assistenten über MCP und legst Backups an. Dauer: rund 20 Minuten.

Voraussetzungen

NoteDiscovery ist eine schlanke, selbstgehostete Wissensdatenbank und läuft deshalb problemlos auf einem kleinen VPS. Leg dir vorher das Folgende bereit:

  • Einen Contabo Cloud VPS 4 (4 vCPU-Kerne, 8 GB RAM) oder größer mit Ubuntu 24.04 oder neuer
  • Docker und das Docker-Compose-Plugin auf dem Server installiert
  • Eine Domain mit einem A-Record, der auf die IP-Adresse deines VPS zeigt
  • Caddy für automatisches SSL, oder einen bestehenden Reverse Proxy, falls du schon einen betreibst

Wenn du von einem synchronisierten Vault in einer App wie Obsidian wegwillst: selbstgehostete Setups haben denselben Aufbau wie diese Anleitung, also ein Docker-Container, ein Daten-Volume und ein Reverse Proxy davor. Der Unterschied ist, dass NoteDiscovery seine eigene Weboberfläche mitbringt. Ein separates Sync-Plugin musst du also nicht konfigurieren.

Die genannten 20 Minuten gelten, wenn der VPS schon bereitsteht und DNS bereits auf ihn zeigt. Die DNS-Propagierung kann je nach Registrar zusätzlich Wartezeit kosten, also fang mit diesem Schritt an, wenn du live mitarbeitest. Root-Rechte brauchst du nur für die erste Einrichtung des Servers. Sobald Docker installiert ist, läuft jeder weitere Schritt als Container-Operation oder als Bearbeitung einer eingebundenen Konfigurationsdatei.

Schritt 1: VPS bereitstellen und Docker installieren

Die Bereitstellung dauert etwa fünf Minuten und ist der einzige Teil dieser Anleitung, der außerhalb von Docker passiert. Starte einen Cloud VPS 4 im Contabo Customer Control Panel, wähle Ubuntu 24.04 oder neuer und hinterlege deinen SSH-Schlüssel direkt bei der Einrichtung, damit Passwort-Logins komplett wegfallen. Hast du noch kein Schlüsselpaar, erzeuge lokal eines mit ssh-keygen -t ed25519, bevor du das Bestellformular öffnest. Im Customer Control Panel fügst du den öffentlichen Schlüssel direkt im Bereitstellungsdialog ein.

Sobald der Server gebootet ist, verbinde dich und sichere ihn ab, bevor du irgendetwas installierst. Die Firewall-Regeln unten öffnen nur das, was diese Anleitung wirklich braucht: SSH für die Verwaltung und die Ports 80 und 443, damit Caddy HTTP und HTTPS ausliefern kann. Alles andere auf dem Server bleibt von außen unerreichbar. Das zählt hier mehr als bei einer typischen Web-App, weil deine Notizen auf derselben Maschine liegen.

ssh root@your-server-ip
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Ist die Firewall aktiv, installiere Docker und das Compose-Plugin:

curl -fsSL https://get.docker.com | sh
apt install docker-compose-plugin -y
docker --version
docker compose version

Das ist dieselbe Grundlage, auf der jede containerisierte Wissensdatenbank läuft, und genau das, was NoteDiscovery braucht, bevor der eigene Container startet: eine abgesicherte Firewall, eine aktuelle Docker Engine und das Compose-Plugin, damit Multi-Container-Stacks nur einen Befehl entfernt sind. Prüfe, dass beide Versionsbefehle eine Ausgabe liefern, bevor du weitermachst.

Schritt 2: NoteDiscovery mit Docker Compose ausrollen

NoteDiscovery läuft in einem einzigen Container, der ganze Stack passt also in eine Datei. Lege zuerst ein Projektverzeichnis und einen Datenordner an, denn der Datenordner muss existieren, bevor der Container startet:

mkdir -p notediscovery/data && cd notediscovery

Dann erstelle docker-compose.yml:

services:
  notediscovery:
    image: ghcr.io/gamosoft/notediscovery:latest
    container_name: notediscovery
    restart: unless-stopped
    ports:
      - "8000:8000"
    volumes:
      - ./data:/app/data

Jede Zeile hat eine Aufgabe: image holt den offiziellen Build direkt aus der GitHub Container Registry, restart: unless-stopped bringt NoteDiscovery nach einem Neustart oder Absturz zurück, ports bildet Port 8000 des Containers auf denselben Port des Hosts ab, und die einzelne Volume-Zeile ist der Grund, warum deine Notizen bleiben, statt mit dem Container zu verschwinden. Einen Datenbankdienst brauchst du nicht, weil NoteDiscovery keine Datenbank hat.

Starte den Stack:

docker compose up -d
docker compose logs -f notediscovery

NoteDiscovery lauscht jetzt auf Port 8000, und deine Notizen liegen als reine Markdown-Dateien in ./data, nicht in einer Datenbank. Ruf http://your-server-ip:8000 auf und prüfe, dass die Oberfläche lädt, bevor du den Reverse Proxy davorsetzt. Beendet sich der Container sofort wieder, kontrolliere, ob der Ordner data existiert und beschreibbar ist. Ein leeres oder fehlendes Volume ist die häufigste Ursache für einen fehlgeschlagenen ersten Start.

Schritt 3: Caddy als Reverse Proxy mit HTTPS einrichten

Caddy sitzt vor NoteDiscovery und übernimmt HTTPS automatisch, für diesen Schritt brauchst du also nur ein Caddyfile. Prüfe vor der Installation, dass der A-Record deiner Domain auf die IP-Adresse des VPS zeigt. Die automatische Zertifikatsanfrage von Caddy scheitert stillschweigend, wenn die Domain noch nicht auf den Server auflöst. Ein dig notes.example.com, das die IP deines Servers zurückgibt, lohnt sich vorher. Installiere Caddy auf dem Host:

apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install caddy -y

Dann richte das Caddyfile auf deine Domain und den Container-Port aus:

notes.example.com {
    reverse_proxy localhost:8000
}

Lade Caddy neu, es fordert das Zertifikat von Let’s Encrypt von selbst an:

systemctl reload caddy

Wenige Sekunden später liefert deine Domain NoteDiscovery über HTTPS aus, ohne dass du ein Zertifikat anfassen musst. Dasselbe Muster nutzt du für den Obsidian-Zugriff über den Browser und für einen selbstgehosteten Obsidian-Vault auf einer öffentlichen Domain: Caddy terminiert TLS, und der App-Container muss von der Verschlüsselung gar nichts wissen.

Schritt 4: Passwortschutz aktivieren

Der Passwortschutz ist im Standard deaktiviert, und das mitgelieferte Standardpasswort lautet admin. Ihn einzuschalten, einen echten Secret Key zu erzeugen und dieses Passwort zu ändern ist deshalb das Erste, was nach dem HTTPS-Setup dran ist.

Erzeuge zuerst einen Secret Key, der die Session-Cookies verschlüsselt, aus dem laufenden Container heraus:

docker exec -it notediscovery python -c "import secrets; print(secrets.token_hex(32))"

Sichere diesen Wert, dann lade die Standard-Konfigurationsdatei von NoteDiscovery herunter, damit du eine eigene, bearbeitbare Kopie hast:

curl -o config.yaml https://raw.githubusercontent.com/gamosoft/notediscovery/main/config.yaml

Bearbeite die neue config.yaml und setze:

authentication:
  enabled: true
  password: "your-strong-password-here"
  secret_key: "the-value-from-the-command-above"

Binde die Datei in den Container ein, damit deine Änderungen Neustarts und Image-Updates überleben. Ergänze sie in docker-compose.yml neben dem bestehenden Daten-Volume:

    volumes:
      - ./data:/app/data
      - ./config.yaml:/app/config.yaml

Erzeuge den Container neu, damit er das neue Volume übernimmt:

docker compose up -d

Lade die Seite neu, und NoteDiscovery fragt jetzt nach dem Passwort, bevor es irgendeine Notiz zeigt. Diesen Schritt zu überspringen ist keine gute Idee: Die App lauscht standardmäßig auf allen Netzwerkschnittstellen, eine ungeschützte Instanz hinter einer öffentlichen Domain ist also für jeden erreichbar, der die URL findet. Nimm ein Passwort mit echter Entropie, kein kurzes Wort mit angehängter Zahl, und verwende den Secret Key nie in anderen Anwendungen. Zusammen sind beide das Einzige, was zwischen dem Internet und deinem gesamten Vault steht.

Schritt 5: KI-Assistenten über MCP verbinden

NoteDiscovery bringt einen eigenen MCP-Server mit, das Anbinden eines KI-Assistenten ist deshalb ein Konfigurations-Snippet und keine separate Installation. Ergänze das Folgende in der MCP-Server-Konfiguration deines Assistenten, egal ob das Claude Desktop, Cursor oder ein anderer MCP-fähiger Client ist:

{
  "mcpServers": {
    "notediscovery": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "-e",
        "NOTEDISCOVERY_URL=https://notes.example.com",
        "ghcr.io/gamosoft/notediscovery:latest", "python", "-m",
        "mcp_server"]
    }
  }
}

Ersetze den Wert von NOTEDISCOVERY_URL durch deine eigene Domain aus Schritt 3. Sobald der Assistent seine MCP-Server neu lädt, kann er deine Notizen durchsuchen, neue aus einem Prompt anlegen, Tags und Backlinks durch deinen Vault verfolgen und an eine bestehende Notiz anhängen, etwa an ein Tagesjournal, alles ohne das Chatfenster zu verlassen. Ein Prompt wie „finde alle meine Notizen zu Docker-Deployment“ oder „füge diese Idee dem heutigen Journaleintrag hinzu“ läuft über dieselben MCP-Tools, die ein Mensch sonst in der Weboberfläche anklicken würde.

Das ist die Funktion, die NoteDiscovery am stärksten von einer Wissensdatenbank unterscheidet, die nur für Menschen gebaut ist: Dieselben Notizen sind für einen KI-Assistenten über ein dokumentiertes Protokoll lesbar, nicht über eine Browser-Erweiterung ausgelesen. Authentifiziert sich der Client deines Assistenten über HTTPS statt über einen lokalen Docker-Befehl, richte ihn auf die öffentliche Domain aus Schritt 3 aus statt auf die Container-URL oben.

Schritt 6: Notizen sichern

Die Notizen liegen als reine Markdown-Dateien in ./data, das Backup ist also ein Datei-Sync und kein Datenbank-Export. Am einfachsten geht das mit einem geplanten Sync zu deinem Speicherziel:

apt install rclone -y
rclone config
# create a remote named "storage" pointing at your storage location
rclone sync /root/notediscovery/data storage:notediscovery-backup

Leg einen täglichen Cron-Eintrag an, damit der Sync unbeaufsichtigt läuft:

crontab -e
# 0 3 * * * rclone sync /root/notediscovery/data storage:notediscovery-backup

Weil der ganze Vault aus Markdown-Dateien auf der Platte besteht, lässt sich eine solche Wissensdatenbank leicht wiederherstellen: Kopiere den gesicherten Datenordner auf einen frischen VPS, richte dieselbe Docker-Compose-Datei darauf aus und starte den Container. Spiel diese Wiederherstellung einmal wirklich durch, auf einem freien VPS oder in einer lokalen Docker-Installation, denn ein Backup, dessen Wiederherstellung du nie getestet hast, ist nur eine Vermutung. Behalte in deinem Storage-Bucket mindestens ein paar Tage Historie, statt einen einzelnen Snapshot zu überschreiben, damit ein fehlerhafter Sync oder ein versehentliches Löschen nicht die einzige Kopie vernichtet.

Fehlerbehebung

Fast alles, was in diesem Setup schiefgehen kann, geht auf eine von drei Ursachen zurück: ein fehlendes Volume, eine Zertifikatsanfrage vor fertigem DNS, oder eine Konfigurationsänderung, die nur im Container gelandet ist.

Der Container beendet sich direkt nach docker compose up -d. Die häufigste Ursache ist ein fehlender oder nicht beschreibbarer Datenordner, denn NoteDiscovery erwartet ihn als bereits vorhanden. Führe mkdir -p notediscovery/data aus Schritt 2 erneut aus, prüfe, dass der Ordner deinem Benutzer oder root gehört, und starte den Stack noch einmal mit docker compose up -d.

Caddy bekommt kein Zertifikat, und die Seite bleibt auf HTTP. Das heißt fast immer, dass der A-Record der Domain bei der ersten Anfrage von Caddy noch nicht auf die VPS-IP zeigte. Prüfe die Auflösung mit dig notes.example.com und lade Caddy dann mit systemctl reload caddy neu, sobald der Record propagiert ist. Am Caddyfile musst du nichts ändern.

Die Änderung an Passwort oder Secret Key aus Schritt 4 greift nicht. Ein einfaches docker compose restart verwendet den bestehenden Container weiter und übernimmt deshalb kein config.yaml-Volume, das gerade erst in docker-compose.yml ergänzt wurde. Nutze stattdessen docker compose up -d, das den Container mit dem neuen Volume neu erzeugt.

FAQ: NoteDiscovery einrichten

Wie migriere ich von Obsidian zu NoteDiscovery?

Kopiere den Ordner deines Obsidian-Vaults direkt in das Datenverzeichnis von NoteDiscovery, denn beide speichern Notizen als reine Markdown-Dateien mit derselben Ordnerstruktur. Ein selbstgehosteter Obsidian-Vault braucht keine Formatkonvertierung: Starte den Container nach dem Kopieren neu, und deine Notizen, Ordner und internen Links erscheinen sofort im Dateibrowser von NoteDiscovery, bereit zum Bearbeiten oder Durchsuchen.

Läuft NoteDiscovery auf einem VPS mit 2 GB?

Ja, NoteDiscovery ist schlank genug für einen VPS mit 2 GB, wenn du allein damit arbeitest und eine überschaubare Notizsammlung hast, denn es hat keine Datenbank und einen kleinen Runtime-Footprint. Größere Vaults, mehrere gleichzeitige Nutzer oder intensive Plugin-Nutzung profitieren von mehr RAM, deshalb setzt diese Anleitung auf einen Cloud VPS 4 mit 8 GB als bequeme Arbeitsbasis.

Wie füge ich eigene Plugins zu NoteDiscovery hinzu?

Binde einen Plugin-Ordner als Docker-Volume ein und lege deine Plugin-Dateien darin ab, passend zur Struktur aus dem Plugin-Guide des Projekts. NoteDiscovery lädt Plugins beim Containerstart aus diesem eingebundenen Verzeichnis, ein Neustart nach dem Hinzufügen oder Aktualisieren eines Plugins genügt also, um die Änderung zu übernehmen, ohne das Image neu zu bauen.

Nach oben scrollen