Konfigurationsreferenz

Vollständige Referenz für nostrfy.toml: jeder Schlüssel, sein Typ, sein Standardwert und genau was er bewirkt — Limits, Datenbank, Daemon, Zugriffskontrolle und Blossom.

Grundlagen

Die Konfiguration ist eine TOML-Datei, standardmäßig nostrfy.toml genannt. Erstellen Sie sie mit init:

sh
nostrfy --config nostrfy.toml init

Validieren Sie sie (vor jedem Start empfohlen):

sh
nostrfy --config nostrfy.toml check

Jeder Befehl akzeptiert --config <path> (Standard nostrfy.toml).

Allgemeine Syntax:

toml
[section]
key = "string"
key = 8080
key = [1, 2]
key = true

Konfigurationsabschnitte

AbschnittZweck
[relay]Identität, URLs und NIP-Schalter
[server]Netzwerk-Bindung, API-Trennung, Metriken
[rpc]NIP-86-Verwaltungs-RPC (Auth, Body-Limit)
[limits]Alle Limits und Überlastschutzmaßnahmen
[database]LMDB-Speicher, Suchindex, Queue-Begrenzungen
[daemon]PID-, Log- und Statistikdateien sowie Rotation
[access]Initiale Zugriffskontrolllisten (zur Laufzeit änderbar)
[blossom]Blossom-Dateiserver (Medien-Hosting)

Jeder Schlüssel ist optional; ein fehlender Schlüssel verwendet seinen Standardwert.

Abschnitt [relay] — Relay-Identität

