feat(backend): wait for DB on start

This commit is contained in:
tigattack
2025-09-21 23:20:35 +01:00
parent c3365fedb2
commit 677d3b4df1
2 changed files with 64 additions and 40 deletions

View File

@@ -54,6 +54,33 @@ async function checkDatabaseConnection(prisma) {
}
}
// Wait for database to be available with retry logic
async function waitForDatabase(prisma, options = {}) {
const maxAttempts = options.maxAttempts || parseInt(process.env.DB_MAX_ATTEMPTS) || 30;
const waitInterval = options.waitInterval || parseInt(process.env.DB_WAIT_INTERVAL) || 2;
console.log(`Waiting for database connection (max ${maxAttempts} attempts, ${waitInterval}s interval)...`);
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const isConnected = await checkDatabaseConnection(prisma);
if (isConnected) {
console.log(`Database connected successfully after ${attempt} attempt(s)`);
return true;
}
} catch (error) {
// checkDatabaseConnection already logs the error
}
if (attempt < maxAttempts) {
console.log(`⏳ Database not ready (attempt ${attempt}/${maxAttempts}), retrying in ${waitInterval}s...`);
await new Promise(resolve => setTimeout(resolve, waitInterval * 1000));
}
}
throw new Error(`❌ Database failed to become available after ${maxAttempts} attempts`);
}
// Graceful disconnect with retry
async function disconnectPrisma(prisma, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
@@ -75,6 +102,7 @@ async function disconnectPrisma(prisma, maxRetries = 3) {
module.exports = {
createPrismaClient,
checkDatabaseConnection,
waitForDatabase,
disconnectPrisma,
getOptimizedDatabaseUrl
};

View File

@@ -3,7 +3,7 @@ const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const { createPrismaClient, checkDatabaseConnection, disconnectPrisma } = require('./config/database');
const { createPrismaClient, waitForDatabase, disconnectPrisma } = require('./config/database');
const winston = require('winston');
// Import routes
@@ -341,12 +341,8 @@ process.on('SIGTERM', async () => {
// Start server with database health check
async function startServer() {
try {
// Check database connection before starting server
const isConnected = await checkDatabaseConnection(prisma);
if (!isConnected) {
console.error('❌ Database connection failed. Server not started.');
process.exit(1);
}
// Wait for database to be available
await waitForDatabase(prisma);
if (process.env.ENABLE_LOGGING === 'true') {
logger.info('✅ Database connection successful');