start.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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🌐 API接口:');
  58. console.log(` 健康检查: http://localhost:${process.env.PORT || 3000}/health`);
  59. console.log(` API文档: http://localhost:${process.env.PORT || 3000}/api`);
  60. console.log(` 订阅状态: http://localhost:${process.env.PORT || 3000}/api/subscription/status`);
  61. console.log('\n🔄 启动应用...\n');
  62. // 启动应用
  63. const app = spawn('node', ['src/app.js'], {
  64. stdio: 'inherit',
  65. cwd: __dirname
  66. });
  67. app.on('error', (error) => {
  68. console.error('❌ 启动失败:', error.message);
  69. process.exit(1);
  70. });
  71. app.on('exit', (code) => {
  72. if (code !== 0) {
  73. console.error(`❌ 应用异常退出,退出码: ${code}`);
  74. process.exit(code);
  75. }
  76. });
  77. } catch (error) {
  78. console.error('❌ 启动过程中发生错误:', error.message);
  79. process.exit(1);
  80. }
  81. }
  82. // 处理信号
  83. process.on('SIGINT', () => {
  84. console.log('\n\n👋 正在关闭应用...');
  85. process.exit(0);
  86. });
  87. process.on('SIGTERM', () => {
  88. console.log('\n\n👋 正在关闭应用...');
  89. process.exit(0);
  90. });
  91. // 启动
  92. start();