aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-server
diff options
context:
space:
mode:
authorScotte Zinn <scotte@zinn.ca>2025-06-23 07:31:55 -0400
committerGitHub <noreply@github.com>2025-06-23 12:31:55 +0100
commit7f868711f0a7c77c868a2dd956fcc594d3d95ec8 (patch)
treed19d879cbe6b33624cd0724fb498cddf72e8a466 /crates/atuin-server
parentfix(search): prevent panic on malformed format strings (#2776) (#2777) (diff)
downloadatuin-7f868711f0a7c77c868a2dd956fcc594d3d95ec8.zip
feat: Add sqlite server support for self-hosting (#2770)
* Move db_uri setting to DbSettings * WIP: sqlite crate framework * WIP: Migrations * WIP: sqlite implementation * Add sqlite3 to Docker image * verified_at needed for user query * chore(deps): bump debian (#2772) Bumps debian from bookworm-20250428-slim to bookworm-20250520-slim. --- updated-dependencies: - dependency-name: debian dependency-version: bookworm-20250520-slim dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(doctor): mention the required ble.sh version (#2774) References: https://forum.atuin.sh/t/1047 * fix: Don't print errors in `zsh_autosuggest` helper (#2780) Previously, this would result in long multi-line errors when typing, making it hard to see the shell prompt: ``` $ Error: could not load client settings Caused by: 0: could not create config file 1: failed to create file `/home/jyn/.config/atuin/config.toml` 2: Required key not available (os error 126) Location: atuin-client/src/settings.rs:675:54 fError: could not load client settings Caused by: 0: could not create config file 1: failed to create file `/home/jyn/.config/atuin/config.toml` 2: Required key not available (os error 126) Location: atuin-client/src/settings.rs:675:54 faError: could not load client settings ``` Silence these in autosuggestions, such that they only show up when explicitly invoking atuin. * fix: `atuin.nu` enchancements (#2778) * PR feedback * Remove sqlite3 package * fix(search): prevent panic on malformed format strings (#2776) (#2777) * fix(search): prevent panic on malformed format strings (#2776) - Wrap format operations in panic catcher for graceful error handling - Improve error messages with context-aware guidance for common issues - Let runtime-format parser handle validation to avoid blocking valid formats Fixes crash when using malformed format strings by catching formatting errors gracefully and providing actionable guidance without restricting legitimate format patterns like {command} or {time}. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * Satisfy cargo fmt * test(search): add regression tests for format string panic (#2776) - Add test for malformed JSON format strings that previously caused panics - Add test to ensure valid format strings continue to work - Prevent future regressions of the format string panic issue 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Koichi Murase <myoga.murase@gmail.com> Co-authored-by: jyn <github@jyn.dev> Co-authored-by: Tyarel8 <98483313+Tyarel8@users.noreply.github.com> Co-authored-by: Brian Cosgrove <cosgroveb@gmail.com> Co-authored-by: Claude <noreply@anthropic.com>
Diffstat (limited to 'crates/atuin-server')
-rw-r--r--crates/atuin-server/server.toml1
-rw-r--r--crates/atuin-server/src/lib.rs13
-rw-r--r--crates/atuin-server/src/router.rs4
-rw-r--r--crates/atuin-server/src/settings.rs7
4 files changed, 11 insertions, 14 deletions
diff --git a/crates/atuin-server/server.toml b/crates/atuin-server/server.toml
index 946769c9..1eff5b72 100644
--- a/crates/atuin-server/server.toml
+++ b/crates/atuin-server/server.toml
@@ -9,6 +9,7 @@
## URI for postgres (using development creds here)
# db_uri="postgres://username:password@localhost/atuin"
+# db_uri="sqlite:///config/atuin-server.db"
## Maximum size for one history entry
# max_history_length = 8192
diff --git a/crates/atuin-server/src/lib.rs b/crates/atuin-server/src/lib.rs
index 7a0e982b..f1d616f2 100644
--- a/crates/atuin-server/src/lib.rs
+++ b/crates/atuin-server/src/lib.rs
@@ -45,10 +45,7 @@ async fn shutdown_signal() {
eprintln!("Shutting down gracefully...");
}
-pub async fn launch<Db: Database>(
- settings: Settings<Db::Settings>,
- addr: SocketAddr,
-) -> Result<()> {
+pub async fn launch<Db: Database>(settings: Settings, addr: SocketAddr) -> Result<()> {
if settings.tls.enable {
launch_with_tls::<Db>(settings, addr, shutdown_signal()).await
} else {
@@ -64,7 +61,7 @@ pub async fn launch<Db: Database>(
}
pub async fn launch_with_tcp_listener<Db: Database>(
- settings: Settings<Db::Settings>,
+ settings: Settings,
listener: TcpListener,
shutdown: impl Future<Output = ()> + Send + 'static,
) -> Result<()> {
@@ -78,7 +75,7 @@ pub async fn launch_with_tcp_listener<Db: Database>(
}
async fn launch_with_tls<Db: Database>(
- settings: Settings<Db::Settings>,
+ settings: Settings,
addr: SocketAddr,
shutdown: impl Future<Output = ()>,
) -> Result<()> {
@@ -135,9 +132,7 @@ pub async fn launch_metrics_server(host: String, port: u16) -> Result<()> {
Ok(())
}
-async fn make_router<Db: Database>(
- settings: Settings<<Db as Database>::Settings>,
-) -> Result<Router, eyre::Error> {
+async fn make_router<Db: Database>(settings: Settings) -> Result<Router, eyre::Error> {
let db = Db::new(&settings.db_settings)
.await
.wrap_err_with(|| format!("failed to connect to db: {:?}", settings.db_settings))?;
diff --git a/crates/atuin-server/src/router.rs b/crates/atuin-server/src/router.rs
index ae63e1e8..6d168f63 100644
--- a/crates/atuin-server/src/router.rs
+++ b/crates/atuin-server/src/router.rs
@@ -105,10 +105,10 @@ async fn semver(request: Request, next: Next) -> Response {
#[derive(Clone)]
pub struct AppState<DB: Database> {
pub database: DB,
- pub settings: Settings<DB::Settings>,
+ pub settings: Settings,
}
-pub fn router<DB: Database>(database: DB, settings: Settings<DB::Settings>) -> Router {
+pub fn router<DB: Database>(database: DB, settings: Settings) -> Router {
let routes = Router::new()
.route("/", get(handlers::index))
.route("/healthz", get(handlers::health::health_check))
diff --git a/crates/atuin-server/src/settings.rs b/crates/atuin-server/src/settings.rs
index d5070dae..7221d4dd 100644
--- a/crates/atuin-server/src/settings.rs
+++ b/crates/atuin-server/src/settings.rs
@@ -1,9 +1,10 @@
use std::{io::prelude::*, path::PathBuf};
+use atuin_server_database::DbSettings;
use config::{Config, Environment, File as ConfigFile, FileFormat};
use eyre::{Result, eyre};
use fs_err::{File, create_dir_all};
-use serde::{Deserialize, Serialize, de::DeserializeOwned};
+use serde::{Deserialize, Serialize};
static EXAMPLE_CONFIG: &str = include_str!("../server.toml");
@@ -53,7 +54,7 @@ impl Default for Metrics {
}
#[derive(Clone, Debug, Deserialize, Serialize)]
-pub struct Settings<DbSettings> {
+pub struct Settings {
pub host: String,
pub port: u16,
pub path: String,
@@ -78,7 +79,7 @@ pub struct Settings<DbSettings> {
pub db_settings: DbSettings,
}
-impl<DbSettings: DeserializeOwned> Settings<DbSettings> {
+impl Settings {
pub fn new() -> Result<Self> {
let mut config_file = if let Ok(p) = std::env::var("ATUIN_CONFIG_DIR") {
PathBuf::from(p)