feat: add error handling; update dockerfile
parent
391e45c09d
commit
6610442bf1
|
@ -1,4 +1,4 @@
|
|||
FROM rust:1.69-alpine3.16 AS builder
|
||||
FROM rust:1.83-alpine3.21 AS builder
|
||||
|
||||
ARG DI_VER=1.2.5
|
||||
|
||||
|
@ -18,7 +18,7 @@ COPY . ./
|
|||
RUN cargo build --release
|
||||
|
||||
|
||||
FROM alpine:3.16
|
||||
FROM alpine:3.21
|
||||
|
||||
COPY --from=builder /app/target/release/site /bin/site
|
||||
COPY --from=builder /app/dumb-init /bin/dumb-init
|
||||
|
|
12
src/main.rs
12
src/main.rs
|
@ -43,27 +43,17 @@ async fn main() {
|
|||
let data_dir = PathBuf::from(std::env::var("DATA_DIR").expect("No DATA_DIR was provided."));
|
||||
let static_dir = data_dir.join(STATIC_DIR_NAME);
|
||||
|
||||
std::fs::create_dir_all(&static_dir);
|
||||
std::fs::create_dir_all(&static_dir).unwrap();
|
||||
|
||||
let state = Context {
|
||||
static_dir,
|
||||
tmp_dir: std::env::temp_dir(),
|
||||
};
|
||||
|
||||
tracing::info!("tmpdir = {}", state.tmp_dir.display());
|
||||
|
||||
// Initialize metrics
|
||||
// let recorder_handle = metrics::setup_metrics_recorder();
|
||||
let app = server::app(state, &api_key, &REDIRECTS);
|
||||
|
||||
// Each static site gets mounted explicitely so that the default site can be used as fallback
|
||||
// Each entry is of the form (route, static dir name)
|
||||
let sites = [
|
||||
("/docs/vieter", "docs-vieter"),
|
||||
("/api-docs/vieter", "api-docs-vieter"),
|
||||
("/man/vieter", "man-vieter"),
|
||||
];
|
||||
|
||||
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
|
||||
let listener = TcpListener::bind(addr).await.unwrap();
|
||||
tracing::debug!("listening on {}", addr);
|
||||
|
|
|
@ -21,7 +21,7 @@ use std::{
|
|||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
use crate::STATIC_ROOT_NAME;
|
||||
use crate::{error::Result, STATIC_ROOT_NAME};
|
||||
|
||||
pub fn app(
|
||||
ctx: crate::Context,
|
||||
|
@ -41,6 +41,7 @@ pub fn app(
|
|||
.route(
|
||||
"/{*path}",
|
||||
post(post_static_archive)
|
||||
.delete(delete_dir)
|
||||
.route_layer(ValidateRequestHeaderLayer::bearer(api_key))
|
||||
.get_service(serve_dir),
|
||||
)
|
||||
|
@ -58,16 +59,16 @@ pub async fn post_static_archive(
|
|||
State(ctx): State<crate::Context>,
|
||||
extract::Path(path): extract::Path<String>,
|
||||
body: Body,
|
||||
) {
|
||||
) -> Result<()> {
|
||||
// Copy tarball data to file for parsing
|
||||
let stream = body.into_data_stream();
|
||||
let mut reader = StreamReader::new(stream.map_err(io::Error::other));
|
||||
|
||||
let uuid = uuid::Uuid::new_v4();
|
||||
let ar_path = ctx.tmp_dir.join(uuid.to_string());
|
||||
let mut f = File::create(&ar_path).await;
|
||||
let mut f = File::create(&ar_path).await?;
|
||||
|
||||
tokio::io::copy(&mut reader, &mut f.unwrap()).await;
|
||||
tokio::io::copy(&mut reader, &mut f).await?;
|
||||
|
||||
// Root is stored in its own specifc directory, as otherwise it would wipe all other uploaded
|
||||
// directories every time it's updated
|
||||
|
@ -80,7 +81,9 @@ pub async fn post_static_archive(
|
|||
|
||||
tokio::task::spawn_blocking(move || process_archive(&ar_path, &dest_dir))
|
||||
.await
|
||||
.unwrap();
|
||||
.unwrap()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn process_archive(ar_path: &Path, dest_dir: &Path) -> io::Result<()> {
|
||||
|
@ -116,7 +119,7 @@ fn process_archive(ar_path: &Path, dest_dir: &Path) -> io::Result<()> {
|
|||
pub async fn delete_dir(
|
||||
State(ctx): State<crate::Context>,
|
||||
extract::Path(path): extract::Path<String>,
|
||||
) {
|
||||
) -> Result<()> {
|
||||
let dest_dir = if path.is_empty() {
|
||||
String::from(crate::STATIC_ROOT_NAME)
|
||||
} else {
|
||||
|
@ -124,5 +127,7 @@ pub async fn delete_dir(
|
|||
};
|
||||
let dest_dir = ctx.static_dir.join(dest_dir);
|
||||
|
||||
tokio::fs::remove_dir_all(dest_dir).await;
|
||||
tokio::fs::remove_dir_all(dest_dir).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue