NotariumDokumentation
Dokumentationsversion: latest
DE

Umgebungsvariablen

Notarium wird über Umgebungsvariablen konfiguriert. Die Standardwerte funktionieren so, wie sie sind — für einen lokalen Start musst du nichts ausfüllen: Kopiere .env.example nach .env und passe nur die Zeilen an, die du wirklich brauchst. Der Docker-Stack reicht .env unverändert in den Container durch (die Werte werden nicht ins Image eingebacken), deshalb beschreibt dieselbe Datei sowohl deine lokale als auch deine Produktionsinstanz.

cp .env.example .env      # die Standardwerte funktionieren — ändere nur, was nötig ist

Nachfolgend die vollständige Referenz. Ein Teil der Variablen wird direkt in .env.example gesetzt, ein anderer (die Feinabstimmung der Suche) hat Standardwerte im Code und ist im Beispiel nicht aufgeführt — diese sind gesondert gekennzeichnet.

Kern

Die Grundlagen: Port, Authentifizierungsmodus sowie der Ort von Metadaten-Datenbank und Spaces.

VariableZweckStandardBeispiel
DATA_DIRDie einzige Daten-Stellschraube: die Wurzel, aus der alles Übrige abgeleitet wird — Metadaten-Datenbank, Indizes, Notizen, Artefakte. Nicht gesetzt → es greift ein sinnvoller Standard./data (Docker); ~/.local/share/notarium (Host)DATA_DIR=/srv/notarium
PORTDer Port, auf dem das Backend lauscht; ein einziger Fastify-Listener bedient /api, /mcp und die statischen Assets der SPA.3000PORT=3000
AUTH_MODEAuthentifizierungsmodus: password (Login plus Setup-Bildschirm beim ersten Start, erfordert die Metadaten-Datenbank) oder none (ein einzelner All-Access-Principal für Desktop/Dev/vertrauenswürdiges Intranet, ohne Login-UI).passwordAUTH_MODE=none
META_DB_URLDie Metadaten-Datenbank: Identität, Revisionsprotokoll, Space-Registry, Authentifizierung, Projekte. Standardmäßig SQLite unter DATA_DIR, deshalb funktioniert der password-Modus ohne Einrichtung. Optional: nur setzen, um den Metadaten-Zustand in ein externes Postgres zu verlagern (gemeinsamer Zustand, HA).sqlite:<DATA_DIR>/meta.dbMETA_DB_URL=postgres://user:pass@db:5432/notarium
SPACES_ROOTDie Wurzel, in der jeder Space ein Ordner ist; ermöglicht das Anlegen von Spaces aus der Oberfläche zur Laufzeit. Optional: standardmäßig <DATA_DIR>/spaces — nur setzen, wenn deine Notizen außerhalb des Datenverzeichnisses liegen.<DATA_DIR>/spacesSPACES_ROOT=/mnt/notes
SPACES_CONFIGExplizite Space-Topologie: Inline-JSON oder ein Pfad zu einer JSON-Datei. Überschreibt die Single-Space-Variablen.nicht gesetztSPACES_CONFIG=/data/spaces.json
ENGINE_DATA_DIRWo die Engine die abgeleiteten Indizes ablegt — eine Datei pro Space. Der Dateiname folgt dem Ordnernamen des Spaces und ändert sich beim Umbenennen des Spaces nicht. Verzeichnis gelöscht → Reindizierung beim Start; der Index ist wiederherstellbar. Optional: standardmäßig <DATA_DIR>/engine — setzen, um die Indizes auf eine andere Platte auszulagern.<DATA_DIR>/engineENGINE_DATA_DIR=/mnt/ssd/engine
JOBS_DATA_DIRDas Job-Verzeichnis: Artefakte asynchroner Exporte (abgeleitet, werden per TTL bereinigt) und die hochgeladenen Dateien eines unfertigen Imports — diese leben genau so lange wie ihr Job und gehören deshalb ins Backup. Optional: standardmäßig <DATA_DIR>/jobs — setzen, um es auf eine andere Platte auszulagern.<DATA_DIR>/jobsJOBS_DATA_DIR=/mnt/ssd/jobs
SPACE_IDLE_EVICT_SECONDSDas Read-Model eines inaktiven Spaces aus dem Speicher räumen. 0 — warm halten; Spaces mit einer aktiven SSE-Verbindung werden nie geräumt.0SPACE_IDLE_EVICT_SECONDS=900
SYNC_POLL_SECONDSDas Abfrageintervall für externe Änderungen auf der Platte (jede Abfrage ist ein vollständiger Rescan des Spaces). 0 — Abfrage abschalten. Für nicht überwachbare Mounts (Netzwerk-Volume, In-Memory) ist das effektive Intervall nach oben auf 60 s begrenzt.120SYNC_POLL_SECONDS=0
PUBLIC_BASE_URLDie kanonische externe Adresse der Instanz hinter einem Reverse-Proxy — für die OAuth-Metadaten der MCP-Connectors. Ohne sie wird die Adresse aus den Forwarded-Headern des Proxys abgeleitet.nicht gesetztPUBLIC_BASE_URL=https://notes.example.com
TRUST_PROXYEine kommagetrennte Liste der IPs/CIDRs der unmittelbar vorgelagerten Proxys — daraus wird die echte Client-IP für Login-Rate-Limits und für die Zulassung neuer OAuth-Clients abgeleitet. Nicht gesetzt heißt: sicherer Standard, X-Forwarded-For wirkt sich nicht auf die Limits aus. Boolesche Werte, Hop-Zähler, benannte Bereiche und Bereiche über alle Adressen (/0) werden beim Start abgelehnt.nicht gesetztTRUST_PROXY=172.18.0.0/16
Metadaten-Datenbank vs. Dateien

