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); +});