fix: parse DATABASE_URL in pool clients + extend Ollama health timeout to 15s

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.
This commit is contained in:
Rene Fichtmueller 2026-04-02 23:03:31 +02:00
parent 4c5003f9fc
commit 773fd368e0
3 changed files with 45 additions and 20 deletions

View File

@ -5,18 +5,35 @@ const { Pool } = pg;
let pool: pg.Pool | null = null; let pool: pg.Pool | null = null;
export function getPool(): pg.Pool { /**
if (!pool) { * Build pool config from DATABASE_URL (preferred) or individual DB_* env vars.
pool = new Pool({ * DATABASE_URL format: postgresql://user:password@host:port/database
host: process.env['DB_HOST'] ?? 'localhost', */
port: parseInt(process.env['DB_PORT'] ?? '5432', 10), function buildPoolConfig(): pg.PoolConfig {
database: process.env['DB_NAME'] ?? 'llm_gateway', const databaseUrl = process.env['DATABASE_URL'];
user: process.env['DB_USER'] ?? 'llm_gateway', if (databaseUrl) {
password: process.env['DB_PASSWORD'] ?? '', return {
connectionString: databaseUrl,
max: 10, max: 10,
idleTimeoutMillis: 30_000, idleTimeoutMillis: 30_000,
connectionTimeoutMillis: 5_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) => { pool.on('error', (err) => {
logger.error({ err }, 'PostgreSQL pool error'); logger.error({ err }, 'PostgreSQL pool error');

View File

@ -21,7 +21,7 @@ async function checkOllama(baseUrl: string): Promise<{ status: 'ok' | 'down'; la
const start = Date.now(); const start = Date.now();
try { try {
const response = await fetch(`${baseUrl}/api/tags`, { const response = await fetch(`${baseUrl}/api/tags`, {
signal: AbortSignal.timeout(5000), signal: AbortSignal.timeout(15000),
}); });
const latency_ms = Date.now() - start; const latency_ms = Date.now() - start;
if (!response.ok) { if (!response.ok) {

View File

@ -5,18 +5,26 @@ const { Pool } = pg;
let pool: pg.Pool | null = null; 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 { export function getPool(): pg.Pool {
if (!pool) { if (!pool) {
pool = new Pool({ pool = new Pool(buildPoolConfig());
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.on('error', (err) => { pool.on('error', (err) => {
logger.error({ err }, 'PostgreSQL pool error (learning engine)'); logger.error({ err }, 'PostgreSQL pool error (learning engine)');