From ffcf5531264fa346ddbfb1530185b72d4f12cb74 Mon Sep 17 00:00:00 2001 From: Niko Reunanen Date: Sat, 25 Jan 2025 01:04:54 +0200 Subject: [PATCH] Initial binary definition --- Cargo.toml | 24 +++++++++++++++++++++ src/bin/main.rs | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/bin/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b079c3a --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "microdeploy" +version = "0.1.0" +edition = "2021" + +[dependencies] +axum = { version = "0.8.1" } +bollard = { version = "0.18.1", registry = "cratesio" } +tokio = { version = "1.43.0", features = ["full"] } +tower-http = { version = "0.6.2", features = ["trace"] } +tracing = { version = "0.1.41" } +tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } + +[[bin]] +name = "microdeploy" +path = "src/bin/main.rs" + +[profile.release] +debug = false +lto = false +codegen-units = 1 +strip = "debuginfo" +incremental = false +panic = "abort" diff --git a/src/bin/main.rs b/src/bin/main.rs new file mode 100644 index 0000000..7100848 --- /dev/null +++ b/src/bin/main.rs @@ -0,0 +1,55 @@ +use std::process::ExitCode; + +use axum::Router; +use bollard::Docker; +use tower_http::trace::TraceLayer; +use tracing::level_filters::LevelFilter; + +#[tokio::main] +async fn main() -> ExitCode { + let docker = match Docker::connect_with_socket_defaults() { + Ok(docker) => docker, + Err(error) => { + eprintln!("failed to connect docker socket: {error}"); + return ExitCode::FAILURE; + } + }; + + match docker.version().await { + Ok(version) => println!("docker version: {version:?}"), + Err(error) => { + eprintln!("failed to read docker version: {error}"); + return ExitCode::FAILURE; + } + }; + + let bind = std::env::var("BIND").unwrap_or("0.0.0.0:8080".into()); + + if let Err(error) = tracing_subscriber::fmt() + .with_max_level(LevelFilter::DEBUG) + .try_init() + { + eprintln!("failed to register a global tracing logger: {error}"); + return ExitCode::FAILURE; + } + + tracing::info!("Launching microdeploy on {bind}"); + + let listener = match tokio::net::TcpListener::bind(&bind).await { + Ok(listener) => listener, + Err(error) => { + tracing::error!("TcpListener::bind({bind}): {error}"); + return ExitCode::FAILURE; + } + }; + + let app = Router::new().layer(TraceLayer::new_for_http()); + + match axum::serve(listener, app).await { + Ok(()) => ExitCode::SUCCESS, + Err(error) => { + tracing::error!("axum::serve: {error}"); + ExitCode::FAILURE + } + } +}