diff options
Diffstat (limited to 'crates/configuration')
-rw-r--r-- | crates/configuration/.env.example | 1 | ||||
-rw-r--r-- | crates/configuration/src/main.rs | 46 |
2 files changed, 44 insertions, 3 deletions
diff --git a/crates/configuration/.env.example b/crates/configuration/.env.example new file mode 100644 index 0000000..9581956 --- /dev/null +++ b/crates/configuration/.env.example @@ -0,0 +1 @@ +DATABASE_URL=postgres://postgres:password@localhost:5432/configuration diff --git a/crates/configuration/src/main.rs b/crates/configuration/src/main.rs index 7dc8da6..a7843a1 100644 --- a/crates/configuration/src/main.rs +++ b/crates/configuration/src/main.rs @@ -7,9 +7,13 @@ use std::net::{Ipv6Addr, SocketAddr}; use crate::{server::error::AppError, state::AppState}; use axum::http::header::CONTENT_TYPE; use clap::Parser; +use tokio::signal; use tower::{make::Shared, steer::Steer}; -use tracing::{error, info}; -use warden_stack::{Configuration, Services, tracing::Tracing}; +use tracing::{error, info, trace}; +use warden_stack::{ + Configuration, Services, + tracing::{SdkTracerProvider, Tracing}, +}; /// warden-config #[derive(Parser, Debug)] @@ -82,6 +86,12 @@ async fn main() -> Result<(), AppError> { ) .await?; + trace!("running migrations"); + sqlx::migrate!("./migrations") + .run(&state.services.postgres) + .await?; + trace!("migrations updated"); + let (app, grpc_server) = server::serve(state)?; let service = Steer::new( @@ -108,7 +118,37 @@ async fn main() -> Result<(), AppError> { let listener = tokio::net::TcpListener::bind(addr).await?; info!(port = addr.port(), "starting config-api"); - axum::serve(listener, Shared::new(service)).await?; + axum::serve(listener, Shared::new(service)) + .with_graceful_shutdown(shutdown_signal(provider)) + .await?; Ok(()) } + +async fn shutdown_signal(provider: SdkTracerProvider) { + let ctrl_c = async { + signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + #[cfg(unix)] + let terminate = async { + signal::unix::signal(signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => {}, + _ = terminate => {}, + } + + provider + .shutdown() + .expect("failed to shutdown trace provider"); +} |