mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-12 20:57:26 +08:00
add binary file easytier-web-embed (#718)
* embed web dashboard into easytier-web * add binary file easytier-web-embed
This commit is contained in:
@@ -18,6 +18,7 @@ axum = { version = "0.7", features = ["macros"] }
|
||||
axum-login = { version = "0.16" }
|
||||
password-auth = { version = "1.0.0" }
|
||||
axum-messages = "0.7.0"
|
||||
axum-embed = { version = "0.1.0", optional = true }
|
||||
tower-sessions-sqlx-store = { version = "0.14.1", features = ["sqlite"] }
|
||||
tower-sessions = { version = "0.13.0", default-features = false, features = [
|
||||
"signed",
|
||||
@@ -59,3 +60,7 @@ uuid = { version = "1.5.0", features = [
|
||||
] }
|
||||
|
||||
chrono = { version = "0.4.37", features = ["serde"] }
|
||||
|
||||
[features]
|
||||
default = []
|
||||
embed = ["dep:axum-embed"]
|
||||
@@ -22,3 +22,9 @@ 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 前端使用"
|
||||
web_server_port:
|
||||
en: "The port to listen for the web dashboard server"
|
||||
zh-CN: "web dashboard 服务器的监听端口"
|
||||
no_web:
|
||||
en: "Do not run the web dashboard server"
|
||||
zh-CN: "不运行 web dashboard 服务器"
|
||||
@@ -5,7 +5,7 @@ extern crate rust_i18n;
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
use clap::{command, Parser};
|
||||
use clap::Parser;
|
||||
use easytier::{
|
||||
common::{
|
||||
config::{ConfigLoader, ConsoleLoggerConfig, FileLoggerConfig, TomlConfigLoader},
|
||||
@@ -21,6 +21,9 @@ mod db;
|
||||
mod migrator;
|
||||
mod restful;
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
mod web;
|
||||
|
||||
rust_i18n::i18n!("locales", fallback = "en");
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
@@ -70,6 +73,23 @@ struct Cli {
|
||||
help = t!("cli.api_server_port").to_string(),
|
||||
)]
|
||||
api_server_port: u16,
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
#[arg(
|
||||
long,
|
||||
short='l',
|
||||
default_value = "11210",
|
||||
help = t!("cli.web_server_port").to_string(),
|
||||
)]
|
||||
web_server_port: u16,
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
#[arg(
|
||||
long,
|
||||
help = t!("cli.no_web").to_string(),
|
||||
default_value = "false"
|
||||
)]
|
||||
no_web: bool,
|
||||
}
|
||||
|
||||
pub fn get_listener_by_url(
|
||||
@@ -120,6 +140,20 @@ async fn main() {
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
restful_server.start().await.unwrap();
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
let mut web_server = web::WebServer::new(
|
||||
format!("0.0.0.0:{}", cli.web_server_port).parse().unwrap()
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
#[cfg(feature = "embed")]
|
||||
if !cli.no_web {
|
||||
web_server.start().await.unwrap();
|
||||
}
|
||||
|
||||
tokio::signal::ctrl_c().await.unwrap();
|
||||
}
|
||||
|
||||
39
easytier-web/src/web/mod.rs
Normal file
39
easytier-web/src/web/mod.rs
Normal file
@@ -0,0 +1,39 @@
|
||||
use axum::Router;
|
||||
use easytier::common::scoped_task::ScopedTask;
|
||||
use rust_embed::RustEmbed;
|
||||
use std::net::SocketAddr;
|
||||
use axum_embed::ServeEmbed;
|
||||
use tokio::net::TcpListener;
|
||||
|
||||
/// Embed assets for web dashboard, build frontend first
|
||||
#[derive(RustEmbed, Clone)]
|
||||
#[folder = "frontend/dist/"]
|
||||
struct Assets;
|
||||
|
||||
pub struct WebServer {
|
||||
bind_addr: SocketAddr,
|
||||
serve_task: Option<ScopedTask<()>>,
|
||||
}
|
||||
|
||||
impl WebServer {
|
||||
pub async fn new(bind_addr: SocketAddr) -> anyhow::Result<Self> {
|
||||
Ok(WebServer {
|
||||
bind_addr,
|
||||
serve_task: None,
|
||||
})
|
||||
}
|
||||
|
||||
pub async fn start(&mut self) -> Result<(), anyhow::Error> {
|
||||
let listener = TcpListener::bind(self.bind_addr).await?;
|
||||
let service = ServeEmbed::<Assets>::new();
|
||||
let app = Router::new().fallback_service(service);
|
||||
|
||||
let task = tokio::spawn(async move {
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
});
|
||||
|
||||
self.serve_task = Some(task.into());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user