start.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env node
  2. const { spawn } = require('child_process');
  3. const path = require('path');
  4. const fs = require('fs');
  5. console.log('🚀 启动Clash节点测速工具...\n');
  6. // 检查环境变量文件
  7. const envFile = path.join(__dirname, '.env');
  8. if (!fs.existsSync(envFile)) {
  9. console.log('⚠️ 未找到.env文件,请先复制env.example为.env并配置相关参数');
  10. console.log(' 命令: cp env.example .env');
  11. process.exit(1);
  12. }
  13. // 检查数据库连接
  14. async function checkDatabase() {
  15. try {
  16. const sequelize = require('./src/config/database');
  17. await sequelize.authenticate();
  18. console.log('✅ 数据库连接正常');
  19. return true;
  20. } catch (error) {
  21. console.log('❌ 数据库连接失败:', error.message);
  22. console.log(' 请检查数据库配置和连接');
  23. return false;
  24. }
  25. }
  26. // 检查Telegram配置
  27. function checkTelegram() {
  28. const botToken = process.env.TELEGRAM_BOT_TOKEN;
  29. const chatId = process.env.TELEGRAM_CHAT_ID;
  30. if (!botToken || !chatId) {
  31. console.log('⚠️ Telegram配置不完整,通知功能将被禁用');
  32. console.log(' 请配置TELEGRAM_BOT_TOKEN和TELEGRAM_CHAT_ID');
  33. return false;
  34. }
  35. console.log('✅ Telegram配置正常');
  36. console.log(` Bot Token: ${botToken.substring(0, 10)}...${botToken.substring(botToken.length - 10)}`);
  37. console.log(` Chat ID: ${chatId}`);
  38. return true;
  39. }
  40. // 主启动函数
  41. async function start() {
  42. try {
  43. // 加载环境变量
  44. require('dotenv').config();
  45. // 检查配置
  46. const dbOk = await checkDatabase();
  47. if (!dbOk) {
  48. process.exit(1);
  49. }
  50. checkTelegram();
  51. console.log('\n📊 系统信息:');
  52. console.log(` 端口: ${process.env.PORT || 3000}`);
  53. console.log(` 环境: ${process.env.NODE_ENV || 'development'}`);
  54. console.log(` 测速间隔: ${process.env.SPEED_TEST_INTERVAL || 15}分钟`);
  55. console.log(` 测试超时: ${process.env.SPEED_TEST_TIMEOUT || 10000}ms`);
  56. console.log(` 订阅更新间隔: ${(process.env.SUBSCRIPTION_UPDATE_INTERVAL || 3600000) / 1000}秒`);
  57. console.log('\n🌐 应用地址:');
  58. console.log(` 前端界面: http://localhost:${process.env.PORT || 3000}`);
  59. console.log('\n🔄 启动应用...\n');
  60. // 启动应用
  61. const app = spawn('node', ['src/app.js'], {
  62. stdio: 'inherit',
  63. cwd: __dirname
  64. });
  65. app.on('error', (error) => {
  66. console.error('❌ 启动失败:', error.message);
  67. process.exit(1);
  68. });
  69. app.on('exit', (code) => {
  70. if (code !== 0) {
  71. console.error(`❌ 应用异常退出,退出码: ${code}`);
  72. process.exit(code);
  73. }
  74. });
  75. } catch (error) {
  76. console.error('❌ 启动过程中发生错误:', error.message);
  77. process.exit(1);
  78. }
  79. }
  80. // 处理信号
  81. process.on('SIGINT', () => {
  82. console.log('\n\n👋 正在关闭应用...');
  83. process.exit(0);
  84. });
  85. process.on('SIGTERM', () => {
  86. console.log('\n\n👋 正在关闭应用...');
  87. process.exit(0);
  88. });
  89. // 启动
  90. start();