import { app } from './app.js'; import { env } from './config/env.js'; import { tenantDb } from './config/database.js'; import { startSatSyncJob } from './jobs/sat-sync.job.js'; const PORT = parseInt(env.PORT, 10); const server = app.listen(PORT, '0.0.0.0', () => { console.log(`API Server running on http://0.0.0.0:${PORT}`); console.log(`Environment: ${env.NODE_ENV}`); // Iniciar job de sincronización SAT if (env.NODE_ENV === 'production') { startSatSyncJob(); } }); // Graceful shutdown — close all tenant DB pools before exiting const gracefulShutdown = async (signal: string) => { console.log(`${signal} received. Shutting down gracefully...`); server.close(() => { console.log('HTTP server closed'); }); await tenantDb.shutdown(); process.exit(0); }; process.on('SIGTERM', () => gracefulShutdown('SIGTERM')); process.on('SIGINT', () => gracefulShutdown('SIGINT')); // PM2 cluster: cross-worker cache invalidation process.on('message', (msg: any) => { if (msg?.type === 'invalidate-tenant-cache' && msg.tenantId) { tenantDb.invalidatePool(msg.tenantId); } });