增加重启功能
This commit is contained in:
@@ -13,6 +13,7 @@ const repositoryRoutes = require('./repository');
|
||||
const rankingRoutes = require('./ranking');
|
||||
const watchlistRoutes = require('./watchlist');
|
||||
const updateRoutes = require('./update');
|
||||
const systemRoutes = require('./system');
|
||||
|
||||
// 导入认证中间件
|
||||
const { authMiddleware } = require('../middleware/auth');
|
||||
@@ -47,6 +48,7 @@ function setupRoutes(app, backend) {
|
||||
app.use('/api/proxy', proxyRoutes); // 图片代理,不需要认证
|
||||
app.use('/api/watchlist', authMiddleware, watchlistRoutes); // 待看名单,需要认证
|
||||
app.use('/api/update', updateRoutes); // 更新检查,不需要认证
|
||||
app.use('/api/system', systemRoutes); // 系统管理,不需要认证
|
||||
|
||||
// 404 处理
|
||||
app.use((req, res) => {
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const { defaultLogger } = require('../utils/logger');
|
||||
|
||||
// 创建logger实例
|
||||
const logger = defaultLogger.child('SystemRouter');
|
||||
|
||||
/**
|
||||
* 重启服务器
|
||||
* POST /api/system/restart
|
||||
*/
|
||||
router.post('/restart', async (req, res) => {
|
||||
try {
|
||||
logger.info('收到重启请求');
|
||||
|
||||
// 立即返回响应,避免客户端等待超时
|
||||
res.json({
|
||||
success: true,
|
||||
message: '服务器正在重启,请稍后刷新页面'
|
||||
});
|
||||
|
||||
// 延迟执行重启,给响应时间发送
|
||||
setTimeout(async () => {
|
||||
try {
|
||||
// 获取服务器实例(通过全局变量或其他方式)
|
||||
const server = req.app.locals.serverInstance;
|
||||
if (server && typeof server.restart === 'function') {
|
||||
await server.restart();
|
||||
} else {
|
||||
logger.error('无法获取服务器实例或重启方法');
|
||||
// 如果无法优雅重启,则退出进程让进程管理器重启
|
||||
process.exit(1);
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error('重启失败:', error);
|
||||
// 强制退出进程
|
||||
process.exit(1);
|
||||
}
|
||||
}, 1000); // 延迟1秒执行重启
|
||||
|
||||
} catch (error) {
|
||||
logger.error('处理重启请求失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* 获取系统状态
|
||||
* GET /api/system/status
|
||||
*/
|
||||
router.get('/status', (req, res) => {
|
||||
try {
|
||||
const status = {
|
||||
uptime: process.uptime(),
|
||||
memory: process.memoryUsage(),
|
||||
version: process.version,
|
||||
platform: process.platform,
|
||||
arch: process.arch,
|
||||
pid: process.pid,
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: status
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error('获取系统状态失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
+47
-1
@@ -27,6 +27,7 @@ class PixivServer {
|
||||
constructor() {
|
||||
this.app = express();
|
||||
this.backend = null;
|
||||
this.server = null; // 添加server实例引用
|
||||
this.port = 3000; // 默认端口,会在init时重新设置
|
||||
this.logLevel = process.env.LOG_LEVEL || 'info'; // 获取日志级别
|
||||
this.isVerboseMode = ['debug', 'trace'].includes(this.logLevel.toLowerCase()); // 检查是否为详细模式
|
||||
@@ -91,6 +92,9 @@ class PixivServer {
|
||||
|
||||
// 后端实例注入中间件
|
||||
this.app.use(backendInjector(this.backend));
|
||||
|
||||
// 将服务器实例保存到app.locals中,供路由使用
|
||||
this.app.locals.serverInstance = this;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,7 +115,7 @@ class PixivServer {
|
||||
* 启动服务器
|
||||
*/
|
||||
start() {
|
||||
this.app.listen(this.port, () => {
|
||||
this.server = this.app.listen(this.port, () => {
|
||||
logger.info('Pixiv 后端服务器已启动');
|
||||
logger.info(`服务地址: http://localhost:${this.port}`);
|
||||
logger.info(`健康检查: http://localhost:${this.port}/health`);
|
||||
@@ -174,6 +178,48 @@ class PixivServer {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重启服务器
|
||||
*/
|
||||
async restart() {
|
||||
logger.info('正在重启服务器...');
|
||||
|
||||
try {
|
||||
// 清理代理环境变量
|
||||
proxyConfig.clearEnvironmentVariables();
|
||||
|
||||
// 关闭当前服务器
|
||||
if (this.server) {
|
||||
await new Promise((resolve) => {
|
||||
this.server.close(() => {
|
||||
logger.info('HTTP服务器已关闭');
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 清理后端实例
|
||||
if (this.backend) {
|
||||
await this.backend.cleanup?.();
|
||||
}
|
||||
|
||||
logger.info('正在重新初始化服务器...');
|
||||
|
||||
// 重新初始化
|
||||
await this.init();
|
||||
|
||||
// 重新启动
|
||||
this.start();
|
||||
|
||||
logger.info('服务器重启完成');
|
||||
return { success: true, message: '服务器重启成功' };
|
||||
|
||||
} catch (error) {
|
||||
logger.error('服务器重启失败:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 优雅关闭
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user