From 6392c0a2c744a6a9c5824e729b9150133d0c555f Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 3 Dec 2025 09:43:04 +0100 Subject: [PATCH] Add production Makefile --- Makefile | 18 ++++ matrixgw_backend/.gitignore | 1 + matrixgw_backend/Cargo.lock | 80 ++++++++++++++++++ matrixgw_backend/Cargo.toml | 4 +- .../docker/matrixgw_backend/Dockerfile | 10 +++ matrixgw_backend/src/controllers/mod.rs | 1 + .../src/controllers/static_controller.rs | 45 ++++++++++ matrixgw_backend/src/main.rs | 8 +- matrixgw_frontend/public/favicon.png | Bin 0 -> 4710 bytes matrixgw_frontend/public/vite.svg | 1 - 10 files changed, 165 insertions(+), 3 deletions(-) create mode 100644 Makefile create mode 100644 matrixgw_backend/docker/matrixgw_backend/Dockerfile create mode 100644 matrixgw_backend/src/controllers/static_controller.rs create mode 100644 matrixgw_frontend/public/favicon.png delete mode 100644 matrixgw_frontend/public/vite.svg diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ad8433a --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +DOCKER_TEMP_DIR=temp + +all: frontend backend + +frontend: + cd matrixgw_frontend && npm run build && cd .. + rm -rf matrixgw_backend/static + mv matrixgw_frontend/dist matrixgw_backend/static + +backend: frontend + cd matrixgw_backend && cargo clippy -- -D warnings && cargo build --release + +backend_docker: backend + rm -rf $(DOCKER_TEMP_DIR) + mkdir $(DOCKER_TEMP_DIR) + cp matrixgw_backend/target/release/matrixgw_backend $(DOCKER_TEMP_DIR) + docker build -t pierre42100/matrix_gateway -f matrixgw_backend/docker/matrixgw_backend/Dockerfile "$(DOCKER_TEMP_DIR)" + rm -rf $(DOCKER_TEMP_DIR) diff --git a/matrixgw_backend/.gitignore b/matrixgw_backend/.gitignore index f3a3b05..afb9e89 100644 --- a/matrixgw_backend/.gitignore +++ b/matrixgw_backend/.gitignore @@ -2,3 +2,4 @@ storage app_storage .idea target +static \ No newline at end of file diff --git a/matrixgw_backend/Cargo.lock b/matrixgw_backend/Cargo.lock index f44d616..8666560 100644 --- a/matrixgw_backend/Cargo.lock +++ b/matrixgw_backend/Cargo.lock @@ -3077,8 +3077,10 @@ dependencies = [ "log", "mailchecker", "matrix-sdk", + "mime_guess", "ractor", "rand 0.9.2", + "rust-embed", "serde", "serde_json", "sha2", @@ -3124,6 +3126,16 @@ version = "0.1.54" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbf6f36070878c42c5233846cd3de24cf9016828fd47bc22957a687298bb21fc" +[[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 = "minimal-lexical" version = "0.2.1" @@ -4196,6 +4208,40 @@ dependencies = [ "smallvec", ] +[[package]] +name = "rust-embed" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "947d7f3fad52b283d261c4c99a084937e2fe492248cb9a68a8435a861b8798ca" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fa2c8c9e8711e10f9c4fd2d64317ef13feaab820a4c51541f1a8c8e2e851ab2" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b161f275cb337fe0a44d924a5f4df0ed69c2c39519858f931ce61c779d3475" +dependencies = [ + "sha2", + "walkdir", +] + [[package]] name = "rust-stemmers" version = "1.2.0" @@ -4279,6 +4325,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[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.28" @@ -5278,6 +5333,12 @@ dependencies = [ "web-time", ] +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + [[package]] name = "unicode-ident" version = "1.0.22" @@ -5417,6 +5478,16 @@ dependencies = [ "zeroize", ] +[[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" @@ -5563,6 +5634,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/matrixgw_backend/Cargo.toml b/matrixgw_backend/Cargo.toml index 84f0947..454ea41 100644 --- a/matrixgw_backend/Cargo.toml +++ b/matrixgw_backend/Cargo.toml @@ -33,4 +33,6 @@ ractor = "0.15.9" serde_json = "1.0.145" lazy-regex = "3.4.2" actix-ws = "0.3.0" -infer = "0.19.0" \ No newline at end of file +infer = "0.19.0" +rust-embed = "8.9.0" +mime_guess = "2.0.5" \ No newline at end of file diff --git a/matrixgw_backend/docker/matrixgw_backend/Dockerfile b/matrixgw_backend/docker/matrixgw_backend/Dockerfile new file mode 100644 index 0000000..0ff5868 --- /dev/null +++ b/matrixgw_backend/docker/matrixgw_backend/Dockerfile @@ -0,0 +1,10 @@ +FROM debian:bookworm-slim + +RUN apt-get update \ + && apt-get install -y libcurl4 libsqlite3-0 \ + && rm -rf /var/lib/apt/lists/* + + +COPY matrixgw_backend /usr/local/bin/matrixgw_backend + +ENTRYPOINT ["/usr/local/bin/matrixgw_backend"] \ No newline at end of file diff --git a/matrixgw_backend/src/controllers/mod.rs b/matrixgw_backend/src/controllers/mod.rs index 75ceeed..9dfcf05 100644 --- a/matrixgw_backend/src/controllers/mod.rs +++ b/matrixgw_backend/src/controllers/mod.rs @@ -7,6 +7,7 @@ pub mod matrix; pub mod matrix_link_controller; pub mod matrix_sync_thread_controller; pub mod server_controller; +pub mod static_controller; pub mod tokens_controller; pub mod ws_controller; diff --git a/matrixgw_backend/src/controllers/static_controller.rs b/matrixgw_backend/src/controllers/static_controller.rs new file mode 100644 index 0000000..93f8073 --- /dev/null +++ b/matrixgw_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 Matrix Gateway!") + } + + 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::{HttpResponse, Responder, web}; + 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/matrixgw_backend/src/main.rs b/matrixgw_backend/src/main.rs index 6137319..d2bcccf 100644 --- a/matrixgw_backend/src/main.rs +++ b/matrixgw_backend/src/main.rs @@ -15,7 +15,7 @@ use matrixgw_backend::controllers::matrix::{ }; use matrixgw_backend::controllers::{ auth_controller, matrix_link_controller, matrix_sync_thread_controller, server_controller, - tokens_controller, ws_controller, + static_controller, tokens_controller, ws_controller, }; use matrixgw_backend::matrix_connection::matrix_manager::MatrixManagerActor; use matrixgw_backend::users::User; @@ -202,6 +202,12 @@ async fn main() -> std::io::Result<()> { "/api/matrix/media/{mxc}", web::get().to(matrix_media_controller::serve_mxc_handler), ) + // Static assets + .route("/", web::get().to(static_controller::root_index)) + .route( + "/{tail:.*}", + web::get().to(static_controller::serve_static_content), + ) }) .workers(4) .bind(&AppConfig::get().listen_address)? diff --git a/matrixgw_frontend/public/favicon.png b/matrixgw_frontend/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..6027e50857e6f7716c0c234de212d40a22a768b0 GIT binary patch literal 4710 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 Q1=z=8zl~|3F)ijl0KG@Y`v3p{ literal 0 HcmV?d00001 diff --git a/matrixgw_frontend/public/vite.svg b/matrixgw_frontend/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/matrixgw_frontend/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file