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 0000000..6027e50 Binary files /dev/null and b/matrixgw_frontend/public/favicon.png differ 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