Auf der Platte liegen zwei verschiedene Dinge. SPACES_ROOT ist die Markdown-Wahrheit (deine Notizen, ein Ordner pro Space). META_DB_URL ist die Metadaten-Datenbank: das, was sich nicht aus den Dateien ableiten lässt (Benutzer, Zugriffe, Versionsverlauf). Mehr im Abschnitt Self-Hosting.

Single-Space (Bare-Host, ohne Docker)

Für den Betrieb eines einzelnen Spaces ohne SPACES_CONFIG und ohne SPACES_ROOT (zum Beispiel ein lokaler Bare-Run ohne Docker).

VariableZweckStandardBeispiel
ENGINEDie Engine eines einzelnen Spaces. Der einzige Wert ist notarium; du kannst die Variable weglassen.notariumENGINE=notarium
NOTES_DIRAbsoluter Pfad zum Notizordner eines einzelnen Spaces (Single-Space-Modus).nicht gesetztNOTES_DIR=/home/me/notes

Semantische Suche

Die lexikalische Volltextsuche (FTS) funktioniert immer und ohne Konfiguration. Semantische (Vektor-) und hybride Suche musst du ausdrücklich aktivieren: ein schwerer nativer Stack (onnxruntime + sqlite-vec, ~660 MB auf der Platte) plus das Embedding-Modell bge-m3 (~600 MB auf der Platte, Hunderte MB RAM). Die Variablen unten haben Standardwerte im Code und sind in .env.example nicht aufgeführt.

VariableZweckStandardBeispiel
VECTOR_SEARCHon/off — schaltet Semantik und hybride Fusion ein. Fehlt der native Stack, fällt on auf die Volltextsuche zurück — ohne Fehler.on (Code), off (veröffentlichtes Image)VECTOR_SEARCH=on
EMBED_MODELDie ID des Embedding-Modells (transformers.js/ONNX). Zusammen mit EMBED_DIMENSIONS setzen.Xenova/bge-m3EMBED_MODEL=Xenova/multilingual-e5-small
EMBED_DIMENSIONSDie Vektorbreite; sie muss zum Modell passen (bge-m3 — 1024, e5-small — 384). Eine Abweichung ist fail-closed: Die Notiz bleibt FTS-only.1024EMBED_DIMENSIONS=384
EMBED_DTYPEQuantisierung des Modells: fp32 / fp16 / q8 / q4.q8EMBED_DTYPE=fp16
EMBED_THREADSDie Anzahl der ONNX-Intra-op-Threads pro Worker der Hintergrundindizierung (ein Pool aus EMBED_WORKERS Workern).1 pro Worker (Fallback ohne Pool — die Hälfte der Kerne)EMBED_THREADS=2
EMBED_WORKERSDie Größe des worker_threads-Pools für Embeddings = Parallelität der Hintergrundindizierung über die Kerne. Jeder Worker hält seine eigene Kopie des Modells (das schlägt auf den RAM durch).max(1, min(Kerne−2, 4))EMBED_WORKERS=8
EMBED_QUERY_PREFIX / EMBED_PASSAGE_PREFIXPräfixe für asymmetrische Modelle (e5). Für das symmetrische bge-m3 nicht setzen — sonst sinkt die Qualität, ohne dass du es merkst.nicht gesetztEMBED_QUERY_PREFIX="query: "
EMBED_CPU_MEM_ARENAon/off. off hält den Verbrauch konstant bei ~1,9 GB RAM für bge-m3 — ein Schutz gegen OOM auf einer knappen Maschine ohne Swap (mit on kann die Arena auf mehrere GB anwachsen).onEMBED_CPU_MEM_ARENA=off
GRAPH_BOOSTon/off — ein dritter RRF-Kanal (ein Graph-Boost über Links, 1-Hop-Wiki-Link). Wirkungslos, wenn VECTOR_SEARCH=off.offGRAPH_BOOST=on
Zwei unabhängige Schalter

