diff --git a/crates/atuin-server/src/handlers/health.rs b/crates/atuin-server/src/handlers/health.rs new file mode 100644 index 00000000000..1a3fc4d79e4 --- /dev/null +++ b/crates/atuin-server/src/handlers/health.rs @@ -0,0 +1,15 @@ +use axum::{http, response::IntoResponse, Json}; + +use serde::Serialize; + +#[derive(Serialize)] +pub struct HealthResponse { + pub status: &'static str, +} + +pub async fn health_check() -> impl IntoResponse { + ( + http::StatusCode::OK, + Json(HealthResponse { status: "healthy" }), + ) +} diff --git a/crates/atuin-server/src/handlers/mod.rs b/crates/atuin-server/src/handlers/mod.rs index ce10f4b70d8..97132c079ba 100644 --- a/crates/atuin-server/src/handlers/mod.rs +++ b/crates/atuin-server/src/handlers/mod.rs @@ -4,6 +4,7 @@ use axum::{extract::State, http, response::IntoResponse, Json}; use crate::router::AppState; +pub mod health; pub mod history; pub mod record; pub mod status; diff --git a/crates/atuin-server/src/router.rs b/crates/atuin-server/src/router.rs index df3a2937304..d6700b8d812 100644 --- a/crates/atuin-server/src/router.rs +++ b/crates/atuin-server/src/router.rs @@ -111,6 +111,7 @@ pub struct AppState { pub fn router(database: DB, settings: Settings) -> Router { let routes = Router::new() .route("/", get(handlers::index)) + .route("/healthz", get(handlers::health::health_check)) .route("/sync/count", get(handlers::history::count)) .route("/sync/history", get(handlers::history::list)) .route("/sync/calendar/:focus", get(handlers::history::calendar)) diff --git a/k8s/atuin.yaml b/k8s/atuin.yaml index 2a9cb82a1da..7f7174fe733 100644 --- a/k8s/atuin.yaml +++ b/k8s/atuin.yaml @@ -33,7 +33,7 @@ spec: image: ghcr.io/atuinsh/atuin:latest name: atuin ports: - - containerPort: 8888 + - containerPort: &port 8888 resources: limits: cpu: 250m @@ -41,6 +41,23 @@ spec: requests: cpu: 250m memory: 1Gi + startupProbe: + httpGet: + path: /healthz + port: *port + failureThreshold: 30 + periodSeconds: 10 + livenessProbe: + httpGet: + path: /healthz + port: *port + initialDelaySeconds: 3 + periodSeconds: 3 + readinessProbe: + tcpSocket: + port: *port + initialDelaySeconds: 15 + periodSeconds: 10 volumeMounts: - mountPath: /config name: atuin-claim0