Compare commits
1 commit
main
...
config-rew
Author | SHA1 | Date | |
---|---|---|---|
1c52be1fe6 |
7 changed files with 29 additions and 71 deletions
26
Cargo.lock
generated
26
Cargo.lock
generated
|
@ -290,21 +290,6 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "axum-range"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b1c30398a7f716ebdd7f3c8a4f7a7a6df48a30e002007fd57b2a7a00fac864bd"
|
|
||||||
dependencies = [
|
|
||||||
"axum",
|
|
||||||
"axum-extra",
|
|
||||||
"bytes",
|
|
||||||
"futures",
|
|
||||||
"http-body",
|
|
||||||
"pin-project",
|
|
||||||
"tokio",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace"
|
name = "backtrace"
|
||||||
version = "0.3.71"
|
version = "0.3.71"
|
||||||
|
@ -1472,14 +1457,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "nyazoom"
|
name = "nyazoom"
|
||||||
version = "0.3.2"
|
version = "0.2.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-bincode",
|
"async-bincode",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"async_zip",
|
"async_zip",
|
||||||
"axum",
|
"axum",
|
||||||
"axum-extra",
|
"axum-extra",
|
||||||
"axum-range",
|
|
||||||
"bincode",
|
"bincode",
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap",
|
"clap",
|
||||||
|
@ -1499,7 +1483,7 @@ dependencies = [
|
||||||
"sqlx",
|
"sqlx",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"tower 0.5.2",
|
"tower 0.5.0",
|
||||||
"tower-http",
|
"tower-http",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
@ -2672,14 +2656,14 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower"
|
name = "tower"
|
||||||
version = "0.5.2"
|
version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9"
|
checksum = "36b837f86b25d7c0d7988f00a54e74739be6477f2aac6201b8f429a7569991b7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"sync_wrapper 1.0.1",
|
"sync_wrapper 0.1.2",
|
||||||
"tower-layer",
|
"tower-layer",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "nyazoom"
|
name = "nyazoom"
|
||||||
version = "0.3.2"
|
version = "0.2.4"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
authors = ["Zynh Ludwig <Zynh0722@gmail.com>"]
|
authors = ["Zynh Ludwig <Zynh0722@gmail.com>"]
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
@ -46,7 +46,6 @@ tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
||||||
color-eyre = "0.6.3"
|
color-eyre = "0.6.3"
|
||||||
eyre = "0.6.12"
|
eyre = "0.6.12"
|
||||||
clap = "4.5.26"
|
clap = "4.5.26"
|
||||||
axum-range = "0.4.0"
|
|
||||||
|
|
||||||
# I want to use askama's block feature, this requires unreleased 0.13
|
# I want to use askama's block feature, this requires unreleased 0.13
|
||||||
[dependencies.sqlx]
|
[dependencies.sqlx]
|
||||||
|
|
|
@ -6,10 +6,9 @@ README is a supreme work in progress, terribly sorry
|
||||||
|
|
||||||
<!-- markdownlint-disable MD013 -->
|
<!-- markdownlint-disable MD013 -->
|
||||||
|
|
||||||
| variable | description | default |
|
| variable | description | default |
|
||||||
| -------------- | --------------------------------------------- | ------------------------ |
|
| ----------- | --------------------------------------------- | ------------------------ |
|
||||||
| `NZ_CACHE_DIR` | the location for storing all downloaded files | "/var/lib/nyazoom/cache" |
|
| `CACHE_DIR` | the location for storing all downloaded files | "/var/lib/nyazoom/cache" |
|
||||||
| `NZ_DIST_DIR` | location of the folder to be static served | "./dist" |
|
| `DIST_DIR` | location of the folder to be static served | "./dist" |
|
||||||
| `DATABASE_URL` | sqlite database connection url | "./dist" |
|
|
||||||
|
|
||||||
<!-- markdownlint-restore -->
|
<!-- markdownlint-restore -->
|
||||||
|
|
5
build.rs
5
build.rs
|
@ -1,5 +0,0 @@
|
||||||
// generated by `sqlx migrate build-script`
|
|
||||||
fn main() {
|
|
||||||
// trigger recompilation when a new migration is added
|
|
||||||
println!("cargo:rerun-if-changed=migrations");
|
|
||||||
}
|
|
34
src/main.rs
34
src/main.rs
|
@ -6,15 +6,13 @@ use axum::{
|
||||||
Router,
|
Router,
|
||||||
};
|
};
|
||||||
use axum_extra::TypedHeader;
|
use axum_extra::TypedHeader;
|
||||||
use eyre::Context;
|
|
||||||
use tower_http::{services::ServeDir, trace::TraceLayer};
|
use tower_http::{services::ServeDir, trace::TraceLayer};
|
||||||
use views::templates::WelcomeTemplate;
|
use views::templates::WelcomeTemplate;
|
||||||
|
|
||||||
use std::net::SocketAddr;
|
use std::{net::SocketAddr, sync::OnceLock};
|
||||||
|
|
||||||
use nyazoom::*;
|
use nyazoom::{config::Settings, *};
|
||||||
|
|
||||||
use config::Settings;
|
|
||||||
use util::{headers::ForwardedFor, logging, sweeper};
|
use util::{headers::ForwardedFor, logging, sweeper};
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
|
@ -22,26 +20,16 @@ async fn main() -> eyre::Result<()> {
|
||||||
color_eyre::install()?;
|
color_eyre::install()?;
|
||||||
logging::init_tracing();
|
logging::init_tracing();
|
||||||
|
|
||||||
// Generate settings from figments and create initial AppState
|
let config = Settings::try_new()?;
|
||||||
let state = AppState::new_with_settings(Settings::try_new()?);
|
tracing::info!(?config, "config generated");
|
||||||
|
|
||||||
tracing::debug!(
|
// uses create_dir_all to create both .cache and serve inside it in one go
|
||||||
chache_dir=?state.settings.cache.dir,
|
util::make_dir(&config.cache.dir).await?;
|
||||||
dist_dir=?state.settings.dist.dir,
|
|
||||||
db_url=?state.settings.database.url,
|
|
||||||
"config generated"
|
|
||||||
);
|
|
||||||
|
|
||||||
// uses create_dir_all to ensure a valid directory structure
|
let fallback_service = ServeDir::new(&config.dist.dir);
|
||||||
util::make_dir(&state.settings.cache.dir).await?;
|
|
||||||
|
|
||||||
// Use the sqlite pool to run the db migrations
|
let state = AppState::new_with_settings(config);
|
||||||
sqlx::migrate!()
|
|
||||||
.run(&state.pool)
|
|
||||||
.await
|
|
||||||
.context("running database migrations")?;
|
|
||||||
|
|
||||||
// Spawn the cleanup task
|
|
||||||
sweeper::spawn(state.clone());
|
sweeper::spawn(state.clone());
|
||||||
|
|
||||||
// Router Setup
|
// Router Setup
|
||||||
|
@ -51,10 +39,10 @@ async fn main() -> eyre::Result<()> {
|
||||||
.nest("/upload", get_upload_router())
|
.nest("/upload", get_upload_router())
|
||||||
.nest("/records", get_records_router())
|
.nest("/records", get_records_router())
|
||||||
.nest("/link", get_link_router())
|
.nest("/link", get_link_router())
|
||||||
.fallback_service(ServeDir::new(&state.settings.dist.dir))
|
.with_state(state)
|
||||||
|
.fallback_service(fallback_service)
|
||||||
.layer(TraceLayer::new_for_http())
|
.layer(TraceLayer::new_for_http())
|
||||||
.layer(middleware::from_fn(log_source))
|
.layer(middleware::from_fn(log_source));
|
||||||
.with_state(state);
|
|
||||||
|
|
||||||
serve(app).await;
|
serve(app).await;
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use axum::{
|
use axum::{
|
||||||
|
body::Body,
|
||||||
extract::State,
|
extract::State,
|
||||||
response::{IntoResponse, Redirect},
|
response::{IntoResponse, Redirect},
|
||||||
routing::get,
|
routing::get,
|
||||||
Router,
|
Router,
|
||||||
};
|
};
|
||||||
use axum_extra::{headers::Range, TypedHeader};
|
|
||||||
use axum_range::{KnownSize, Ranged};
|
|
||||||
use reqwest::StatusCode;
|
use reqwest::StatusCode;
|
||||||
|
use tokio_util::io::ReaderStream;
|
||||||
|
|
||||||
use crate::AppState;
|
use crate::AppState;
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ pub fn get_download_router() -> Router<AppState> {
|
||||||
|
|
||||||
async fn download(
|
async fn download(
|
||||||
axum::extract::Path(id): axum::extract::Path<String>,
|
axum::extract::Path(id): axum::extract::Path<String>,
|
||||||
range: Option<TypedHeader<Range>>,
|
|
||||||
State(state): State<AppState>,
|
State(state): State<AppState>,
|
||||||
) -> Result<axum::response::Response, (StatusCode, String)> {
|
) -> Result<axum::response::Response, (StatusCode, String)> {
|
||||||
let mut conn = state.pool.acquire().await.unwrap();
|
let mut conn = state.pool.acquire().await.unwrap();
|
||||||
|
@ -34,11 +33,10 @@ async fn download(
|
||||||
.await
|
.await
|
||||||
.map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()))?;
|
.map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err.to_string()))?;
|
||||||
|
|
||||||
let body = KnownSize::file(file).await.unwrap();
|
return Ok(axum::response::Response::builder()
|
||||||
let range = range.map(|TypedHeader(range)| range);
|
.header("Content-Type", "application/zip")
|
||||||
let ranged_body = Ranged::new(range, body);
|
.body(Body::from_stream(ReaderStream::new(file)))
|
||||||
|
.unwrap());
|
||||||
return Ok(([("Content-Type", "application/zip")], ranged_body).into_response());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Redirect::to("/404.html").into_response())
|
Ok(Redirect::to("/404.html").into_response())
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use sqlx::{
|
use sqlx::{sqlite::SqliteConnectOptions, SqlitePool};
|
||||||
sqlite::{SqliteConnectOptions, SqliteJournalMode},
|
|
||||||
SqlitePool,
|
|
||||||
};
|
|
||||||
|
|
||||||
use crate::config::Settings;
|
use crate::config::Settings;
|
||||||
|
|
||||||
|
@ -19,9 +16,7 @@ impl AppState {
|
||||||
Self {
|
Self {
|
||||||
pool: SqlitePool::connect_lazy_with(
|
pool: SqlitePool::connect_lazy_with(
|
||||||
SqliteConnectOptions::from_str(&settings.database.url)
|
SqliteConnectOptions::from_str(&settings.database.url)
|
||||||
.expect("Invalid Database String")
|
.expect("Invalid Database String"),
|
||||||
.journal_mode(SqliteJournalMode::Wal)
|
|
||||||
.create_if_missing(true),
|
|
||||||
),
|
),
|
||||||
settings,
|
settings,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue