mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-14 05:37:23 +08:00
Magic DNS and easytier-web improvements (#856)
1. dns add macos system config 2. allow easytier-web serve dashboard and api in same port
This commit is contained in:
@@ -23,8 +23,8 @@ cli:
|
||||
en: "The port to listen for the restful server, acting as ApiHost and used by the web frontend"
|
||||
zh-CN: "restful 服务器的监听端口,作为 ApiHost 并被 web 前端使用"
|
||||
web_server_port:
|
||||
en: "The port to listen for the web dashboard server"
|
||||
zh-CN: "web dashboard 服务器的监听端口"
|
||||
en: "The port to listen for the web dashboard server, default is same as the api server port"
|
||||
zh-CN: "web dashboard 服务器的监听端口, 默认为与 api 服务器端口相同"
|
||||
no_web:
|
||||
en: "Do not run the web dashboard server"
|
||||
zh-CN: "不运行 web dashboard 服务器"
|
||||
@@ -78,10 +78,9 @@ struct Cli {
|
||||
#[arg(
|
||||
long,
|
||||
short='l',
|
||||
default_value = "11210",
|
||||
help = t!("cli.web_server_port").to_string(),
|
||||
)]
|
||||
web_server_port: u16,
|
||||
web_server_port: Option<u16>,
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
#[arg(
|
||||
@@ -92,9 +91,7 @@ struct Cli {
|
||||
no_web: bool,
|
||||
}
|
||||
|
||||
pub fn get_listener_by_url(
|
||||
l: &url::Url,
|
||||
) -> Result<Box<dyn TunnelListener>, Error> {
|
||||
pub fn get_listener_by_url(l: &url::Url) -> Result<Box<dyn TunnelListener>, Error> {
|
||||
Ok(match l.scheme() {
|
||||
"tcp" => Box::new(TcpTunnelListener::new(l.clone())),
|
||||
"udp" => Box::new(UdpTunnelListener::new(l.clone())),
|
||||
@@ -126,17 +123,30 @@ async fn main() {
|
||||
let db = db::Db::new(cli.db).await.unwrap();
|
||||
|
||||
let listener = get_listener_by_url(
|
||||
&format!("{}://0.0.0.0:{}", cli.config_server_protocol, cli.config_server_port).parse().unwrap(),
|
||||
&format!(
|
||||
"{}://0.0.0.0:{}",
|
||||
cli.config_server_protocol, cli.config_server_port
|
||||
)
|
||||
.parse()
|
||||
.unwrap(),
|
||||
)
|
||||
.unwrap();
|
||||
let mut mgr = client_manager::ClientManager::new(db.clone());
|
||||
mgr.serve(listener).await.unwrap();
|
||||
let mgr = Arc::new(mgr);
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
let restful_also_serve_web = !cli.no_web
|
||||
&& (cli.web_server_port.is_none() || cli.web_server_port == Some(cli.api_server_port));
|
||||
|
||||
#[cfg(not(feature = "embed"))]
|
||||
let restful_also_serve_web = false;
|
||||
|
||||
let mut restful_server = restful::RestfulServer::new(
|
||||
format!("0.0.0.0:{}", cli.api_server_port).parse().unwrap(),
|
||||
mgr.clone(),
|
||||
db,
|
||||
restful_also_serve_web,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
@@ -145,13 +155,15 @@ async fn main() {
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
let mut web_server = web::WebServer::new(
|
||||
format!("0.0.0.0:{}", cli.web_server_port).parse().unwrap()
|
||||
format!("0.0.0.0:{}", cli.web_server_port.unwrap_or(0))
|
||||
.parse()
|
||||
.unwrap(),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
if !cli.no_web {
|
||||
if !cli.no_web && !restful_also_serve_web {
|
||||
web_server.start().await.unwrap();
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,12 @@ use crate::client_manager::storage::StorageToken;
|
||||
use crate::client_manager::ClientManager;
|
||||
use crate::db::Db;
|
||||
|
||||
/// Embed assets for web dashboard, build frontend first
|
||||
#[cfg(feature = "embed")]
|
||||
#[derive(rust_embed::RustEmbed, Clone)]
|
||||
#[folder = "frontend/dist/"]
|
||||
struct Assets;
|
||||
|
||||
pub struct RestfulServer {
|
||||
bind_addr: SocketAddr,
|
||||
client_mgr: Arc<ClientManager>,
|
||||
@@ -38,6 +44,8 @@ pub struct RestfulServer {
|
||||
delete_task: Option<ScopedTask<tower_sessions::session_store::Result<()>>>,
|
||||
|
||||
network_api: NetworkApi,
|
||||
|
||||
enable_web_embed: bool,
|
||||
}
|
||||
|
||||
type AppStateInner = Arc<ClientManager>;
|
||||
@@ -87,6 +95,7 @@ impl RestfulServer {
|
||||
bind_addr: SocketAddr,
|
||||
client_mgr: Arc<ClientManager>,
|
||||
db: Db,
|
||||
enable_web_embed: bool,
|
||||
) -> anyhow::Result<Self> {
|
||||
assert!(client_mgr.is_running());
|
||||
|
||||
@@ -99,6 +108,7 @@ impl RestfulServer {
|
||||
serve_task: None,
|
||||
delete_task: None,
|
||||
network_api,
|
||||
enable_web_embed,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -219,6 +229,15 @@ impl RestfulServer {
|
||||
.layer(tower_http::cors::CorsLayer::very_permissive())
|
||||
.layer(compression_layer);
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
let app = if self.enable_web_embed {
|
||||
use axum_embed::ServeEmbed;
|
||||
let service = ServeEmbed::<Assets>::new();
|
||||
app.fallback_service(service)
|
||||
} else {
|
||||
app
|
||||
};
|
||||
|
||||
let task = tokio::spawn(async move {
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user