add CD, fix warnings
This commit is contained in:
27
.gitea/workflows/default.yaml
Normal file
27
.gitea/workflows/default.yaml
Normal file
@ -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
|
||||
@ -3,6 +3,8 @@ name = "httpserver"
|
||||
version = "0.1.0"
|
||||
authors = ["tomoron <tomoron@student.42angouleme.fr>"]
|
||||
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
|
||||
|
||||
|
||||
24
Dockerfile
Normal file
24
Dockerfile
Normal file
@ -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"]
|
||||
@ -1,2 +1,2 @@
|
||||
mod component;
|
||||
pub use component::*;
|
||||
//mod component;
|
||||
//pub use component::*;
|
||||
|
||||
@ -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<String, HttpError> {
|
||||
|
||||
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<String, HttpError> {
|
||||
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<String, HttpError> {
|
||||
|
||||
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 => {
|
||||
|
||||
@ -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<FileStream, HttpError> {
|
||||
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::<String>(&mut pool.get().unwrap()));
|
||||
|
||||
if let Err(_) = result {
|
||||
return HttpError::internal_server_error("Database request failed");
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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<UploadServerStats, HttpError> {
|
||||
_ => 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::<i64>(&mut pool.get().unwrap())) {
|
||||
Ok(val) => val,
|
||||
_ => return HttpError::internal_server_error("wth ?")
|
||||
};
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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<ConnectionManager<PgConnection>> = {
|
||||
pub static DB: Pool<ConnectionManager<PgConnection>> = {
|
||||
let s_config = ServerConfig::load();
|
||||
let db_url = s_config.db_url.clone();
|
||||
|
||||
let manager = ConnectionManager::<PgConnection>::new(&db_url);
|
||||
diesel::r2d2::Pool::builder()
|
||||
Pool::builder()
|
||||
.build(manager)
|
||||
.unwrap_or_else(|_| panic!("Error creating pool for {}", db_url))
|
||||
};
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user