rubis/apps/api/config/database.ts
ordinarthur cb1195ab73 fix(api): TCP keepalive + pool tuning sur la connexion PG
Le firewall entre pod K3s et LXC PG coupe silencieusement les connexions
idle (« Connection terminated unexpectedly » remonté par Sentry). On
active `keepAlive` sur le socket pg et on recycle les connexions idle
du pool plus vite (idleTimeoutMillis: 30 s).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 13:29:24 +02:00

67 lines
2.0 KiB
TypeScript

import app from '@adonisjs/core/services/app'
import { defineConfig } from '@adonisjs/lucid'
import env from '#start/env'
const dbConfig = defineConfig({
/**
* Postgres en dev/prod. SQLite reste accessible via DB_CONNECTION=sqlite
* pour les tests rapides ou un usage offline.
*/
connection: env.get('DB_CONNECTION', 'postgres'),
connections: {
postgres: {
client: 'pg',
// TCP keepalive (keepAlive / keepAliveInitialDelayMillis) : empêche le
// firewall entre pod K3s et LXC PG de couper silencieusement les
// connexions idle (cause de l'erreur « Connection terminated
// unexpectedly » remontée par Sentry). Lucid type-narrow ne les expose
// pas mais le driver `pg` les accepte et knex les forward tels quels.
connection: {
host: env.get('PG_HOST'),
port: env.get('PG_PORT'),
user: env.get('PG_USER'),
password: env.get('PG_PASSWORD'),
database: env.get('PG_DB_NAME'),
// @ts-expect-error Lucid n'expose pas keepAlive/keepAliveInitialDelayMillis dans son type pg ; le driver et knex les forward tels quels.
keepAlive: true,
keepAliveInitialDelayMillis: 10_000,
},
pool: {
min: 0,
max: 10,
// Recycler les connexions idle rapidement plutôt que d'en garder
// qui risquent d'être coupées côté réseau.
idleTimeoutMillis: 30_000,
},
migrations: {
naturalSort: true,
paths: ['database/migrations'],
},
schemaGeneration: {
enabled: true,
rulesPaths: ['./database/schema_rules.js'],
},
debug: app.inDev,
},
sqlite: {
client: 'better-sqlite3',
connection: {
filename: app.tmpPath('db.sqlite3'),
},
useNullAsDefault: true,
migrations: {
naturalSort: true,
paths: ['database/migrations'],
},
schemaGeneration: {
enabled: true,
rulesPaths: ['./database/schema_rules.js'],
},
},
},
})
export default dbConfig