mirror of
https://github.com/whyour/qinglong.git
synced 2025-05-22 22:36:06 +08:00
增加 update 服务
This commit is contained in:
parent
cdeca4b808
commit
68ad01e0e8
|
@ -1,3 +1,4 @@
|
||||||
|
UPDATE_PORT=5300
|
||||||
PUBLIC_PORT=5400
|
PUBLIC_PORT=5400
|
||||||
CRON_PORT=5500
|
CRON_PORT=5500
|
||||||
BACK_PORT=5600
|
BACK_PORT=5600
|
||||||
|
|
|
@ -16,6 +16,11 @@ export default defineConfig({
|
||||||
favicons: [`https://qn.whyour.cn/favicon.svg`],
|
favicons: [`https://qn.whyour.cn/favicon.svg`],
|
||||||
publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
|
publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
|
||||||
proxy: {
|
proxy: {
|
||||||
|
[`${baseUrl}api/update`]: {
|
||||||
|
target: 'http://127.0.0.1:5300/',
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: { [`^${baseUrl}api/update`]: '/api' },
|
||||||
|
},
|
||||||
[`${baseUrl}api/public`]: {
|
[`${baseUrl}api/public`]: {
|
||||||
target: 'http://127.0.0.1:5400/',
|
target: 'http://127.0.0.1:5400/',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
|
|
@ -57,6 +57,7 @@ export default {
|
||||||
port: parseInt(process.env.BACK_PORT as string, 10),
|
port: parseInt(process.env.BACK_PORT as string, 10),
|
||||||
cronPort: parseInt(process.env.CRON_PORT as string, 10),
|
cronPort: parseInt(process.env.CRON_PORT as string, 10),
|
||||||
publicPort: parseInt(process.env.PUBLIC_PORT as string, 10),
|
publicPort: parseInt(process.env.PUBLIC_PORT as string, 10),
|
||||||
|
updatePort: parseInt(process.env.UPDATE_PORT as string, 10),
|
||||||
secret: process.env.SECRET || createRandomString(16, 32),
|
secret: process.env.SECRET || createRandomString(16, 32),
|
||||||
logs: {
|
logs: {
|
||||||
level: process.env.LOG_LEVEL || 'silly',
|
level: process.env.LOG_LEVEL || 'silly',
|
||||||
|
|
91
back/loaders/update.ts
Normal file
91
back/loaders/update.ts
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
import bodyParser from 'body-parser';
|
||||||
|
import { errors } from 'celebrate';
|
||||||
|
import cors from 'cors';
|
||||||
|
import { Application, NextFunction, Request, Response } from 'express';
|
||||||
|
import jwt from 'express-jwt';
|
||||||
|
import Container from 'typedi';
|
||||||
|
import Logger from './logger';
|
||||||
|
import config from '../config';
|
||||||
|
import SystemService from '../services/system';
|
||||||
|
|
||||||
|
export default ({ app }: { app: Application }) => {
|
||||||
|
app.set('trust proxy', 'loopback');
|
||||||
|
app.use(cors());
|
||||||
|
|
||||||
|
app.use(bodyParser.json({ limit: '50mb' }));
|
||||||
|
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
jwt({
|
||||||
|
secret: config.secret,
|
||||||
|
algorithms: ['HS384'],
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
app.put(
|
||||||
|
'/api/system',
|
||||||
|
async (req: Request, res: Response, next: NextFunction) => {
|
||||||
|
try {
|
||||||
|
const systemService = Container.get(SystemService);
|
||||||
|
const result = await systemService.reloadSystem('system');
|
||||||
|
res.send(result);
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error('🔥 error: %o', e);
|
||||||
|
return next(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
app.put(
|
||||||
|
'/api/data',
|
||||||
|
async (req: Request, res: Response, next: NextFunction) => {
|
||||||
|
try {
|
||||||
|
const systemService = Container.get(SystemService);
|
||||||
|
const result = await systemService.reloadSystem('data');
|
||||||
|
res.send(result);
|
||||||
|
} catch (e) {
|
||||||
|
Logger.error('🔥 error: %o', e);
|
||||||
|
return next(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
app.use((req, res, next) => {
|
||||||
|
const err: any = new Error('Not Found');
|
||||||
|
err['status'] = 404;
|
||||||
|
next(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use(errors());
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
(
|
||||||
|
err: Error & { status: number },
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction,
|
||||||
|
) => {
|
||||||
|
if (err.name === 'UnauthorizedError') {
|
||||||
|
return res
|
||||||
|
.status(err.status)
|
||||||
|
.send({ code: 401, message: err.message })
|
||||||
|
.end();
|
||||||
|
}
|
||||||
|
return next(err);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
(
|
||||||
|
err: Error & { status: number },
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction,
|
||||||
|
) => {
|
||||||
|
res.status(err.status || 500);
|
||||||
|
res.json({
|
||||||
|
code: err.status || 500,
|
||||||
|
message: err.message,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
};
|
|
@ -329,28 +329,7 @@ export default class SystemService {
|
||||||
public async reloadSystem(target: 'system' | 'data') {
|
public async reloadSystem(target: 'system' | 'data') {
|
||||||
const cmd = `real_time=true ql reload ${target || ''}`;
|
const cmd = `real_time=true ql reload ${target || ''}`;
|
||||||
const cp = spawn(cmd, { shell: '/bin/bash' });
|
const cp = spawn(cmd, { shell: '/bin/bash' });
|
||||||
|
cp.unref();
|
||||||
cp.stdout.on('data', (data) => {
|
|
||||||
this.sockService.sendMessage({
|
|
||||||
type: 'reloadSystem',
|
|
||||||
message: data.toString(),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
cp.stderr.on('data', (data) => {
|
|
||||||
this.sockService.sendMessage({
|
|
||||||
type: 'reloadSystem',
|
|
||||||
message: data.toString(),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
cp.on('error', (err) => {
|
|
||||||
this.sockService.sendMessage({
|
|
||||||
type: 'reloadSystem',
|
|
||||||
message: JSON.stringify(err),
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return { code: 200 };
|
return { code: 200 };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
27
back/update.ts
Normal file
27
back/update.ts
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import 'reflect-metadata'; // We need this in order to use @Decorators
|
||||||
|
import config from './config';
|
||||||
|
import express from 'express';
|
||||||
|
import depInjectorLoader from './loaders/depInjector';
|
||||||
|
import Logger from './loaders/logger';
|
||||||
|
|
||||||
|
|
||||||
|
async function startServer() {
|
||||||
|
const app = express();
|
||||||
|
depInjectorLoader();
|
||||||
|
|
||||||
|
await require('./loaders/update').default({ app });
|
||||||
|
|
||||||
|
app
|
||||||
|
.listen(config.updatePort, () => {
|
||||||
|
Logger.debug(`✌️ 更新服务启动成功!`);
|
||||||
|
console.debug(`✌️ 更新服务启动成功!`);
|
||||||
|
process.send?.('ready');
|
||||||
|
})
|
||||||
|
.on('error', (err) => {
|
||||||
|
Logger.error(err);
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
startServer();
|
|
@ -6,6 +6,10 @@ upstream publicApi {
|
||||||
server 0.0.0.0:5400;
|
server 0.0.0.0:5400;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
upstream updateApi {
|
||||||
|
server 0.0.0.0:5300;
|
||||||
|
}
|
||||||
|
|
||||||
map $http_upgrade $connection_upgrade {
|
map $http_upgrade $connection_upgrade {
|
||||||
default keep-alive;
|
default keep-alive;
|
||||||
'websocket' upgrade;
|
'websocket' upgrade;
|
||||||
|
@ -16,6 +20,18 @@ server {
|
||||||
IPV6_CONFIG
|
IPV6_CONFIG
|
||||||
ssl_session_timeout 5m;
|
ssl_session_timeout 5m;
|
||||||
|
|
||||||
|
location QL_BASE_URLapi/update/ {
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://updateApi/api/;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_redirect default;
|
||||||
|
proxy_connect_timeout 1800;
|
||||||
|
proxy_send_timeout 1800;
|
||||||
|
proxy_read_timeout 1800;
|
||||||
|
}
|
||||||
|
|
||||||
location QL_BASE_URLapi/public/ {
|
location QL_BASE_URLapi/public/ {
|
||||||
proxy_set_header Host $http_host;
|
proxy_set_header Host $http_host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
apps: [
|
apps: [
|
||||||
|
{
|
||||||
|
name: 'update',
|
||||||
|
max_restarts: 10,
|
||||||
|
kill_timeout: 15000,
|
||||||
|
wait_ready: true,
|
||||||
|
listen_timeout: 10000,
|
||||||
|
time: true,
|
||||||
|
script: 'static/build/update.js',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'schedule',
|
name: 'schedule',
|
||||||
max_restarts: 10,
|
max_restarts: 10,
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
"start": "concurrently -n w: npm:start:*",
|
"start": "concurrently -n w: npm:start:*",
|
||||||
"start:front": "max dev",
|
"start:front": "max dev",
|
||||||
"start:back": "nodemon",
|
"start:back": "nodemon",
|
||||||
|
"start:update": "ts-node -P tsconfig.back.json ./back/update.ts",
|
||||||
"start:public": "ts-node -P tsconfig.back.json ./back/public.ts",
|
"start:public": "ts-node -P tsconfig.back.json ./back/public.ts",
|
||||||
"start:rpc": "ts-node -P tsconfig.back.json ./back/schedule/index.ts",
|
"start:rpc": "ts-node -P tsconfig.back.json ./back/schedule/index.ts",
|
||||||
"build:front": "max build",
|
"build:front": "max build",
|
||||||
|
@ -11,6 +12,7 @@
|
||||||
"panel": "npm run build:back && node static/build/app.js",
|
"panel": "npm run build:back && node static/build/app.js",
|
||||||
"schedule": "npm run build:back && node static/build/schedule/index.js",
|
"schedule": "npm run build:back && node static/build/schedule/index.js",
|
||||||
"public": "npm run build:back && node static/build/public.js",
|
"public": "npm run build:back && node static/build/public.js",
|
||||||
|
"update": "npm run build:back && node static/build/update.js",
|
||||||
"gen:proto": "protoc --experimental_allow_proto3_optional --plugin=./node_modules/.bin/protoc-gen-ts_proto ./back/protos/*.proto --ts_proto_out=./ --ts_proto_opt=outputServices=grpc-js,env=node,esModuleInterop=true",
|
"gen:proto": "protoc --experimental_allow_proto3_optional --plugin=./node_modules/.bin/protoc-gen-ts_proto ./back/protos/*.proto --ts_proto_out=./ --ts_proto_opt=outputServices=grpc-js,env=node,esModuleInterop=true",
|
||||||
"prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",
|
"prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",
|
||||||
"postinstall": "max setup 2>/dev/null || true",
|
"postinstall": "max setup 2>/dev/null || true",
|
||||||
|
|
|
@ -116,7 +116,7 @@ const CheckUpdate = ({ systemInfo }: any) => {
|
||||||
|
|
||||||
const reloadSystem = (type?: string) => {
|
const reloadSystem = (type?: string) => {
|
||||||
request
|
request
|
||||||
.put(`${config.apiPrefix}system/reload`, { type })
|
.put(`${config.apiPrefix}update/${type}`)
|
||||||
.then((_data: any) => {
|
.then((_data: any) => {
|
||||||
message.success({
|
message.success({
|
||||||
content: (
|
content: (
|
||||||
|
@ -220,7 +220,7 @@ const CheckUpdate = ({ systemInfo }: any) => {
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
onClick={() => reloadSystem()}
|
onClick={() => reloadSystem('system')}
|
||||||
style={{ marginLeft: 8 }}
|
style={{ marginLeft: 8 }}
|
||||||
>
|
>
|
||||||
{intl.get('重新启动')}
|
{intl.get('重新启动')}
|
||||||
|
|
|
@ -141,7 +141,7 @@ const Other = ({
|
||||||
okText: intl.get('重启'),
|
okText: intl.get('重启'),
|
||||||
onOk() {
|
onOk() {
|
||||||
request
|
request
|
||||||
.put(`${config.apiPrefix}system/reload`, { type: 'data' })
|
.put(`${config.apiPrefix}update/data`)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
message.success({
|
message.success({
|
||||||
content: (
|
content: (
|
||||||
|
|
Loading…
Reference in New Issue
Block a user