nodebbs 0.1.0 → 0.3.0-beta.0

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.
@@ -3,39 +3,37 @@ import { select } from '@inquirer/prompts';
3
3
  import { logger } from './logger.js';
4
4
  import fs from 'node:fs/promises';
5
5
  import path from 'node:path';
6
- const ENV_MARKER_FILE = '.env.lock';
6
+ import { getEnvValue, setEnvValue, unsetEnvValue } from './env.js';
7
7
  export const EnvFlag = Flags.string({
8
8
  char: 'e',
9
- description: '部署环境 (production, lowmem)',
10
- options: ['production', 'lowmem'],
9
+ description: '部署环境 (production, lowmem, basic)',
10
+ options: ['production', 'lowmem', 'basic'],
11
11
  });
12
12
  async function getStoredEnv() {
13
- try {
14
- const content = await fs.readFile(path.resolve(process.cwd(), ENV_MARKER_FILE), 'utf-8');
15
- const env = content.trim();
16
- if (['production', 'lowmem'].includes(env)) {
17
- return env;
18
- }
13
+ const env = await getEnvValue('DEPLOY_ENV');
14
+ if (env && ['production', 'lowmem', 'basic'].includes(env)) {
15
+ return env;
19
16
  }
20
- catch { }
21
17
  return null;
22
18
  }
23
19
  export async function setStoredEnv(env) {
20
+ await setEnvValue('DEPLOY_ENV', env);
21
+ }
22
+ export async function getDeploymentMode() {
23
+ // 自动检测:检查当前目录下是否有 package.json 且 name='nodebbs-forum'
24
24
  try {
25
- await fs.writeFile(path.resolve(process.cwd(), ENV_MARKER_FILE), env, 'utf-8');
26
- }
27
- catch (error) {
28
- logger.warning(`无法保存环境标记: ${error}`);
25
+ const packageJsonPath = path.resolve(process.cwd(), 'package.json');
26
+ const content = await fs.readFile(packageJsonPath, 'utf-8');
27
+ const pkg = JSON.parse(content);
28
+ if (pkg.name === 'nodebbs-forum') {
29
+ return 'source';
30
+ }
29
31
  }
32
+ catch { }
33
+ return 'image';
30
34
  }
31
35
  export async function clearStoredEnv() {
32
- try {
33
- const filepath = path.resolve(process.cwd(), ENV_MARKER_FILE);
34
- await fs.rm(filepath, { force: true });
35
- }
36
- catch (error) {
37
- logger.warning(`无法清除环境标记: ${error}`);
38
- }
36
+ await unsetEnvValue('DEPLOY_ENV');
39
37
  }
40
38
  export async function selectEnvironment(env, options = {}) {
41
39
  if (env) {
@@ -51,8 +49,9 @@ export async function selectEnvironment(env, options = {}) {
51
49
  const selected = await select({
52
50
  message: options.prompt || '请选择运行环境:',
53
51
  choices: [
54
- { name: '标准环境 (推荐)', value: 'production' },
55
- { name: '低配环境 (1C1G)', value: 'lowmem' },
52
+ { name: '标准生产环境 (2C4G+) [推荐]', value: 'production' },
53
+ { name: '低配环境 (1C1G/1C2G)', value: 'lowmem' },
54
+ { name: '基础环境 (仅用于测试)', value: 'basic' },
56
55
  { name: '❌ 取消', value: '__CANCEL__' },
57
56
  ],
58
57
  loop: true,
@@ -61,13 +61,14 @@
61
61
  "flags": {
62
62
  "env": {
63
63
  "char": "e",
64
- "description": "部署环境 (production, lowmem)",
64
+ "description": "部署环境 (production, lowmem, basic)",
65
65
  "name": "env",
66
66
  "hasDynamicHelp": false,
67
67
  "multiple": false,
68
68
  "options": [
69
69
  "production",
70
- "lowmem"
70
+ "lowmem",
71
+ "basic"
71
72
  ],
72
73
  "type": "option"
73
74
  },
@@ -99,35 +100,28 @@
99
100
  "db:import": {
100
101
  "aliases": [],
101
102
  "args": {},
102
- "description": "导入数据库 (PostgreSQL)",
103
+ "description": "导入数据库 (从 SQL 文件恢复)",
103
104
  "flags": {
104
105
  "env": {
105
106
  "char": "e",
106
- "description": "部署环境 (production, lowmem)",
107
+ "description": "部署环境 (production, lowmem, basic)",
107
108
  "name": "env",
108
109
  "hasDynamicHelp": false,
109
110
  "multiple": false,
110
111
  "options": [
111
112
  "production",
112
- "lowmem"
113
+ "lowmem",
114
+ "basic"
113
115
  ],
114
116
  "type": "option"
115
117
  },
116
- "file": {
117
- "char": "f",
118
- "description": "SQL 备份文件路径",
119
- "name": "file",
120
- "required": true,
118
+ "input": {
119
+ "char": "i",
120
+ "description": "输入文件路径",
121
+ "name": "input",
121
122
  "hasDynamicHelp": false,
122
123
  "multiple": false,
123
124
  "type": "option"
124
- },
125
- "yes": {
126
- "char": "y",
127
- "description": "跳过确认提示",
128
- "name": "yes",
129
- "allowNo": false,
130
- "type": "boolean"
131
125
  }
132
126
  },
133
127
  "hasDynamicHelp": false,
@@ -153,13 +147,14 @@
153
147
  "flags": {
154
148
  "env": {
155
149
  "char": "e",
156
- "description": "部署环境 (production, lowmem)",
150
+ "description": "部署环境 (production, lowmem, basic)",
157
151
  "name": "env",
158
152
  "hasDynamicHelp": false,
159
153
  "multiple": false,
160
154
  "options": [
161
155
  "production",
162
- "lowmem"
156
+ "lowmem",
157
+ "basic"
163
158
  ],
164
159
  "type": "option"
165
160
  }
@@ -187,13 +182,14 @@
187
182
  "flags": {
188
183
  "env": {
189
184
  "char": "e",
190
- "description": "部署环境 (production, lowmem)",
185
+ "description": "部署环境 (production, lowmem, basic)",
191
186
  "name": "env",
192
187
  "hasDynamicHelp": false,
193
188
  "multiple": false,
194
189
  "options": [
195
190
  "production",
196
- "lowmem"
191
+ "lowmem",
192
+ "basic"
197
193
  ],
198
194
  "type": "option"
199
195
  }
@@ -221,13 +217,14 @@
221
217
  "flags": {
222
218
  "env": {
223
219
  "char": "e",
224
- "description": "部署环境 (production, lowmem)",
220
+ "description": "部署环境 (production, lowmem, basic)",
225
221
  "name": "env",
226
222
  "hasDynamicHelp": false,
227
223
  "multiple": false,
228
224
  "options": [
229
225
  "production",
230
- "lowmem"
226
+ "lowmem",
227
+ "basic"
231
228
  ],
232
229
  "type": "option"
233
230
  }
@@ -255,13 +252,14 @@
255
252
  "flags": {
256
253
  "env": {
257
254
  "char": "e",
258
- "description": "部署环境 (production, lowmem)",
255
+ "description": "部署环境 (production, lowmem, basic)",
259
256
  "name": "env",
260
257
  "hasDynamicHelp": false,
261
258
  "multiple": false,
262
259
  "options": [
263
260
  "production",
264
- "lowmem"
261
+ "lowmem",
262
+ "basic"
265
263
  ],
266
264
  "type": "option"
267
265
  }
@@ -289,13 +287,14 @@
289
287
  "flags": {
290
288
  "env": {
291
289
  "char": "e",
292
- "description": "部署环境 (production, lowmem)",
290
+ "description": "部署环境 (production, lowmem, basic)",
293
291
  "name": "env",
294
292
  "hasDynamicHelp": false,
295
293
  "multiple": false,
296
294
  "options": [
297
295
  "production",
298
- "lowmem"
296
+ "lowmem",
297
+ "basic"
299
298
  ],
300
299
  "type": "option"
301
300
  }
@@ -323,13 +322,14 @@
323
322
  "flags": {
324
323
  "env": {
325
324
  "char": "e",
326
- "description": "部署环境 (production, lowmem)",
325
+ "description": "部署环境 (production, lowmem, basic)",
327
326
  "name": "env",
328
327
  "hasDynamicHelp": false,
329
328
  "multiple": false,
330
329
  "options": [
331
330
  "production",
332
- "lowmem"
331
+ "lowmem",
332
+ "basic"
333
333
  ],
334
334
  "type": "option"
335
335
  }
@@ -357,13 +357,14 @@
357
357
  "flags": {
358
358
  "env": {
359
359
  "char": "e",
360
- "description": "部署环境 (production, lowmem)",
360
+ "description": "部署环境 (production, lowmem, basic)",
361
361
  "name": "env",
362
362
  "hasDynamicHelp": false,
363
363
  "multiple": false,
364
364
  "options": [
365
365
  "production",
366
- "lowmem"
366
+ "lowmem",
367
+ "basic"
367
368
  ],
368
369
  "type": "option"
369
370
  }
@@ -391,13 +392,14 @@
391
392
  "flags": {
392
393
  "env": {
393
394
  "char": "e",
394
- "description": "部署环境 (production, lowmem)",
395
+ "description": "部署环境 (production, lowmem, basic)",
395
396
  "name": "env",
396
397
  "hasDynamicHelp": false,
397
398
  "multiple": false,
398
399
  "options": [
399
400
  "production",
400
- "lowmem"
401
+ "lowmem",
402
+ "basic"
401
403
  ],
402
404
  "type": "option"
403
405
  }
@@ -449,41 +451,21 @@
449
451
  "index.js"
450
452
  ]
451
453
  },
452
- "rebuild": {
453
- "aliases": [],
454
- "args": {},
455
- "description": "拉取最新镜像并重启服务 (Update & Restart)",
456
- "flags": {},
457
- "hasDynamicHelp": false,
458
- "hiddenAliases": [],
459
- "id": "rebuild",
460
- "pluginAlias": "nodebbs",
461
- "pluginName": "nodebbs",
462
- "pluginType": "core",
463
- "strict": false,
464
- "enableJsonFlag": false,
465
- "isESM": true,
466
- "relativePath": [
467
- "dist",
468
- "commands",
469
- "rebuild",
470
- "index.js"
471
- ]
472
- },
473
454
  "restart": {
474
455
  "aliases": [],
475
456
  "args": {},
476
- "description": "重启所有服务 (up --force-recreate)",
457
+ "description": "重启服务",
477
458
  "flags": {
478
459
  "env": {
479
460
  "char": "e",
480
- "description": "部署环境 (production, lowmem)",
461
+ "description": "部署环境 (production, lowmem, basic)",
481
462
  "name": "env",
482
463
  "hasDynamicHelp": false,
483
464
  "multiple": false,
484
465
  "options": [
485
466
  "production",
486
- "lowmem"
467
+ "lowmem",
468
+ "basic"
487
469
  ],
488
470
  "type": "option"
489
471
  }
@@ -511,13 +493,14 @@
511
493
  "flags": {
512
494
  "env": {
513
495
  "char": "e",
514
- "description": "部署环境 (production, lowmem)",
496
+ "description": "部署环境 (production, lowmem, basic)",
515
497
  "name": "env",
516
498
  "hasDynamicHelp": false,
517
499
  "multiple": false,
518
500
  "options": [
519
501
  "production",
520
- "lowmem"
502
+ "lowmem",
503
+ "basic"
521
504
  ],
522
505
  "type": "option"
523
506
  }
@@ -545,13 +528,14 @@
545
528
  "flags": {
546
529
  "env": {
547
530
  "char": "e",
548
- "description": "部署环境 (production, lowmem)",
531
+ "description": "部署环境 (production, lowmem, basic)",
549
532
  "name": "env",
550
533
  "hasDynamicHelp": false,
551
534
  "multiple": false,
552
535
  "options": [
553
536
  "production",
554
- "lowmem"
537
+ "lowmem",
538
+ "basic"
555
539
  ],
556
540
  "type": "option"
557
541
  }
@@ -579,13 +563,14 @@
579
563
  "flags": {
580
564
  "env": {
581
565
  "char": "e",
582
- "description": "部署环境 (production, lowmem)",
566
+ "description": "部署环境 (production, lowmem, basic)",
583
567
  "name": "env",
584
568
  "hasDynamicHelp": false,
585
569
  "multiple": false,
586
570
  "options": [
587
571
  "production",
588
- "lowmem"
572
+ "lowmem",
573
+ "basic"
589
574
  ],
590
575
  "type": "option"
591
576
  }
@@ -613,13 +598,14 @@
613
598
  "flags": {
614
599
  "env": {
615
600
  "char": "e",
616
- "description": "部署环境 (production, lowmem)",
601
+ "description": "部署环境 (production, lowmem, basic)",
617
602
  "name": "env",
618
603
  "hasDynamicHelp": false,
619
604
  "multiple": false,
620
605
  "options": [
621
606
  "production",
622
- "lowmem"
607
+ "lowmem",
608
+ "basic"
623
609
  ],
624
610
  "type": "option"
625
611
  }
@@ -643,27 +629,27 @@
643
629
  "start": {
644
630
  "aliases": [],
645
631
  "args": {},
646
- "description": "开始部署",
632
+ "description": "启动服务",
647
633
  "flags": {
648
634
  "env": {
649
635
  "char": "e",
650
- "description": "部署环境 (production, lowmem)",
636
+ "description": "部署环境 (production, lowmem, basic)",
651
637
  "name": "env",
652
638
  "hasDynamicHelp": false,
653
639
  "multiple": false,
654
640
  "options": [
655
641
  "production",
656
- "lowmem"
642
+ "lowmem",
643
+ "basic"
657
644
  ],
658
645
  "type": "option"
659
646
  },
660
- "tag": {
661
- "char": "t",
662
- "description": "Image version tag (e.g. latest, v0.1.0)",
663
- "name": "tag",
664
- "hasDynamicHelp": false,
665
- "multiple": false,
666
- "type": "option"
647
+ "build": {
648
+ "char": "b",
649
+ "description": "重新构建并启动服务 (跳过健康检查和数据初始化)",
650
+ "name": "build",
651
+ "allowNo": false,
652
+ "type": "boolean"
667
653
  }
668
654
  },
669
655
  "hasDynamicHelp": false,
@@ -689,13 +675,14 @@
689
675
  "flags": {
690
676
  "env": {
691
677
  "char": "e",
692
- "description": "部署环境 (production, lowmem)",
678
+ "description": "部署环境 (production, lowmem, basic)",
693
679
  "name": "env",
694
680
  "hasDynamicHelp": false,
695
681
  "multiple": false,
696
682
  "options": [
697
683
  "production",
698
- "lowmem"
684
+ "lowmem",
685
+ "basic"
699
686
  ],
700
687
  "type": "option"
701
688
  }
@@ -730,13 +717,14 @@
730
717
  },
731
718
  "env": {
732
719
  "char": "e",
733
- "description": "部署环境 (production, lowmem)",
720
+ "description": "部署环境 (production, lowmem, basic)",
734
721
  "name": "env",
735
722
  "hasDynamicHelp": false,
736
723
  "multiple": false,
737
724
  "options": [
738
725
  "production",
739
- "lowmem"
726
+ "lowmem",
727
+ "basic"
740
728
  ],
741
729
  "type": "option"
742
730
  }
@@ -756,7 +744,42 @@
756
744
  "stop",
757
745
  "index.js"
758
746
  ]
747
+ },
748
+ "upgrade": {
749
+ "aliases": [],
750
+ "args": {},
751
+ "description": "升级服务",
752
+ "flags": {
753
+ "env": {
754
+ "char": "e",
755
+ "description": "部署环境 (production, lowmem, basic)",
756
+ "name": "env",
757
+ "hasDynamicHelp": false,
758
+ "multiple": false,
759
+ "options": [
760
+ "production",
761
+ "lowmem",
762
+ "basic"
763
+ ],
764
+ "type": "option"
765
+ }
766
+ },
767
+ "hasDynamicHelp": false,
768
+ "hiddenAliases": [],
769
+ "id": "upgrade",
770
+ "pluginAlias": "nodebbs",
771
+ "pluginName": "nodebbs",
772
+ "pluginType": "core",
773
+ "strict": true,
774
+ "enableJsonFlag": false,
775
+ "isESM": true,
776
+ "relativePath": [
777
+ "dist",
778
+ "commands",
779
+ "upgrade",
780
+ "index.js"
781
+ ]
759
782
  }
760
783
  },
761
- "version": "0.1.0"
784
+ "version": "0.3.0-beta.0"
762
785
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nodebbs",
3
3
  "description": "NodeBBS 论坛系统专业运维工具",
4
- "version": "0.1.0",
4
+ "version": "0.3.0-beta.0",
5
5
  "author": "wengqianshan",
6
6
  "bin": {
7
7
  "nodebbs": "./bin/run.js"
@@ -1,6 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- export default class Rebuild extends Command {
3
- static description: string;
4
- static strict: boolean;
5
- run(): Promise<void>;
6
- }
@@ -1,11 +0,0 @@
1
- import { Command } from '@oclif/core';
2
- import Start from '../start/index.js';
3
- export default class Rebuild extends Command {
4
- static description = '拉取最新镜像并重启服务 (Update & Restart)';
5
- // Allow passing flags like -e to the underlying start command
6
- static strict = false;
7
- async run() {
8
- // Invoke Start command to pull latest images and restart
9
- await Start.run(this.argv);
10
- }
11
- }