feat: 支持https 面板

This commit is contained in:
手瓜一十雪
2025-04-19 20:16:24 +08:00
parent 8ff3ad824e
commit 36e3119d34

View File

@@ -4,6 +4,7 @@
import express from 'express'; import express from 'express';
import { createServer } from 'http'; import { createServer } from 'http';
import { createServer as createHttpsServer } from 'https';
import { LogWrapper } from '@/common/log'; import { LogWrapper } from '@/common/log';
import { NapCatPathWrapper } from '@/common/path'; import { NapCatPathWrapper } from '@/common/path';
import { WebUiConfigWrapper } from '@webapi/helper/config'; import { WebUiConfigWrapper } from '@webapi/helper/config';
@@ -13,11 +14,10 @@ import { createUrl } from '@webapi/utils/url';
import { sendError } from '@webapi/utils/response'; import { sendError } from '@webapi/utils/response';
import { join } from 'node:path'; import { join } from 'node:path';
import { terminalManager } from '@webapi/terminal/terminal_manager'; import { terminalManager } from '@webapi/terminal/terminal_manager';
import multer from 'multer'; // 新增:引入multer用于错误捕获 import multer from 'multer'; // 引入multer用于错误捕获
// 实例化Express // 实例化Express
const app = express(); const app = express();
const server = createServer(app);
/** /**
* 初始化并启动WebUI服务。 * 初始化并启动WebUI服务。
* 该函数配置了Express服务器以支持JSON解析和静态文件服务并监听6099端口。 * 该函数配置了Express服务器以支持JSON解析和静态文件服务并监听6099端口。
@@ -29,6 +29,7 @@ export let webUiPathWrapper: NapCatPathWrapper;
const MAX_PORT_TRY = 100; const MAX_PORT_TRY = 100;
import * as net from 'node:net'; import * as net from 'node:net';
import { WebUiDataRuntime } from './src/helper/Data'; import { WebUiDataRuntime } from './src/helper/Data';
import { existsSync, readFileSync } from 'node:fs';
export let webUiRuntimePort = 6099; export let webUiRuntimePort = 6099;
export async function InitPort(parsedConfig: WebUiConfigType): Promise<[string, number, string]> { export async function InitPort(parsedConfig: WebUiConfigType): Promise<[string, number, string]> {
try { try {
@@ -40,7 +41,23 @@ export async function InitPort(parsedConfig: WebUiConfigType): Promise<[string,
return ['', 0, '']; return ['', 0, ''];
} }
} }
async function checkCertificates(logger: LogWrapper): Promise<{ key: string, cert: string } | null> {
try {
const certPath = join(webUiPathWrapper.configPath, 'cert.pem');
const keyPath = join(webUiPathWrapper.configPath, 'key.pem');
if (existsSync(certPath) && existsSync(keyPath)) {
const cert = readFileSync(certPath, 'utf8');
const key = readFileSync(keyPath, 'utf8');
logger.log('[NapCat] [WebUi] 找到SSL证书将启用HTTPS模式');
return { cert, key };
}
return null;
} catch (error) {
logger.log('[NapCat] [WebUi] 检查SSL证书时出错: ' + error);
return null;
}
}
export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) { export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapper) {
webUiPathWrapper = pathWrapper; webUiPathWrapper = pathWrapper;
WebUiConfig = new WebUiConfigWrapper(); WebUiConfig = new WebUiConfigWrapper();
@@ -107,6 +124,9 @@ export async function InitWebUi(logger: LogWrapper, pathWrapper: NapCatPathWrapp
// 挂载静态路由(前端),路径为 /webui // 挂载静态路由(前端),路径为 /webui
app.use('/webui', express.static(pathWrapper.staticPath)); app.use('/webui', express.static(pathWrapper.staticPath));
// 初始化WebSocket服务器 // 初始化WebSocket服务器
const sslCerts = await checkCertificates(logger);
const isHttps = !!sslCerts;
let server = isHttps && sslCerts ? createHttpsServer(sslCerts, app) : createServer(app);
server.on('upgrade', (request, socket, head) => { server.on('upgrade', (request, socket, head) => {
terminalManager.initialize(request, socket, head, logger); terminalManager.initialize(request, socket, head, logger);
}); });