fix(database): explicit RDS SSL via NODE_EXTRA_CA_CERTS

This commit is contained in:
Sven (AAMOS AI)
2026-08-12 04:48:42 +07:00
parent c5a8530fbf
commit 983f3fb2aa
+16
View File
@@ -1,5 +1,6 @@
import pg from "pg"; import pg from "pg";
import { drizzle } from "drizzle-orm/node-postgres"; import { drizzle } from "drizzle-orm/node-postgres";
import { readFileSync } from "node:fs";
import * as schema from "./schema/index.js"; import * as schema from "./schema/index.js";
export type Database = ReturnType<typeof createDatabase>["db"]; export type Database = ReturnType<typeof createDatabase>["db"];
@@ -24,11 +25,26 @@ export function createDatabase(connectionString?: string) {
throw new Error("Missing DATABASE_URL. Set it in your .env or environment before starting the app."); throw new Error("Missing DATABASE_URL. Set it in your .env or environment before starting the app.");
} }
// RDS SSL: om NODE_EXTRA_CA_CERTS är satt används det certifikatet explicit.
// Detta krävs för node-postgres när sslmode=require och certifikatet inte finns
// i systemets CA-butik (t.ex. AWS RDS regionala CA).
let ssl: pg.PoolConfig["ssl"] | undefined;
const extraCa = process.env.NODE_EXTRA_CA_CERTS;
if (extraCa && url.includes("sslmode=")) {
try {
ssl = { ca: readFileSync(extraCa) };
} catch {
// Certifikatet kunde inte läsas låt pg falla tillbaka till standardbeteende
// så att felet blir tydligt vid anslutning.
}
}
const pool = new pg.Pool({ const pool = new pg.Pool({
connectionString: url, connectionString: url,
max: Number(process.env.DATABASE_POOL_MAX ?? 10), max: Number(process.env.DATABASE_POOL_MAX ?? 10),
idleTimeoutMillis: 30_000, idleTimeoutMillis: 30_000,
connectionTimeoutMillis: 10_000, connectionTimeoutMillis: 10_000,
...(ssl ? { ssl } : {}),
}); });
const db = drizzle(pool, { schema, casing: "snake_case" }); const db = drizzle(pool, { schema, casing: "snake_case" });