Add crash prevention and keep-alive mechanisms
This commit is contained in:
parent
2f59a363da
commit
acefe143b4
48
worker.js
48
worker.js
|
|
@ -530,6 +530,24 @@ async function shutdown() {
|
||||||
process.on('SIGTERM', shutdown);
|
process.on('SIGTERM', shutdown);
|
||||||
process.on('SIGINT', shutdown);
|
process.on('SIGINT', shutdown);
|
||||||
|
|
||||||
|
// ==================== PREVENT CRASHES ====================
|
||||||
|
|
||||||
|
// Handle uncaught exceptions
|
||||||
|
process.on('uncaughtException', (error) => {
|
||||||
|
console.error('❌ Uncaught Exception:', error.message);
|
||||||
|
console.error(error.stack);
|
||||||
|
// Don't exit - try to keep worker running
|
||||||
|
console.log('⚠️ Worker continuing despite error...');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Handle unhandled promise rejections
|
||||||
|
process.on('unhandledRejection', (reason, promise) => {
|
||||||
|
console.error('❌ Unhandled Rejection at:', promise);
|
||||||
|
console.error('Reason:', reason);
|
||||||
|
// Don't exit - try to keep worker running
|
||||||
|
console.log('⚠️ Worker continuing despite rejection...');
|
||||||
|
});
|
||||||
|
|
||||||
// ==================== STARTUP COMPLETE ====================
|
// ==================== STARTUP COMPLETE ====================
|
||||||
|
|
||||||
console.log('\n✨ ApsGo Railway Worker is running!');
|
console.log('\n✨ ApsGo Railway Worker is running!');
|
||||||
|
|
@ -543,3 +561,33 @@ console.log('\n🎯 Worker is ready to process jobs...\n');
|
||||||
|
|
||||||
// Initial health check
|
// Initial health check
|
||||||
setTimeout(healthCheck, 5000);
|
setTimeout(healthCheck, 5000);
|
||||||
|
|
||||||
|
// ==================== KEEP-ALIVE MECHANISM ====================
|
||||||
|
|
||||||
|
// Heartbeat every 30 seconds to prevent Railway from stopping container
|
||||||
|
setInterval(() => {
|
||||||
|
const uptime = Math.floor(process.uptime());
|
||||||
|
const hours = Math.floor(uptime / 3600);
|
||||||
|
const minutes = Math.floor((uptime % 3600) / 60);
|
||||||
|
console.log(`💓 Heartbeat: Worker alive for ${hours}h ${minutes}m`);
|
||||||
|
}, 30000);
|
||||||
|
|
||||||
|
// Verify Firebase connection on startup
|
||||||
|
setTimeout(async () => {
|
||||||
|
try {
|
||||||
|
console.log('🔍 Verifying Firebase connection...');
|
||||||
|
const snapshot = await db.ref('kontrol').once('value');
|
||||||
|
const data = snapshot.val();
|
||||||
|
if (data) {
|
||||||
|
console.log('✅ Firebase /kontrol readable - waktu mode:', data.waktu ? 'ENABLED' : 'DISABLED');
|
||||||
|
if (data.waktu) {
|
||||||
|
console.log(` 📅 Schedules: ${data.waktu_1 || 'none'} / ${data.waktu_2 || 'none'}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.log('⚠️ Firebase /kontrol is empty - waiting for Flutter app to set schedule');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Firebase verification failed:', error.message);
|
||||||
|
}
|
||||||
|
}, 3000);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue