2022-12-19 19:42:40 +00:00
|
|
|
appName: strfry
|
2023-01-13 23:54:04 +00:00
|
|
|
onAppStartup: true
|
2023-01-29 22:31:28 +00:00
|
|
|
useGlobalH: true
|
2023-02-02 20:18:18 +00:00
|
|
|
customLMDBSetup: true
|
2022-12-19 19:42:40 +00:00
|
|
|
|
|
|
|
flatBuffers: |
|
|
|
|
include "../fbs/nostr-index.fbs";
|
|
|
|
|
2023-01-11 21:23:18 +00:00
|
|
|
includes: |
|
|
|
|
inline std::string_view sv(const NostrIndex::Fixed32Bytes *f) {
|
|
|
|
return std::string_view((const char *)f->val()->data(), 32);
|
|
|
|
}
|
|
|
|
|
2022-12-19 19:42:40 +00:00
|
|
|
tables:
|
2023-01-13 23:54:04 +00:00
|
|
|
## DB meta-data. Single entry, with id = 1
|
|
|
|
Meta:
|
|
|
|
fields:
|
|
|
|
- name: dbVersion
|
|
|
|
- name: endianness
|
|
|
|
|
2023-01-22 08:22:28 +00:00
|
|
|
## Meta-info of nostr events, suitable for indexing
|
|
|
|
## Primary key is auto-incremented, called "levId" for Local EVent ID
|
2022-12-19 19:42:40 +00:00
|
|
|
Event:
|
|
|
|
fields:
|
|
|
|
- name: receivedAt # microseconds
|
|
|
|
- name: flat
|
|
|
|
type: ubytes
|
|
|
|
nestedFlat: NostrIndex.Event
|
2023-02-07 13:08:29 +00:00
|
|
|
- name: sourceType
|
|
|
|
- name: sourceInfo
|
|
|
|
type: ubytes
|
2022-12-19 19:42:40 +00:00
|
|
|
|
|
|
|
indices:
|
|
|
|
created_at:
|
|
|
|
integer: true
|
|
|
|
id:
|
|
|
|
comparator: StringUint64
|
|
|
|
pubkey:
|
|
|
|
comparator: StringUint64
|
|
|
|
kind:
|
|
|
|
comparator: Uint64Uint64
|
|
|
|
pubkeyKind:
|
|
|
|
comparator: StringUint64Uint64
|
|
|
|
tag:
|
|
|
|
comparator: StringUint64
|
|
|
|
multi: true
|
|
|
|
deletion: # eventId, pubkey
|
|
|
|
multi: true
|
2023-02-08 11:48:38 +00:00
|
|
|
expiration:
|
|
|
|
integer: true
|
|
|
|
multi: true
|
2022-12-19 19:42:40 +00:00
|
|
|
|
|
|
|
indexPrelude: |
|
|
|
|
auto *flat = v.flat_nested();
|
|
|
|
created_at = flat->created_at();
|
|
|
|
uint64_t indexTime = *created_at;
|
|
|
|
|
|
|
|
id = makeKey_StringUint64(sv(flat->id()), indexTime);
|
|
|
|
pubkey = makeKey_StringUint64(sv(flat->pubkey()), indexTime);
|
|
|
|
kind = makeKey_Uint64Uint64(flat->kind(), indexTime);
|
|
|
|
pubkeyKind = makeKey_StringUint64Uint64(sv(flat->pubkey()), flat->kind(), indexTime);
|
|
|
|
|
2023-01-11 21:23:18 +00:00
|
|
|
for (const auto &tagPair : *(flat->tagsGeneral())) {
|
|
|
|
auto tagName = (char)tagPair->key();
|
|
|
|
auto tagVal = sv(tagPair->val());
|
|
|
|
tag.push_back(makeKey_StringUint64(std::string(1, tagName) + std::string(tagVal), indexTime));
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const auto &tagPair : *(flat->tagsFixed32())) {
|
2022-12-19 19:42:40 +00:00
|
|
|
auto tagName = (char)tagPair->key();
|
|
|
|
auto tagVal = sv(tagPair->val());
|
|
|
|
tag.push_back(makeKey_StringUint64(std::string(1, tagName) + std::string(tagVal), indexTime));
|
|
|
|
if (flat->kind() == 5 && tagName == 'e') deletion.push_back(std::string(tagVal) + std::string(sv(flat->pubkey())));
|
|
|
|
}
|
|
|
|
|
2023-02-08 11:48:38 +00:00
|
|
|
if (flat->expiration() != 0) {
|
|
|
|
expiration.push_back(flat->expiration());
|
|
|
|
}
|
|
|
|
|
2023-01-22 08:22:28 +00:00
|
|
|
CompressionDictionary:
|
|
|
|
fields:
|
|
|
|
- name: dict
|
|
|
|
type: ubytes
|
|
|
|
|
|
|
|
tablesRaw:
|
|
|
|
## Raw nostr event JSON, possibly compressed
|
|
|
|
## keys are levIds
|
|
|
|
## vals are prefixed with a type byte:
|
|
|
|
## 0: no compression, payload follows
|
|
|
|
## 1: zstd compression. Followed by Dictionary ID (native endian uint32) then compressed payload
|
|
|
|
EventPayload:
|
|
|
|
flags: 'MDB_INTEGERKEY'
|
|
|
|
|
2022-12-19 19:42:40 +00:00
|
|
|
config:
|
|
|
|
- name: db
|
2023-02-02 20:18:18 +00:00
|
|
|
desc: "Directory that contains the strfry LMDB database"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: "./strfry-db/"
|
|
|
|
noReload: true
|
|
|
|
|
2023-02-02 20:18:18 +00:00
|
|
|
- name: dbParams__maxreaders
|
|
|
|
desc: "Maximum number of threads/processes that can simultaneously have LMDB transactions open"
|
|
|
|
default: 256
|
|
|
|
noReload: true
|
|
|
|
- name: dbParams__mapsize
|
2023-02-07 19:00:21 +00:00
|
|
|
desc: "Size of mmap() to use when loading LMDB (default is 10TB, does *not* correspond to disk-space used)"
|
2023-02-02 20:18:18 +00:00
|
|
|
default: 10995116277760
|
|
|
|
noReload: true
|
|
|
|
|
2022-12-19 19:42:40 +00:00
|
|
|
- name: relay__bind
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Interface to listen on. Use 0.0.0.0 to listen on all interfaces"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: "127.0.0.1"
|
|
|
|
noReload: true
|
2023-01-13 21:14:11 +00:00
|
|
|
- name: relay__port
|
|
|
|
desc: "Port to open for the nostr websocket protocol"
|
|
|
|
default: 7777
|
|
|
|
noReload: true
|
2023-02-02 20:42:05 +00:00
|
|
|
- name: relay__nofiles
|
|
|
|
desc: "Set OS-limit on maximum number of open files/sockets (if 0, don't attempt to set)"
|
|
|
|
default: 1000000
|
|
|
|
noReload: true
|
2022-12-19 19:42:40 +00:00
|
|
|
|
|
|
|
- name: relay__info__name
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "NIP-11: Name of this server. Short/descriptive (< 30 characters)"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: "strfry default"
|
|
|
|
- name: relay__info__description
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "NIP-11: Detailed information about relay, free-form"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: "This is a strfry instance."
|
|
|
|
- name: relay__info__pubkey
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "NIP-11: Administrative nostr pubkey, for contact purposes"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: "unset"
|
|
|
|
- name: relay__info__contact
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "NIP-11: Alternative administrative contact (email, website, etc)"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: "unset"
|
|
|
|
|
|
|
|
- name: relay__maxWebsocketPayloadSize
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Maximum accepted incoming websocket frame size (should be larger than max event and yesstr msg)"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: 131072
|
|
|
|
noReload: true
|
2023-01-12 04:56:45 +00:00
|
|
|
- name: relay__autoPingSeconds
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Websocket-level PING message frequency (should be less than any reverse proxy idle timeouts)"
|
2023-01-12 04:56:45 +00:00
|
|
|
default: 55
|
|
|
|
noReload: true
|
2023-01-13 19:34:54 +00:00
|
|
|
- name: relay__enableTcpKeepalive
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "If TCP keep-alive should be enabled (detect dropped connections to upstream reverse proxy)"
|
2023-01-13 19:34:54 +00:00
|
|
|
default: false
|
2022-12-19 19:42:40 +00:00
|
|
|
- name: relay__queryTimesliceBudgetMicroseconds
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "How much uninterrupted CPU time a REQ query should get during its DB scan"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: 10000
|
|
|
|
- name: relay__maxFilterLimit
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Maximum records that can be returned per filter"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: 500
|
2023-02-05 20:43:11 +00:00
|
|
|
- name: relay__maxSubsPerConnection
|
|
|
|
desc: "Maximum number of subscriptions (concurrent REQs) a connection can have open at any time"
|
|
|
|
default: 20
|
2022-12-19 19:42:40 +00:00
|
|
|
|
2023-02-07 19:00:21 +00:00
|
|
|
- name: relay__plugins__writePolicyPath
|
|
|
|
desc: ""
|
|
|
|
default: ""
|
|
|
|
|
2023-02-01 14:23:28 +00:00
|
|
|
- name: relay__compression__enabled
|
|
|
|
desc: "Use permessage-deflate compression if supported by client. Reduces bandwidth, but slight increase in CPU"
|
|
|
|
default: true
|
|
|
|
noReload: true
|
|
|
|
- name: relay__compression__slidingWindow
|
|
|
|
desc: "Maintain a sliding window buffer for each connection. Improves compression, but uses more memory"
|
|
|
|
default: true
|
|
|
|
noReload: true
|
|
|
|
|
2023-01-22 16:33:12 +00:00
|
|
|
- name: relay__logging__dumpInAll
|
|
|
|
desc: "Dump all incoming messages"
|
|
|
|
default: false
|
|
|
|
- name: relay__logging__dumpInEvents
|
|
|
|
desc: "Dump all incoming EVENT messages"
|
|
|
|
default: false
|
|
|
|
- name: relay__logging__dumpInReqs
|
|
|
|
desc: "Dump all incoming REQ/CLOSE messages"
|
|
|
|
default: false
|
|
|
|
- name: relay__logging__dbScanPerf
|
|
|
|
desc: "Log performance metrics for initial REQ database scans"
|
|
|
|
default: false
|
|
|
|
|
2023-01-13 21:14:11 +00:00
|
|
|
- name: relay__numThreads__ingester
|
2023-01-25 17:21:23 +00:00
|
|
|
desc: Ingester threads: route incoming requests, validate events/sigs
|
2023-01-13 21:14:11 +00:00
|
|
|
default: 3
|
|
|
|
noReload: true
|
|
|
|
- name: relay__numThreads__reqWorker
|
2023-01-25 17:21:23 +00:00
|
|
|
desc: reqWorker threads: Handle initial DB scan for events
|
2023-01-13 21:14:11 +00:00
|
|
|
default: 3
|
|
|
|
noReload: true
|
|
|
|
- name: relay__numThreads__reqMonitor
|
2023-01-25 17:21:23 +00:00
|
|
|
desc: reqMonitor threads: Handle filtering of new events
|
2023-01-13 21:14:11 +00:00
|
|
|
default: 3
|
|
|
|
noReload: true
|
|
|
|
- name: relay__numThreads__yesstr
|
2023-01-25 17:21:23 +00:00
|
|
|
desc: yesstr threads: Experimental yesstr protocol
|
2023-01-13 21:14:11 +00:00
|
|
|
default: 1
|
|
|
|
noReload: true
|
|
|
|
|
|
|
|
- name: events__maxEventSize
|
|
|
|
desc: "Maximum size of normalised JSON, in bytes"
|
|
|
|
default: 65536
|
2022-12-19 19:42:40 +00:00
|
|
|
- name: events__rejectEventsNewerThanSeconds
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Events newer than this will be rejected"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: 900 # 15 mins
|
|
|
|
- name: events__rejectEventsOlderThanSeconds
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Events older than this will be rejected"
|
|
|
|
default: 94608000 # 3 years
|
2022-12-19 19:42:40 +00:00
|
|
|
- name: events__rejectEphemeralEventsOlderThanSeconds
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Ephemeral events older than this will be rejected"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: 60
|
|
|
|
- name: events__ephemeralEventsLifetimeSeconds
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Ephemeral events will be deleted from the DB when older than this"
|
2022-12-19 19:42:40 +00:00
|
|
|
default: 300
|
|
|
|
- name: events__maxNumTags
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Maximum number of tags allowed"
|
2023-02-05 06:50:26 +00:00
|
|
|
default: 2000
|
2022-12-19 19:42:40 +00:00
|
|
|
- name: events__maxTagValSize
|
2023-01-13 21:14:11 +00:00
|
|
|
desc: "Maximum size for tag values, in bytes"
|
2023-02-05 06:50:26 +00:00
|
|
|
default: 1024
|