From 870eca9e9f55fae88556a518ed7c6afbec22b431 Mon Sep 17 00:00:00 2001 From: "Sijie.Sun" Date: Sat, 21 Dec 2024 01:27:39 +0800 Subject: [PATCH] optimize easytier-web (#522) 1. use default compress level for tower_http. the best level consume lots of memory 2. add more help message and command line arg. --- Cargo.lock | 2 + easytier-web/Cargo.toml | 3 ++ easytier-web/locales/app.yml | 24 +++++++++ easytier-web/src/main.rs | 93 +++++++++++++++++++++++++++++---- easytier-web/src/restful/mod.rs | 2 +- easytier/src/utils.rs | 2 +- 6 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 easytier-web/locales/app.yml diff --git a/Cargo.lock b/Cargo.lock index f5b6a0a..695a3ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1987,12 +1987,14 @@ dependencies = [ "password-auth", "rand 0.8.5", "rust-embed", + "rust-i18n", "rusttype", "sea-orm", "sea-orm-migration", "serde", "serde_json", "sqlx", + "sys-locale", "thiserror 1.0.63", "tokio", "tower-http", diff --git a/easytier-web/Cargo.toml b/easytier-web/Cargo.toml index fb26087..a70f29b 100644 --- a/easytier-web/Cargo.toml +++ b/easytier-web/Cargo.toml @@ -2,6 +2,7 @@ name = "easytier-web" version = "0.1.0" edition = "2021" +description = "Config server for easytier. easytier-core gets config from this and web frontend use it as restful api server." [dependencies] easytier = { path = "../easytier" } @@ -36,6 +37,8 @@ rusttype = "0.9.3" imageproc = "0.23.0" +rust-i18n = "3" +sys-locale = "0.3" clap = { version = "4.4.8", features = [ "string", "unicode", diff --git a/easytier-web/locales/app.yml b/easytier-web/locales/app.yml new file mode 100644 index 0000000..1ce6e5d --- /dev/null +++ b/easytier-web/locales/app.yml @@ -0,0 +1,24 @@ +_version: 2 + +cli: + db: + en: "path to the sqlite3 database file, used to save all the data" + zh-CN: "sqlite3 数据库文件路径, 用于保存所有数据" + console_log_level: + en: "The log level for the console logger. Possible values: trace, debug, info, warn, error" + zh-CN: "控制台日志级别。可能的值:trace, debug, info, warn, error" + file_log_level: + en: "The log level for the file logger. Possible values: trace, debug, info, warn, error" + zh-CN: "文件日志级别。可能的值:trace, debug, info, warn, error" + file_log_dir: + en: "The directory to save the log files, default is the current directory" + zh-CN: "保存日志文件的目录,默认为当前目录" + config_server_port: + en: "The port to listen for the config server, used by the easytier-core to connect to" + zh-CN: "配置服务器的监听端口,用于被 easytier-core 连接" + config_server_protocol: + en: "The protocol to listen for the config server, used by the easytier-core to connect to" + zh-CN: "配置服务器的监听协议,用于被 easytier-core 连接, 可能的值:udp, tcp" + 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 前端使用" diff --git a/easytier-web/src/main.rs b/easytier-web/src/main.rs index c12c0a0..38844d1 100644 --- a/easytier-web/src/main.rs +++ b/easytier-web/src/main.rs @@ -1,11 +1,18 @@ #![allow(dead_code)] +#[macro_use] +extern crate rust_i18n; + use std::sync::Arc; +use clap::{command, Parser}; use easytier::{ - common::config::{ConfigLoader, ConsoleLoggerConfig, TomlConfigLoader}, + common::{ + config::{ConfigLoader, ConsoleLoggerConfig, FileLoggerConfig, TomlConfigLoader}, + constants::EASYTIER_VERSION, + }, tunnel::udp::UdpTunnelListener, - utils::init_logger, + utils::{init_logger, setup_panic_handler}, }; mod client_manager; @@ -13,26 +20,94 @@ mod db; mod migrator; mod restful; +rust_i18n::i18n!("locales", fallback = "en"); + +#[derive(Parser, Debug)] +#[command(name = "easytier-core", author, version = EASYTIER_VERSION , about, long_about = None)] +struct Cli { + #[arg(short, long, default_value = "et.db", help = t!("cli.db").to_string())] + db: String, + + #[arg( + long, + help = t!("cli.console_log_level").to_string(), + )] + console_log_level: Option, + + #[arg( + long, + help = t!("cli.file_log_level").to_string(), + )] + file_log_level: Option, + + #[arg( + long, + help = t!("cli.file_log_dir").to_string(), + )] + file_log_dir: Option, + + #[arg( + long, + short='c', + default_value = "22020", + help = t!("cli.config_server_port").to_string(), + )] + config_server_port: u16, + + #[arg( + long, + short='p', + default_value = "udp", + help = t!("cli.config_server_protocol").to_string(), + )] + config_server_protocol: String, + + #[arg( + long, + short='a', + default_value = "11211", + help = t!("cli.api_server_port").to_string(), + )] + api_server_port: u16, +} + #[tokio::main] async fn main() { + let locale = sys_locale::get_locale().unwrap_or_else(|| String::from("en-US")); + rust_i18n::set_locale(&locale); + setup_panic_handler(); + + let cli = Cli::parse(); let config = TomlConfigLoader::default(); config.set_console_logger_config(ConsoleLoggerConfig { - level: Some("trace".to_string()), + level: cli.console_log_level, + }); + config.set_file_logger_config(FileLoggerConfig { + dir: cli.file_log_dir, + level: cli.file_log_level, + file: None, }); init_logger(config, false).unwrap(); // let db = db::Db::new(":memory:").await.unwrap(); - let db = db::Db::new("et.db").await.unwrap(); + let db = db::Db::new(cli.db).await.unwrap(); - let listener = UdpTunnelListener::new("udp://0.0.0.0:22020".parse().unwrap()); + let listener = UdpTunnelListener::new( + format!("udp://0.0.0.0:{}", cli.config_server_port) + .parse() + .unwrap(), + ); let mut mgr = client_manager::ClientManager::new(db.clone()); mgr.serve(listener).await.unwrap(); let mgr = Arc::new(mgr); - let mut restful_server = - restful::RestfulServer::new("0.0.0.0:11211".parse().unwrap(), mgr.clone(), db) - .await - .unwrap(); + let mut restful_server = restful::RestfulServer::new( + format!("0.0.0.0:{}", cli.api_server_port).parse().unwrap(), + mgr.clone(), + db, + ) + .await + .unwrap(); restful_server.start().await.unwrap(); tokio::signal::ctrl_c().await.unwrap(); } diff --git a/easytier-web/src/restful/mod.rs b/easytier-web/src/restful/mod.rs index 24870b9..44ab988 100644 --- a/easytier-web/src/restful/mod.rs +++ b/easytier-web/src/restful/mod.rs @@ -167,7 +167,7 @@ impl RestfulServer { .deflate(true) .gzip(true) .zstd(true) - .quality(tower_http::compression::CompressionLevel::Best); + .quality(tower_http::compression::CompressionLevel::Default); let app = Router::new() .route("/api/v1/summary", get(Self::handle_get_summary)) diff --git a/easytier/src/utils.rs b/easytier/src/utils.rs index b62a241..5160f04 100644 --- a/easytier/src/utils.rs +++ b/easytier/src/utils.rs @@ -168,4 +168,4 @@ mod tests { tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; tracing::debug!("test display debug"); } -} \ No newline at end of file +}