設定參考

nostrfy.toml 的完整參考:每個鍵、類型、預設值及其確切作用 — 限制、資料庫、常駐程式、存取控制與 Blossom。

基礎

設定是一個 TOML 檔案,預設名為 nostrfy.toml。用 init 建立它:

sh
nostrfy --config nostrfy.toml init

驗證它(建議每次啟動前都執行):

sh
nostrfy --config nostrfy.toml check

每個指令都接受 --config <path>(預設 nostrfy.toml)。

一般語法:

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

設定區段

區段用途
[relay]身分、URL 與 NIP 切換
[server]網路綁定、API 拆分、指標
[rpc]NIP-86 管理 RPC(認證、請求主體限制)
[limits]所有限制與過載保護
[database]LMDB 儲存、搜尋索引、佇列上限
[daemon]PID、日誌與統計檔案及輪替
[access]初始存取控制清單(執行階段可變更)
[blossom]Blossom 檔案伺服器(媒體託管)

每個鍵都是選用的;缺少的鍵使用其預設值。

[relay] 區段 — 中繼身分

鍵類型預設值說明
namestring"nostrfy"透過 NIP-11 向用戶端顯示的中繼名稱
descriptionstring"A minimal and stable Nostr relay"中繼說明(NIP-11)
pubkeystring (64 hex)""管理員公鑰(NIP-11 pubkey 欄位)
contactstring""管理員聯絡 URI(mailto: 或 https://)
iconstring""中繼圖示圖片 URL
post_policystring""指向中繼發布政策的 URL
private_keystring (64 hex)""中繼本身的金鑰;NIP-29 群組需要
public_urlstring""公開 URL,例如 wss://relay.example.com
livekit_urlstring""用於 NIP-29 影音房間的 LiveKit 伺服器 URL
livekit_api_keystring""LiveKit API key
livekit_api_secretstring""LiveKit API secret(用於簽發 JWT)
enabled_nipsarray of integers[]明確的 NIP 允許清單
disabled_nipsarray of integers[]要停用的 NIP(enabled_nips 非空時忽略)
reject_ephemeralbooleanfalse拒絕 NIP-01 臨時事件(類型 20000-29999)
enabled_gitbooleanfalse接受 NIP-34 git 事件(類型 1617-1633、30617/30618)
require_powinteger0要求的工作量證明前導零位數
new_pubkey_min_age_secsinteger0拒絕來自比該值更「年輕」的公鑰的事件(秒;0 = 關閉)
max_events_per_min_per_pubkeyinteger0每個公鑰的發布速率限制(每分鐘;0 = 無限制)
max_groupsinteger1000記憶體中 NIP-29 群組儲存的上限
require_authbooleanfalse對 REQ/EVENT/COUNT/NEG 要求 NIP-42 認證
send_auth_challengebooleantrue連線時傳送 AUTH 挑戰
enabled_nip78_authbooleantrue接受 kind 78/30078 事件前要求 NIP-42 AUTH
enabled_command_eventsbooleanfalse執行由管理員公鑰發布的 kind:1 維運指令

鍵的詳細說明

  • private_key — 中繼本身的金鑰,用於簽署中繼產生的事件:NIP-29 群組中繼資料(39000-39005)與 NIP-43 角色/成員事件。用 nostrfy genkey 產生;請保密。它只在啟動時讀取一次,因此變更它需要重新啟動。
  • public_url — 用於驗證用戶端送來的帶 URL 標籤:NIP-42 AUTH、NIP-62 消除與 NIP-98 管理認證。為空時,中繼回退到 host:port,而綁定 0.0.0.0 或 127.0.0.1 時它永遠不會符合真實用戶端 URL(會記錄警告)。務必設定它。
  • enabled_nips 與 disabled_nips — 允許清單優先:當 enabled_nips 非空時,只公佈其中的 NIP,disabled_nips 被忽略。兩者都需要重新啟動。
  • reject_ephemeral — 類型 20000-29999 被拒絕,但 NIP 要求轉送的豁免類型仍會轉送:22242、27235、28934/28935/28936、24133、23194/23195、24242 與 21059。SIGHUP 時生效。
  • enabled_git — 選用的 NIP-34:接受類型 1617-1633 與 30617/30618 並公佈 NIP-34。預設關閉,因為修補程式負載可能很大。SIGHUP 時生效。

[server] 區段 — 伺服器設定

鍵類型預設值說明
hoststring"127.0.0.1"綁定位址;0.0.0.0 接受來自任何位置的連線
portinteger8080連接埠(1-65535);80 連接埠需要 root
api_hoststring""專用於 REST API 的主機名稱
metrics_enabledbooleantrue在 /metrics 提供 Prometheus 指標
ws_pathsstring"root"WebSocket 端點路徑:root、inbox-outbox 或 all
inbox_write_policystring"any"誰可以寫入 /inbox:"any" 或 "relay"(事件仍須帶 p 標籤)
outbox_write_policystring"any"誰可以寫入 /outbox:"any"(NIP-42 認證公鑰自己的事件)或 "relay"
trusted_proxiesarray of strings[]其 X-Forwarded-For 受信任的反向代理位址/CIDR(空 = 不信任任何代理)

鍵的詳細說明

  • host — 0.0.0.0 綁定所有 IPv4 介面;127.0.0.1 僅本機。
  • port — 1-65535;80 連接埠需要 root。這一個連接埠同時提供 WebSocket 中繼、NIP-11 文件、REST API 與 NIP-86 RPC。
  • api_host — 將 REST API 專用於單一主機名稱,使 API 與中繼可以在反向代理後共用一個連接埠。啟動時固定 — 需要重新啟動。
  • ws_paths — root 只提供 /,inbox-outbox 只提供 /inbox 與 /outbox,all 兩者都提供。啟動時固定 — 需要重新啟動。
  • trusted_proxies — 只列出代理本身的位址(同主機上 nginx/Caddy 用回環位址,雲端用負載平衡器的來源網段)。設定後,用戶端 IP 從最後一個不受信任的 X-Forwarded-For 條目推導,用於按 IP 的上限、速率限制、blockip 與日誌。切勿加入用戶端能直接存取的位址 — 它們可以偽造該標頭並繞過按 IP 限制。啟動時固定 — 需要重新啟動。

[rpc] 區段 — NIP-86 管理

鍵類型預設值說明
management_tokenstring""管理 API 的 Bearer token
admin_pubkeystring (64 hex)""用於 NIP-98 管理認證的管理員公鑰
max_admin_body_bytesinteger65536NIP-86 管理 RPC 的請求主體限制

NIP-86 RPC 掛載在中繼的公開 POST / 路由上 — 沒有單獨的管理連接埠。舊指南中 management_token 與 admin_pubkey 有時出現在 [server] 下;那些寫法是這些 [rpc] 鍵的舊版別名。

[limits] 區段 — 限制與保護

連線與訊息

鍵類型預設值說明
max_connectionsinteger10000最大並行連線數
max_connections_per_ipinteger64每個來源 IP 的最大連線數
max_ws_message_bytesinteger1048576每則 WebSocket 訊息/框架的最大位元組數
socket_recv_buffer_kbinteger64每連線核心接收緩衝區(KiB)
max_out_queue_bytesinteger262144每連線出站佇列上限(位元組)
ws_idle_timeout_secsinteger300閒置連線在此時間後關閉
http_read_timeout_secsinteger30HTTP 請求標頭逾時(slow-loris 防禦)
max_connections_per_sec_per_ipinteger0每個來源 IP 每秒最大新連線數

訂閱與查詢

鍵類型預設值說明
max_filtersinteger20每個 REQ 的最大過濾器數
max_subscriptionsinteger20每連線的最大訂閱數
max_limitinteger500REQ limit 的上限
max_countinteger2000COUNT 結果的上限
max_sub_id_leninteger64訂閱 id 最大長度(字元,非位元組)
max_sub_bytesinteger1048576每連線的訂閱過濾器總位元組數
max_req_response_bytesinteger33554432 (32 MB)單一 REQ 回應可傳送的總位元組上限

事件

鍵類型預設值說明
max_content_bytesinteger65536事件內容最大字元數
max_tagsinteger2000每個事件的最大標籤數
max_tag_value_bytesinteger1024每個標籤值的最大位元組數
max_created_at_future_secsinteger3600容忍的 created_at 未來偏移
group_late_publish_secsinteger3600容忍的 NIP-29 群組管理事件延遲(秒)
max_neg_itemsinteger100000每次 NIP-77 negentropy 同步的最大記錄數

舊版別名:limits.require_pow、limits.new_pubkey_min_age_secs 與 limits.max_indexed_words 仍被接受為 relay.require_pow、relay.new_pubkey_min_age_secs 與 database.max_indexed_words 的別名。

REST API

鍵類型預設值說明
max_api_concurrentinteger8最大並行 /api/v1 請求數
max_api_limitinteger5000API limit 參數的上限
max_api_offsetinteger50000API offset 參數的上限
max_api_fetchinteger55001offset 查詢的最大預取視窗 — 必須涵蓋 max_api_offset + max_api_limit + 1(0 = 無限制)
max_api_search_bytesinteger2048API search 參數的最大位元組數

即時扇出

鍵類型預設值說明
live_batch_interval_msinteger20即時事件重新整理頻率(毫秒)
live_batch_sizeinteger32每個即時批次的最大事件數
live_bufferinteger65536即時扇出佇列大小

[database] 區段 — 資料庫

鍵類型預設值說明
pathstring"./data"資料庫目錄(LMDB)
max_dbsinteger32LMDB 最大具名資料庫數
max_readersinteger128LMDB 最大並行讀取者數
map_sizeinteger1073741824 (1 GB)記憶體映射大小的下限(位元組)
max_map_sizeinteger1099511627776 (1 TB)記憶體映射上限(位元組)
purge_interval_secsinteger300NIP-40 清除間隔(秒)
search_indexbooleantrue啟用 NIP-50 詞索引
reader_threadsinteger2專用掃描執行緒
max_indexed_wordsinteger32每個事件內容被索引的單詞數
meta_indexbooleantrue寫入掃描預過濾使用的每事件中繼資料標頭
disabled_fsyncbooleanfalse跳過每個寫入批次後的同步磁碟清除
db_buffer_sizeinteger2048每連線 WebSocket 初始緩衝區(位元組)
db_request_timeout_secsinteger30資料庫請求在失敗前可等待的時長
max_db_queue_msgsinteger4096快速失敗前排隊的待處理訊息上限
max_db_queue_eventsinteger262144快速失敗前排隊批次內的事件上限
max_db_queue_bytesinteger268435456 (256 MiB)快速失敗前排隊的資料庫請求位元組上限(0 = 無位元組上限)

鍵的詳細說明

  • map_size — 記憶體映射的下限:映射始終至少以該大小開啟。
  • max_map_size — 上限,以稀疏虛擬保留方式開啟:實體磁碟只隨實際寫入的資料成長。當遇到 database map is full 時提高它。
  • search_index = false — 搜尋仍可用(針對內容的全詞比對)但掃描會更慢;在微型 VPS 上它可將資料庫減半。小型執行個體推薦。
  • disabled_fsync — 以持久性換取輸送量:寫入提交到作業系統頁快取,斷電可能遺失最近的寫入。

[daemon] 區段 — 常駐程式

鍵類型預設值說明
pid_filestring"./nostrfy.pid"PID 檔案路徑
log_filestring"./nostrfy.log"日誌檔案路徑
stats_filestring"./nostrfy.stats.json"統計檔案路徑
stats_interval_secsinteger5統計寫入間隔(秒)
max_log_size_bytesinteger52428800 (50 MB)日誌輪替大小(0 = 不輪替)
max_log_filesinteger5保留的輪替日誌代數

路徑相對於設定檔所在目錄解析,因此常駐程式變更工作目錄後它們仍然有效。

[access] 區段 — 存取控制

鍵類型預設值說明
restrict_relaybooleanfalse只有允許清單中的公鑰可以發布
blocked_kindsarray of integers[]要拒絕的類型
allowed_kindsarray of integers[]類型允許清單;非空時只接受這些類型
blocked_ipsarray of strings[]連線時拒絕的 IP 位址
method_grantstable: pubkey → array of strings{}非管理員公鑰的 NIP-86 方法授權(執行階段用 assignmethod 管理)

公鑰允許/拒絕清單不是設定鍵 — 它們位於中繼資料庫(LMDB)中並在執行階段管理:

sh
nostrfy relay allow npub1...
nostrfy relay deny npub1...
nostrfy relay list
  • restrict_relay = true — 只有允許清單中的公鑰可以發布,而讀取對所有人保持開放(任何用戶端仍可訂閱與取得)。
  • 被拒絕的公鑰在發布時始終被拒絕,讀取時也永遠不會被提供。
  • method_grants — 非管理員公鑰的 NIP-86 方法授權(公鑰 → 方法名稱,例如允許版主使用 banevent 與 listbannedevents)。首次執行時從設定初始化,之後在執行階段用 NIP-86 assignmethod/unassignmethod 管理(用 listmethodassignees 檢視)。只有審核與讀取方法可被授權 — 權限、角色、邀請碼與中繼身分管理保持僅管理員,且被封鎖的公鑰即使有授權也會被拒絕。參閱管理 API。

[blossom] 區段 — Blossom 檔案伺服器

鍵類型預設值說明
hoststring""Blossom 伺服器的主機名稱(空 = 停用)
storagestring"local"後端:"local"(local_path)或 "s3"(S3 相容儲存桶)
local_pathstring"/var/lib/nostrfy/images"媒體檔案的本機儲存根目錄
max_upload_bytesinteger20971520 (20 MB)媒體檔案最大大小
min_free_bytesinteger33554432 (32 MB)低於該磁碟空間時拒絕上傳
s3_endpointstring""S3 相容端點(例如 R2)
s3_regionstring""S3 區域(R2 使用 "auto")
s3_bucketstring""S3 儲存桶名稱
s3_access_keystring""S3 access key
s3_secret_keystring""S3 secret key
restrict_uploadsbooleanfalse只有允許清單中的公鑰可以上傳

執行階段重載(SIGHUP)

編輯檔案並傳送 kill -HUP $(cat nostrfy.pid) 會無需重新啟動重載設定。大多數設定立即生效;少數在啟動時固定:

SIGHUP 時生效需要重新啟動
relay.name、description、pubkey、contact、icon、post_policy、public_urlrelay.private_key
reject_ephemeral、enabled_git、enabled_nip78_authrelay.livekit_*、enabled_nips / disabled_nips
大部分 [limits]api_host、trusted_proxies、metrics_enabled、ws_paths、database.*、daemon 大小、限制上限、blossom.*

[access] 不會由重載套用 — 清單在啟動時初始化一次,之後透過 NIP-86 在執行階段管理。當需要重新啟動的設定發生變化時日誌會警告,少數啟動時擷取的設定不會被重載檢查。

常見錯誤
錯誤修正
未設定 public_url設定 wss://...
host 保持 127.0.0.1外部用戶端無法連線
啟用 NIP-29 但未設定 private_key執行 nostrfy genkey + 重新啟動
restrict_relay 為 true 但允許清單為空所有人被鎖定
變更僅重新啟動生效的鍵卻只送 SIGHUP使用 nostrfy restart