From c61999e2a442c1ebf20c28749e7a0899fedf4710 Mon Sep 17 00:00:00 2001 From: xion Date: Fri, 21 Feb 2025 00:48:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 5 +- readme.md => README.md | 0 app.config.json5.example | 20 +++++++ package.json | 7 +-- release/.gitkeep | 0 script/release/index.mjs | 114 +++++++++++++++++++++++++++++++++++++++ src/index.ts | 3 ++ src/models/user.ts | 5 +- 8 files changed, 148 insertions(+), 6 deletions(-) rename readme.md => README.md (100%) create mode 100644 app.config.json5.example create mode 100644 release/.gitkeep create mode 100644 script/release/index.mjs diff --git a/.gitignore b/.gitignore index eae58d7..9c7f722 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,7 @@ cache-file /apps -logs \ No newline at end of file +logs + +release/* +!release/.gitkeep \ No newline at end of file diff --git a/readme.md b/README.md similarity index 100% rename from readme.md rename to README.md diff --git a/app.config.json5.example b/app.config.json5.example new file mode 100644 index 0000000..e0f6077 --- /dev/null +++ b/app.config.json5.example @@ -0,0 +1,20 @@ +{ + port: 4005, // 端口 + tokenSecret: '', + appPath: 'apps', + appName: 'codeflow', + postgres: { + username: 'root', + host: 'localhost', + database: 'postgres', + password: '*****', + port: 5432, + }, + minio: { + endPoint: 'minio.xiongxiao.me', + bucketName: 'resources', + useSSL: false, + accessKey: 'username', + secretKey: 'password', + }, +} diff --git a/package.json b/package.json index 71f06b9..aa0f556 100644 --- a/package.json +++ b/package.json @@ -8,18 +8,19 @@ "scripts": { "watch": "rollup -c rollup.config.mjs -w", "dev": "cross-env NODE_ENV=development nodemon --delay 2.5 -e js,cjs,mjs --exec node dist/app.mjs", - "dev:pm2": "pm2-dev start ecosystem.config.cjs", "test": "tsx test/**/*.ts", "dev:watch": "cross-env NODE_ENV=development concurrently -n \"Watch,Dev\" -c \"green,blue\" \"npm run watch\" \"sleep 1 && npm run dev\" ", "build": "rimraf dist && rollup -c rollup.config.mjs", "deploy": "rsync -avz --delete ./dist/ --exclude='app.config.json5' light:~/apps/codecenter/dist", + "demo": "rsync -avz --delete ./dist/ on:~/docker/kevisual/dist", "clean": "rm -rf dist", "reload": "ssh light pm2 restart codecenter", "pub": "npm run build && npm run deploy && npm run reload", "deploy:nova": "rsync -avz --delete ./dist/ --exclude='app.config.json5' nova:~/apps/codecenter/dist", "apps:build": "rollup -c rollup.apps.config.mjs", "apps:watch": "rollup -c rollup.apps.config.mjs -w", - "start": "pm2 start dist/app.mjs --name codecenter" + "start": "pm2 start dist/app.mjs --name codecenter", + "release": "node ./script/release/index.mjs" }, "keywords": [], "types": "types/index.d.ts", @@ -32,6 +33,7 @@ "dependencies": { "@kevisual/auth": "1.0.5", "@kevisual/local-app-manager": "0.1.6", + "@kevisual/use-config": "^1.0.7", "@kevisual/router": "^0.0.6-alpha-5", "@types/semver": "^7.5.8", "archiver": "^7.0.1", @@ -55,7 +57,6 @@ "zod": "^3.24.2" }, "devDependencies": { - "@kevisual/use-config": "^1.0.7", "@rollup/plugin-alias": "^5.1.1", "@rollup/plugin-commonjs": "^28.0.2", "@rollup/plugin-json": "^6.1.0", diff --git a/release/.gitkeep b/release/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/script/release/index.mjs b/script/release/index.mjs new file mode 100644 index 0000000..c260181 --- /dev/null +++ b/script/release/index.mjs @@ -0,0 +1,114 @@ +import fs from 'fs'; +import path from 'path'; +import archiver from 'archiver'; +import { exec } from 'child_process'; +import { nanoid } from 'nanoid'; + +const cwd = process.cwd(); +const pkgPath = path.join(cwd, 'package.json'); + +export const checkFileExistsSync = (filePath) => { + try { + // 使用 F_OK 检查文件或目录是否存在 + fs.accessSync(filePath, fs.constants.F_OK); + return true; + } catch (err) { + return false; + } +}; + +const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')); + +const releasePath = path.join(cwd, 'release'); + +const distPath = path.join(cwd, 'dist'); + +const zip = archiver('zip', { + zlib: { level: 9 }, +}); +const zipName = `code-center-${pkg.version}.zip`; +const zipCache = path.join(releasePath, `code-center-${pkg.version}.zip`); + +const getZip = async () => { + return new Promise((resolve, reject) => { + const output = fs.createWriteStream(zipCache); + const startTime = (new Date().getTime() / 1000).toFixed(0); + // 监听事件 + output.on('close', async () => { + const bytes = zip.pointer(); + const size = bytes < 1024 ? `${bytes} bytes` : `${(bytes / 1024).toFixed(2)} KB`; + console.log(`Zip file has been created successfully. Total size: ${size} bytes.`); + let time = (new Date().getTime() / 1000).toFixed(0); + console.log('time', time - startTime); + resolve(); + }); + + output.on('end', () => { + console.log('Data has been drained.'); // 数据已被耗尽 + throw new CustomError('Data has been drained.'); + }); + + zip.on('warning', (err) => { + if (err.code === 'ENOENT') { + console.warn('File not found:', err); + } else { + throw err; + } + }); + + zip.on('error', (err) => { + throw err; + }); + + // 通过管道将 zip 数据流输出到指定文件 + zip.pipe(output); + + // 添加 sh 字符串作为文件到 zip 中 + const sh = `#!/bin/bash + npm i -g pnpm + pnpm install --prod + `; + zip.append(sh, { name: 'start.sh' }); + // 把dist目录下的文件添加到zip中 + zip.directory(distPath, 'dist'); + // 把README.md添加到zip中 + zip.file(path.join(cwd, 'README.md'), { name: 'README.md' }); + // 把package.json添加到zip中 + zip.file(pkgPath, { name: 'package.json' }); + const ecosystemContent = `module.exports = { + apps: [ + { + name: 'codecenter', // 应用名称 + script: './dist/app.mjs', // 入口文件 + // cwd: '.', // 设置当前工作目录 + output: './logs/codecenter.log', + error: './logs/codecenter.log', + log_date_format: 'YYYY-MM-DD HH:mm:ss', + // watch: true, // 自动监控文件变化 + watch: ['dist'], // 监控的文件夹 + ignore_watch: ['node_modules', 'logs'], // 忽略的文件夹 + } + ] +} +`; + zip.append(ecosystemContent, { name: 'ecosystem.config.cjs' }); + const json5Content = fs.readFileSync(path.join(cwd, 'app.config.json5.example'), 'utf8'); + // tokenSecret 是一个随机字符串,用于生成 token + const tokenSecret = 'XX' + nanoid(39); + json5Content.replace('', tokenSecret); + // tokenSecret + // 把app.config.json5.example添加到zip中 + // zip.file(path.join(cwd, 'app.config.json5.example'), { name: 'app.config.json5.example' }); + zip.append(json5Content, { name: 'app.config.json5.example' }); + + // 结束归档(必须调用,否则 zip 文件无法完成) + zip.finalize(); + }); +}; + +getZip().then(() => { + console.log('zip success'); + console.log(`envision switchOrg 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}`); +}); diff --git a/src/index.ts b/src/index.ts index fe749b7..ae758b3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,7 +8,10 @@ import { loadApps } from './load-apps.ts'; // export { aiApp }; export { app }; loadApps(app); + +// if (import.meta.url === `file://${process.argv[1]}`) { app.listen(config.port, () => { console.log(`server is running at http://localhost:${config.port}`); }); app.server.on(uploadMiddleware); +// } diff --git a/src/models/user.ts b/src/models/user.ts index e953871..d46351d 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -215,7 +215,7 @@ User.init( ); User.sync({ alter: true, logging: false }) .then((res) => { - // initializeUser(); + initializeUser(); }) .catch((err) => { console.error('Sync User error', err); @@ -238,6 +238,7 @@ export const initializeUser = async () => { const org = await User.createOrg('admin', root.id, '管理员'); console.info(' new Users name', root.username, org.username); console.info('new Users id', root.id, org.id); + CreateDemoUser(); } }; export const CreateDemoUser = async () => { @@ -245,7 +246,7 @@ export const CreateDemoUser = async () => { logging: false, }); console.info('[User count]', w.count); - const username = 'dmeo'; + const username = 'demo'; const u = await User.findOne({ where: { username }, logging: false }); if (!u) { const user = await User.createUser(username, '', 'demo');