aboutsummaryrefslogtreecommitdiffstats
path: root/crates/configuration
diff options
context:
space:
mode:
Diffstat (limited to 'crates/configuration')
-rw-r--r--crates/configuration/.env.example1
-rw-r--r--crates/configuration/src/main.rs46
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");
+}