設定參考
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] 區段 — 中繼身分
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
name | string | "nostrfy" | 透過 NIP-11 向用戶端顯示的中繼名稱 |
description | string | "A minimal and stable Nostr relay" | 中繼說明(NIP-11) |
pubkey | string (64 hex) | "" | 管理員公鑰(NIP-11 pubkey 欄位) |
contact | string | "" | 管理員聯絡 URI(mailto: 或 https://) |
icon | string | "" | 中繼圖示圖片 URL |
post_policy | string | "" | 指向中繼發布政策的 URL |
private_key | string (64 hex) | "" | 中繼本身的金鑰;NIP-29 群組需要 |
public_url | string | "" | 公開 URL,例如 wss://relay.example.com |
livekit_url | string | "" | 用於 NIP-29 影音房間的 LiveKit 伺服器 URL |
livekit_api_key | string | "" | LiveKit API key |
livekit_api_secret | string | "" | LiveKit API secret(用於簽發 JWT) |
enabled_nips | array of integers | [] | 明確的 NIP 允許清單 |
disabled_nips | array of integers | [] | 要停用的 NIP(enabled_nips 非空時忽略) |
reject_ephemeral | boolean | false | 拒絕 NIP-01 臨時事件(類型 20000-29999) |
enabled_git | boolean | false | 接受 NIP-34 git 事件(類型 1617-1633、30617/30618) |
require_pow | integer | 0 | 要求的工作量證明前導零位數 |
new_pubkey_min_age_secs | integer | 0 | 拒絕來自比該值更「年輕」的公鑰的事件(秒;0 = 關閉) |
max_events_per_min_per_pubkey | integer | 0 | 每個公鑰的發布速率限制(每分鐘;0 = 無限制) |
max_groups | integer | 1000 | 記憶體中 NIP-29 群組儲存的上限 |
require_auth | boolean | false | 對 REQ/EVENT/COUNT/NEG 要求 NIP-42 認證 |
send_auth_challenge | boolean | true | 連線時傳送 AUTH 挑戰 |
enabled_nip78_auth | boolean | true | 接受 kind 78/30078 事件前要求 NIP-42 AUTH |
enabled_command_events | boolean | false | 執行由管理員公鑰發布的 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] 區段 — 伺服器設定
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
host | string | "127.0.0.1" | 綁定位址;0.0.0.0 接受來自任何位置的連線 |
port | integer | 8080 | 連接埠(1-65535);80 連接埠需要 root |
api_host | string | "" | 專用於 REST API 的主機名稱 |
metrics_enabled | boolean | true | 在 /metrics 提供 Prometheus 指標 |
ws_paths | string | "root" | WebSocket 端點路徑:root、inbox-outbox 或 all |
inbox_write_policy | string | "any" | 誰可以寫入 /inbox:"any" 或 "relay"(事件仍須帶 p 標籤) |
outbox_write_policy | string | "any" | 誰可以寫入 /outbox:"any"(NIP-42 認證公鑰自己的事件)或 "relay" |
trusted_proxies | array 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_token | string | "" | 管理 API 的 Bearer token |
admin_pubkey | string (64 hex) | "" | 用於 NIP-98 管理認證的管理員公鑰 |
max_admin_body_bytes | integer | 65536 | NIP-86 管理 RPC 的請求主體限制 |
NIP-86 RPC 掛載在中繼的公開 POST / 路由上 — 沒有單獨的管理連接埠。舊指南中 management_token 與 admin_pubkey 有時出現在 [server] 下;那些寫法是這些 [rpc] 鍵的舊版別名。
[limits] 區段 — 限制與保護
連線與訊息
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
max_connections | integer | 10000 | 最大並行連線數 |
max_connections_per_ip | integer | 64 | 每個來源 IP 的最大連線數 |
max_ws_message_bytes | integer | 1048576 | 每則 WebSocket 訊息/框架的最大位元組數 |
socket_recv_buffer_kb | integer | 64 | 每連線核心接收緩衝區(KiB) |
max_out_queue_bytes | integer | 262144 | 每連線出站佇列上限(位元組) |
ws_idle_timeout_secs | integer | 300 | 閒置連線在此時間後關閉 |
http_read_timeout_secs | integer | 30 | HTTP 請求標頭逾時(slow-loris 防禦) |
max_connections_per_sec_per_ip | integer | 0 | 每個來源 IP 每秒最大新連線數 |
訂閱與查詢
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
max_filters | integer | 20 | 每個 REQ 的最大過濾器數 |
max_subscriptions | integer | 20 | 每連線的最大訂閱數 |
max_limit | integer | 500 | REQ limit 的上限 |
max_count | integer | 2000 | COUNT 結果的上限 |
max_sub_id_len | integer | 64 | 訂閱 id 最大長度(字元,非位元組) |
max_sub_bytes | integer | 1048576 | 每連線的訂閱過濾器總位元組數 |
max_req_response_bytes | integer | 33554432 (32 MB) | 單一 REQ 回應可傳送的總位元組上限 |
事件
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
max_content_bytes | integer | 65536 | 事件內容最大字元數 |
max_tags | integer | 2000 | 每個事件的最大標籤數 |
max_tag_value_bytes | integer | 1024 | 每個標籤值的最大位元組數 |
max_created_at_future_secs | integer | 3600 | 容忍的 created_at 未來偏移 |
group_late_publish_secs | integer | 3600 | 容忍的 NIP-29 群組管理事件延遲(秒) |
max_neg_items | integer | 100000 | 每次 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_concurrent | integer | 8 | 最大並行 /api/v1 請求數 |
max_api_limit | integer | 5000 | API limit 參數的上限 |
max_api_offset | integer | 50000 | API offset 參數的上限 |
max_api_fetch | integer | 55001 | offset 查詢的最大預取視窗 — 必須涵蓋 max_api_offset + max_api_limit + 1(0 = 無限制) |
max_api_search_bytes | integer | 2048 | API search 參數的最大位元組數 |
即時扇出
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
live_batch_interval_ms | integer | 20 | 即時事件重新整理頻率(毫秒) |
live_batch_size | integer | 32 | 每個即時批次的最大事件數 |
live_buffer | integer | 65536 | 即時扇出佇列大小 |
[database] 區段 — 資料庫
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
path | string | "./data" | 資料庫目錄(LMDB) |
max_dbs | integer | 32 | LMDB 最大具名資料庫數 |
max_readers | integer | 128 | LMDB 最大並行讀取者數 |
map_size | integer | 1073741824 (1 GB) | 記憶體映射大小的下限(位元組) |
max_map_size | integer | 1099511627776 (1 TB) | 記憶體映射上限(位元組) |
purge_interval_secs | integer | 300 | NIP-40 清除間隔(秒) |
search_index | boolean | true | 啟用 NIP-50 詞索引 |
reader_threads | integer | 2 | 專用掃描執行緒 |
max_indexed_words | integer | 32 | 每個事件內容被索引的單詞數 |
meta_index | boolean | true | 寫入掃描預過濾使用的每事件中繼資料標頭 |
disabled_fsync | boolean | false | 跳過每個寫入批次後的同步磁碟清除 |
db_buffer_size | integer | 2048 | 每連線 WebSocket 初始緩衝區(位元組) |
db_request_timeout_secs | integer | 30 | 資料庫請求在失敗前可等待的時長 |
max_db_queue_msgs | integer | 4096 | 快速失敗前排隊的待處理訊息上限 |
max_db_queue_events | integer | 262144 | 快速失敗前排隊批次內的事件上限 |
max_db_queue_bytes | integer | 268435456 (256 MiB) | 快速失敗前排隊的資料庫請求位元組上限(0 = 無位元組上限) |
鍵的詳細說明
- map_size — 記憶體映射的下限:映射始終至少以該大小開啟。
- max_map_size — 上限,以稀疏虛擬保留方式開啟:實體磁碟只隨實際寫入的資料成長。當遇到
database map is full時提高它。 - search_index = false — 搜尋仍可用(針對內容的全詞比對)但掃描會更慢;在微型 VPS 上它可將資料庫減半。小型執行個體推薦。
- disabled_fsync — 以持久性換取輸送量:寫入提交到作業系統頁快取,斷電可能遺失最近的寫入。
[daemon] 區段 — 常駐程式
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
pid_file | string | "./nostrfy.pid" | PID 檔案路徑 |
log_file | string | "./nostrfy.log" | 日誌檔案路徑 |
stats_file | string | "./nostrfy.stats.json" | 統計檔案路徑 |
stats_interval_secs | integer | 5 | 統計寫入間隔(秒) |
max_log_size_bytes | integer | 52428800 (50 MB) | 日誌輪替大小(0 = 不輪替) |
max_log_files | integer | 5 | 保留的輪替日誌代數 |
路徑相對於設定檔所在目錄解析,因此常駐程式變更工作目錄後它們仍然有效。
[access] 區段 — 存取控制
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
restrict_relay | boolean | false | 只有允許清單中的公鑰可以發布 |
blocked_kinds | array of integers | [] | 要拒絕的類型 |
allowed_kinds | array of integers | [] | 類型允許清單;非空時只接受這些類型 |
blocked_ips | array of strings | [] | 連線時拒絕的 IP 位址 |
method_grants | table: 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-86assignmethod/unassignmethod管理(用listmethodassignees檢視)。只有審核與讀取方法可被授權 — 權限、角色、邀請碼與中繼身分管理保持僅管理員,且被封鎖的公鑰即使有授權也會被拒絕。參閱管理 API。
[blossom] 區段 — Blossom 檔案伺服器
| 鍵 | 類型 | 預設值 | 說明 |
|---|---|---|---|
host | string | "" | Blossom 伺服器的主機名稱(空 = 停用) |
storage | string | "local" | 後端:"local"(local_path)或 "s3"(S3 相容儲存桶) |
local_path | string | "/var/lib/nostrfy/images" | 媒體檔案的本機儲存根目錄 |
max_upload_bytes | integer | 20971520 (20 MB) | 媒體檔案最大大小 |
min_free_bytes | integer | 33554432 (32 MB) | 低於該磁碟空間時拒絕上傳 |
s3_endpoint | string | "" | S3 相容端點(例如 R2) |
s3_region | string | "" | S3 區域(R2 使用 "auto") |
s3_bucket | string | "" | S3 儲存桶名稱 |
s3_access_key | string | "" | S3 access key |
s3_secret_key | string | "" | S3 secret key |
restrict_uploads | boolean | false | 只有允許清單中的公鑰可以上傳 |
執行階段重載(SIGHUP)
編輯檔案並傳送 kill -HUP $(cat nostrfy.pid) 會無需重新啟動重載設定。大多數設定立即生效;少數在啟動時固定:
| SIGHUP 時生效 | 需要重新啟動 |
|---|---|
| relay.name、description、pubkey、contact、icon、post_policy、public_url | relay.private_key |
| reject_ephemeral、enabled_git、enabled_nip78_auth | relay.livekit_*、enabled_nips / disabled_nips |
| 大部分 [limits] | api_host、trusted_proxies、metrics_enabled、ws_paths、database.*、daemon 大小、限制上限、blossom.* |
[access] 不會由重載套用 — 清單在啟動時初始化一次,之後透過 NIP-86 在執行階段管理。當需要重新啟動的設定發生變化時日誌會警告,少數啟動時擷取的設定不會被重載檢查。