mirror of
https://github.com/9technologygroup/patchmon.net.git
synced 2025-11-08 16:01:59 +00:00
feat(backend): wait for DB on start
This commit is contained in:
@@ -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
|
// Graceful disconnect with retry
|
||||||
async function disconnectPrisma(prisma, maxRetries = 3) {
|
async function disconnectPrisma(prisma, maxRetries = 3) {
|
||||||
for (let i = 0; i < maxRetries; i++) {
|
for (let i = 0; i < maxRetries; i++) {
|
||||||
@@ -75,6 +102,7 @@ async function disconnectPrisma(prisma, maxRetries = 3) {
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
createPrismaClient,
|
createPrismaClient,
|
||||||
checkDatabaseConnection,
|
checkDatabaseConnection,
|
||||||
|
waitForDatabase,
|
||||||
disconnectPrisma,
|
disconnectPrisma,
|
||||||
getOptimizedDatabaseUrl
|
getOptimizedDatabaseUrl
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const express = require('express');
|
|||||||
const cors = require('cors');
|
const cors = require('cors');
|
||||||
const helmet = require('helmet');
|
const helmet = require('helmet');
|
||||||
const rateLimit = require('express-rate-limit');
|
const rateLimit = require('express-rate-limit');
|
||||||
const { createPrismaClient, checkDatabaseConnection, disconnectPrisma } = require('./config/database');
|
const { createPrismaClient, waitForDatabase, disconnectPrisma } = require('./config/database');
|
||||||
const winston = require('winston');
|
const winston = require('winston');
|
||||||
|
|
||||||
// Import routes
|
// Import routes
|
||||||
@@ -341,12 +341,8 @@ process.on('SIGTERM', async () => {
|
|||||||
// Start server with database health check
|
// Start server with database health check
|
||||||
async function startServer() {
|
async function startServer() {
|
||||||
try {
|
try {
|
||||||
// Check database connection before starting server
|
// Wait for database to be available
|
||||||
const isConnected = await checkDatabaseConnection(prisma);
|
await waitForDatabase(prisma);
|
||||||
if (!isConnected) {
|
|
||||||
console.error('❌ Database connection failed. Server not started.');
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.env.ENABLE_LOGGING === 'true') {
|
if (process.env.ENABLE_LOGGING === 'true') {
|
||||||
logger.info('✅ Database connection successful');
|
logger.info('✅ Database connection successful');
|
||||||
|
|||||||
Reference in New Issue
Block a user