From df58358469be0df06ba7e90ca431c529548764ad Mon Sep 17 00:00:00 2001 From: Samuel Mwangi Date: Tue, 24 Mar 2026 16:42:20 +0300 Subject: [PATCH 1/2] Notify systemd on startup if server is run on a systemd OS. --- Cargo.toml | 1 + src/server/mod.rs | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 01f6b78..1776da7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ napi-derive = "3.0.0" percent-encoding = "2.3.2" regex = "1.12.3" rustls-acme = {version = "0.15.1", features = ["tokio"]} +sd-notify = "0.5.0" serde_json = "1.0.148" serde_qs = "1.0.0" serde_urlencoded = "0.7.1" diff --git a/src/server/mod.rs b/src/server/mod.rs index 5d64e82..64818ba 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -13,6 +13,7 @@ use napi::threadsafe_function::{ThreadsafeCallContext, ThreadsafeFunction}; use napi_derive::napi; use rustls_acme::AcmeConfig; use rustls_acme::caches::DirCache; +use sd_notify::{NotifyState, notify}; use std::sync::Arc; use tokio::net::TcpListener; use tokio_stream::wrappers::TcpListenerStream; @@ -177,7 +178,14 @@ impl Server { let rt = tokio::runtime::Runtime::new().unwrap(); rt.block_on(async move { let tcp_listener = TcpListener::bind(&addr).await.unwrap(); - log::debug!("Server listening on {}", addr); + let server_status_message = format!("Server listening on {}", addr); + log::debug!("{server_status_message}"); + + if let Err(e) = notify(&[NotifyState::Ready]) { + log::error!("Failed to notify systemd: {}", e); + } + + let _ = notify(&[NotifyState::Status(&server_status_message)]); match acme_config_meta { Some(acme) => { From 18c2403f4ad2062d86e4da110b3e6c27efab09dc Mon Sep 17 00:00:00 2001 From: Samuel Mwangi Date: Tue, 24 Mar 2026 16:53:34 +0300 Subject: [PATCH 2/2] Limit systemd notification code and dependencies to unix systems. --- Cargo.toml | 4 +++- src/server/mod.rs | 13 ++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1776da7..5568270 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,6 @@ napi-derive = "3.0.0" percent-encoding = "2.3.2" regex = "1.12.3" rustls-acme = {version = "0.15.1", features = ["tokio"]} -sd-notify = "0.5.0" serde_json = "1.0.148" serde_qs = "1.0.0" serde_urlencoded = "0.7.1" @@ -70,3 +69,6 @@ napi-build = "2" [profile.release] lto = true strip = "symbols" + +[target.'cfg(unix)'.dependencies] +sd-notify = "0.5.0" diff --git a/src/server/mod.rs b/src/server/mod.rs index 64818ba..bcfefef 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -13,7 +13,6 @@ use napi::threadsafe_function::{ThreadsafeCallContext, ThreadsafeFunction}; use napi_derive::napi; use rustls_acme::AcmeConfig; use rustls_acme::caches::DirCache; -use sd_notify::{NotifyState, notify}; use std::sync::Arc; use tokio::net::TcpListener; use tokio_stream::wrappers::TcpListenerStream; @@ -181,11 +180,15 @@ impl Server { let server_status_message = format!("Server listening on {}", addr); log::debug!("{server_status_message}"); - if let Err(e) = notify(&[NotifyState::Ready]) { - log::error!("Failed to notify systemd: {}", e); - } + #[cfg(unix)] + { + use sd_notify::{NotifyState, notify}; + if let Err(e) = notify(&[NotifyState::Ready]) { + log::error!("Failed to notify systemd: {}", e); + } - let _ = notify(&[NotifyState::Status(&server_status_message)]); + let _ = notify(&[NotifyState::Status(&server_status_message)]); + } match acme_config_meta { Some(acme) => {