//! InternetProject 后端入口。 //! //! 启动一个后台采样任务持续刷新系统指标,并对外提供 HTTP 接口: //! - `GET /api/web/stats` 给 React 前端(挂 CORS) //! - `GET /api/client/health` 给未来 .NET 客户端(不挂 CORS) mod auth; mod folders; mod monitor; mod photos; mod routes; mod state; mod weather; use std::net::SocketAddr; use state::AppState; #[tokio::main] async fn main() { let state = AppState::new(); // 后台每秒采样系统指标,写入共享快照。 tokio::spawn(monitor::run_sampler(state.clone())); let app = routes::build_router(state); let port = std::env::var("PORT").unwrap_or_else(|_| "8080".to_string()); let addr = format!("0.0.0.0:{port}"); let listener = tokio::net::TcpListener::bind(&addr) .await .unwrap_or_else(|_| panic!("无法绑定 {addr}")); println!("backend listening on http://{addr}"); // 用 connect-info 让 handler 能拿到对端 socket 地址(天气接口要按访问者 IP 定位/限流)。 axum::serve(listener, app.into_make_service_with_connect_info::()) .await .expect("server error"); }