1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
|
# Reference: Configuration
**Purpose:** Complete reference for all ngit-grasp configuration options
**Audience:** Operators and developers
---
## Configuration Methods
ngit-grasp can be configured via:
1. **Environment variables** (recommended for deployment)
2. **`.env` file** (recommended for development)
3. **Command-line arguments** (planned, not yet implemented)
Configuration is loaded at startup and validated before the server starts.
---
## Environment Variables
### Server Configuration
#### `NGIT_BIND_ADDRESS`
**Description:** Address and port for the HTTP server to bind to
**Type:** String (IP:PORT format)
**Default:** `127.0.0.1:8080`
**Required:** No
**Examples:**
```bash
# Localhost only (development)
NGIT_BIND_ADDRESS=127.0.0.1:8080
# All interfaces (production)
NGIT_BIND_ADDRESS=0.0.0.0:8080
# IPv6
NGIT_BIND_ADDRESS=[::1]:8080
# Custom port
NGIT_BIND_ADDRESS=127.0.0.1:3000
```
**Notes:**
- Use `127.0.0.1` for local development
- Use `0.0.0.0` for production (behind reverse proxy)
- Ensure firewall rules allow the port
---
#### `NGIT_DOMAIN`
**Description:** Public domain name for this GRASP instance
**Type:** String (domain name)
**Default:** None
**Required:** Yes
**Examples:**
```bash
NGIT_DOMAIN=gitnostr.com
NGIT_DOMAIN=git.example.org
NGIT_DOMAIN=localhost:8080 # Development only
```
**Used for:**
- NIP-11 relay information document
- Generating repository URLs
- CORS configuration
- Webhook URLs (future)
**Notes:**
- Must be accessible from the internet for production
- Include port if non-standard (e.g., `localhost:8080`)
- Used in repository clone URLs: `https://{NGIT_DOMAIN}/{npub}/{repo}.git`
---
### Nostr Relay Configuration
#### `NGIT_OWNER_NPUB`
**Description:** Nostr public key (npub format) of the relay operator
**Type:** String (npub1... format)
**Default:** None
**Required:** Yes
**Examples:**
```bash
NGIT_OWNER_NPUB=npub1alice...
```
**Used for:**
- NIP-11 relay information document
- Contact information
- Administrative operations (future)
**Notes:**
- Must be valid npub format (starts with `npub1`)
- Can be generated with Nostr tools
- Publicly visible in relay metadata
---
#### `NGIT_RELAY_NAME`
**Description:** Human-readable name for this relay
**Type:** String
**Default:** `"ngit-grasp relay"`
**Required:** No
**Examples:**
```bash
NGIT_RELAY_NAME="GitNostr Community Relay"
NGIT_RELAY_NAME="Alice's GRASP Server"
```
**Used for:**
- NIP-11 relay information document
- Client display
- Relay discovery
---
#### `NGIT_RELAY_DESCRIPTION`
**Description:** Description of this relay's purpose and policies
**Type:** String
**Default:** `"A GRASP-compliant Git relay"`
**Required:** No
**Examples:**
```bash
NGIT_RELAY_DESCRIPTION="Public GRASP relay for open source projects"
NGIT_RELAY_DESCRIPTION="Private relay for ACME Corp repositories"
```
**Used for:**
- NIP-11 relay information document
- User information
- Relay selection
---
### Storage Configuration
#### `NGIT_GIT_DATA_PATH`
**Description:** Directory path for storing Git repositories
**Type:** String (filesystem path)
**Default:** `./data/git`
**Required:** No
**Examples:**
```bash
# Relative path (development)
NGIT_GIT_DATA_PATH=./data/git
# Absolute path (production)
NGIT_GIT_DATA_PATH=/var/lib/ngit-grasp/git
# Custom location
NGIT_GIT_DATA_PATH=/mnt/storage/git-repos
```
**Storage structure:**
```
{NGIT_GIT_DATA_PATH}/
├── {npub1}/
│ ├── {repo1}.git/
│ │ ├── objects/
│ │ ├── refs/
│ │ └── ...
│ └── {repo2}.git/
└── {npub2}/
└── ...
```
**Notes:**
- Directory must be writable by ngit-grasp process
- Ensure sufficient disk space
- Consider backup strategy
- Use fast storage for better performance
---
#### `NGIT_RELAY_DATA_PATH`
**Description:** Directory path for storing Nostr events and relay data
**Type:** String (filesystem path)
**Default:** `./data/relay`
**Required:** No
**Examples:**
```bash
# Relative path (development)
NGIT_RELAY_DATA_PATH=./data/relay
# Absolute path (production)
NGIT_RELAY_DATA_PATH=/var/lib/ngit-grasp/relay
# Separate disk
NGIT_RELAY_DATA_PATH=/mnt/ssd/relay-data
```
**Storage structure:**
```
{NGIT_RELAY_DATA_PATH}/
├── events/
│ └── {event-id}.json
├── indexes/
│ ├── by-kind/
│ ├── by-author/
│ └── by-tag/
└── metadata/
```
**Notes:**
- Directory must be writable
- Consider SSD for better query performance
- Size grows with event count
- Implement retention policy for production
---
#### `NGIT_DATABASE_BACKEND`
**Description:** Database backend type for storing Nostr events
**Type:** String (enum: memory, nostrdb, lmdb)
**Default:** `memory`
**Required:** No
**Valid Values:**
- `memory` - In-memory database (default, fastest, no persistence)
- `nostrdb` - NostrDB backend (persistent, optimized for Nostr) [Not yet implemented]
- `lmdb` - LMDB backend (persistent, general purpose) [Not yet implemented]
**Examples:**
```bash
# Development (default, no persistence)
NGIT_DATABASE_BACKEND=memory
# Production with NostrDB (when implemented)
NGIT_DATABASE_BACKEND=nostrdb
# Production with LMDB (when implemented)
NGIT_DATABASE_BACKEND=lmdb
```
**Comparison:**
| Backend | Persistence | Performance | Use Case |
|---------|-------------|-------------|----------|
| memory | No | Fastest | Development, testing |
| nostrdb | Yes | High | Production (Nostr-optimized) |
| lmdb | Yes | High | Production (general purpose) |
**Notes:**
- `memory` backend loses all data on restart
- NostrDB and LMDB backends will use `NGIT_RELAY_DATA_PATH` for storage
- NostrDB and LMDB are planned features, not yet available
- Default `memory` backend suitable for development and testing only
- Production deployments should use persistent backends when available
---
### Proactive Sync Configuration (GRASP-02)
These options configure the proactive sync feature that synchronizes events from other relays.
#### `NGIT_SYNC_BOOTSTRAP_RELAY_URL`
**Description:** URL of the bootstrap relay to initially sync events from
**Type:** String (WebSocket URL)
**Default:** None (relay discovery only)
**Required:** No
**Examples:**
```bash
# Sync from a public relay
NGIT_SYNC_BOOTSTRAP_RELAY_URL=wss://relay.example.com
# Sync from another GRASP relay
NGIT_SYNC_BOOTSTRAP_RELAY_URL=wss://git.nostr.dev
# Local testing
NGIT_SYNC_BOOTSTRAP_RELAY_URL=ws://127.0.0.1:8081
```
**Notes:**
- Bootstrap relay provides initial sync source on startup
- Additional relays are **automatically discovered** from repository announcements that list our service
- Even without a bootstrap relay, sync will discover relays from stored announcements
- Synced events go through the same validation as directly-submitted events
- Use WebSocket protocol (`ws://` or `wss://`)
---
#### `NGIT_SYNC_MAX_BACKOFF_SECS`
**Description:** Maximum backoff time in seconds for sync relay reconnection
**Type:** Integer (seconds)
**Default:** `3600` (1 hour)
**Required:** No
**Examples:**
```bash
# Default: 1 hour max backoff
NGIT_SYNC_MAX_BACKOFF_SECS=3600
# Aggressive: 5 minute max backoff
NGIT_SYNC_MAX_BACKOFF_SECS=300
# Conservative: 2 hour max backoff
NGIT_SYNC_MAX_BACKOFF_SECS=7200
```
**Notes:**
- Backoff starts at 5 seconds and doubles on each failure
- Capped at this maximum value
- After 24 hours of failures, relay is marked "dead" and retried daily
- Lower values mean more reconnection attempts
---
#### `NGIT_SYNC_STARTUP_DELAY_SECS`
**Description:** Delay in seconds before running startup catchup
**Type:** Integer (seconds)
**Default:** `30`
**Required:** No
**Examples:**
```bash
# Default: 30 second delay
NGIT_SYNC_STARTUP_DELAY_SECS=30
# Quick startup (testing)
NGIT_SYNC_STARTUP_DELAY_SECS=5
# Production: longer warm-up
NGIT_SYNC_STARTUP_DELAY_SECS=60
```
**Notes:**
- Allows connections to stabilize before catchup
- Reduces load on remote relays at startup
- Set to 0 for immediate catchup (not recommended)
---
#### `NGIT_SYNC_RECONNECT_DELAY_SECS`
**Description:** Delay in seconds before running catchup after reconnection
**Type:** Integer (seconds)
**Default:** `10`
**Required:** No
**Examples:**
```bash
# Default: 10 second delay
NGIT_SYNC_RECONNECT_DELAY_SECS=10
# Quick reconnect catchup
NGIT_SYNC_RECONNECT_DELAY_SECS=5
# Conservative
NGIT_SYNC_RECONNECT_DELAY_SECS=30
```
**Notes:**
- Prevents rate limiting from remote relays
- Applied after each successful reconnection
- Only catches up on recent events (see lookback days)
---
#### `NGIT_SYNC_RECONNECT_LOOKBACK_DAYS`
**Description:** Number of days to look back for reconnect catchup
**Type:** Integer (days)
**Default:** `3`
**Required:** No
**Examples:**
```bash
# Default: 3 days lookback
NGIT_SYNC_RECONNECT_LOOKBACK_DAYS=3
# Short lookback (frequent reconnects expected)
NGIT_SYNC_RECONNECT_LOOKBACK_DAYS=1
# Extended lookback
NGIT_SYNC_RECONNECT_LOOKBACK_DAYS=7
```
**Notes:**
- Limits catchup queries to recent events only
- Reduces load compared to full historical sync
- Balance between completeness and performance
- Longer lookback useful for less reliable connections
---
### Logging Configuration
#### `RUST_LOG`
**Description:** Logging level and filters (standard Rust environment variable)
**Type:** String (log level or filter)
**Default:** `info`
**Required:** No
**Examples:**
```bash
# Simple levels
RUST_LOG=error # Errors only
RUST_LOG=warn # Warnings and errors
RUST_LOG=info # Info, warnings, errors
RUST_LOG=debug # Debug and above
RUST_LOG=trace # Everything
# Module-specific
RUST_LOG=ngit_grasp=debug,actix_web=info
# Complex filters
RUST_LOG=debug,hyper=info,tokio=warn
```
**Log levels (most to least verbose):**
1. `trace` - Very detailed, performance impact
2. `debug` - Detailed debugging information
3. `info` - General information (default)
4. `warn` - Warnings about potential issues
5. `error` - Errors only
**Production recommendation:**
```bash
RUST_LOG=info,ngit_grasp=debug
```
---
### Security Configuration (Planned)
#### `NGIT_AUTH_REQUIRED`
**Description:** Require authentication for all operations
**Type:** Boolean
**Default:** `false`
**Status:** 🔜 Planned
**Examples:**
```bash
NGIT_AUTH_REQUIRED=true # Require auth
NGIT_AUTH_REQUIRED=false # Public relay
```
---
#### `NGIT_RATE_LIMIT_ENABLED`
**Description:** Enable rate limiting
**Type:** Boolean
**Default:** `true`
**Status:** 🔜 Planned
**Examples:**
```bash
NGIT_RATE_LIMIT_ENABLED=true
NGIT_RATE_LIMIT_ENABLED=false
```
---
## Configuration File (.env)
For development, create a `.env` file in the project root:
```bash
# .env file example
NGIT_DOMAIN=localhost:8080
NGIT_OWNER_NPUB=npub1alice...
NGIT_RELAY_NAME="Development Relay"
NGIT_RELAY_DESCRIPTION="Local development instance"
NGIT_GIT_DATA_PATH=./data/git
NGIT_RELAY_DATA_PATH=./data/relay
NGIT_BIND_ADDRESS=127.0.0.1:8080
RUST_LOG=debug
```
**Notes:**
- Never commit `.env` to version control
- Use `.env.example` as a template
- Environment variables override `.env` values
---
## Validation
Configuration is validated at startup:
```rust
// Example validation errors:
Error: Invalid configuration
- NGIT_DOMAIN is required
- NGIT_OWNER_NPUB must start with 'npub1'
- NGIT_GIT_DATA_PATH is not writable
```
**Validation checks:**
- Required fields are present
- Values have correct format
- Paths are accessible and writable
- Ports are available
- npub keys are valid
---
## Production Configuration Example
```bash
# Production .env
NGIT_DOMAIN=gitnostr.com
NGIT_OWNER_NPUB=npub1alice...
NGIT_RELAY_NAME="GitNostr Public Relay"
NGIT_RELAY_DESCRIPTION="Public GRASP relay for open source projects"
NGIT_GIT_DATA_PATH=/var/lib/ngit-grasp/git
NGIT_RELAY_DATA_PATH=/var/lib/ngit-grasp/relay
NGIT_BIND_ADDRESS=0.0.0.0:8080
RUST_LOG=info,ngit_grasp=debug
```
**Additional production considerations:**
- Use reverse proxy (nginx, Caddy) for HTTPS
- Set up log rotation
- Configure monitoring
- Implement backup strategy
- Use dedicated user account
- Set file permissions properly
---
## Development Configuration Example
```bash
# Development .env
NGIT_DOMAIN=localhost:8080
NGIT_OWNER_NPUB=npub1test...
NGIT_RELAY_NAME="Dev Relay"
NGIT_RELAY_DESCRIPTION="Local development"
NGIT_GIT_DATA_PATH=./data/git
NGIT_RELAY_DATA_PATH=./data/relay
NGIT_BIND_ADDRESS=127.0.0.1:8080
RUST_LOG=debug
```
---
## Testing Configuration Example
```bash
# Testing .env
NGIT_DOMAIN=localhost:9999
NGIT_OWNER_NPUB=npub1test...
NGIT_RELAY_NAME="Test Relay"
NGIT_RELAY_DESCRIPTION="Automated testing"
NGIT_GIT_DATA_PATH=/tmp/ngit-test/git
NGIT_RELAY_DATA_PATH=/tmp/ngit-test/relay
NGIT_BIND_ADDRESS=127.0.0.1:9999
RUST_LOG=debug
```
**Testing notes:**
- Use temporary directories
- Use non-standard ports
- Clean up after tests
- Isolate from development data
---
## Configuration Priority
When multiple configuration sources exist:
1. **Command-line arguments** (highest priority, planned)
2. **Environment variables**
3. **`.env` file**
4. **Default values** (lowest priority)
**Example:**
```bash
# .env file
NGIT_BIND_ADDRESS=127.0.0.1:8080
# Environment variable (overrides .env)
NGIT_BIND_ADDRESS=0.0.0.0:3000 cargo run
# Result: binds to 0.0.0.0:3000
```
---
## Related Documentation
- [Deployment How-To](../how-to/deploy.md) - Production deployment
- [Getting Started Tutorial](../tutorials/getting-started.md) - Initial setup
- [Architecture Overview](../explanation/architecture.md) - System design
---
*Part of the [ngit-grasp reference documentation](./)*
|