mirror of
https://github.com/whyour/qinglong.git
synced 2025-07-07 03:46:07 +08:00
移除 nedb 和 sentry
This commit is contained in:
parent
a9755655b2
commit
f1ca2134b7
|
@ -1,4 +1,3 @@
|
||||||
import './loaders/sentry'
|
|
||||||
import 'reflect-metadata'; // We need this in order to use @Decorators
|
import 'reflect-metadata'; // We need this in order to use @Decorators
|
||||||
import config from './config';
|
import config from './config';
|
||||||
import express from 'express';
|
import express from 'express';
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
import Logger from './logger';
|
import Logger from './logger';
|
||||||
import path from 'path';
|
|
||||||
import DataStore from 'nedb';
|
|
||||||
import { EnvModel } from '../data/env';
|
import { EnvModel } from '../data/env';
|
||||||
import { CrontabModel } from '../data/cron';
|
import { CrontabModel } from '../data/cron';
|
||||||
import { DependenceModel } from '../data/dependence';
|
import { DependenceModel } from '../data/dependence';
|
||||||
import { AppModel } from '../data/open';
|
import { AppModel } from '../data/open';
|
||||||
import { SystemModel } from '../data/system';
|
import { SystemModel } from '../data/system';
|
||||||
import { fileExist } from '../config/util';
|
|
||||||
import { SubscriptionModel } from '../data/subscription';
|
import { SubscriptionModel } from '../data/subscription';
|
||||||
import { CrontabViewModel } from '../data/cronView';
|
import { CrontabViewModel } from '../data/cronView';
|
||||||
import config from '../config';
|
|
||||||
import { sequelize } from '../data';
|
import { sequelize } from '../data';
|
||||||
|
|
||||||
export default async () => {
|
export default async () => {
|
||||||
|
@ -61,78 +57,6 @@ export default async () => {
|
||||||
await sequelize.query('alter table Crontabs add column task_after TEXT');
|
await sequelize.query('alter table Crontabs add column task_after TEXT');
|
||||||
} catch (error) {}
|
} catch (error) {}
|
||||||
|
|
||||||
// 2.10-2.11 升级
|
|
||||||
const cronDbFile = path.join(config.rootPath, 'db/crontab.db');
|
|
||||||
const envDbFile = path.join(config.rootPath, 'db/env.db');
|
|
||||||
const appDbFile = path.join(config.rootPath, 'db/app.db');
|
|
||||||
const authDbFile = path.join(config.rootPath, 'db/auth.db');
|
|
||||||
const dependenceDbFile = path.join(config.rootPath, 'db/dependence.db');
|
|
||||||
const crondbExist = await fileExist(cronDbFile);
|
|
||||||
const dependenceDbExist = await fileExist(dependenceDbFile);
|
|
||||||
const envDbExist = await fileExist(envDbFile);
|
|
||||||
const appDbExist = await fileExist(appDbFile);
|
|
||||||
const authDbExist = await fileExist(authDbFile);
|
|
||||||
|
|
||||||
const cronCount = await CrontabModel.count();
|
|
||||||
const dependenceCount = await DependenceModel.count();
|
|
||||||
const envCount = await EnvModel.count();
|
|
||||||
const appCount = await AppModel.count();
|
|
||||||
const authCount = await SystemModel.count();
|
|
||||||
if (crondbExist && cronCount === 0) {
|
|
||||||
const cronDb = new DataStore({
|
|
||||||
filename: cronDbFile,
|
|
||||||
autoload: true,
|
|
||||||
});
|
|
||||||
cronDb.persistence.compactDatafile();
|
|
||||||
cronDb.find({}).exec(async (err, docs) => {
|
|
||||||
await CrontabModel.bulkCreate(docs, { ignoreDuplicates: true });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dependenceDbExist && dependenceCount === 0) {
|
|
||||||
const dependenceDb = new DataStore({
|
|
||||||
filename: dependenceDbFile,
|
|
||||||
autoload: true,
|
|
||||||
});
|
|
||||||
dependenceDb.persistence.compactDatafile();
|
|
||||||
dependenceDb.find({}).exec(async (err, docs) => {
|
|
||||||
await DependenceModel.bulkCreate(docs, { ignoreDuplicates: true });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (envDbExist && envCount === 0) {
|
|
||||||
const envDb = new DataStore({
|
|
||||||
filename: envDbFile,
|
|
||||||
autoload: true,
|
|
||||||
});
|
|
||||||
envDb.persistence.compactDatafile();
|
|
||||||
envDb.find({}).exec(async (err, docs) => {
|
|
||||||
await EnvModel.bulkCreate(docs, { ignoreDuplicates: true });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (appDbExist && appCount === 0) {
|
|
||||||
const appDb = new DataStore({
|
|
||||||
filename: appDbFile,
|
|
||||||
autoload: true,
|
|
||||||
});
|
|
||||||
appDb.persistence.compactDatafile();
|
|
||||||
appDb.find({}).exec(async (err, docs) => {
|
|
||||||
await AppModel.bulkCreate(docs, { ignoreDuplicates: true });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (authDbExist && authCount === 0) {
|
|
||||||
const authDb = new DataStore({
|
|
||||||
filename: authDbFile,
|
|
||||||
autoload: true,
|
|
||||||
});
|
|
||||||
authDb.persistence.compactDatafile();
|
|
||||||
authDb.find({}).exec(async (err, docs) => {
|
|
||||||
await SystemModel.bulkCreate(docs, { ignoreDuplicates: true });
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('✌️ DB loaded');
|
console.log('✌️ DB loaded');
|
||||||
Logger.info('✌️ DB loaded');
|
Logger.info('✌️ DB loaded');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
@ -6,7 +6,6 @@ import config from '../config';
|
||||||
import { UnauthorizedError, expressjwt } from 'express-jwt';
|
import { UnauthorizedError, expressjwt } from 'express-jwt';
|
||||||
import { getPlatform, getToken } from '../config/util';
|
import { getPlatform, getToken } from '../config/util';
|
||||||
import rewrite from 'express-urlrewrite';
|
import rewrite from 'express-urlrewrite';
|
||||||
import * as Sentry from '@sentry/node';
|
|
||||||
import { errors } from 'celebrate';
|
import { errors } from 'celebrate';
|
||||||
import { createProxyMiddleware } from 'http-proxy-middleware';
|
import { createProxyMiddleware } from 'http-proxy-middleware';
|
||||||
import { serveEnv } from '../config/serverEnv';
|
import { serveEnv } from '../config/serverEnv';
|
||||||
|
@ -131,8 +130,6 @@ export default ({ app }: { app: Application }) => {
|
||||||
|
|
||||||
app.use(errors());
|
app.use(errors());
|
||||||
|
|
||||||
Sentry.setupExpressErrorHandler(app);
|
|
||||||
|
|
||||||
app.use(
|
app.use(
|
||||||
(
|
(
|
||||||
err: Error & { status: number },
|
err: Error & { status: number },
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
import * as Sentry from '@sentry/node';
|
|
||||||
import Logger from './logger';
|
|
||||||
import fs from 'fs';
|
|
||||||
import config from '../config';
|
|
||||||
import { parseContentVersion } from '../config/util';
|
|
||||||
|
|
||||||
let version = '1.0.0';
|
|
||||||
try {
|
|
||||||
const content = fs.readFileSync(config.versionFile, 'utf-8');
|
|
||||||
({ version } = parseContentVersion(content));
|
|
||||||
} catch (error) {}
|
|
||||||
|
|
||||||
Sentry.init({
|
|
||||||
ignoreErrors: [
|
|
||||||
/SequelizeUniqueConstraintError/i,
|
|
||||||
/Validation error/i,
|
|
||||||
/UnauthorizedError/i,
|
|
||||||
/celebrate request validation failed/i,
|
|
||||||
],
|
|
||||||
dsn: 'https://8b5c84cfef3e22541bc84de0ed00497b@o1098464.ingest.sentry.io/6122819',
|
|
||||||
tracesSampleRate: 0.5,
|
|
||||||
release: version,
|
|
||||||
});
|
|
||||||
|
|
||||||
Logger.info('✌️ Sentry loaded');
|
|
||||||
console.log('✌️ Sentry loaded');
|
|
10
package.json
10
package.json
|
@ -64,7 +64,6 @@
|
||||||
"@grpc/grpc-js": "^1.12.3",
|
"@grpc/grpc-js": "^1.12.3",
|
||||||
"@grpc/proto-loader": "^0.7.13",
|
"@grpc/proto-loader": "^0.7.13",
|
||||||
"@otplib/preset-default": "^12.0.1",
|
"@otplib/preset-default": "^12.0.1",
|
||||||
"@sentry/node": "^8.42.0",
|
|
||||||
"body-parser": "^1.20.3",
|
"body-parser": "^1.20.3",
|
||||||
"celebrate": "^15.0.3",
|
"celebrate": "^15.0.3",
|
||||||
"chokidar": "^4.0.1",
|
"chokidar": "^4.0.1",
|
||||||
|
@ -73,7 +72,7 @@
|
||||||
"cross-spawn": "^7.0.6",
|
"cross-spawn": "^7.0.6",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"dotenv": "^16.4.6",
|
"dotenv": "^16.4.6",
|
||||||
"express": "^4.21.1",
|
"express": "^4.21.2",
|
||||||
"express-jwt": "^8.4.1",
|
"express-jwt": "^8.4.1",
|
||||||
"express-rate-limit": "^7.4.1",
|
"express-rate-limit": "^7.4.1",
|
||||||
"express-urlrewrite": "^2.0.3",
|
"express-urlrewrite": "^2.0.3",
|
||||||
|
@ -86,7 +85,6 @@
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"multer": "1.4.5-lts.1",
|
"multer": "1.4.5-lts.1",
|
||||||
"nedb": "^1.8.0",
|
|
||||||
"node-schedule": "^2.1.0",
|
"node-schedule": "^2.1.0",
|
||||||
"nodemailer": "^6.9.16",
|
"nodemailer": "^6.9.16",
|
||||||
"p-queue-cjs": "7.3.4",
|
"p-queue-cjs": "7.3.4",
|
||||||
|
@ -117,7 +115,6 @@
|
||||||
"@monaco-editor/react": "4.2.1",
|
"@monaco-editor/react": "4.2.1",
|
||||||
"@react-hook/resize-observer": "^2.0.2",
|
"@react-hook/resize-observer": "^2.0.2",
|
||||||
"react-router-dom": "6.26.1",
|
"react-router-dom": "6.26.1",
|
||||||
"@sentry/react": "^8.42.0",
|
|
||||||
"@types/body-parser": "^1.19.2",
|
"@types/body-parser": "^1.19.2",
|
||||||
"@types/cors": "^2.8.12",
|
"@types/cors": "^2.8.12",
|
||||||
"@types/cross-spawn": "^6.0.2",
|
"@types/cross-spawn": "^6.0.2",
|
||||||
|
@ -128,7 +125,6 @@
|
||||||
"@types/jsonwebtoken": "^8.5.8",
|
"@types/jsonwebtoken": "^8.5.8",
|
||||||
"@types/lodash": "^4.14.185",
|
"@types/lodash": "^4.14.185",
|
||||||
"@types/multer": "^1.4.7",
|
"@types/multer": "^1.4.7",
|
||||||
"@types/nedb": "^1.8.12",
|
|
||||||
"@types/node": "^17.0.21",
|
"@types/node": "^17.0.21",
|
||||||
"@types/node-schedule": "^1.3.2",
|
"@types/node-schedule": "^1.3.2",
|
||||||
"@types/nodemailer": "^6.4.4",
|
"@types/nodemailer": "^6.4.4",
|
||||||
|
@ -144,11 +140,11 @@
|
||||||
"@types/proper-lockfile": "^4.1.4",
|
"@types/proper-lockfile": "^4.1.4",
|
||||||
"@uiw/codemirror-extensions-langs": "^4.21.9",
|
"@uiw/codemirror-extensions-langs": "^4.21.9",
|
||||||
"@uiw/react-codemirror": "^4.21.9",
|
"@uiw/react-codemirror": "^4.21.9",
|
||||||
"@umijs/max": "^4.3.36",
|
"@umijs/max": "^4.4.4",
|
||||||
"@umijs/ssr-darkreader": "^4.9.45",
|
"@umijs/ssr-darkreader": "^4.9.45",
|
||||||
"ahooks": "^3.7.8",
|
"ahooks": "^3.7.8",
|
||||||
"ansi-to-react": "^6.1.6",
|
"ansi-to-react": "^6.1.6",
|
||||||
"antd": "^4.24.8",
|
"antd": "^4.24.16",
|
||||||
"antd-img-crop": "^4.23.0",
|
"antd-img-crop": "^4.23.0",
|
||||||
"axios": "^1.4.0",
|
"axios": "^1.4.0",
|
||||||
"compression-webpack-plugin": "9.2.0",
|
"compression-webpack-plugin": "9.2.0",
|
||||||
|
|
1052
pnpm-lock.yaml
1052
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
@ -1,35 +1,21 @@
|
||||||
import intl from 'react-intl-universal';
|
import config from '@/utils/config';
|
||||||
import React, { useEffect, useState } from 'react';
|
import { useCtx, useTheme } from '@/utils/hooks';
|
||||||
import ProLayout, { PageLoading } from '@ant-design/pro-layout';
|
import { request } from '@/utils/http';
|
||||||
import * as DarkReader from '@umijs/ssr-darkreader';
|
|
||||||
import defaultProps from './defaultProps';
|
|
||||||
import { Link, history, Outlet, useLocation } from '@umijs/max';
|
|
||||||
import {
|
import {
|
||||||
LogoutOutlined,
|
LogoutOutlined,
|
||||||
MenuFoldOutlined,
|
MenuFoldOutlined,
|
||||||
MenuUnfoldOutlined,
|
MenuUnfoldOutlined,
|
||||||
UserOutlined,
|
UserOutlined,
|
||||||
} from '@ant-design/icons';
|
} from '@ant-design/icons';
|
||||||
import config from '@/utils/config';
|
import ProLayout, { PageLoading } from '@ant-design/pro-layout';
|
||||||
import { request } from '@/utils/http';
|
import { history, Link, Outlet, useLocation } from '@umijs/max';
|
||||||
import './index.less';
|
import * as DarkReader from '@umijs/ssr-darkreader';
|
||||||
|
import { Avatar, Badge, Dropdown, Image, MenuProps, Tooltip } from 'antd';
|
||||||
|
import React, { useEffect, useState } from 'react';
|
||||||
|
import intl from 'react-intl-universal';
|
||||||
import vhCheck from 'vh-check';
|
import vhCheck from 'vh-check';
|
||||||
import { useCtx, useTheme } from '@/utils/hooks';
|
import defaultProps from './defaultProps';
|
||||||
import {
|
import './index.less';
|
||||||
message,
|
|
||||||
Badge,
|
|
||||||
Modal,
|
|
||||||
Avatar,
|
|
||||||
Dropdown,
|
|
||||||
Menu,
|
|
||||||
Image,
|
|
||||||
Popover,
|
|
||||||
Descriptions,
|
|
||||||
Tooltip,
|
|
||||||
MenuProps,
|
|
||||||
} from 'antd';
|
|
||||||
// @ts-ignore
|
|
||||||
import * as Sentry from '@sentry/react';
|
|
||||||
import { init } from '../utils/init';
|
import { init } from '../utils/init';
|
||||||
import WebSocketManager from '../utils/websocket';
|
import WebSocketManager from '../utils/websocket';
|
||||||
|
|
||||||
|
@ -178,9 +164,9 @@ export default function () {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!user || !user.username) return;
|
if (!user || !user.username) return;
|
||||||
const ws = WebSocketManager.getInstance(
|
const ws = WebSocketManager.getInstance(
|
||||||
`${window.location.origin}${config.apiPrefix}ws?token=${localStorage.getItem(
|
`${window.location.origin}${
|
||||||
config.authKey,
|
config.apiPrefix
|
||||||
)}`,
|
}ws?token=${localStorage.getItem(config.authKey)}`,
|
||||||
);
|
);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
@ -201,9 +187,6 @@ export default function () {
|
||||||
console.log(
|
console.log(
|
||||||
`从开始至load总耗时: ${timing.loadEventEnd - timing.navigationStart}`,
|
`从开始至load总耗时: ${timing.loadEventEnd - timing.navigationStart}`,
|
||||||
);
|
);
|
||||||
Sentry.captureMessage(
|
|
||||||
`白屏时间 ${timing.responseStart - timing.navigationStart}`,
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -254,18 +237,15 @@ export default function () {
|
||||||
<ProLayout
|
<ProLayout
|
||||||
selectedKeys={[location.pathname]}
|
selectedKeys={[location.pathname]}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
ErrorBoundary={Sentry.ErrorBoundary}
|
|
||||||
logo={
|
logo={
|
||||||
<>
|
<>
|
||||||
<Image preview={false} src="https://qn.whyour.cn/logo.png" />
|
<Image preview={false} src="https://qn.whyour.cn/logo.png" />
|
||||||
<div className="title">
|
<div className="title">
|
||||||
<span className="title">{intl.get('青龙')}</span>
|
<span className="title">{intl.get('青龙')}</span>
|
||||||
<a
|
<span
|
||||||
href={systemInfo?.changeLogLink}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
window.open(systemInfo?.changeLogLink, '_blank');
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
|
@ -289,7 +269,7 @@ export default function () {
|
||||||
</span>
|
</span>
|
||||||
</Badge>
|
</Badge>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</a>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
@ -320,7 +300,9 @@ export default function () {
|
||||||
shape="square"
|
shape="square"
|
||||||
size="small"
|
size="small"
|
||||||
icon={<UserOutlined />}
|
icon={<UserOutlined />}
|
||||||
src={user.avatar ? `${config.apiPrefix}static/${user.avatar}` : ''}
|
src={
|
||||||
|
user.avatar ? `${config.apiPrefix}static/${user.avatar}` : ''
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<span style={{ marginLeft: 5 }}>{user.username}</span>
|
<span style={{ marginLeft: 5 }}>{user.username}</span>
|
||||||
</span>
|
</span>
|
||||||
|
@ -342,7 +324,11 @@ export default function () {
|
||||||
shape="square"
|
shape="square"
|
||||||
size="small"
|
size="small"
|
||||||
icon={<UserOutlined />}
|
icon={<UserOutlined />}
|
||||||
src={user.avatar ? `${config.apiPrefix}static/${user.avatar}` : ''}
|
src={
|
||||||
|
user.avatar
|
||||||
|
? `${config.apiPrefix}static/${user.avatar}`
|
||||||
|
: ''
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
<span style={{ marginLeft: 5 }}>{user.username}</span>
|
<span style={{ marginLeft: 5 }}>{user.username}</span>
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -1,42 +1,7 @@
|
||||||
import * as Sentry from '@sentry/react';
|
|
||||||
import { loader } from '@monaco-editor/react';
|
import { loader } from '@monaco-editor/react';
|
||||||
import config from './config';
|
import config from './config';
|
||||||
import { useEffect } from 'react';
|
|
||||||
import {
|
|
||||||
createRoutesFromChildren,
|
|
||||||
matchRoutes,
|
|
||||||
useLocation,
|
|
||||||
useNavigationType,
|
|
||||||
} from 'react-router-dom';
|
|
||||||
|
|
||||||
export function init(version: string) {
|
export function init(version: string) {
|
||||||
// sentry监控 init
|
|
||||||
Sentry.init({
|
|
||||||
dsn: 'https://49b9ad1a6201bfe027db296ab7c6d672@o1098464.ingest.sentry.io/6122818',
|
|
||||||
integrations: [
|
|
||||||
Sentry.reactRouterV6BrowserTracingIntegration({
|
|
||||||
useEffect,
|
|
||||||
useLocation,
|
|
||||||
useNavigationType,
|
|
||||||
createRoutesFromChildren,
|
|
||||||
matchRoutes,
|
|
||||||
}),
|
|
||||||
Sentry.replayIntegration(),
|
|
||||||
],
|
|
||||||
beforeBreadcrumb(breadcrumb) {
|
|
||||||
if (breadcrumb.data && breadcrumb.data.url) {
|
|
||||||
const url = breadcrumb.data.url.replace(/token=.*/, '');
|
|
||||||
breadcrumb.data.url = url;
|
|
||||||
}
|
|
||||||
return breadcrumb;
|
|
||||||
},
|
|
||||||
tracesSampleRate: 0.1,
|
|
||||||
tracePropagationTargets: [/^(?!\/api\/(ws|static)).*$/],
|
|
||||||
replaysSessionSampleRate: 0.1,
|
|
||||||
replaysOnErrorSampleRate: 0.1,
|
|
||||||
release: version,
|
|
||||||
});
|
|
||||||
|
|
||||||
// monaco 编辑器配置cdn和locale
|
// monaco 编辑器配置cdn和locale
|
||||||
loader.config({
|
loader.config({
|
||||||
paths: {
|
paths: {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user