diff --git a/backend/src/database/client.ts b/backend/src/database/client.ts index d3e845d..37ebc18 100644 --- a/backend/src/database/client.ts +++ b/backend/src/database/client.ts @@ -4,4 +4,17 @@ const { Pool } = pg; export const pool = new Pool({ connectionString: process.env.DATABASE_URL, + max: Number(process.env.DB_POOL_MAX ?? 20), + min: Number(process.env.DB_POOL_MIN ?? 2), + idleTimeoutMillis: Number(process.env.DB_IDLE_TIMEOUT ?? 30000), + connectionTimeoutMillis: Number(process.env.DB_CONNECTION_TIMEOUT ?? 5000), + allowExitOnIdle: false, }); + +pool.on('error', (err) => { + console.error('Unexpected database error on idle client', err); +}); + +export async function closePool(): Promise { + await pool.end(); +} \ No newline at end of file diff --git a/backend/src/server.ts b/backend/src/server.ts index 153ba47..1ae232d 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -7,6 +7,7 @@ import { achievementsRouter } from './api/achievements/router.js'; import { healthRouter } from './api/health/router.js'; import { passportRouter } from './api/passport/router.js'; import { reputationRouter } from './api/reputation/router.js'; +import { pool } from './database/client.js'; dotenv.config(); @@ -28,6 +29,14 @@ app.use((error: Error, _request: express.Request, response: express.Response, ne response.status(500).json({ error: error.message }); }); -app.listen(port, () => { +const server = app.listen(port, () => { console.log(`TAO Passport API listening on http://localhost:${port}`); }); + +process.on('SIGTERM', async () => { + console.log('SIGTERM received, closing database pool...'); + await pool.end(); + server.close(() => { + process.exit(0); + }); +}); \ No newline at end of file