From a9d3392f94132686b275595e7503eb8d35de5d84 Mon Sep 17 00:00:00 2001 From: snowrugar-beep Date: Sat, 27 Jun 2026 06:24:41 +0000 Subject: [PATCH] fix: wire DB pool sizing via env (DATABASE_POOL_MIN/MAX, timeouts) (#526) --- app/backend/.env.example | 7 +++++++ app/backend/src/app.module.ts | 25 ++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/app/backend/.env.example b/app/backend/.env.example index f96a39dc..07c03da2 100644 --- a/app/backend/.env.example +++ b/app/backend/.env.example @@ -17,6 +17,13 @@ DB_USER=postgres DB_PASS=postgres DB_NAME=gatherraa +# Connection pool tuning (defaults are conservative; tune for your workload) +DATABASE_POOL_MIN=2 # Minimum idle connections +DATABASE_POOL_MAX=10 # Maximum pool size +IDLE_TIMEOUT_MS=30000 # Close idle connections after this many ms +STATEMENT_TIMEOUT_MS=5000 # Connection acquisition timeout in ms +MAX_LIFETIME_MS=3600000 # Max connection lifetime in ms (1 hour) + # ── Redis ──────────────────────────────────────────────────────────────────── REDIS_URL=redis://localhost:6379 REDIS_HOST=localhost diff --git a/app/backend/src/app.module.ts b/app/backend/src/app.module.ts index 9e11049f..a964f2e7 100644 --- a/app/backend/src/app.module.ts +++ b/app/backend/src/app.module.ts @@ -1,5 +1,5 @@ import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; +import { ConfigModule, ConfigService } from '@nestjs/config'; import { ScheduleModule } from '@nestjs/schedule'; import { TypeOrmModule } from '@nestjs/typeorm'; @@ -16,12 +16,23 @@ import { VerificationHistory } from './identity-verification/entities/verificati ConfigModule.forRoot({ isGlobal: true, }), - TypeOrmModule.forRoot({ - type: 'sqlite', - database: ':memory:', - entities: [IdentityVerification, VerificationHistory], - synchronize: true, - retryAttempts: 0, + TypeOrmModule.forRootAsync({ + inject: [ConfigService], + useFactory: (config: ConfigService) => ({ + type: 'sqlite', + database: config.get('DATABASE_PATH', ':memory:'), + entities: [IdentityVerification, VerificationHistory], + synchronize: true, + retryAttempts: 0, + // Pool sizing — defaults are conservative but tunable via env + extra: { + min: config.get('DATABASE_POOL_MIN', 2), + max: config.get('DATABASE_POOL_MAX', 10), + idleTimeoutMillis: config.get('IDLE_TIMEOUT_MS', 30_000), + connectionTimeoutMillis: config.get('STATEMENT_TIMEOUT_MS', 5_000), + maxLifetimeSeconds: config.get('MAX_LIFETIME_MS', 3_600_000) / 1000, + }, + }), }), ScheduleModule.forRoot(), IdentityVerificationModule,