129 lines
4.2 KiB
Markdown
129 lines
4.2 KiB
Markdown
# Startup Configuration Design Analysis
|
|
|
|
## Review of startup_config_design.md
|
|
|
|
### Key Design Principles Identified
|
|
|
|
1. **Zero Command Line Arguments**: Complete elimination of CLI arguments for true "quick start"
|
|
2. **Event-Based Configuration**: Configuration stored as Nostr event (kind 33334) in events table
|
|
3. **Self-Contained Database**: Database named after relay pubkey (`<pubkey>.nrdb`)
|
|
4. **First-Time Setup**: Automatic key generation and initial configuration creation
|
|
5. **Configuration Consistency**: Always read from event, never from hardcoded defaults
|
|
|
|
### Implementation Gaps and Specifications Needed
|
|
|
|
#### 1. Key Generation Process
|
|
**Specification:**
|
|
```
|
|
First Startup Key Generation:
|
|
1. Generate all keys on first startup (admin private/public, relay private/public)
|
|
2. Use nostr_core_lib for key generation entropy
|
|
3. Keys are encoded in hex format
|
|
4. Print admin private key to stdout for user to save (never stored)
|
|
5. Store admin public key, relay private key, and relay public key in configuration event
|
|
6. Admin can later change the 33334 event to alter stored keys
|
|
```
|
|
|
|
#### 2. Database Naming and Location
|
|
**Specification:**
|
|
```
|
|
Database Naming:
|
|
1. Database is named using relay pubkey: ./<relay_pubkey>.nrdb
|
|
2. Database path structure: ./<relay_pubkey>.nrdb
|
|
3. If database creation fails, program quits (can't run without database)
|
|
4. c_nostr_relay.db should never exist in new system
|
|
```
|
|
|
|
#### 3. Configuration Event Structure (Kind 33334)
|
|
**Specification:**
|
|
```
|
|
Event Structure:
|
|
- Kind: 33334 (parameterized replaceable event)
|
|
- Event validation: Use nostr_core_lib to validate event
|
|
- Event content field: "C Nostr Relay Configuration" (descriptive text)
|
|
- Configuration update mechanism: TBD
|
|
- Complete tag structure provided in configuration section below
|
|
```
|
|
|
|
|
|
|
|
#### 4. Configuration Change Monitoring
|
|
**Configuration Monitoring System:**
|
|
```
|
|
Every event that is received is checked to see if it is a kind 33334 event from the admin pubkey.
|
|
If so, it is processed as a configuration update.
|
|
```
|
|
|
|
#### 5. Error Handling and Recovery
|
|
**Specification:**
|
|
```
|
|
Error Recovery Priority:
|
|
1. Try to load latest valid config event
|
|
2. Generate new default configuration event if none exists
|
|
3. Exit with error if all recovery attempts fail
|
|
|
|
Note: There is only ever one configuration event (parameterized replaceable event),
|
|
so no fallback to previous versions.
|
|
```
|
|
|
|
### Design Clarifications
|
|
|
|
**Key Management:**
|
|
- Admin private key is never stored, only printed once at first startup
|
|
- Single admin system (no multi-admin support)
|
|
- No key rotation support
|
|
|
|
**Configuration Management:**
|
|
- No configuration versioning/timestamping
|
|
- No automatic backup of configuration events
|
|
- Configuration events are not broadcastable to other relays
|
|
- Future: Auth system to restrict admin access to configuration events
|
|
|
|
---
|
|
|
|
## Complete Current Configuration Structure
|
|
|
|
Based on analysis of [`src/config.c`](src/config.c:753-795), here is the complete current configuration structure that will be converted to event tags:
|
|
|
|
### Complete Event Structure Example
|
|
```json
|
|
{
|
|
"kind": 33334,
|
|
"created_at": 1725661483,
|
|
"tags": [
|
|
["d", "<relay_pubkey>"],
|
|
["auth_enabled", "false"],
|
|
["relay_port", "8888"],
|
|
["max_connections", "100"],
|
|
|
|
["relay_description", "High-performance C Nostr relay with SQLite storage"],
|
|
["relay_contact", ""],
|
|
["relay_pubkey", "<relay_public_key>"],
|
|
["relay_privkey", "<relay_private_key>"],
|
|
["relay_software", "https://git.laantungir.net/laantungir/c-relay.git"],
|
|
["relay_version", "v1.0.0"],
|
|
|
|
["pow_min_difficulty", "0"],
|
|
["pow_mode", "basic"],
|
|
["nip40_expiration_enabled", "true"],
|
|
["nip40_expiration_strict", "true"],
|
|
["nip40_expiration_filter", "true"],
|
|
["nip40_expiration_grace_period", "300"],
|
|
["max_subscriptions_per_client", "25"],
|
|
["max_total_subscriptions", "5000"],
|
|
["max_filters_per_subscription", "10"],
|
|
["max_event_tags", "100"],
|
|
["max_content_length", "8196"],
|
|
["max_message_length", "16384"],
|
|
["default_limit", "500"],
|
|
["max_limit", "5000"]
|
|
],
|
|
"content": "C Nostr Relay Configuration",
|
|
"pubkey": "<admin_public_key>",
|
|
"id": "<computed_event_id>",
|
|
"sig": "<event_signature>"
|
|
}
|
|
```
|
|
|
|
**Note:** The `admin_pubkey` tag is omitted as it's redundant with the event's `pubkey` field.
|