mirror of
https://relay.ngit.dev/npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr/ngit-grasp.git
synced 2026-10-05 23:18:24 +00:00
Main lib (src/): - Add #[allow(dead_code)] for build_info field (stored to prevent Prometheus unregistration) - Add #[allow(dead_code)] for first_seen field (reserved for future rate limiting) - Replace .or_insert_with(RelaySyncNeeds::default) with .or_default() - Replace manual div_ceil implementations with .div_ceil(100) Test code (tests/): - Replace .expect(&format!(...)) with .unwrap_or_else(|_| panic!(...)) - Remove needless borrows in fetch_metrics() calls - Add #[allow(dead_code)] and #[allow(unused_imports)] to test helpers module grasp-audit: - Apply cargo fmt to fix formatting
89 lines
3.0 KiB
Rust
89 lines
3.0 KiB
Rust
use std::sync::Arc;
|
|
|
|
use anyhow::Result;
|
|
use tracing::{info, Level};
|
|
use tracing_subscriber::FmtSubscriber;
|
|
|
|
use ngit_grasp::{
|
|
config::{Config, DatabaseBackend},
|
|
http,
|
|
metrics::Metrics,
|
|
nostr,
|
|
sync::SyncManager,
|
|
};
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
// Initialize tracing
|
|
let subscriber = FmtSubscriber::builder()
|
|
.with_max_level(Level::DEBUG)
|
|
.finish();
|
|
tracing::subscriber::set_global_default(subscriber)?;
|
|
|
|
info!("Starting ngit-grasp with nostr-relay-builder...");
|
|
|
|
// Load configuration (priority: CLI flags > env vars > .env file > defaults)
|
|
let config = Config::load()?;
|
|
|
|
info!("Configuration loaded: {}", config.bind_address);
|
|
info!("Domain: {}", config.domain);
|
|
info!("Relay name: {}", config.relay_name());
|
|
info!("Git data directory: {}", config.effective_git_data_path());
|
|
if config.database_backend != DatabaseBackend::Memory {
|
|
info!("Relay data directory: {}", config.relay_data_path);
|
|
}
|
|
info!("Database backend: {}", config.database_backend);
|
|
|
|
// Initialize metrics if enabled
|
|
let metrics = if config.metrics_enabled {
|
|
info!("Metrics enabled on /metrics endpoint");
|
|
Some(Arc::new(Metrics::new(
|
|
config.metrics_connection_per_ip_abuse_threshold,
|
|
)))
|
|
} else {
|
|
info!("Metrics disabled");
|
|
None
|
|
};
|
|
|
|
// Create Nostr relay with NIP-34 validation
|
|
// Returns both the relay and database for direct queries in handlers
|
|
if let Ok(relay_with_db) = nostr::builder::create_relay(&config) {
|
|
info!(
|
|
"Relay created with NIP-34 validation for domain: {}",
|
|
config.domain
|
|
);
|
|
|
|
// Start SyncManager for proactive sync (Phase 2: multi-relay support, Phase 3: health tracking)
|
|
// Even without bootstrap relay, SyncManager discovers relays from stored announcements
|
|
// Pass the already-registered sync metrics from Metrics to avoid duplicate registration
|
|
let sync_manager = SyncManager::new(
|
|
config.sync_bootstrap_relay_url.clone(),
|
|
config.domain.clone(),
|
|
relay_with_db.database.clone(),
|
|
relay_with_db.write_policy.clone(),
|
|
relay_with_db.relay.clone(),
|
|
&config,
|
|
metrics.as_ref().and_then(|m| m.sync_metrics().cloned()),
|
|
);
|
|
|
|
if config.sync_bootstrap_relay_url.is_some() {
|
|
info!(
|
|
"Starting proactive sync with bootstrap relay: {:?}",
|
|
config.sync_bootstrap_relay_url
|
|
);
|
|
} else {
|
|
info!("Proactive sync enabled (will discover relays from stored announcements)");
|
|
}
|
|
|
|
tokio::spawn(async move {
|
|
sync_manager.run().await;
|
|
});
|
|
|
|
// Start HTTP server with integrated relay and database
|
|
info!("Starting HTTP server on {}", config.bind_address);
|
|
http::run_server(config, relay_with_db.relay, relay_with_db.database, metrics).await?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|