fix(db): enforce schema and stabilize connection
Force PostgreSQL search_path based on DATABASE_URL schema param and strip Prisma-only query params for pg connections. Add connection timeout and retry/backoff logging to reduce transient startup failures. Made-with: Cursor
This commit is contained in:
parent
d850e8154c
commit
a69828e477
|
|
@ -4,6 +4,25 @@ import { PrismaClient } from '@prisma/client';
|
||||||
import { logger } from '../utils/logger';
|
import { logger } from '../utils/logger';
|
||||||
|
|
||||||
// Prisma 7 requires a driver adapter for direct database connections.
|
// Prisma 7 requires a driver adapter for direct database connections.
|
||||||
|
const normalizeDatabaseUrlForPg = (): string | undefined => {
|
||||||
|
const raw = (process.env.DATABASE_URL || '').trim();
|
||||||
|
if (!raw) return undefined;
|
||||||
|
|
||||||
|
// Some env providers wrap values in quotes. systemd EnvironmentFile supports quotes,
|
||||||
|
// but we defensively strip outer quotes for URL parsing.
|
||||||
|
const dequoted = raw.replace(/^['"]|['"]$/g, '');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const u = new URL(dequoted);
|
||||||
|
// Prisma-only param; pg doesn't use it and it can be treated as an unknown option.
|
||||||
|
u.searchParams.delete('schema');
|
||||||
|
return u.toString();
|
||||||
|
} catch {
|
||||||
|
// If it's not a valid URL, fall back to the original string.
|
||||||
|
return dequoted;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const resolveDbSchema = (): string => {
|
const resolveDbSchema = (): string => {
|
||||||
const raw = (process.env.DATABASE_URL || '').trim().replace(/^['"]|['"]$/g, '');
|
const raw = (process.env.DATABASE_URL || '').trim().replace(/^['"]|['"]$/g, '');
|
||||||
try {
|
try {
|
||||||
|
|
@ -18,8 +37,9 @@ const resolveDbSchema = (): string => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const dbSchema = resolveDbSchema();
|
const dbSchema = resolveDbSchema();
|
||||||
|
const pgConnectionString = normalizeDatabaseUrlForPg();
|
||||||
const pool = new Pool({
|
const pool = new Pool({
|
||||||
connectionString: process.env.DATABASE_URL,
|
connectionString: pgConnectionString,
|
||||||
// Fail fast when DB is temporarily unreachable; connectDB will retry.
|
// Fail fast when DB is temporarily unreachable; connectDB will retry.
|
||||||
connectionTimeoutMillis: 5_000,
|
connectionTimeoutMillis: 5_000,
|
||||||
// pg(Pool) doesn't understand Prisma's `?schema=...` param.
|
// pg(Pool) doesn't understand Prisma's `?schema=...` param.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue