fix: 解决部署问题

This commit is contained in:
熊潇 2025-02-24 20:27:39 +08:00
parent 1e9f209803
commit 61bf2cc73b
13 changed files with 53 additions and 84 deletions

View File

@ -1,2 +1,6 @@
code center code center
```
unzip -x app.config.json5
```

View File

@ -3,6 +3,8 @@
tokenSecret: '<TOKEN_SECRET>', tokenSecret: '<TOKEN_SECRET>',
appPath: 'apps', appPath: 'apps',
appName: 'codeflow', appName: 'codeflow',
domain: '*',
'mainApp': 'https://kevisual.xiongxiao.me',
postgres: { postgres: {
username: 'root', username: 'root',
host: 'localhost', host: 'localhost',
@ -10,6 +12,7 @@
password: '*****', password: '*****',
port: 5432, port: 5432,
}, },
redis: {},
minio: { minio: {
endPoint: 'minio.xiongxiao.me', endPoint: 'minio.xiongxiao.me',
bucketName: 'resources', bucketName: 'resources',

View File

@ -1,6 +1,6 @@
{ {
"name": "@kevisual/code-center", "name": "@kevisual/code-center",
"version": "0.0.1", "version": "0.0.3",
"description": "code center", "description": "code center",
"type": "module", "type": "module",
"main": "index.js", "main": "index.js",
@ -32,7 +32,7 @@
"license": "UNLICENSED", "license": "UNLICENSED",
"dependencies": { "dependencies": {
"@kevisual/auth": "1.0.5", "@kevisual/auth": "1.0.5",
"@kevisual/local-app-manager": "0.1.6", "@kevisual/local-app-manager": "0.1.8",
"@kevisual/router": "^0.0.6", "@kevisual/router": "^0.0.6",
"@kevisual/use-config": "^1.0.7", "@kevisual/use-config": "^1.0.7",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",

12
pnpm-lock.yaml generated
View File

@ -17,8 +17,8 @@ importers:
specifier: 1.0.5 specifier: 1.0.5
version: 1.0.5 version: 1.0.5
'@kevisual/local-app-manager': '@kevisual/local-app-manager':
specifier: 0.1.6 specifier: 0.1.8
version: 0.1.6(@kevisual/router@0.0.6)(@kevisual/types@0.0.6)(@kevisual/use-config@1.0.7) version: 0.1.8(@kevisual/router@0.0.6)(@kevisual/types@0.0.6)(@kevisual/use-config@1.0.7)(pm2@5.4.3)
'@kevisual/router': '@kevisual/router':
specifier: ^0.0.6 specifier: ^0.0.6
version: 0.0.6 version: 0.0.6
@ -339,12 +339,13 @@ packages:
'@kevisual/auth@1.0.5': '@kevisual/auth@1.0.5':
resolution: {integrity: sha512-GwsLj7unKXi7lmMiIIgdig4LwwLiDJnOy15HHZR5gMbyK6s5/uJiMY5RXPB2+onGzTNDqFo/hXjsD2wkerHPVg==} resolution: {integrity: sha512-GwsLj7unKXi7lmMiIIgdig4LwwLiDJnOy15HHZR5gMbyK6s5/uJiMY5RXPB2+onGzTNDqFo/hXjsD2wkerHPVg==}
'@kevisual/local-app-manager@0.1.6': '@kevisual/local-app-manager@0.1.8':
resolution: {integrity: sha512-ECIM72GS42++xWisE0MVfaby3wGby9Qz+AphpAzYJ286sbSatY7z5cHYKIVeKwIzqU9pyUlgLFDU8UeKCYpsmA==} resolution: {integrity: sha512-3dRstV+g1zZox7NvkXPpQHmil0rU89bXM15msmbmWUB450FIh1WaaQ7pWT6cQKhTuPO+duvSSAXtbbL7A1TqvQ==}
peerDependencies: peerDependencies:
'@kevisual/router': ^0.0.6-alpha-2 '@kevisual/router': ^0.0.6-alpha-2
'@kevisual/types': ^0.0.1 '@kevisual/types': ^0.0.1
'@kevisual/use-config': ^1.0.5 '@kevisual/use-config': ^1.0.5
pm2: ^5.4.3
'@kevisual/router@0.0.6': '@kevisual/router@0.0.6':
resolution: {integrity: sha512-7FQUY87Zy5A4V30OAggRbGpO/Asd7SUpnhHv8mlxnSFFTto25xpXmjHYp12mu/HJTsHM7RTaxVEyD1DeP44D2A==} resolution: {integrity: sha512-7FQUY87Zy5A4V30OAggRbGpO/Asd7SUpnhHv8mlxnSFFTto25xpXmjHYp12mu/HJTsHM7RTaxVEyD1DeP44D2A==}
@ -2509,11 +2510,12 @@ snapshots:
'@kevisual/auth@1.0.5': {} '@kevisual/auth@1.0.5': {}
'@kevisual/local-app-manager@0.1.6(@kevisual/router@0.0.6)(@kevisual/types@0.0.6)(@kevisual/use-config@1.0.7)': '@kevisual/local-app-manager@0.1.8(@kevisual/router@0.0.6)(@kevisual/types@0.0.6)(@kevisual/use-config@1.0.7)(pm2@5.4.3)':
dependencies: dependencies:
'@kevisual/router': 0.0.6 '@kevisual/router': 0.0.6
'@kevisual/types': 0.0.6 '@kevisual/types': 0.0.6
'@kevisual/use-config': 1.0.7 '@kevisual/use-config': 1.0.7
pm2: 5.4.3
'@kevisual/router@0.0.6': '@kevisual/router@0.0.6':
dependencies: dependencies:

View File

@ -73,6 +73,8 @@ const config = {
'socket.io', // socket.io 'socket.io', // socket.io
'minio', // minio 'minio', // minio
'pm2',
'pg', // pg 'pg', // pg
'pino', // pino 'pino', // pino
'pino-pretty', // pino-pretty 'pino-pretty', // pino-pretty

View File

@ -0,0 +1,11 @@
import * as nanoid from 'nanoid';
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
//HMAC-256推荐 32 字节。
// HMAC-512推荐 64 字节。
// jsonwentoken 默认使用 HMAC-256 算法,生成 32 字节的 token。
const v = nanoid.customAlphabet(alphabet, 32);
console.log('v', v());

View File

@ -108,7 +108,9 @@ const getZip = async () => {
getZip().then(() => { getZip().then(() => {
console.log('zip success'); console.log('zip success');
console.log(`envision switchOrg system && envision deploy ./release/${zipName} -v 1.0.0 -k code-center -y y -u`); // 固定上传位置在1.0.0版本不需要更新因为是zip文件
console.log(`envision switch system && envision deploy ./release/${zipName} -v 1.0.0 -k code-center -y y -u`);
console.log(`download zip: https://kevisual.xiongxiao.me/system/code-center/${zipName}`); console.log(`download zip:\n\ncurl -O https://kevisual.xiongxiao.me/system/code-center/${zipName} && unzip ${zipName}`);
}); });

View File

@ -6,14 +6,11 @@ import { minioClient } from './modules/minio.ts';
import { sequelize } from './modules/sequelize.ts'; import { sequelize } from './modules/sequelize.ts';
import { useContextKey, useContext } from '@kevisual/use-config/context'; import { useContextKey, useContext } from '@kevisual/use-config/context';
useConfig(); useConfig();
export const emit = (channel: string, message?: any) => {
redisPublisher.publish(channel, JSON.stringify(message));
};
export { redis, minioClient, sequelize }; export { redis, minioClient, sequelize };
const init = () => { const init = () => {
console.log('init app', global.context); console.log('init app', global.context);
return new App<{ import: any; emit: typeof emit; sequelize: typeof sequelize }>({ return new App<{ import: any; sequelize: typeof sequelize }>({
serverOptions: { serverOptions: {
cors: { cors: {
origin: '*', origin: '*',
@ -22,72 +19,8 @@ const init = () => {
io: true, io: true,
routerContext: { routerContext: {
import: dynamicImport, import: dynamicImport,
emit,
sequelize, sequelize,
}, },
}); });
}; };
export const app = useContextKey('app', init); export const app = useContextKey('app', init);
// @ts-ignore
// app.name = 'main-app';
// console.log('app context', global.context);
const clients = [];
// 订阅频道 pageEdit container 单个页面预览 container 整个页面预览
type ClientData = {
cid?: string; // container id
pid?: string[]; // page id
cids?: string[]; // container id
type: 'page' | 'container' | 'flow';
};
type MessageData = {
source: 'container';
data: any;
operation?: 'edit';
};
redisSubscriber.subscribe('pageEdit', () => {
console.log('Subscribed to Redis data-updates channel');
});
redisSubscriber.on('message', (channel, message) => {
if (channel !== 'pageEdit') return;
const m = JSON.parse(message) as MessageData;
clients.forEach((client) => {
const data = client.data as any;
const { cid, cids = [], pid } = data || {};
const wrapper = (data: any) => {
const res = {
type: 'pageEdit',
source: 'container',
data,
pid,
};
return JSON.stringify(res);
};
const { source, data: mData } = m; // 拆包
if (source === 'container') {
if (cid === mData?.id) {
client.ws.send(wrapper(mData));
} else if (cids.includes(mData?.id)) {
client.ws.send(wrapper(mData));
}
}
// 其他操作 暂时 不处理
// TODO
});
});
app.io.addListener('subscribe', async ({ data, end, ws }) => {
const { type } = data || {};
if (type === 'pageEdit') {
clients.push({ ws, data: data.data }); // 拆包里面包含的type信息去掉
end({ code: 200, data: 'subscribe success' });
} else if (type === 'unsubscribe') {
const index = clients.findIndex((client) => client.ws === ws);
clients.splice(index, 1);
end({ code: 200, data: 'unsubscribe success' });
} else {
end({ code: 404, data: 'subscribe fail' });
}
ws.on('close', () => {
const index = clients.findIndex((client) => client.ws === ws);
clients.splice(index, 1);
});
});

View File

@ -15,3 +15,5 @@ app.listen(config.port, () => {
}); });
app.server.on(uploadMiddleware); app.server.on(uploadMiddleware);
// } // }
console.log(`run ${config.appName} done`);

View File

@ -257,7 +257,7 @@ export const createDemoUser = async (username = 'demo', pwd = custom()) => {
const u = await User.findOne({ where: { username }, logging: false }); const u = await User.findOne({ where: { username }, logging: false });
if (!u) { if (!u) {
const user = await User.createUser(username, pwd, 'demo'); const user = await User.createUser(username, pwd, 'demo');
console.info('new Users name', user.username); console.info('new Users name', user.username, pwd);
return { return {
code: 200, code: 200,
data: { user, pwd: pwd }, data: { user, pwd: pwd },

View File

@ -103,23 +103,24 @@ app
} }
console.log('path', path); console.log('path', path);
const check = await appPathCheck({ key }); const check = await appPathCheck({ key });
let appType: string;
if (check) { if (check) {
if (!force) { if (!force) {
ctx.throw(400, 'App already exists, please remove it first'); ctx.throw(400, 'App already exists, please remove it first');
} else { } else {
const app = manager.getAppShowInfo(key); const app = manager.getAppShowInfo(key);
const appType = app?.type; appType = app?.type;
await manager.removeApp(key); await manager.removeApp(key);
if (appType === 'system-app') {
// 如果是system-app(主进程运行),就重载
selfRestart();
}
} }
} }
const installAppData = await installApp({ path, key }); const installAppData = await installApp({ path, key });
await manager.add(installAppData.showAppInfo); await manager.add(installAppData.showAppInfo);
ctx.body = installAppData; ctx.body = installAppData;
if (appType === 'system-app') {
// 如果是system-app(主进程运行),就重启服务
setTimeout(() => selfRestart(), 3000);
}
}) })
.addTo(app); .addTo(app);

View File

@ -48,7 +48,7 @@ app
const token = await user.createToken(null, loginType); const token = await user.createToken(null, loginType);
ctx.res.cookie('token', token.token, { ctx.res.cookie('token', token.token, {
maxAge: token.expireTime, maxAge: token.expireTime,
domain: { domain }, domain,
sameSite: 'lax', sameSite: 'lax',
httpOnly: true, httpOnly: true,
}); });

9
src/scripts/sync-user.ts Normal file
View File

@ -0,0 +1,9 @@
import { User } from '../models/user.ts';
// User.sync({ alter: true, logging: true }).then(() => {
// console.log('sync user done');
// });
User.findOne({ where: { username: 'admin' } }).then((user) => {
console.log('user', user);
});