diff --git a/server/src/cli/mod.rs b/server/src/cli/mod.rs index fbb8414..5df94a2 100644 --- a/server/src/cli/mod.rs +++ b/server/src/cli/mod.rs @@ -51,6 +51,7 @@ pub struct ClapConfig { #[serde(rename_all = "lowercase")] pub enum NetConfigType { Tcp, + Unix, } #[derive(Serialize, Clone, Args, Debug)] @@ -66,6 +67,11 @@ pub struct NetConfig { #[serde(skip_serializing_if = "Option::is_none")] #[arg(long, value_name = "PORT", global = true)] port: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(rename = "path")] + #[arg(long, value_name = "SOCKET", global = true)] + socket: Option, } #[derive(Subcommand)] diff --git a/server/src/cli/serve.rs b/server/src/cli/serve.rs index 974938b..639bafa 100644 --- a/server/src/cli/serve.rs +++ b/server/src/cli/serve.rs @@ -65,6 +65,24 @@ pub fn serve(config: &crate::config::Config) -> u8 { .unwrap() }); } + NetConfig::Unix { path } => { + // Try to remove the socket file first if it exists + let _ = std::fs::remove_file(&path); + + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).unwrap(); + } + + tracing::info!("Listening on Unix socket {:?}", path); + + rt.block_on(async { + let listener = tokio::net::UnixListener::bind(path).unwrap(); + + axum::serve(listener, app.into_make_service()) + .await + .unwrap() + }); + } } 0 diff --git a/server/src/config.rs b/server/src/config.rs index 02af0ab..25b4195 100644 --- a/server/src/config.rs +++ b/server/src/config.rs @@ -28,6 +28,7 @@ impl From for tracing::Level { #[serde(tag = "type")] pub enum NetConfig { Tcp { domain: String, port: u16 }, + Unix { path: PathBuf }, } #[derive(Serialize, Deserialize)]