diff --git a/.gitea/workflows/default.yaml b/.gitea/workflows/default.yaml new file mode 100644 index 0000000..87aa849 --- /dev/null +++ b/.gitea/workflows/default.yaml @@ -0,0 +1,27 @@ +runs: + using: "composite" + steps: + - uses: actions/checkout@v5 + with: + fetch-depth: 0 + + - name: get commit hash + id: get_hash + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + registry: git.tmoron.fr + username: ${{ secrets.PUSH_USERNAME }} + password: ${{ secrets.PUSH_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: "{{defaultContext}}:${{ input.path }}" + push: true + tags: git.tmoron.fr/${{ inputs.name }}:${{ steps.get_hash.outputs.sha_short }}k diff --git a/Cargo.toml b/Cargo.toml index b0391a1..4728fd6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,8 @@ name = "httpserver" version = "0.1.0" authors = ["tomoron "] edition = "2021" +description = "a rewrite of my http server in rust" +repository = "https://git.tmoron.fr/tom/httpserver" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6fc6659 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM lewimbes/dioxus AS builder + +RUN mkdir /build +WORKDIR /build + +LABEL stage="builder" + +RUN apt-get update && apt-get install -y \ + libpq-dev \ + default-libmysqlclient-dev \ + sqlite3 libsqlite3-dev && \ + rm -rf /var/lib/apt/lists/* + +COPY . . + +RUN dx build -r + +RUN cp /build/target/dx/httpserver/release/web /app -r +WORKDIR /app +RUN rm -rf /build + +ENV IP="0.0.0.0" + +CMD ["./server"] diff --git a/src/components/progress/mod.rs b/src/components/progress/mod.rs index 9a8ae55..f14b92d 100644 --- a/src/components/progress/mod.rs +++ b/src/components/progress/mod.rs @@ -1,2 +1,2 @@ -mod component; -pub use component::*; \ No newline at end of file +//mod component; +//pub use component::*; diff --git a/src/components/upload/create.rs b/src/components/upload/create.rs index bbacae7..fa1be72 100644 --- a/src/components/upload/create.rs +++ b/src/components/upload/create.rs @@ -12,9 +12,11 @@ use crate::config::ClientConfig; use std::time::Duration; +#[cfg(feature = "server")] use std::fs; -use std::fs::File; +#[cfg(feature = "server")] use std::io::Write; +#[cfg(feature = "server")] use futures::StreamExt; @@ -44,7 +46,7 @@ async fn upload_file(mut upload: FileStream) -> Result { let filename: String = loop { let cur = random_string::generate(20, "ABCDEFGHIJKLMNOPQRTSTUVWXYZ0123456789"); - if (!fs::exists(s_config.upload_folder.clone() + &cur).expect("can't check if file exists")) { + if !fs::exists(s_config.upload_folder.clone() + &cur).expect("can't check if file exists") { break cur; } }; @@ -74,7 +76,7 @@ async fn upload_file(mut upload: FileStream) -> Result { break; } - if file.write(&bytes).is_err() { error == Some("failed write"); break; }; + if file.write(&bytes).is_err() { error = Some("failed write"); break; }; }, Err(_) => { error = Some("unknown"); break; } } @@ -82,8 +84,8 @@ async fn upload_file(mut upload: FileStream) -> Result { match error { Some(err)=> { - file.sync_data(); - fs::remove_file(s_config.upload_folder.clone() + &filename); + let _ = file.sync_data(); + let _ = fs::remove_file(s_config.upload_folder.clone() + &filename); HttpError::internal_server_error(err)? } None => { diff --git a/src/components/upload/get.rs b/src/components/upload/get.rs index 3e12576..e4bfa20 100644 --- a/src/components/upload/get.rs +++ b/src/components/upload/get.rs @@ -1,9 +1,6 @@ -use std::fs::create_dir; - use dioxus::prelude::*; use dioxus::fullstack::FileStream; -#[cfg(feature = "server")] -use httpserver::models::GetFile; + #[cfg(feature = "server")] use diesel::prelude::*; #[cfg(feature = "server")] @@ -15,6 +12,7 @@ use httpserver::schema; #[cfg(feature = "server")] use crate::config::ServerConfig; +#[cfg(feature = "server")] use std::path::Path; @@ -39,10 +37,10 @@ async fn download_file(id: String) -> Result { use schema::file; let s_config = ServerConfig::load(); - let result = DB.with(|pool| schema::file::table.select((file::filename)) + let result = DB.with(|pool| schema::file::table.select(file::filename) .filter(file::stored_filename.eq(id.clone())) .filter(file::deleted.eq(false)) - .load::<(String)>(&mut pool.get().unwrap())); + .load::(&mut pool.get().unwrap())); if let Err(_) = result { return HttpError::internal_server_error("Database request failed"); diff --git a/src/components/upload/info.rs b/src/components/upload/info.rs index 4e2cf32..8d0f2f8 100644 --- a/src/components/upload/info.rs +++ b/src/components/upload/info.rs @@ -1,20 +1,17 @@ -use std::time::SystemTime; - use chrono::DateTime; use chrono::Utc; -use dioxus::fullstack::httperror; use dioxus::prelude::*; use serde::{Deserialize, Serialize}; use httpserver::utils::byte_to_human_size; -#[cfg(feature = "server")] -use httpserver::models::GetFile; #[cfg(feature = "server")] use diesel::prelude::*; #[cfg(feature = "server")] use httpserver::DB; +#[cfg(feature = "server")] +use std::time::SystemTime; #[cfg(feature = "server")] use httpserver::schema; diff --git a/src/components/upload/stats.rs b/src/components/upload/stats.rs index ceffc7e..3d2e00d 100644 --- a/src/components/upload/stats.rs +++ b/src/components/upload/stats.rs @@ -1,7 +1,5 @@ use dioxus::prelude::*; -#[cfg(feature = "server")] -use httpserver::models::GetFile; #[cfg(feature = "server")] use diesel::prelude::*; #[cfg(feature = "server")] @@ -9,17 +7,14 @@ use httpserver::DB; #[cfg(feature = "server")] use diesel::dsl; -#[cfg(feature = "server")] -use httpserver::schema; - #[cfg(feature = "server")] use crate::config::ServerConfig; use serde::{Deserialize, Serialize}; +#[cfg(feature = "server")] use bigdecimal::{BigDecimal, ToPrimitive}; -use httpserver::utils::byte_to_human_size; #[derive(Deserialize, Serialize)] struct UploadServerStats { total_limit_soft: u64, @@ -43,8 +38,8 @@ async fn get_upload_stats() -> Result { _ => return HttpError::internal_server_error("wth ?") }; - let total_files = match DB.with(|pool| file::table.select((dsl::count(file::id))) - .first::<(i64)>(&mut pool.get().unwrap())) { + let total_files = match DB.with(|pool| file::table.select(dsl::count(file::id)) + .first::(&mut pool.get().unwrap())) { Ok(val) => val, _ => return HttpError::internal_server_error("wth ?") }; diff --git a/src/config.rs b/src/config.rs index a718c00..f33f821 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,7 +12,7 @@ impl ServerConfig { pub fn load() -> Self { Self { upload_folder: "./test/".to_string(), - db_url: std::env::var("DATABASE_URL").expect("missing DATABASE_URL"), + db_url: std::env::var("HTTPSERVER_DATABASE_URL").expect("missing HTTPSERVER_DATABASE_URL"), upload_storage_limit_soft: 1024 * 1024 * 1024 * 200, upload_storage_limit_hard: 1024 * 1024 * 1024 * 300, diff --git a/src/lib.rs b/src/lib.rs index 490a9d2..b87c052 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,5 @@ #[cfg(feature = "server")] use diesel::pg::PgConnection; -#[cfg(feature = "server")] -use diesel::prelude::*; pub mod utils; @@ -18,17 +16,15 @@ pub mod schema; #[cfg(feature = "server")] use diesel::r2d2::{ConnectionManager, Pool}; -#[cfg(feature = "server")] -use diesel::result::Error; #[cfg(feature = "server")] thread_local! { - pub static DB: diesel::r2d2::Pool> = { + pub static DB: Pool> = { let s_config = ServerConfig::load(); let db_url = s_config.db_url.clone(); let manager = ConnectionManager::::new(&db_url); - diesel::r2d2::Pool::builder() + Pool::builder() .build(manager) .unwrap_or_else(|_| panic!("Error creating pool for {}", db_url)) }; diff --git a/src/main.rs b/src/main.rs index 10eab16..e39104a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,9 @@ use crate::components::toast::ToastProvider; use crate::views::{Upload, UploadInfo, Home}; +#[cfg(feature = "server")] +use crate::config::ServerConfig; + mod components; mod views; @@ -27,6 +30,9 @@ const FAVICON: Asset = asset!("/assets/favicon.ico"); const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); fn main() { + #[cfg(feature = "server")] + let _ = ServerConfig::load(); + dioxus::logger::init(Level::INFO).expect("failed to init logger"); dioxus::launch(App); }