nodebbs 0.0.5 → 0.0.7

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 CHANGED
@@ -168,6 +168,20 @@ npx nodebbs logs:db
168
168
  npx nodebbs logs:redis
169
169
  ```
170
170
 
171
+ ### 离线部署
172
+
173
+ #### `nodebbs pack`
174
+ 生成离线部署包(包含镜像、配置文件和安装脚本)
175
+
176
+ ```bash
177
+ npx nodebbs pack
178
+ npx nodebbs pack -o my-deployment.tar.gz
179
+ ```
180
+
181
+ **参数**:
182
+ - `-o, --output` - 输出文件名 (默认: nodebbs-offline.tar.gz)
183
+
184
+
171
185
  ### Shell 访问
172
186
 
173
187
  #### `nodebbs shell`
@@ -340,6 +354,30 @@ npx nodebbs db:seed
340
354
  npx nodebbs shell:db
341
355
  ```
342
356
 
357
+ ### 场景 6:离线服务器部署
358
+
359
+ 1. **在开发机打包**:
360
+ ```bash
361
+ # 生成离线包
362
+ npx nodebbs pack
363
+ ```
364
+
365
+ 2. **上传到服务器**:
366
+ 将 `nodebbs-offline.tar.gz` 上传到目标服务器。
367
+
368
+ 3. **在服务器部署**:
369
+ ```bash
370
+ # 解压
371
+ tar -xzf nodebbs-offline.tar.gz
372
+
373
+ # 配置环境变量
374
+ cp .env.example .env
375
+ vi .env
376
+
377
+ # 一键安装启动
378
+ ./install.sh
379
+ ```
380
+
343
381
 
344
382
 
345
383
  ## ⚙️ 环境配置
@@ -86,7 +86,6 @@ export default class Pack extends Command {
86
86
  this.warn('检测到 .env 文件,出于安全考虑,不会默认打包 .env 文件。请在部署时手动配置环境变量。');
87
87
  }
88
88
  // 创建 .env.example
89
- // 创建 .env.example
90
89
  const envTemplatePath = getTemplatePath('env');
91
90
  let envExample = '';
92
91
  try {
@@ -1,9 +1,9 @@
1
1
  import { Command } from '@oclif/core';
2
2
  import { runCompose, getComposeFiles } from '../../utils/docker.js';
3
3
  import { logger } from '../../utils/logger.js';
4
- import { EnvFlag, selectEnvironment } from '../../utils/selection.js';
4
+ import { EnvFlag, selectEnvironment, setStoredEnv } from '../../utils/selection.js';
5
5
  export default class Restart extends Command {
6
- static description = '重启所有服务 (docker compose restart)';
6
+ static description = '重启所有服务 (up --force-recreate)';
7
7
  static flags = {
8
8
  env: EnvFlag,
9
9
  };
@@ -11,10 +11,15 @@ export default class Restart extends Command {
11
11
  const { flags } = await this.parse(Restart);
12
12
  // 1. 选择环境
13
13
  const env = await selectEnvironment(flags.env);
14
+ await setStoredEnv(env);
14
15
  const { files, isBuiltIn } = await getComposeFiles(env);
15
- logger.info('正在重启服务...');
16
+ logger.info('正在重启服务 (使用现有镜像)...');
16
17
  logger.info('环境: ' + env);
17
- await runCompose(files, ['restart'], isBuiltIn);
18
+ // 使用 up -d --force-recreate 可以:
19
+ // 1. 如果服务不存在,则创建并启动
20
+ // 2. 如果服务已存在,则强制重启
21
+ // 3. 不会执行构建 (除非镜像不存在)
22
+ await runCompose(files, ['up', '-d', '--force-recreate'], isBuiltIn);
18
23
  logger.success('服务已重启');
19
24
  }
20
25
  }
@@ -91,76 +91,6 @@
91
91
  "backup.js"
92
92
  ]
93
93
  },
94
- "db:generate": {
95
- "aliases": [],
96
- "args": {},
97
- "description": "生成 Prisma Client (db:generate)",
98
- "flags": {
99
- "env": {
100
- "char": "e",
101
- "description": "部署环境 (production, lowmem, basic)",
102
- "name": "env",
103
- "hasDynamicHelp": false,
104
- "multiple": false,
105
- "options": [
106
- "production",
107
- "lowmem",
108
- "basic"
109
- ],
110
- "type": "option"
111
- }
112
- },
113
- "hasDynamicHelp": false,
114
- "hiddenAliases": [],
115
- "id": "db:generate",
116
- "pluginAlias": "nodebbs",
117
- "pluginName": "nodebbs",
118
- "pluginType": "core",
119
- "strict": true,
120
- "enableJsonFlag": false,
121
- "isESM": true,
122
- "relativePath": [
123
- "dist",
124
- "commands",
125
- "db",
126
- "generate.js"
127
- ]
128
- },
129
- "db:migrate": {
130
- "aliases": [],
131
- "args": {},
132
- "description": "执行数据库迁移 (db:migrate)",
133
- "flags": {
134
- "env": {
135
- "char": "e",
136
- "description": "部署环境 (production, lowmem, basic)",
137
- "name": "env",
138
- "hasDynamicHelp": false,
139
- "multiple": false,
140
- "options": [
141
- "production",
142
- "lowmem",
143
- "basic"
144
- ],
145
- "type": "option"
146
- }
147
- },
148
- "hasDynamicHelp": false,
149
- "hiddenAliases": [],
150
- "id": "db:migrate",
151
- "pluginAlias": "nodebbs",
152
- "pluginName": "nodebbs",
153
- "pluginType": "core",
154
- "strict": true,
155
- "enableJsonFlag": false,
156
- "isESM": true,
157
- "relativePath": [
158
- "dist",
159
- "commands",
160
- "db",
161
- "migrate.js"
162
- ]
163
- },
164
94
  "db:push": {
165
95
  "aliases": [],
166
96
  "args": {},
@@ -266,37 +196,6 @@
266
196
  "seed.js"
267
197
  ]
268
198
  },
269
- "pack": {
270
- "aliases": [],
271
- "args": {},
272
- "description": "生成离线部署包",
273
- "flags": {
274
- "output": {
275
- "char": "o",
276
- "description": "输出文件名",
277
- "name": "output",
278
- "default": "nodebbs-offline.tar.gz",
279
- "hasDynamicHelp": false,
280
- "multiple": false,
281
- "type": "option"
282
- }
283
- },
284
- "hasDynamicHelp": false,
285
- "hiddenAliases": [],
286
- "id": "pack",
287
- "pluginAlias": "nodebbs",
288
- "pluginName": "nodebbs",
289
- "pluginType": "core",
290
- "strict": true,
291
- "enableJsonFlag": false,
292
- "isESM": true,
293
- "relativePath": [
294
- "dist",
295
- "commands",
296
- "pack",
297
- "index.js"
298
- ]
299
- },
300
199
  "logs:api": {
301
200
  "aliases": [],
302
201
  "args": {},
@@ -472,6 +371,37 @@
472
371
  "web.js"
473
372
  ]
474
373
  },
374
+ "pack": {
375
+ "aliases": [],
376
+ "args": {},
377
+ "description": "生成离线部署包",
378
+ "flags": {
379
+ "output": {
380
+ "char": "o",
381
+ "description": "输出文件名",
382
+ "name": "output",
383
+ "default": "nodebbs-offline.tar.gz",
384
+ "hasDynamicHelp": false,
385
+ "multiple": false,
386
+ "type": "option"
387
+ }
388
+ },
389
+ "hasDynamicHelp": false,
390
+ "hiddenAliases": [],
391
+ "id": "pack",
392
+ "pluginAlias": "nodebbs",
393
+ "pluginName": "nodebbs",
394
+ "pluginType": "core",
395
+ "strict": true,
396
+ "enableJsonFlag": false,
397
+ "isESM": true,
398
+ "relativePath": [
399
+ "dist",
400
+ "commands",
401
+ "pack",
402
+ "index.js"
403
+ ]
404
+ },
475
405
  "rebuild": {
476
406
  "aliases": [],
477
407
  "args": {},
@@ -496,7 +426,7 @@
496
426
  "restart": {
497
427
  "aliases": [],
498
428
  "args": {},
499
- "description": "重启所有服务 (docker compose restart)",
429
+ "description": "重启所有服务 (up --force-recreate)",
500
430
  "flags": {
501
431
  "env": {
502
432
  "char": "e",
@@ -788,5 +718,5 @@
788
718
  ]
789
719
  }
790
720
  },
791
- "version": "0.0.5"
721
+ "version": "0.0.7"
792
722
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nodebbs",
3
3
  "description": "NodeBBS 论坛系统专业运维工具",
4
- "version": "0.0.5",
4
+ "version": "0.0.7",
5
5
  "author": "wengqianshan",
6
6
  "bin": {
7
7
  "nodebbs": "./bin/run.js"
@@ -65,7 +65,7 @@
65
65
  "description": "数据库操作 (备份, 迁移, 种子数据等)"
66
66
  },
67
67
  "shell": {
68
- "description": "服务的交互式 Shell"
68
+ "description": "进入容器终端"
69
69
  }
70
70
  }
71
71
  },
@@ -1,8 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class DbGenerate extends Command {
3
- static description: string;
4
- static flags: {
5
- env: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
- };
7
- run(): Promise<void>;
8
- }
@@ -1,18 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- import { execCompose, getComposeFiles } from '../../utils/docker.js';
3
- import { logger } from '../../utils/logger.js';
4
- import { EnvFlag, selectEnvironment } from '../../utils/selection.js';
5
- export default class DbGenerate extends Command {
6
- static description = '生成 Prisma Client (db:generate)';
7
- static flags = {
8
- env: EnvFlag,
9
- };
10
- async run() {
11
- const { flags } = await this.parse(DbGenerate);
12
- const env = await selectEnvironment(flags.env);
13
- const { files, isBuiltIn } = await getComposeFiles(env);
14
- logger.info('正在生成 Prisma Client...');
15
- await execCompose(files, 'api', ['npm', 'run', 'db:generate'], isBuiltIn);
16
- logger.success('数据库迁移文件生成完成');
17
- }
18
- }
@@ -1,8 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class DbMigrate extends Command {
3
- static description: string;
4
- static flags: {
5
- env: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
- };
7
- run(): Promise<void>;
8
- }
@@ -1,18 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- import { execCompose, getComposeFiles } from '../../utils/docker.js';
3
- import { logger } from '../../utils/logger.js';
4
- import { EnvFlag, selectEnvironment } from '../../utils/selection.js';
5
- export default class DbMigrate extends Command {
6
- static description = '执行数据库迁移 (db:migrate)';
7
- static flags = {
8
- env: EnvFlag,
9
- };
10
- async run() {
11
- const { flags } = await this.parse(DbMigrate);
12
- const env = await selectEnvironment(flags.env);
13
- const { files, isBuiltIn } = await getComposeFiles(env);
14
- logger.info('正在执行数据库迁移...');
15
- await execCompose(files, 'api', ['npm', 'run', 'db:migrate'], isBuiltIn);
16
- logger.success('数据库迁移完成');
17
- }
18
- }