Damit die Semantik lokal funktioniert, brauchst du beides: den nativen Stack installiert (make deps-vector; das standardmäßige make deps installiert ihn nicht, das veröffentlichte Image bringt ihn immer mit) und VECTOR_SEARCH=on. Fehlt der Stack, fällt on auf die lexikalische Volltextsuche zurück — ohne Fehler. Mehr in den Abschnitten Suche und Suche einrichten.

Backup und Wiederherstellung

Die eingebauten Befehle backup, backup verify und restore funktionieren ohne Konfiguration. Die Variablen unten brauchst du nur, wenn die Container-Wurzel schreibgeschützt eingehängt ist oder deine Datenmenge deutlich über dem Üblichen liegt. Mehr unter Backup und Wiederherstellung.

VariableZweckStandardBeispiel
NOTARIUM_BACKUP_TMPDIRDas Verzeichnis für die Zwischendateien von Backup, Verifizierung und Wiederherstellung. Setz es, wenn die Container-Wurzel read-only ist oder unter /tmp der Platz knapp wird: Ein Streaming-Backup kann zeitweise Raum für das Archiv plus zwei entpackte Stages brauchen./tmpNOTARIUM_BACKUP_TMPDIR=/mnt/scratch
NOTARIUM_BACKUP_MAX_BYTESDie Größenobergrenze — sowohl für die komprimierte Eingabe als auch für die entpackten Nutzdaten. Ein Schutz gegen Zip-Bomben; nur große, vertrauenswürdige Installationen heben sie an.64 GiBNOTARIUM_BACKUP_MAX_BYTES=137438953472
NOTARIUM_BACKUP_MAX_ENTRIESDie Obergrenze für die Anzahl der Einträge im Archiv.1000000NOTARIUM_BACKUP_MAX_ENTRIES=2000000
NOTARIUM_BACKUP_MAX_METADATA_BYTESEine gesonderte Speicherobergrenze für Namen, die internen Strukturen des ZIP und manifest.json.32 MiBNOTARIUM_BACKUP_MAX_METADATA_BYTES=67108864

Docker und Build

VariableZweckStandardBeispiel
IMAGE / TAGDie Image-Referenz für docker compose / make up. Der Haupt-Installationspfad ist das öffentliche Image docouno/notarium:latest; überschreib die Koordinate, um deine eigene Registry oder einen bestimmten Image-Tag zu verwenden.docouno/notarium:latestIMAGE=docouno/notarium TAG=latest
GIT_SHA / BUILD_TIMEBuild-Args; werden in GET /api/about und den Tab Settings → About eingebettet. Ohne sie — null.leerGIT_SHA=$(git rev-parse --short HEAD)
Das Image und der Bau aus dem Quellcode

docouno/notarium:latest ist das öffentliche Image und der Haupt-Installationspfad; IMAGE / TAG legen fest, welches Image docker compose / make up zieht. Wenn das Image noch nicht aus der Registry gezogen wurde — bau es aus dem Quellcode des Hauptrepositorys: make up (das Verhalten ist identisch).

Siehe auch