mod app; mod error; mod routes; mod service; mod state; mod storage; use std::{env, net::SocketAddr, path::PathBuf}; use mcpaas_registry::PostgresRegistry; use tokio::net::TcpListener; use tracing::info; use crate::{app::build_app, service::AdminService, state::AppState}; #[tokio::main] async fn main() -> Result<(), Box> { tracing_subscriber::fmt() .with_env_filter( env::var("MCPAAS_LOG_LEVEL") .unwrap_or_else(|_| "admin_api=info,tower_http=info".into()), ) .init(); let database_url = env::var("MCPAAS_DATABASE_URL")?; let storage_root = PathBuf::from( env::var("MCPAAS_STORAGE_ROOT").unwrap_or_else(|_| "/var/lib/rmcp/storage".into()), ); let bind_addr = env::var("MCPAAS_ADMIN_BIND").unwrap_or_else(|_| "0.0.0.0:3001".into()); let socket_addr: SocketAddr = bind_addr.parse()?; let registry = PostgresRegistry::connect(&database_url).await?; let state = AppState { service: AdminService::new(registry, storage_root), }; let app = build_app(state); let listener = TcpListener::bind(socket_addr).await?; info!("admin-api listening on {}", socket_addr); axum::serve(listener, app).await?; Ok(()) }