Persist chat history to Postgres via durable JetStream consumer

DATABASE_URL required at startup; schema self-initializes.
Compose gains a postgres service for standalone dev.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bendik Aagaard Lynghaug
2026-07-08 22:14:26 +02:00
co-authored by Claude Fable 5
parent 6b97ec3b0f
commit ec3771f2e7
10 changed files with 696 additions and 21 deletions
+14 -1
View File
@@ -10,7 +10,7 @@ async fn main() -> anyhow::Result<()> {
Router,
};
use cnats::app::{shell, App};
use cnats::server::{oidc, sse, AppState};
use cnats::server::{oidc, sse, store, AppState};
use leptos::prelude::*;
use leptos_axum::{generate_route_list, LeptosRoutes};
use std::sync::Arc;
@@ -34,12 +34,25 @@ async fn main() -> anyhow::Result<()> {
tracing::info!(%nats_url, "connecting to NATS");
let nats = async_nats::connect(&nats_url).await?;
let database_url = std::env::var("DATABASE_URL")
.unwrap_or_else(|_| "postgres://cnats:cnats@127.0.0.1:5432/cnats".to_string());
tracing::info!("connecting to postgres");
let pool = sqlx::postgres::PgPoolOptions::new()
.max_connections(5)
.connect(&database_url)
.await?;
store::init_schema(&pool).await?;
// Archive chat.room.* into Postgres via a durable JetStream consumer.
tokio::spawn(store::run_consumer(nats.clone(), pool.clone()));
let oidc_state = Arc::new(oidc::Oidc::from_env().await?);
let state = AppState {
leptos_options: leptos_options.clone(),
nats,
oidc: oidc_state,
pool,
};
// Dev-friendly defaults: in-memory sessions, secure cookies only when