From e18162b32d46c119b1aa02b73a2a366a1916525d Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 7 Aug 2024 16:44:30 +0200 Subject: [PATCH] Can build central in production mode --- Makefile | 11 +++ central_backend/.gitignore | 1 + central_backend/Cargo.lock | 83 +++++++++++++++++++ central_backend/Cargo.toml | 4 +- central_backend/src/server/mod.rs | 1 + central_backend/src/server/servers.rs | 10 ++- .../src/server/web_app_controller.rs | 46 ++++++++++ central_frontend/src/routes/LoginRoute.tsx | 1 - 8 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 Makefile create mode 100644 central_backend/src/server/web_app_controller.rs diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ee23212 --- /dev/null +++ b/Makefile @@ -0,0 +1,11 @@ +DOCKER_TEMP_DIR=temp + +all: frontend backend + +frontend: + cd central_frontend && npm run build && cd .. + rm -rf central_backend/static + mv central_frontend/dist central_backend/static + +backend: frontend + cd central_backend && cargo clippy -- -D warnings && cargo build --release diff --git a/central_backend/.gitignore b/central_backend/.gitignore index f0767f5..e45beac 100644 --- a/central_backend/.gitignore +++ b/central_backend/.gitignore @@ -1,3 +1,4 @@ target .idea storage +static diff --git a/central_backend/Cargo.lock b/central_backend/Cargo.lock index af6b20c..bf8209b 100644 --- a/central_backend/Cargo.lock +++ b/central_backend/Cargo.lock @@ -610,10 +610,12 @@ dependencies = [ "lazy_static", "libc", "log", + "mime_guess", "openssl", "openssl-sys", "rand", "reqwest", + "rust-embed", "semver", "serde", "serde_json", @@ -1441,6 +1443,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.7.4" @@ -1816,6 +1828,40 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rust-embed" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -1890,6 +1936,15 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.23" @@ -2315,6 +2370,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" @@ -2391,6 +2455,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -2482,6 +2556,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "windows-core" version = "0.52.0" diff --git a/central_backend/Cargo.toml b/central_backend/Cargo.toml index d8e0fcd..bcd5573 100644 --- a/central_backend/Cargo.toml +++ b/central_backend/Cargo.toml @@ -31,4 +31,6 @@ uuid = { version = "1.9.1", features = ["v4", "serde"] } semver = { version = "1.0.23", features = ["serde"] } lazy-regex = "3.1.0" tokio = { version = "1.38.1", features = ["full"] } -tokio_schedule = "0.3.2" \ No newline at end of file +tokio_schedule = "0.3.2" +mime_guess = "2.0.5" +rust-embed = "8.5.0" \ No newline at end of file diff --git a/central_backend/src/server/mod.rs b/central_backend/src/server/mod.rs index 0fa62e3..b009b16 100644 --- a/central_backend/src/server/mod.rs +++ b/central_backend/src/server/mod.rs @@ -8,5 +8,6 @@ pub mod devices_api; pub mod servers; pub mod unsecure_server; pub mod web_api; +pub mod web_app_controller; pub type WebEnergyActor = web::Data; diff --git a/central_backend/src/server/servers.rs b/central_backend/src/server/servers.rs index 704ac46..985d412 100644 --- a/central_backend/src/server/servers.rs +++ b/central_backend/src/server/servers.rs @@ -6,6 +6,7 @@ use crate::server::auth_middleware::AuthChecker; use crate::server::devices_api::{mgmt_controller, utils_controller}; use crate::server::unsecure_server::*; use crate::server::web_api::*; +use crate::server::web_app_controller; use actix_cors::Cors; use actix_identity::config::LogoutBehaviour; use actix_identity::IdentityMiddleware; @@ -105,7 +106,7 @@ pub async fn secure_server(energy_actor: EnergyActorAddr) -> anyhow::Result<()> .app_data(web::Data::new(RemoteIPConfig { proxy: AppConfig::get().proxy_ip.clone(), })) - .route("/", web::get().to(server_controller::secure_home)) + //.route("/", web::get().to(server_controller::secure_home)) // Web API // Server controller .route( @@ -181,6 +182,13 @@ pub async fn secure_server(energy_actor: EnergyActorAddr) -> anyhow::Result<()> "/devices_api/mgmt/get_certificate", web::get().to(mgmt_controller::get_certificate), ) + // Web app + .route("/", web::get().to(web_app_controller::root_index)) + .route( + "/assets/{tail:.*}", + web::get().to(web_app_controller::serve_assets_content), + ) + .route("/{tail:.*}", web::get().to(web_app_controller::root_index)) }) .bind_openssl(&AppConfig::get().listen_address, builder)? .run() diff --git a/central_backend/src/server/web_app_controller.rs b/central_backend/src/server/web_app_controller.rs new file mode 100644 index 0000000..5dbd129 --- /dev/null +++ b/central_backend/src/server/web_app_controller.rs @@ -0,0 +1,46 @@ +#[cfg(debug_assertions)] +pub use serve_static_debug::{root_index, serve_assets_content}; +#[cfg(not(debug_assertions))] +pub use serve_static_release::{root_index, serve_assets_content}; + +#[cfg(debug_assertions)] +mod serve_static_debug { + use actix_web::{HttpResponse, Responder}; + + pub async fn root_index() -> impl Responder { + HttpResponse::Ok() + .body("Solar energy secure home: Hello world! Debug=on for Solar platform!") + } + + pub async fn serve_assets_content() -> impl Responder { + HttpResponse::NotFound().body("Hello world! Static assets are not served in debug mode") + } +} + +#[cfg(not(debug_assertions))] +mod serve_static_release { + use actix_web::{web, HttpResponse, Responder}; + use rust_embed::RustEmbed; + + #[derive(RustEmbed)] + #[folder = "static/"] + struct Asset; + + fn handle_embedded_file(path: &str, can_fallback: bool) -> HttpResponse { + match (Asset::get(path), can_fallback) { + (Some(content), _) => HttpResponse::Ok() + .content_type(mime_guess::from_path(path).first_or_octet_stream().as_ref()) + .body(content.data.into_owned()), + (None, false) => HttpResponse::NotFound().body("404 Not Found"), + (None, true) => handle_embedded_file("index.html", false), + } + } + + pub async fn root_index() -> impl Responder { + handle_embedded_file("index.html", false) + } + + pub async fn serve_assets_content(path: web::Path) -> impl Responder { + handle_embedded_file(&format!("assets/{}", path.as_ref()), false) + } +} diff --git a/central_frontend/src/routes/LoginRoute.tsx b/central_frontend/src/routes/LoginRoute.tsx index 52fd48f..db20f04 100644 --- a/central_frontend/src/routes/LoginRoute.tsx +++ b/central_frontend/src/routes/LoginRoute.tsx @@ -10,7 +10,6 @@ import Paper from "@mui/material/Paper"; import TextField from "@mui/material/TextField"; import Typography from "@mui/material/Typography"; import * as React from "react"; -import { useAlert } from "../hooks/context_providers/AlertDialogProvider"; import { useLoadingMessage } from "../hooks/context_providers/LoadingMessageProvider"; import { AuthApi } from "../api/AuthApi";