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)');