From efe4549f82fe5d800c5fc8ba6da862bffde97f5e Mon Sep 17 00:00:00 2001 From: Mathias Wagner Date: Tue, 9 Sep 2025 09:53:30 +0200 Subject: [PATCH] Implement support for serving webui --- server/Cargo.lock | 47 ++++++++++++++++++++++++++++++++++++++++++++++ server/Cargo.toml | 2 +- server/src/main.rs | 25 +++++++++++++++--------- 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/server/Cargo.lock b/server/Cargo.lock index 710205f..0b8dd30 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -628,6 +628,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + [[package]] name = "httparse" version = "1.10.1" @@ -947,6 +953,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1782,6 +1798,19 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "tower" version = "0.5.2" @@ -1806,10 +1835,22 @@ checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "bitflags", "bytes", + "futures-core", + "futures-util", "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", "pin-project-lite", + "tokio", + "tokio-util", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -1862,6 +1903,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-bidi" version = "0.3.18" diff --git a/server/Cargo.toml b/server/Cargo.toml index 6fcb3cb..84d10d9 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -12,5 +12,5 @@ serde_json = "1.0" bcrypt = "0.17.1" uuid = { version = "1.0", features = ["v4", "serde"] } chrono = { version = "0.4", features = ["serde"] } -tower-http = { version = "0.6.6", features = ["cors"] } +tower-http = { version = "0.6.6", features = ["cors", "fs"] } anyhow = "1.0" \ No newline at end of file diff --git a/server/src/main.rs b/server/src/main.rs index 280b0ad..660bd06 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,18 +4,15 @@ mod utils; use utils::init_database; use anyhow::Result; -use axum::{ - routing::{delete, get, post, put}, - Router, -}; +use axum::{routing::{delete, get, post, put}, Router}; use routes::{admin, auth as auth_routes, machines, setup}; -use tower_http::cors::CorsLayer; +use tower_http::{cors::CorsLayer, services::{ServeDir, ServeFile}}; +use std::path::Path; #[tokio::main] async fn main() -> Result<()> { let pool = init_database().await?; - - let app = Router::new() + let api_routes = Router::new() .route("/setup/status", get(setup::get_setup_status)) .route("/setup/init", post(setup::init_setup)) @@ -35,10 +32,20 @@ async fn main() -> Result<()> { .with_state(pool); + let dist_path = "../dist"; + let app = Router::new() + .nest("/api", api_routes) + .nest_service("/assets", ServeDir::new(format!("{}/assets", dist_path))) + .route_service("/", ServeFile::new(format!("{}/index.html", dist_path))) + .fallback_service(ServeFile::new(format!("{}/index.html", dist_path))) + .layer(CorsLayer::permissive()); + + if !Path::new(dist_path).exists() { + println!("Warning: dist directory not found at {}", dist_path); + } + let listener = tokio::net::TcpListener::bind("0.0.0.0:8379").await?; println!("Server running on http://0.0.0.0:8379"); - axum::serve(listener, app).await?; - Ok(()) }