// Archipelago Bitcoin Node OS - Native Backend // Pure Archipelago implementation, no StartOS dependencies use anyhow::Result; use std::net::SocketAddr; use tracing::info; mod api; mod auth; mod backup; mod config; mod content_server; mod credentials; mod electrs_status; mod container; mod port_allocator; mod data_model; mod identity; mod identity_manager; mod node_message; mod nostr_discovery; mod peers; mod server; mod session; mod state; mod totp; mod wallet; mod names; mod network; mod nostr_relays; mod update; use auth::AuthManager; use config::Config; use server::Server; /// Default dev password when auto-creating a user (matches mock-backend). const DEV_DEFAULT_PASSWORD: &str = "password123"; #[tokio::main] async fn main() -> Result<()> { // Initialize tracing tracing_subscriber::fmt() .with_env_filter( tracing_subscriber::EnvFilter::try_from_default_env() .unwrap_or_else(|_| "archipelago=debug,info".into()), ) .init(); info!("🚀 Starting Archipelago Bitcoin Node OS"); // Load configuration let config = Config::load().await?; info!("📁 Data directory: {}", config.data_dir.display()); // In dev mode, ensure a default user exists so login works without manual setup if config.dev_mode { let auth = AuthManager::new(config.data_dir.clone()); if !auth.is_setup().await? { auth.setup_user(DEV_DEFAULT_PASSWORD).await?; info!("👤 Created default dev user (password: {})", DEV_DEFAULT_PASSWORD); } } // Create server let server = Server::new(config.clone()).await?; // Start server let addr: SocketAddr = format!("{}:{}", config.bind_host, config.bind_port) .parse() .expect("Invalid bind address"); info!("🌐 Server listening on http://{}", addr); info!("📡 RPC API: http://{}/rpc/v1", addr); info!("🔌 WebSocket: ws://{}/ws", addr); server.serve(addr).await?; Ok(()) }