From 1c0ba90b8ead3fc46be882ff564d9348179f147c Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Mon, 6 May 2024 21:27:07 +0200 Subject: [PATCH] Create release docker image --- Makefile | 19 +++++ remote_backend/.gitignore | 1 + remote_backend/Cargo.lock | 83 +++++++++++++++++++ remote_backend/Cargo.toml | 4 +- remote_backend/Dockerfile | 9 ++ remote_backend/src/controllers/mod.rs | 1 + .../src/controllers/static_controller.rs | 45 ++++++++++ remote_backend/src/main.rs | 13 ++- 8 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 Makefile create mode 100644 remote_backend/Dockerfile create mode 100644 remote_backend/src/controllers/static_controller.rs diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8a8e10f --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +DOCKER_TEMP_DIR=temp + +all: frontend backend + +frontend: + cd remote_frontend && npm run build && cd .. + rm -rf remote_backend/static + mv remote_frontend/dist remote_backend/static + +backend: frontend + cd remote_backend && cargo clippy -- -D warnings && cargo build --release + +backend_docker: backend + rm -rf $(DOCKER_TEMP_DIR) + mkdir $(DOCKER_TEMP_DIR) + cp remote_backend/target/release/remote_backend $(DOCKER_TEMP_DIR) + docker build -t pierre42100/remote_backend -f remote_backend/Dockerfile "$(DOCKER_TEMP_DIR)" + rm -rf $(DOCKER_TEMP_DIR) + diff --git a/remote_backend/.gitignore b/remote_backend/.gitignore index c507849..8251c84 100644 --- a/remote_backend/.gitignore +++ b/remote_backend/.gitignore @@ -1,2 +1,3 @@ target .idea +static diff --git a/remote_backend/Cargo.lock b/remote_backend/Cargo.lock index 166b5ce..c1cdbe7 100644 --- a/remote_backend/Cargo.lock +++ b/remote_backend/Cargo.lock @@ -1353,6 +1353,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "miniz_oxide" version = "0.7.2" @@ -1743,7 +1753,9 @@ dependencies = [ "lazy_static", "light-openid", "log", + "mime_guess", "reqwest", + "rust-embed", "serde", "thiserror", "uuid", @@ -1816,6 +1828,40 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rust-embed" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb78f46d0066053d16d4ca7b898e9343bc3530f71c61d5ad84cd404ada068745" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91ac2a3c6c0520a3fb3dd89321177c3c692937c4eb21893378219da10c44fc8" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.60", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f69089032567ffff4eada41c573fc43ff466c7db7c5688b2e7969584345581" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -1866,6 +1912,15 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[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" @@ -2301,6 +2356,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" @@ -2389,6 +2453,16 @@ version = "0.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314" +[[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" @@ -2480,6 +2554,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "windows-sys" version = "0.48.0" diff --git a/remote_backend/Cargo.toml b/remote_backend/Cargo.toml index 09e4c47..88ab203 100644 --- a/remote_backend/Cargo.toml +++ b/remote_backend/Cargo.toml @@ -23,4 +23,6 @@ reqwest = { version = "0.12.4", features = ["json"] } thiserror = "1.0.59" uuid = { version = "1.8.0", features = ["v4", "serde"] } futures-util = "0.3.30" -lazy-regex = "3.1.0" \ No newline at end of file +lazy-regex = "3.1.0" +mime_guess = "2.0.4" +rust-embed = { version = "8.3.0" } \ No newline at end of file diff --git a/remote_backend/Dockerfile b/remote_backend/Dockerfile new file mode 100644 index 0000000..f8aded9 --- /dev/null +++ b/remote_backend/Dockerfile @@ -0,0 +1,9 @@ +FROM debian:bookworm-slim + +RUN apt-get update \ + && apt-get install -y libcurl4 \ + && rm -rf /var/lib/apt/lists/* + +COPY remote_backend /usr/local/bin/remote_backend + +ENTRYPOINT /usr/local/bin/remote_backend diff --git a/remote_backend/src/controllers/mod.rs b/remote_backend/src/controllers/mod.rs index 23ff409..1bf9cbd 100644 --- a/remote_backend/src/controllers/mod.rs +++ b/remote_backend/src/controllers/mod.rs @@ -9,6 +9,7 @@ pub mod auth_controller; pub mod server_controller; pub mod sys_info_controller; pub mod vm_controller; +pub mod static_controller; /// Custom error to ease controller writing #[derive(Debug)] diff --git a/remote_backend/src/controllers/static_controller.rs b/remote_backend/src/controllers/static_controller.rs new file mode 100644 index 0000000..137f0cc --- /dev/null +++ b/remote_backend/src/controllers/static_controller.rs @@ -0,0 +1,45 @@ +#[cfg(debug_assertions)] +pub use serve_static_debug::{root_index, serve_static_content}; +#[cfg(not(debug_assertions))] +pub use serve_static_release::{root_index, serve_static_content}; + +#[cfg(debug_assertions)] +mod serve_static_debug { + use actix_web::{HttpResponse, Responder}; + + pub async fn root_index() -> impl Responder { + HttpResponse::Ok().body("Hello world! Debug=on for VirtWeb!") + } + + pub async fn serve_static_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_static_content(path: web::Path) -> impl Responder { + handle_embedded_file(path.as_ref(), !path.as_ref().starts_with("static/")) + } +} diff --git a/remote_backend/src/main.rs b/remote_backend/src/main.rs index d5e65f4..3e3e84e 100644 --- a/remote_backend/src/main.rs +++ b/remote_backend/src/main.rs @@ -11,9 +11,7 @@ use actix_web::{web, App, HttpServer}; use light_openid::basic_state_manager::BasicStateManager; use remote_backend::app_config::AppConfig; use remote_backend::constants; -use remote_backend::controllers::{ - auth_controller, server_controller, sys_info_controller, vm_controller, -}; +use remote_backend::controllers::{auth_controller, server_controller, static_controller, sys_info_controller, vm_controller}; use remote_backend::middlewares::auth_middleware::AuthChecker; use std::time::Duration; @@ -61,6 +59,7 @@ async fn main() -> std::io::Result<()> { .app_data(Data::new(RemoteIPConfig { proxy: AppConfig::get().proxy_ip.clone(), })) + // Server routes .route( "/api/server/config", web::get().to(server_controller::config), @@ -81,6 +80,7 @@ async fn main() -> std::io::Result<()> { "/api/auth/sign_out", web::get().to(auth_controller::sign_out), ) + // VM routes .route("/api/vm/list", web::get().to(vm_controller::list)) .route("/api/vm/{uid}/state", web::get().to(vm_controller::state)) .route("/api/vm/{uid}/start", web::get().to(vm_controller::start)) @@ -99,6 +99,7 @@ async fn main() -> std::io::Result<()> { "/api/vm/{uid}/screenshot", web::get().to(vm_controller::screenshot), ) + // Sys info routes .route( "/api/sysinfo/config", web::get().to(sys_info_controller::config), @@ -107,6 +108,12 @@ async fn main() -> std::io::Result<()> { "/api/sysinfo/status", web::get().to(sys_info_controller::status), ) + // Static assets + .route("/", web::get().to(static_controller::root_index)) + .route( + "/{tail:.*}", + web::get().to(static_controller::serve_static_content), + ) }) .bind(&AppConfig::get().listen_address)? .run()