From 5716f7f16bf98fa0e285a90cc3a41198239687ef Mon Sep 17 00:00:00 2001 From: Mg Pig Date: Sun, 1 Mar 2026 01:02:31 +0800 Subject: [PATCH] fix(web): allow configuring listen address for API and web servers (#1919) (#1948) --- easytier-web/locales/app.yml | 6 ++++++ easytier-web/src/main.rs | 27 ++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/easytier-web/locales/app.yml b/easytier-web/locales/app.yml index 79070306..eb7344e4 100644 --- a/easytier-web/locales/app.yml +++ b/easytier-web/locales/app.yml @@ -22,9 +22,15 @@ cli: api_server_port: en: "The port to listen for the restful server, acting as ApiHost and used by the web frontend" zh-CN: "restful 服务器的监听端口,作为 ApiHost 并被 web 前端使用" + api_server_addr: + en: "The listen address for the restful server, e.g. 0.0.0.0, ::, 127.0.0.1" + zh-CN: "restful 服务器的监听地址, 例如 0.0.0.0, ::, 127.0.0.1" web_server_port: en: "The port to listen for the web dashboard server, default is same as the api server port" zh-CN: "web dashboard 服务器的监听端口, 默认为与 api 服务器端口相同" + web_server_addr: + en: "The listen address for the web dashboard server (only effective when web_server_port differs from api_server_port or web_server_addr differs from api_server_addr), e.g. 0.0.0.0, ::, 127.0.0.1" + zh-CN: "web dashboard 服务器的监听地址(仅在 web_server_port 与 api_server_port 不同,或 web_server_addr 与 api_server_addr 不同时生效), 例如 0.0.0.0, ::, 127.0.0.1" no_web: en: "Do not run the web dashboard server" zh-CN: "不运行 web dashboard 服务器" diff --git a/easytier-web/src/main.rs b/easytier-web/src/main.rs index 0b20240d..c8a2d123 100644 --- a/easytier-web/src/main.rs +++ b/easytier-web/src/main.rs @@ -3,6 +3,7 @@ #[macro_use] extern crate rust_i18n; +use std::net::IpAddr; use std::sync::Arc; use clap::Parser; @@ -81,6 +82,13 @@ struct Cli { )] api_server_port: u16, + #[arg( + long, + default_value = "0.0.0.0", + help = t!("cli.api_server_addr").to_string(), + )] + api_server_addr: IpAddr, + #[arg( long, help = t!("cli.geoip_db").to_string(), @@ -95,6 +103,14 @@ struct Cli { )] web_server_port: Option, + #[cfg(feature = "embed")] + #[arg( + long, + default_value = "0.0.0.0", + help = t!("cli.web_server_addr").to_string(), + )] + web_server_addr: IpAddr, + #[cfg(feature = "embed")] #[arg( long, @@ -205,7 +221,10 @@ async fn main() { (None, None) } else { let web_router = web::build_router(cli.api_host.clone()); - if cli.web_server_port.is_none() || cli.web_server_port == Some(cli.api_server_port) { + if cli.web_server_port.is_none() + || (cli.web_server_port == Some(cli.api_server_port) + && cli.web_server_addr == cli.api_server_addr) + { (Some(web_router), None) } else { (None, Some(web_router)) @@ -215,7 +234,7 @@ async fn main() { let web_router_restful = None; let _restful_server_tasks = restful::RestfulServer::new( - format!("0.0.0.0:{}", cli.api_server_port).parse().unwrap(), + std::net::SocketAddr::new(cli.api_server_addr, cli.api_server_port), mgr.clone(), db, web_router_restful, @@ -231,9 +250,7 @@ async fn main() { let _web_server_task = if let Some(web_router) = web_router_static { Some( web::WebServer::new( - format!("0.0.0.0:{}", cli.web_server_port.unwrap_or(0)) - .parse() - .unwrap(), + std::net::SocketAddr::new(cli.web_server_addr, cli.web_server_port.unwrap_or(0)), web_router, ) .await