Files
ggl/start-simple.cjs
2025-09-23 07:35:11 +00:00

169 lines
4.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 宝塔面板简化启动脚本 - 兼容Node.js v16
* 专门用于后端服务启动
*/
const { spawn } = require('child_process');
const path = require('path');
const fs = require('fs');
// 设置环境变量
process.env.PORT = process.env.PORT || 4001;
process.env.NODE_ENV = 'production';
console.log('=== 宝塔面板简化启动脚本 ===');
console.log(`端口: ${process.env.PORT}`);
console.log(`环境: ${process.env.NODE_ENV}`);
console.log(`工作目录: ${process.cwd()}`);
console.log(`Node.js版本: ${process.version}`);
// 检查关键文件
const requiredFiles = [
'api/server.ts',
'api/app.ts',
'package.json'
];
for (const file of requiredFiles) {
if (!fs.existsSync(file)) {
console.error(`错误: 缺少必要文件 ${file}`);
process.exit(1);
}
}
console.log('✓ 必要文件检查通过');
// 首先尝试编译TypeScript文件仅后端
console.log('正在编译后端TypeScript文件...');
const tscProcess = spawn('npx', ['tsc', '--project', 'tsconfig.server.json'], {
cwd: process.cwd(),
stdio: 'inherit'
});
tscProcess.on('exit', (code) => {
if (code === 0) {
console.log('✓ 后端TypeScript编译成功');
startCompiledServer();
} else {
console.log('后端TypeScript编译失败尝试直接启动...');
startWithTsNode();
}
});
tscProcess.on('error', (err) => {
console.log('TypeScript编译器不可用尝试直接启动...');
startWithTsNode();
});
function startCompiledServer() {
console.log('使用编译后的JS文件启动服务器...');
const server = spawn('node', ['dist/api/server.js'], {
cwd: process.cwd(),
stdio: 'inherit',
env: {
...process.env,
PORT: process.env.PORT || 4001,
NODE_ENV: 'production'
}
});
setupServerHandlers(server);
}
function startWithTsNode() {
console.log('使用ts-node启动服务器...');
// 使用ts-node指定服务器专用配置
const server = spawn('npx', ['ts-node', '--project', 'tsconfig.server.json', '--esm', 'api/server.ts'], {
cwd: process.cwd(),
stdio: 'inherit',
env: {
...process.env,
PORT: process.env.PORT || 4001,
NODE_ENV: 'production'
}
});
server.on('error', (err) => {
console.log('ts-node启动失败尝试使用tsx...');
startWithTsx();
});
server.on('exit', (code) => {
if (code !== 0) {
console.log('ts-node启动失败尝试使用tsx...');
startWithTsx();
}
});
setupServerHandlers(server);
}
function startWithTsx() {
console.log('使用tsx启动服务器...');
const server = spawn('npx', ['tsx', 'api/server.ts'], {
cwd: process.cwd(),
stdio: 'inherit',
env: {
...process.env,
PORT: process.env.PORT || 4001,
NODE_ENV: 'production'
}
});
server.on('error', (err) => {
console.error('所有启动方式都失败了:', err);
process.exit(1);
});
setupServerHandlers(server);
}
function setupServerHandlers(server) {
server.on('error', (err) => {
console.error('服务器启动失败:', err);
process.exit(1);
});
server.on('exit', (code, signal) => {
console.log(`服务器进程退出,代码: ${code}, 信号: ${signal}`);
if (code !== 0) {
console.error('服务器异常退出');
process.exit(1);
}
});
// 处理进程退出信号
process.on('SIGTERM', () => {
console.log('收到SIGTERM信号正在关闭服务...');
if (server) {
server.kill('SIGTERM');
}
setTimeout(() => {
process.exit(0);
}, 5000);
});
process.on('SIGINT', () => {
console.log('收到SIGINT信号正在关闭服务...');
if (server) {
server.kill('SIGINT');
}
setTimeout(() => {
process.exit(0);
}, 5000);
});
}
// 防止进程意外退出
process.on('uncaughtException', (err) => {
console.error('未捕获的异常:', err);
});
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的Promise拒绝:', reason);
});
console.log('✓ 启动脚本初始化完成');