SchlüsselTypStandardBeschreibung
namestring"nostrfy"Relay-Name, der Clients per NIP-11 angezeigt wird
descriptionstring"A minimal and stable Nostr relay"Relay-Beschreibung (NIP-11)
pubkeystring (64 hex)""Öffentlicher Schlüssel des Administrators (NIP-11-pubkey-Feld)
contactstring""Kontakt-URI des Administrators (mailto: oder https://)
iconstring""Relay-Icon-Bild-URL
post_policystring""URL zur Posting-Richtlinie des Relays
private_keystring (64 hex)""Der eigene geheime Schlüssel des Relays; erforderlich für NIP-29-Gruppen
public_urlstring""Öffentliche URL, z. B. wss://relay.example.com
livekit_urlstring""LiveKit-Server-URL für NIP-29-Audio-/Videoräume
livekit_api_keystring""LiveKit-API-Schlüssel
livekit_api_secretstring""LiveKit-API-Secret (zum Signieren von JWTs)
enabled_nipsarray of integers[]Explizite NIP-Allowlist
disabled_nipsarray of integers[]Zu deaktivierende NIPs (ignoriert, wenn enabled_nips nicht leer ist)
reject_ephemeralbooleanfalseNIP-01-ephemere Events ablehnen (Kinds 20000–29999)
enabled_gitbooleanfalseNIP-34-Git-Events akzeptieren (Kinds 1617–1633, 30617/30618)
require_powinteger0Erforderlicher Proof-of-Work in führenden Null-Bits
new_pubkey_min_age_secsinteger0Events von Pubkeys ablehnen, die jünger sind als dieser Wert (Sekunden; 0 = aus)
max_events_per_min_per_pubkeyinteger0Veröffentlichungs-Ratenlimit pro Pubkey (pro Minute; 0 = kein Limit)
max_groupsinteger1000Obergrenze für den In-Memory-NIP-29-Gruppenspeicher
require_authbooleanfalseNIP-42-Authentifizierung für REQ/EVENT/COUNT/NEG erfordern
send_auth_challengebooleantrueAUTH-Challenge bei Verbindung senden
enabled_nip78_authbooleantrueNIP-42-AUTH vor Annahme von Kind-78/30078-Events erfordern
enabled_command_eventsbooleanfalseKind:1-Operatorbefehle ausführen, die vom Admin-Pubkey verfasst wurden

Details zu Schlüsseln

  • private_key — der eigene geheime Schlüssel des Relays, verwendet zum Signieren Relay-generierter Events: NIP-29-Gruppenmetadaten (39000–39005) und NIP-43-Rollen-/Mitgliedschafts-Events. Generieren Sie ihn mit nostrfy genkey; halten Sie ihn geheim. Er wird einmal beim Start gelesen, daher erfordert eine Änderung einen Neustart.
  • public_url — wird zur Validierung URL-tragender Tags von Clients verwendet: NIP-42-AUTH, NIP-62-Vanish und NIP-98-Admin-Auth. Wenn leer, fällt das Relay auf host:port zurück, was niemals mit einer echten Client-URL übereinstimmt, wenn 0.0.0.0 oder 127.0.0.1 gebunden ist (eine Warnung wird geloggt). Immer setzen.
  • enabled_nips vs disabled_nips — die Allowlist gewinnt: wenn enabled_nips nicht leer ist, werden nur deren NIPs beworben und disabled_nips wird ignoriert. Beides erfordert einen Neustart.
  • reject_ephemeral — Kinds 20000–29999 werden abgelehnt, aber die ausgenommenen Kinds, die laut NIPs weitergeleitet werden müssen, werden weiterhin weitergeleitet: 22242, 27235, 28934/28935/28936, 24133, 23194/23195, 24242 und 21059. Gilt bei SIGHUP.
  • enabled_git — Opt-in für NIP-34: akzeptiert Kinds 1617–1633 und 30617/30618 und bewirbt NIP-34. Standardmäßig aus, da Patch-Payloads groß sein können. Gilt bei SIGHUP.

Abschnitt [server] — Servereinstellungen

SchlüsselTypStandardBeschreibung
hoststring"127.0.0.1"Bind-Adresse; 0.0.0.0 akzeptiert Verbindungen von überall
portinteger8080Port (1–65535); Port 80 erfordert Root
api_hoststring""Hostname, der ausschließlich für die REST-API vorgesehen ist
metrics_enabledbooleantruePrometheus-Metriken unter /metrics bereitstellen
ws_pathsstring"root"WebSocket-Endpunktpfade: root, inbox-outbox oder all
inbox_write_policystring"any"Wer nach /inbox schreiben darf: „any“ oder „relay“ (Events müssen weiterhin einen p-Tag tragen)
outbox_write_policystring"any"Wer nach /outbox schreiben darf: „any“ (eigene Events des NIP-42-authentifizierten Pubkeys) oder „relay“
trusted_proxiesarray of strings[]Reverse-Proxy-Adressen/CIDRs, deren X-Forwarded-For vertraut wird (leer = keinem Proxy vertrauen)

Details zu Schlüsseln

  • host — 0.0.0.0 bindet alle IPv4-Schnittstellen; 127.0.0.1 ist nur lokal.
  • port — 1–65535; Port 80 erfordert Root. Dieser eine Port bedient gemeinsam das WebSocket-Relay, das NIP-11-Dokument, die REST-API und die NIP-86-RPC.
  • api_host — widmet die REST-API einem einzigen Hostnamen, sodass sich API und Relay einen Port hinter einem Reverse-Proxy teilen können. Beim Start fixiert — erfordert einen Neustart.
  • ws_paths — root bedient nur /, inbox-outbox bedient nur /inbox und /outbox, all bedient beides. Beim Start fixiert — erfordert einen Neustart.
  • trusted_proxies — listen Sie nur die eigenen Adressen des Proxys auf (Loopback für nginx/Caddy auf demselben Host, Quellbereich des Load-Balancers in der Cloud). Wenn gesetzt, wird die Client-IP aus dem letzten nicht vertrauenswürdigen X-Forwarded-For-Eintrag abgeleitet für die Pro-IP-Begrenzungen, das Ratenlimit, blockip und die Logs. Fügen Sie niemals eine Adresse hinzu, die Clients direkt erreichen können — sie könnten den Header fälschen und die Pro-IP-Limits umgehen. Beim Start fixiert — erfordert einen Neustart.

Abschnitt [rpc] — NIP-86-Verwaltung

SchlüsselTypStandardBeschreibung
management_tokenstring""Bearer-Token für die Verwaltungs-APIs
admin_pubkeystring (64 hex)""Administrator-Pubkey für NIP-98-Verwaltungsauth
max_admin_body_bytesinteger65536Body-Limit für die NIP-86-Verwaltungs-RPC

Die NIP-86-RPC ist auf den öffentlichen POST /-Routen des Relays eingebunden — es gibt keinen separaten Verwaltungsport. management_token und admin_pubkey erscheinen in alten Anleitungen manchmal unter [server]; diese Schreibweisen sind veraltete Aliase dieser [rpc]-Schlüssel.

Abschnitt [limits] — Limits und Schutzmaßnahmen

Verbindungen und Nachrichten

SchlüsselTypStandardBeschreibung
max_connectionsinteger10000Maximale gleichzeitige Verbindungen
max_connections_per_ipinteger64Max. Verbindungen pro Quell-IP
max_ws_message_bytesinteger1048576Max. Bytes pro WebSocket-Nachricht/Frame
socket_recv_buffer_kbinteger64Kernel-Empfangspuffer pro Verbindung (KiB)
max_out_queue_bytesinteger262144Begrenzung der Ausgangsqueue pro Verbindung (Bytes)
ws_idle_timeout_secsinteger300Untätige Verbindungen nach dieser Zeit schließen
http_read_timeout_secsinteger30HTTP-Request-Head-Timeout (Slow-Loris-Abwehr)
max_connections_per_sec_per_ipinteger0Max. neue Verbindungen pro Sekunde pro Quell-IP

Abonnements und Abfragen

SchlüsselTypStandardBeschreibung
max_filtersinteger20Max. Filter pro REQ
max_subscriptionsinteger20Max. Abonnements pro Verbindung
max_limitinteger500Obergrenze für das REQ-Limit
max_countinteger2000Obergrenze für COUNT-Ergebnisse
max_sub_id_leninteger64Max. Abonnement-ID-Länge (Zeichen, nicht Bytes)
max_sub_bytesinteger1048576Gesamte Abonnement-Filterbytes pro Verbindung
max_req_response_bytesinteger33554432 (32 MB)Obergrenze für die Gesamtbytes, die eine einzelne REQ-Antwort senden darf

Events

SchlüsselTypStandardBeschreibung
max_content_bytesinteger65536Max. Event-Inhaltslänge in Zeichen
max_tagsinteger2000Max. Tags pro Event
max_tag_value_bytesinteger1024Max. Bytes pro Tag-Wert
max_created_at_future_secsinteger3600Tolerierte Zukunftsabweichung von created_at
group_late_publish_secsinteger3600Tolerierte Verzögerung für NIP-29-Gruppenadmin-Events (Sekunden)
max_neg_itemsinteger100000Max. Datensätze pro NIP-77-Negentropy-Sync

Veraltete Aliase: limits.require_pow, limits.new_pubkey_min_age_secs und limits.max_indexed_words werden weiterhin als Aliase von relay.require_pow, relay.new_pubkey_min_age_secs und database.max_indexed_words akzeptiert.

REST-API

SchlüsselTypStandardBeschreibung
max_api_concurrentinteger8Max. gleichzeitige /api/v1-Anfragen
max_api_limitinteger5000Obergrenze für den API-limit-Parameter
max_api_offsetinteger50000Obergrenze für den API-offset-Parameter
max_api_fetchinteger55001Max. Over-Fetch-Fenster für Offset-Abfragen — muss max_api_offset + max_api_limit + 1 abdecken (0 = keine Begrenzung)
max_api_search_bytesinteger2048Max. Bytes des API-search-Parameters

Live-Fan-out

SchlüsselTypStandardBeschreibung
live_batch_interval_msinteger20Wie oft Live-Events geflusht werden (ms)
live_batch_sizeinteger32Max. Events pro Live-Batch
live_bufferinteger65536Live-Fan-out-Queue-Größe

Abschnitt [database] — Datenbank

SchlüsselTypStandardBeschreibung
pathstring"./data"Datenbankverzeichnis (LMDB)
max_dbsinteger32LMDB-max. benannte Datenbanken
max_readersinteger128LMDB-max. gleichzeitige Leser
map_sizeinteger1073741824 (1 GB)Untergrenze für die Memory-Map-Größe (Bytes)
max_map_sizeinteger1099511627776 (1 TB)Obergrenze der Memory-Map (Bytes)
purge_interval_secsinteger300NIP-40-Bereinigungsintervall (Sekunden)
search_indexbooleantrueNIP-50-Wortindex aktivieren
reader_threadsinteger2Dedizierte Scan-Threads
max_indexed_wordsinteger32Wörter jedes Event-Inhalts, die für die Suche indexiert werden
meta_indexbooleantrueMetadaten-Header pro Event schreiben, der vom Scan-Prefilter verwendet wird
disabled_fsyncbooleanfalseSynchronen Disk-Flush nach jedem Schreibbatch überspringen
db_buffer_sizeinteger2048Initialer WebSocket-Puffer pro Verbindung (Bytes)
db_request_timeout_secsinteger30Wie lange eine Datenbankanfrage warten darf, bevor sie fehlschlägt
max_db_queue_msgsinteger4096Max. wartende Nachrichten in der Queue vor Fail-Fast
max_db_queue_eventsinteger262144Max. Events in wartenden Batches vor Fail-Fast
max_db_queue_bytesinteger268435456 (256 MiB)Max. Bytes wartender Datenbankanfragen vor Fail-Fast (0 = keine Byte-Begrenzung)

Details zu Schlüsseln

  • map_size — die Untergrenze für die Memory-Map: die Map wird immer mindestens so groß geöffnet.
  • max_map_size — die Obergrenze, geöffnet als spärliche virtuelle Reservierung: physischer Speicher wächst nur mit den tatsächlich geschriebenen Daten. Erhöhen Sie sie bei database map is full.
  • search_index = false — die Suche funktioniert weiterhin (Ganzwortsuche im Inhalt), aber Scans werden langsamer; auf einem winzigen VPS halbiert es die Datenbank. Für kleine Instanzen empfohlen.
  • disabled_fsync — tauscht Haltbarkeit gegen Durchsatz: Schreibvorgänge landen im OS-Page-Cache und bei Stromausfall können die neuesten Schreibvorgänge verloren gehen.

Abschnitt [daemon] — Daemon

SchlüsselTypStandardBeschreibung
pid_filestring"./nostrfy.pid"PID-Dateipfad
log_filestring"./nostrfy.log"Log-Dateipfad
stats_filestring"./nostrfy.stats.json"Statistikdateipfad
stats_interval_secsinteger5Statistik-Schreibintervall (Sekunden)
max_log_size_bytesinteger52428800 (50 MB)Log-Rotationsgröße (0 = keine Rotation)
max_log_filesinteger5Aufzubewahrende rotierte Log-Generationen

Pfade werden relativ zum Verzeichnis der Konfigurationsdatei aufgelöst, sodass sie gültig bleiben, nachdem der Daemon sein Arbeitsverzeichnis wechselt.

Abschnitt [access] — Zugriffskontrolle

SchlüsselTypStandardBeschreibung
restrict_relaybooleanfalseNur allow-gelistete Pubkeys dürfen veröffentlichen
blocked_kindsarray of integers[]Abzulehnende Kinds
allowed_kindsarray of integers[]Kind-Allowlist; nur diese Kinds werden akzeptiert, wenn nicht leer
blocked_ipsarray of strings[]IP-Adressen, die beim Verbindungsaufbau abgewiesen werden
method_grantstable: pubkey → array of strings{}NIP-86-Methodengrants für Nicht-Admin-Pubkeys (zur Laufzeit mit assignmethod verwaltet)

Die Pubkey-Allow-/Deny-Listen sind keine Konfigurationsschlüssel — sie leben in der Relay-Datenbank (LMDB) und werden zur Laufzeit verwaltet:

sh
nostrfy relay allow npub1...
nostrfy relay deny npub1...
nostrfy relay list
  • restrict_relay = true — nur die allow-gelisteten Pubkeys dürfen veröffentlichen, während das Lesen für alle offen bleibt (jeder Client kann weiterhin abonnieren und abrufen).
  • Ein denied Pubkey wird beim Veröffentlichen immer abgewiesen und beim Lesen nie bedient.
  • method_grants — NIP-86-Methodengrants für Nicht-Admin-Pubkeys (Pubkey → Methodennamen, z. B. ein Moderator mit banevent und listbannedevents). Beim ersten Start aus der Konfiguration initialisiert, dann zur Laufzeit mit NIP-86 assignmethod/unassignmethod verwaltet (prüfbar mit listmethodassignees). Nur Moderations- und Lesemethoden sind übertragbar — Berechtigungs-, Rollen-, Invite-Claim- und Relay-Identitätsverwaltung bleiben Admin-only, und ein gebannter Pubkey wird auch mit Grants abgewiesen. Siehe die Verwaltungs-API.

Abschnitt [blossom] — Blossom-Dateiserver

SchlüsselTypStandardBeschreibung
hoststring""Hostname für den Blossom-Server (leer = deaktiviert)
storagestring"local"Backend: „local“ (local_path) oder „s3“ (S3-kompatibler Bucket)
local_pathstring"/var/lib/nostrfy/images"Lokales Speicherverzeichnis für Mediendateien
max_upload_bytesinteger20971520 (20 MB)Max. Mediendateigröße
min_free_bytesinteger33554432 (32 MB)Festplattenspeicher, unterhalb dessen Uploads abgelehnt werden
s3_endpointstring""S3-kompatibler Endpunkt (z. B. R2)
s3_regionstring""S3-Region (R2 verwendet „auto“)
s3_bucketstring""S3-Bucket-Name
s3_access_keystring""S3-Zugangsschlüssel
s3_secret_keystring""S3-Geheimschlüssel
restrict_uploadsbooleanfalseNur allow-gelistete Pubkeys dürfen hochladen

Neuladen zur Laufzeit (SIGHUP)

Das Bearbeiten der Datei und Senden von kill -HUP $(cat nostrfy.pid) lädt die Konfiguration ohne Neustart neu. Die meisten Einstellungen wirken sofort; einige sind beim Start fixiert:

Gilt bei SIGHUPErfordert Neustart
relay.name, description, pubkey, contact, icon, post_policy, public_urlrelay.private_key
reject_ephemeral, enabled_git, enabled_nip78_authrelay.livekit_*, enabled_nips / disabled_nips
der Großteil von [limits]api_host, trusted_proxies, metrics_enabled, ws_paths, database.*, Daemon-Größen, Limit-Obergrenzen, blossom.*

[access] wird durch ein Neuladen nicht angewendet — die Listen werden einmal beim Start initialisiert und dann zur Laufzeit per NIP-86 verwaltet. Das Log warnt, wenn sich eine neustartpflichtige Einstellung geändert hat, und einige beim Start erfasste Einstellungen werden beim Neuladen nicht geprüft.

Häufige Fehler
FehlerLösung
public_url nicht gesetztsetzen Sie wss://...
host auf 127.0.0.1 belassenexterne Clients können sich nicht verbinden
private_key nicht gesetzt bei NIP-29nostrfy genkey ausführen + Neustart
restrict_relay true mit leerer Allowlistalle ausgesperrt
neustartpflichtige Schlüssel geändert und nur SIGHUP gesendetnutzen Sie nostrfy restart