Add beautiful graceful shutdown on CTRL+C
- Display 'Thank you for using General Bots!' message - Show version, links, and farewell - Handle both SIGTERM and SIGINT (Ctrl+C) - Graceful 10 second timeout for in-flight requests
This commit is contained in:
parent
fe301d003b
commit
0bbaaf4878
1 changed files with 62 additions and 0 deletions
62
src/main.rs
62
src/main.rs
|
|
@ -133,6 +133,58 @@ async fn health_check_simple() -> (StatusCode, Json<serde_json::Value>) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Print beautiful shutdown message
|
||||||
|
fn print_shutdown_message() {
|
||||||
|
let version = env!("CARGO_PKG_VERSION");
|
||||||
|
println!();
|
||||||
|
println!("\x1b[36m╔════════════════════════════════════════════════════════════════╗\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[33m✨ Thank you for using General Bots! ✨\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[37mVersion: {:<10}\x1b[0m \x1b[36m║\x1b[0m", version);
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[37mGraceful shutdown completed.\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[34m🌐 https://github.com/GeneralBots\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[34m📧 contato@pragmatismo.cloud\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[32mSee you next time! 👋\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m║\x1b[0m \x1b[36m║\x1b[0m");
|
||||||
|
println!("\x1b[36m╚════════════════════════════════════════════════════════════════╝\x1b[0m");
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Graceful shutdown signal handler
|
||||||
|
async fn shutdown_signal() {
|
||||||
|
let ctrl_c = async {
|
||||||
|
tokio::signal::ctrl_c()
|
||||||
|
.await
|
||||||
|
.expect("Failed to install Ctrl+C handler");
|
||||||
|
};
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
let terminate = async {
|
||||||
|
tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
|
||||||
|
.expect("Failed to install SIGTERM handler")
|
||||||
|
.recv()
|
||||||
|
.await;
|
||||||
|
};
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
let terminate = std::future::pending::<()>();
|
||||||
|
|
||||||
|
tokio::select! {
|
||||||
|
_ = ctrl_c => {
|
||||||
|
info!("Received Ctrl+C, initiating graceful shutdown...");
|
||||||
|
}
|
||||||
|
_ = terminate => {
|
||||||
|
info!("Received SIGTERM, initiating graceful shutdown...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print beautiful shutdown message
|
||||||
|
print_shutdown_message();
|
||||||
|
}
|
||||||
|
|
||||||
async fn run_axum_server(
|
async fn run_axum_server(
|
||||||
app_state: Arc<AppState>,
|
app_state: Arc<AppState>,
|
||||||
port: u16,
|
port: u16,
|
||||||
|
|
@ -269,6 +321,15 @@ async fn run_axum_server(
|
||||||
info!("HTTPS server listening on {} with TLS", addr);
|
info!("HTTPS server listening on {} with TLS", addr);
|
||||||
|
|
||||||
let handle = axum_server::Handle::new();
|
let handle = axum_server::Handle::new();
|
||||||
|
let handle_clone = handle.clone();
|
||||||
|
|
||||||
|
// Spawn shutdown handler
|
||||||
|
tokio::spawn(async move {
|
||||||
|
shutdown_signal().await;
|
||||||
|
info!("Shutting down HTTPS server...");
|
||||||
|
handle_clone.graceful_shutdown(Some(std::time::Duration::from_secs(10)));
|
||||||
|
});
|
||||||
|
|
||||||
axum_server::bind_rustls(addr, tls_config)
|
axum_server::bind_rustls(addr, tls_config)
|
||||||
.handle(handle)
|
.handle(handle)
|
||||||
.serve(app.into_make_service())
|
.serve(app.into_make_service())
|
||||||
|
|
@ -284,6 +345,7 @@ async fn run_axum_server(
|
||||||
let listener = tokio::net::TcpListener::bind(addr).await?;
|
let listener = tokio::net::TcpListener::bind(addr).await?;
|
||||||
info!("HTTP server listening on {}", addr);
|
info!("HTTP server listening on {}", addr);
|
||||||
axum::serve(listener, app.into_make_service())
|
axum::serve(listener, app.into_make_service())
|
||||||
|
.with_graceful_shutdown(shutdown_signal())
|
||||||
.await
|
.await
|
||||||
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))
|
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue