nodebbs 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -99
- package/dist/commands/clean/index.d.ts +11 -0
- package/dist/commands/clean/index.js +93 -0
- package/dist/commands/db/backup.d.ts +9 -0
- package/dist/commands/db/backup.js +78 -0
- package/dist/commands/db/generate.d.ts +3 -0
- package/dist/commands/db/generate.js +9 -3
- package/dist/commands/db/index.d.ts +3 -0
- package/dist/commands/db/index.js +9 -3
- package/dist/commands/db/migrate.d.ts +3 -0
- package/dist/commands/db/migrate.js +8 -2
- package/dist/commands/db/push.d.ts +3 -0
- package/dist/commands/db/push.js +8 -2
- package/dist/commands/db/reset.d.ts +3 -0
- package/dist/commands/db/reset.js +10 -4
- package/dist/commands/db/seed.d.ts +3 -0
- package/dist/commands/db/seed.js +9 -3
- package/dist/commands/logs/api.d.ts +3 -0
- package/dist/commands/logs/api.js +8 -2
- package/dist/commands/logs/db.d.ts +3 -0
- package/dist/commands/logs/db.js +8 -2
- package/dist/commands/logs/index.d.ts +3 -0
- package/dist/commands/logs/index.js +8 -2
- package/dist/commands/logs/redis.d.ts +3 -0
- package/dist/commands/logs/redis.js +8 -2
- package/dist/commands/logs/web.d.ts +3 -0
- package/dist/commands/logs/web.js +9 -3
- package/dist/commands/restart/index.d.ts +3 -0
- package/dist/commands/restart/index.js +10 -2
- package/dist/commands/shell/api.d.ts +3 -0
- package/dist/commands/shell/api.js +9 -3
- package/dist/commands/shell/db.d.ts +3 -0
- package/dist/commands/shell/db.js +9 -3
- package/dist/commands/shell/redis.d.ts +3 -0
- package/dist/commands/shell/redis.js +9 -3
- package/dist/commands/shell/web.d.ts +3 -0
- package/dist/commands/shell/web.js +9 -3
- package/dist/commands/{dev → start}/index.d.ts +2 -2
- package/dist/commands/start/index.js +110 -0
- package/dist/commands/status/index.d.ts +3 -0
- package/dist/commands/status/index.js +8 -2
- package/dist/commands/stop/index.d.ts +1 -0
- package/dist/commands/stop/index.js +7 -1
- package/dist/templates/env +61 -0
- package/dist/utils/docker.js +3 -11
- package/dist/utils/env.js +19 -9
- package/dist/utils/selection.d.ts +5 -0
- package/dist/utils/selection.js +24 -0
- package/dist/utils/template.d.ts +11 -0
- package/dist/utils/template.js +18 -0
- package/oclif.manifest.json +380 -89
- package/package.json +21 -21
- package/dist/commands/deploy/index.d.ts +0 -8
- package/dist/commands/deploy/index.js +0 -95
- package/dist/commands/dev/index.js +0 -59
- package/dist/commands/setup/index.d.ts +0 -5
- package/dist/commands/setup/index.js +0 -12
package/package.json
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodebbs",
|
|
3
3
|
"description": "A new CLI generated with oclif",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.3",
|
|
5
5
|
"author": "wengqianshan",
|
|
6
6
|
"bin": {
|
|
7
7
|
"nodebbs": "./bin/run.js"
|
|
8
8
|
},
|
|
9
|
-
"bugs": "https://github.com/
|
|
9
|
+
"bugs": "https://github.com/aiprojecthub/nodebbs/issues",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@inquirer/prompts": "^8.0.2",
|
|
12
|
-
"@oclif/core": "^4",
|
|
13
|
-
"@oclif/plugin-help": "^6",
|
|
14
|
-
"@oclif/plugin-plugins": "^5",
|
|
12
|
+
"@oclif/core": "^4.8.0",
|
|
13
|
+
"@oclif/plugin-help": "^6.2.36",
|
|
14
|
+
"@oclif/plugin-plugins": "^5.4.54",
|
|
15
15
|
"chalk": "^5.6.2",
|
|
16
16
|
"dotenv": "^17.2.3",
|
|
17
17
|
"execa": "^9.6.1",
|
|
18
18
|
"inquirer": "^13.0.2"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@eslint/compat": "^1",
|
|
21
|
+
"@eslint/compat": "^1.4.1",
|
|
22
22
|
"@oclif/prettier-config": "^0.2.1",
|
|
23
|
-
"@oclif/test": "^4",
|
|
24
|
-
"@types/chai": "^4",
|
|
25
|
-
"@types/mocha": "^10",
|
|
26
|
-
"@types/node": "^18",
|
|
27
|
-
"chai": "^4",
|
|
28
|
-
"eslint": "^9",
|
|
29
|
-
"eslint-config-oclif": "^6",
|
|
30
|
-
"eslint-config-prettier": "^10",
|
|
31
|
-
"mocha": "^10",
|
|
32
|
-
"oclif": "^4",
|
|
33
|
-
"shx": "^0.3.
|
|
34
|
-
"ts-node": "^10",
|
|
35
|
-
"typescript": "^5"
|
|
23
|
+
"@oclif/test": "^4.1.15",
|
|
24
|
+
"@types/chai": "^4.3.20",
|
|
25
|
+
"@types/mocha": "^10.0.10",
|
|
26
|
+
"@types/node": "^18.19.130",
|
|
27
|
+
"chai": "^4.5.0",
|
|
28
|
+
"eslint": "^9.39.1",
|
|
29
|
+
"eslint-config-oclif": "^6.0.124",
|
|
30
|
+
"eslint-config-prettier": "^10.1.8",
|
|
31
|
+
"mocha": "^10.8.2",
|
|
32
|
+
"oclif": "^4.22.54",
|
|
33
|
+
"shx": "^0.3.4",
|
|
34
|
+
"ts-node": "^10.9.2",
|
|
35
|
+
"typescript": "^5.9.3"
|
|
36
36
|
},
|
|
37
37
|
"engines": {
|
|
38
38
|
"node": ">=18.0.0"
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"./dist",
|
|
43
43
|
"./oclif.manifest.json"
|
|
44
44
|
],
|
|
45
|
-
"homepage": "https://github.com/
|
|
45
|
+
"homepage": "https://github.com/aiprojecthub/nodebbs",
|
|
46
46
|
"keywords": [
|
|
47
47
|
"oclif"
|
|
48
48
|
],
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
},
|
|
67
|
-
"repository": "
|
|
67
|
+
"repository": "https://github.com/aiprojecthub/nodebbs",
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "shx rm -rf dist && tsc -b && npm run copy-templates",
|
|
70
70
|
"copy-templates": "shx mkdir -p dist/templates && shx cp src/templates/* dist/templates/",
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Command } from '@oclif/core';
|
|
2
|
-
export default class Deploy extends Command {
|
|
3
|
-
static description: string;
|
|
4
|
-
static flags: {
|
|
5
|
-
name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
6
|
-
};
|
|
7
|
-
run(): Promise<void>;
|
|
8
|
-
}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import { select, confirm } from '@inquirer/prompts';
|
|
3
|
-
import { checkDocker, runCompose, waitForHealth, execCompose, getComposeFiles } from '../../utils/docker.js';
|
|
4
|
-
import { initEnv, checkEnv } from '../../utils/env.js';
|
|
5
|
-
import { logger } from '../../utils/logger.js';
|
|
6
|
-
import dotenv from 'dotenv';
|
|
7
|
-
export default class Deploy extends Command {
|
|
8
|
-
static description = '部署 NodeBBS';
|
|
9
|
-
static flags = {
|
|
10
|
-
name: Flags.string({ char: 'n', description: 'name to print' }),
|
|
11
|
-
};
|
|
12
|
-
async run() {
|
|
13
|
-
logger.header('NodeBBS Docker 部署');
|
|
14
|
-
// 1. Select Environment
|
|
15
|
-
const env = await select({
|
|
16
|
-
message: '请选择部署环境:',
|
|
17
|
-
choices: [
|
|
18
|
-
{ name: '标准生产环境 (2C4G+) [推荐]', value: 'production' },
|
|
19
|
-
{ name: '低配环境 (1C1G/1C2G)', value: 'lowmem' },
|
|
20
|
-
{ name: '基础环境 (仅用于测试)', value: 'basic' }
|
|
21
|
-
]
|
|
22
|
-
});
|
|
23
|
-
// 2. Get Compose Files
|
|
24
|
-
const { files: composeFiles, isBuiltIn } = await getComposeFiles(env);
|
|
25
|
-
if (isBuiltIn) {
|
|
26
|
-
logger.info('使用内置 Docker Compose 模板...');
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
logger.info('使用项目 Docker Compose 文件...');
|
|
30
|
-
}
|
|
31
|
-
if (env === 'production') {
|
|
32
|
-
logger.success('已选择:标准生产环境');
|
|
33
|
-
}
|
|
34
|
-
else if (env === 'lowmem') {
|
|
35
|
-
logger.success('已选择:低配环境');
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
logger.success('已选择:基础环境');
|
|
39
|
-
logger.warning('注意:无资源限制,不推荐用于生产环境。');
|
|
40
|
-
}
|
|
41
|
-
// 3. Check Docker
|
|
42
|
-
await checkDocker();
|
|
43
|
-
// 4. Init & Check Env
|
|
44
|
-
await initEnv();
|
|
45
|
-
await checkEnv(env);
|
|
46
|
-
const continueDeploy = await confirm({
|
|
47
|
-
message: '是否继续部署?',
|
|
48
|
-
default: true
|
|
49
|
-
});
|
|
50
|
-
if (!continueDeploy) {
|
|
51
|
-
logger.info('部署已取消。');
|
|
52
|
-
this.exit(0);
|
|
53
|
-
}
|
|
54
|
-
// 5. Build Images
|
|
55
|
-
logger.info('正在构建 Docker 镜像...');
|
|
56
|
-
await runCompose(composeFiles, ['build', '--no-cache'], isBuiltIn);
|
|
57
|
-
logger.success('镜像构建完成');
|
|
58
|
-
// 6. Start Services
|
|
59
|
-
logger.info('正在启动服务...');
|
|
60
|
-
await runCompose(composeFiles, ['up', '-d'], isBuiltIn);
|
|
61
|
-
logger.success('服务已启动');
|
|
62
|
-
// 7. Wait for Health
|
|
63
|
-
await waitForHealth(composeFiles, isBuiltIn);
|
|
64
|
-
// 8. Init Database
|
|
65
|
-
const pushDb = await confirm({
|
|
66
|
-
message: '是否推送数据库 schema?',
|
|
67
|
-
default: false
|
|
68
|
-
});
|
|
69
|
-
if (pushDb) {
|
|
70
|
-
logger.info('正在推送数据库 schema...');
|
|
71
|
-
await execCompose(composeFiles, 'api', ['npm', 'run', 'db:push'], isBuiltIn);
|
|
72
|
-
logger.success('数据库 schema 推送完成');
|
|
73
|
-
}
|
|
74
|
-
const seedDb = await confirm({
|
|
75
|
-
message: '是否初始化种子数据?',
|
|
76
|
-
default: false
|
|
77
|
-
});
|
|
78
|
-
if (seedDb) {
|
|
79
|
-
logger.info('正在初始化数据...');
|
|
80
|
-
await execCompose(composeFiles, 'api', ['npm', 'run', 'seed'], isBuiltIn);
|
|
81
|
-
logger.success('数据初始化完成');
|
|
82
|
-
}
|
|
83
|
-
// 9. Show Info
|
|
84
|
-
logger.header('部署完成!');
|
|
85
|
-
logger.info(`环境: ${env}`);
|
|
86
|
-
// 读取 .env 文件获取端口配置
|
|
87
|
-
const envConfig = dotenv.config().parsed || {};
|
|
88
|
-
const webPort = envConfig.WEB_PORT || '3100';
|
|
89
|
-
const apiPort = envConfig.API_PORT || '7100';
|
|
90
|
-
console.log(` Web 前端: http://localhost:${webPort}`);
|
|
91
|
-
console.log(` API 服务: http://localhost:${apiPort}`);
|
|
92
|
-
console.log(` API 文档: http://localhost:${apiPort}/docs`);
|
|
93
|
-
console.log(` 健康检查: http://localhost:${apiPort}/api`);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Command, Flags } from '@oclif/core';
|
|
2
|
-
import { select } from '@inquirer/prompts';
|
|
3
|
-
import { runCompose, getComposeFiles } from '../../utils/docker.js';
|
|
4
|
-
import { logger } from '../../utils/logger.js';
|
|
5
|
-
import dotenv from 'dotenv';
|
|
6
|
-
export default class Dev extends Command {
|
|
7
|
-
static description = '启动开发环境';
|
|
8
|
-
static flags = {
|
|
9
|
-
env: Flags.string({
|
|
10
|
-
char: 'e',
|
|
11
|
-
description: '部署环境 (production, lowmem, basic)',
|
|
12
|
-
options: ['production', 'lowmem', 'basic'],
|
|
13
|
-
}),
|
|
14
|
-
rebuild: Flags.boolean({
|
|
15
|
-
char: 'r',
|
|
16
|
-
description: '重新构建镜像',
|
|
17
|
-
default: false,
|
|
18
|
-
}),
|
|
19
|
-
};
|
|
20
|
-
async run() {
|
|
21
|
-
const { flags } = await this.parse(Dev);
|
|
22
|
-
// 如果没有指定环境,询问用户
|
|
23
|
-
let env = flags.env;
|
|
24
|
-
if (!env) {
|
|
25
|
-
env = await select({
|
|
26
|
-
message: '请选择部署环境:',
|
|
27
|
-
choices: [
|
|
28
|
-
{ name: '标准生产环境 (2C4G+) [推荐]', value: 'production' },
|
|
29
|
-
{ name: '低配环境 (1C1G/1C2G)', value: 'lowmem' },
|
|
30
|
-
{ name: '基础环境 (仅用于测试)', value: 'basic' },
|
|
31
|
-
],
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const { files, isBuiltIn } = await getComposeFiles(env);
|
|
35
|
-
if (isBuiltIn) {
|
|
36
|
-
logger.info('使用内置 Docker Compose 模板...');
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
logger.info('使用项目 Docker Compose 文件...');
|
|
40
|
-
}
|
|
41
|
-
if (flags.rebuild) {
|
|
42
|
-
logger.info('正在重新构建并启动服务...');
|
|
43
|
-
await runCompose(files, ['up', '-d', '--build'], isBuiltIn);
|
|
44
|
-
logger.success('服务已重新构建并启动!');
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
logger.info('正在启动服务...');
|
|
48
|
-
await runCompose(files, ['up', '-d'], isBuiltIn);
|
|
49
|
-
logger.success('服务已启动!');
|
|
50
|
-
}
|
|
51
|
-
// 读取 .env 文件获取端口配置
|
|
52
|
-
const envConfig = dotenv.config().parsed || {};
|
|
53
|
-
const webPort = envConfig.WEB_PORT || '3100';
|
|
54
|
-
const apiPort = envConfig.API_PORT || '7100';
|
|
55
|
-
console.log(` Web 前端: http://localhost:${webPort}`);
|
|
56
|
-
console.log(` API 服务: http://localhost:${apiPort}`);
|
|
57
|
-
console.log(` API 文档: http://localhost:${apiPort}/docs`);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Command } from '@oclif/core';
|
|
2
|
-
import { initEnv } from '../../utils/env.js';
|
|
3
|
-
import { logger } from '../../utils/logger.js';
|
|
4
|
-
export default class Setup extends Command {
|
|
5
|
-
static description = '初始化项目(首次使用)';
|
|
6
|
-
async run() {
|
|
7
|
-
logger.header('NodeBBS 项目初始化');
|
|
8
|
-
await initEnv();
|
|
9
|
-
logger.success('初始化完成!');
|
|
10
|
-
logger.info('请编辑 .env 文件,修改数据库密码、Redis 密码和 JWT 密钥。');
|
|
11
|
-
}
|
|
12
|
-
}
|