From 412175030a2cb470a577a0b0ce7f5bcb2ed04857 Mon Sep 17 00:00:00 2001 From: Martin Porwoll Date: Sun, 1 Mar 2026 09:26:20 +0000 Subject: [PATCH] feat: add entry point with graceful shutdown and PM2 config Co-Authored-By: Claude Opus 4.6 --- ecosystem.config.cjs | 17 +++++++++++++++++ src/index.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 ecosystem.config.cjs create mode 100644 src/index.ts diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs new file mode 100644 index 0000000..f821f3f --- /dev/null +++ b/ecosystem.config.cjs @@ -0,0 +1,17 @@ +module.exports = { + apps: [{ + name: 'telegram-media-bot', + script: './dist/index.js', + instances: 1, + autorestart: true, + watch: false, + max_memory_restart: '256M', + env: { + NODE_ENV: 'production', + }, + error_file: './logs/error.log', + out_file: './logs/out.log', + merge_logs: true, + time: true, + }], +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..f3aeba6 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,42 @@ +import { config } from './config.js'; +import { createLogger, setLogLevel } from './utils/logger.js'; +import { createBot } from './bot.js'; +import { registerHandlers } from './telegram/handlers.js'; + +const log = createLogger('Main'); + +setLogLevel(config.logLevel as 'debug' | 'info' | 'warn' | 'error'); + +async function main(): Promise { + log.info('Starting Telegram Media Upload Bot...'); + log.info(`Environment: ${config.nodeEnv}`); + log.info(`Payload API: ${config.payload.apiUrl}`); + log.info(`Default Tenant: ${config.defaultTenantId}`); + log.info(`Allowed Users: ${config.telegram.allowedUserIds.join(', ')}`); + + const bot = createBot(); + registerHandlers(bot); + + // Graceful shutdown + const shutdown = async (signal: string) => { + log.info(`Received ${signal}, shutting down...`); + bot.stop(); + setTimeout(() => { + log.warn('Forced shutdown after timeout'); + process.exit(1); + }, 60_000); + }; + + process.on('SIGINT', () => shutdown('SIGINT')); + process.on('SIGTERM', () => shutdown('SIGTERM')); + + // Start bot + await bot.start({ + onStart: () => log.info('Bot is running! Listening for messages...'), + }); +} + +main().catch((error) => { + log.error('Fatal error', error); + process.exit(1); +});