From 773fd368e0c165a1e717157c2381956cae89d249 Mon Sep 17 00:00:00 2001 From: Rene Fichtmueller Date: Thu, 2 Apr 2026 23:03:31 +0200 Subject: [PATCH] fix: parse DATABASE_URL in pool clients + extend Ollama health timeout to 15s MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gateway and learning DB clients now prefer DATABASE_URL connection string over individual DB_* env vars — matches ecosystem.config.cjs convention. Ollama health check timeout increased 5→15s for Cloudflare tunnel latency. --- packages/gateway/src/db/client.ts | 35 ++++++++++++++++++++------- packages/gateway/src/routes/health.ts | 2 +- packages/learning/src/db/client.ts | 28 +++++++++++++-------- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/packages/gateway/src/db/client.ts b/packages/gateway/src/db/client.ts index 2d57b10..aeaa997 100644 --- a/packages/gateway/src/db/client.ts +++ b/packages/gateway/src/db/client.ts @@ -5,18 +5,35 @@ const { Pool } = pg; let pool: pg.Pool | null = null; -export function getPool(): pg.Pool { - if (!pool) { - pool = new Pool({ - host: process.env['DB_HOST'] ?? 'localhost', - port: parseInt(process.env['DB_PORT'] ?? '5432', 10), - database: process.env['DB_NAME'] ?? 'llm_gateway', - user: process.env['DB_USER'] ?? 'llm_gateway', - password: process.env['DB_PASSWORD'] ?? '', +/** + * Build pool config from DATABASE_URL (preferred) or individual DB_* env vars. + * DATABASE_URL format: postgresql://user:password@host:port/database + */ +function buildPoolConfig(): pg.PoolConfig { + const databaseUrl = process.env['DATABASE_URL']; + if (databaseUrl) { + return { + connectionString: databaseUrl, max: 10, idleTimeoutMillis: 30_000, connectionTimeoutMillis: 5_000, - }); + }; + } + return { + host: process.env['DB_HOST'] ?? 'localhost', + port: parseInt(process.env['DB_PORT'] ?? '5432', 10), + database: process.env['DB_NAME'] ?? 'llm_gateway', + user: process.env['DB_USER'] ?? 'llm', + password: process.env['DB_PASSWORD'] ?? '', + max: 10, + idleTimeoutMillis: 30_000, + connectionTimeoutMillis: 5_000, + }; +} + +export function getPool(): pg.Pool { + if (!pool) { + pool = new Pool(buildPoolConfig()); pool.on('error', (err) => { logger.error({ err }, 'PostgreSQL pool error'); diff --git a/packages/gateway/src/routes/health.ts b/packages/gateway/src/routes/health.ts index 51bcc9b..73a75ab 100644 --- a/packages/gateway/src/routes/health.ts +++ b/packages/gateway/src/routes/health.ts @@ -21,7 +21,7 @@ async function checkOllama(baseUrl: string): Promise<{ status: 'ok' | 'down'; la const start = Date.now(); try { const response = await fetch(`${baseUrl}/api/tags`, { - signal: AbortSignal.timeout(5000), + signal: AbortSignal.timeout(15000), }); const latency_ms = Date.now() - start; if (!response.ok) { diff --git a/packages/learning/src/db/client.ts b/packages/learning/src/db/client.ts index 6a7f34e..083dafb 100644 --- a/packages/learning/src/db/client.ts +++ b/packages/learning/src/db/client.ts @@ -5,18 +5,26 @@ const { Pool } = pg; let pool: pg.Pool | null = null; +function buildPoolConfig(): pg.PoolConfig { + const databaseUrl = process.env['DATABASE_URL']; + if (databaseUrl) { + return { connectionString: databaseUrl, max: 5, idleTimeoutMillis: 30_000, connectionTimeoutMillis: 5_000 }; + } + return { + host: process.env['DB_HOST'] ?? 'localhost', + port: parseInt(process.env['DB_PORT'] ?? '5432', 10), + database: process.env['DB_NAME'] ?? 'llm_gateway', + user: process.env['DB_USER'] ?? 'llm', + password: process.env['DB_PASSWORD'] ?? '', + max: 5, + idleTimeoutMillis: 30_000, + connectionTimeoutMillis: 5_000, + }; +} + export function getPool(): pg.Pool { if (!pool) { - pool = new Pool({ - host: process.env['DB_HOST'] ?? 'localhost', - port: parseInt(process.env['DB_PORT'] ?? '5432', 10), - database: process.env['DB_NAME'] ?? 'llm_gateway', - user: process.env['DB_USER'] ?? 'llm', - password: process.env['DB_PASSWORD'] ?? '', - max: 5, - idleTimeoutMillis: 30_000, - connectionTimeoutMillis: 5_000, - }); + pool = new Pool(buildPoolConfig()); pool.on('error', (err) => { logger.error({ err }, 'PostgreSQL pool error (learning engine)');