Configuration Overview
BigBrotr uses a YAML-driven configuration system with Pydantic validation. This approach provides type safety, clear documentation, and flexibility for different deployment scenarios.
Configuration Philosophy
Section titled “Configuration Philosophy”- YAML for Structure: All non-sensitive configuration in YAML files
- Environment for Secrets: Only passwords and keys from environment variables
- Defaults are Safe: Sensible defaults for all optional settings
- Validation at Startup: Configuration errors fail fast with clear messages
File Structure
Section titled “File Structure”implementations/bigbrotr/yaml/├── core/│ └── brotr.yaml # Database pool and connection settings└── services/ ├── initializer.yaml # Schema verification, seed file path ├── finder.yaml # API sources, discovery intervals ├── monitor.yaml # Health check settings, Tor config └── synchronizer.yaml # Sync filters, timeouts, concurrencyEnvironment Variables
Section titled “Environment Variables”Only sensitive data comes from environment variables:
| Variable | Required | Description |
|---|---|---|
DB_PASSWORD | Yes | PostgreSQL database password |
MONITOR_PRIVATE_KEY | No | Nostr private key for NIP-66 write tests (hex) |
Setting Environment Variables
Section titled “Setting Environment Variables”Docker Compose (recommended):
cp .env.example .envnano .env # Edit DB_PASSWORD.env file:
DB_PASSWORD=your_secure_passwordMONITOR_PRIVATE_KEY=your_hex_private_key # OptionalShell Export:
export DB_PASSWORD=your_secure_passwordSystemd Service:
[Service]Environment="DB_PASSWORD=your_secure_password"Loading Configuration
Section titled “Loading Configuration”Services load configuration via factory methods:
# From YAML file (recommended)service = MyService.from_yaml("yaml/services/myservice.yaml", brotr=brotr)
# From dictionaryconfig_dict = {"interval": 1800.0, "tor": {"enabled": False}}service = MyService.from_dict(config_dict, brotr=brotr)
# Direct constructionservice = MyService(brotr=brotr, config=MyServiceConfig(interval=1800.0))Pydantic Validation
Section titled “Pydantic Validation”All configuration uses Pydantic models with built-in validation:
from pydantic import BaseModel, Field
class TimeoutsConfig(BaseModel): clearnet: float = Field(default=30.0, ge=5.0, le=120.0) tor: float = Field(default=60.0, ge=10.0, le=180.0)Validation Ranges
Section titled “Validation Ranges”| Config Type | Field | Default | Range |
|---|---|---|---|
| Pool | min_size | 5 | 1-100 |
| Pool | max_size | 20 | 1-100 |
| Timeouts | clearnet | 30.0 | 5.0-120.0 |
| Timeouts | tor | 60.0 | 10.0-180.0 |
| Concurrency | max_parallel | 10-50 | 1-500 |
| Concurrency | max_processes | 10 | 1-32 |
| Intervals | interval | varies | ≥60.0 |
Validation Errors
Section titled “Validation Errors”Invalid configuration fails at startup with clear messages:
pydantic_core._pydantic_core.ValidationError: 1 validation error for TimeoutsConfigclearnet Input should be greater than or equal to 5 [type=greater_than_equal, input_value=2.0, input_type=float]Configuration Hierarchy
Section titled “Configuration Hierarchy”Configuration is loaded in this order:
- Pydantic Defaults: Built-in defaults in model definition
- YAML File: Values from configuration file
- Environment Variables: Override for secrets only
Cross-Field Validation
Section titled “Cross-Field Validation”Some configurations have cross-field validation:
class PoolLimitsConfig(BaseModel): min_size: int = Field(default=5, ge=1, le=100) max_size: int = Field(default=20, ge=1, le=100)
@model_validator(mode='after') def validate_sizes(self) -> Self: if self.max_size < self.min_size: raise ValueError("max_size must be >= min_size") return selfTesting Configuration
Section titled “Testing Configuration”Validate configuration before deployment:
from services.synchronizer import SynchronizerConfigimport yaml
with open("yaml/services/synchronizer.yaml") as f: config_dict = yaml.safe_load(f)
# Raises ValidationError if invalidconfig = SynchronizerConfig(**config_dict)print(f"Config valid: {config}")Common Customizations
Section titled “Common Customizations”Disable Tor
Section titled “Disable Tor”tor: enabled: false
# yaml/services/synchronizer.yamltor: enabled: falseLower Resource Usage
Section titled “Lower Resource Usage”pool: limits: min_size: 2 max_size: 5
# yaml/services/synchronizer.yamlconcurrency: max_parallel: 3 max_processes: 2Increase Timeouts
Section titled “Increase Timeouts”timeouts: clearnet: 60.0 tor: 120.0Filter Event Kinds
Section titled “Filter Event Kinds”filter: kinds: [0, 1, 3, 6, 7] # Only specific kindsBest Practices
Section titled “Best Practices”- Start with Defaults: Only override what you need
- Use Per-Relay Overrides: For problematic relays, not global changes
- Secure Secrets: Never commit
.envfiles to version control - Test Changes: Validate YAML before deployment
- Monitor Resources: Adjust pool sizes based on actual usage
Next Steps
Section titled “Next Steps”- Learn about Core Configuration
- Explore Service Configuration
- Check the FAQ