nodebbs 0.3.2 → 0.3.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 CHANGED
@@ -131,7 +131,7 @@ vi .env
131
131
 
132
132
  - **production** - 生产环境(推荐,启用资源限制与安全配置)
133
133
  - **lowmem** - 低配环境(适用于 1C2G 服务器)
134
- - **basic** - 基础环境(测试用,无资源限制)
134
+ - **default** - 默认环境(无资源限制,适用于开发或高配服务器)
135
135
 
136
136
  ### 环境变量
137
137
 
@@ -2,6 +2,7 @@ import { Command } from '@oclif/core';
2
2
  import { runCompose, getComposeFiles } from '../../utils/docker.js';
3
3
  import { logger } from '../../utils/logger.js';
4
4
  import { EnvFlag, selectEnvironment } from '../../utils/selection.js';
5
+ import { getEnvValue } from '../../utils/env.js';
5
6
  export default class ShellDb extends Command {
6
7
  static description = '进入数据库 shell (psql)';
7
8
  static flags = {
@@ -11,7 +12,9 @@ export default class ShellDb extends Command {
11
12
  const { flags } = await this.parse(ShellDb);
12
13
  const env = await selectEnvironment(flags.env);
13
14
  const { files, isBuiltIn } = await getComposeFiles(env);
15
+ // 从环境变量获取数据库名,默认为 nodebbs
16
+ const dbName = await getEnvValue('POSTGRES_DB') || 'nodebbs';
14
17
  logger.info('正在进入数据库 shell...');
15
- await runCompose(files, ['exec', 'postgres', 'psql', '-U', 'postgres', '-d', 'nodebbs'], isBuiltIn);
18
+ await runCompose(files, ['exec', 'postgres', 'psql', '-U', 'postgres', '-d', dbName], isBuiltIn);
16
19
  }
17
20
  }
@@ -2,6 +2,7 @@ import { Command } from '@oclif/core';
2
2
  import { runCompose, getComposeFiles } from '../../utils/docker.js';
3
3
  import { logger } from '../../utils/logger.js';
4
4
  import { EnvFlag, selectEnvironment } from '../../utils/selection.js';
5
+ import { getEnvValue } from '../../utils/env.js';
5
6
  export default class ShellRedis extends Command {
6
7
  static description = '进入 Redis shell (redis-cli)';
7
8
  static flags = {
@@ -11,7 +12,13 @@ export default class ShellRedis extends Command {
11
12
  const { flags } = await this.parse(ShellRedis);
12
13
  const env = await selectEnvironment(flags.env);
13
14
  const { files, isBuiltIn } = await getComposeFiles(env);
15
+ // 从环境变量获取密码
16
+ const redisPassword = await getEnvValue('REDIS_PASSWORD');
14
17
  logger.info('正在进入 Redis shell...');
15
- await runCompose(files, ['exec', 'redis', 'redis-cli'], isBuiltIn);
18
+ // 如果有密码则使用认证参数
19
+ const redisCliArgs = redisPassword
20
+ ? ['exec', 'redis', 'redis-cli', '-a', redisPassword]
21
+ : ['exec', 'redis', 'redis-cli'];
22
+ await runCompose(files, redisCliArgs, isBuiltIn);
16
23
  }
17
24
  }
@@ -2,13 +2,13 @@ services:
2
2
  # PostgreSQL 数据库
3
3
  postgres:
4
4
  image: postgres:16-alpine
5
- container_name: nodebbs-postgres
5
+ container_name: ${COMPOSE_PROJECT_NAME:-nodebbs}-postgres
6
6
  restart: unless-stopped
7
7
  environment:
8
8
  POSTGRES_USER: postgres
9
9
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres_password}
10
10
  POSTGRES_DB: ${POSTGRES_DB:-nodebbs}
11
- TZ: Asia/Shanghai
11
+ TZ: ${TZ:-Asia/Shanghai}
12
12
  volumes:
13
13
  - postgres_data:/var/lib/postgresql/data
14
14
 
@@ -24,11 +24,11 @@ services:
24
24
  # Redis 缓存
25
25
  redis:
26
26
  image: redis:7-alpine
27
- container_name: nodebbs-redis
27
+ container_name: ${COMPOSE_PROJECT_NAME:-nodebbs}-redis
28
28
  restart: unless-stopped
29
29
  command: redis-server --requirepass ${REDIS_PASSWORD:-redis_password} --appendonly yes
30
30
  environment:
31
- TZ: Asia/Shanghai
31
+ TZ: ${TZ:-Asia/Shanghai}
32
32
  volumes:
33
33
  - redis_data:/data
34
34
 
@@ -46,10 +46,9 @@ services:
46
46
  context: .
47
47
  dockerfile: apps/api/Dockerfile
48
48
  image: ${API_IMAGE:-nodebbs-api:local}
49
- container_name: nodebbs-api
49
+ container_name: ${COMPOSE_PROJECT_NAME:-nodebbs}-api
50
50
  restart: unless-stopped
51
51
  environment:
52
- NODE_ENV: production
53
52
  APP_NAME: ${APP_NAME:-nodebbs}
54
53
  HOST: 0.0.0.0
55
54
  PORT: 7100
@@ -59,7 +58,7 @@ services:
59
58
  JWT_SECRET: ${JWT_SECRET:-change-this-to-a-secure-random-string-in-production}
60
59
  JWT_ACCESS_TOKEN_EXPIRES_IN: ${JWT_ACCESS_TOKEN_EXPIRES_IN:-1y}
61
60
  CORS_ORIGIN: ${CORS_ORIGIN:-*}
62
- TZ: Asia/Shanghai
61
+ TZ: ${TZ:-Asia/Shanghai}
63
62
  volumes:
64
63
  - api_uploads:/app/apps/api/uploads
65
64
  # - ./apps/api/src:/app/apps/api/src:ro
@@ -85,14 +84,13 @@ services:
85
84
  context: .
86
85
  dockerfile: apps/web/Dockerfile
87
86
  image: ${WEB_IMAGE:-nodebbs-web:local}
88
- container_name: nodebbs-web
87
+ container_name: ${COMPOSE_PROJECT_NAME:-nodebbs}-web
89
88
  restart: unless-stopped
90
89
  environment:
91
- NODE_ENV: production
92
90
  APP_NAME: ${APP_NAME:-nodebbs}
93
91
  PORT: 3100
94
92
  SERVER_API_URL: ${SERVER_API_URL:-http://api:7100}
95
- TZ: Asia/Shanghai
93
+ TZ: ${TZ:-Asia/Shanghai}
96
94
  # volumes:
97
95
  # 自定义资源挂载(如有需要,请取消注释并在同级目录下创建 web 文件夹及对应文件)
98
96
  # - ./web/favicon.ico:/app/apps/web/public/favicon.ico
@@ -10,13 +10,11 @@ APP_NAME=nodebbs
10
10
  # ========================================
11
11
  POSTGRES_PASSWORD=your_secure_postgres_password_here
12
12
  POSTGRES_DB=nodebbs
13
- POSTGRES_PORT=5432
14
13
 
15
14
  # ========================================
16
15
  # Redis 配置
17
16
  # ========================================
18
17
  REDIS_PASSWORD=your_secure_redis_password_here
19
- REDIS_PORT=6379
20
18
 
21
19
  # ========================================
22
20
  # API 服务配置
@@ -5,7 +5,7 @@
5
5
  * - 如果存在,则优先使用项目根目录的配置。
6
6
  * - 如果不存在,则使用 CLI 内置的模板文件。
7
7
  *
8
- * @param env - 运行环境 ('production' | 'lowmem' | 'basic')
8
+ * @param env - 运行环境 ('production' | 'lowmem' | 'default')
9
9
  * @returns 对象包含文件路径数组和是否使用内置模板的标志
10
10
  */
11
11
  export declare function getComposeFiles(env: string): Promise<{
@@ -23,7 +23,7 @@ async function getDockerEnv() {
23
23
  * - 如果存在,则优先使用项目根目录的配置。
24
24
  * - 如果不存在,则使用 CLI 内置的模板文件。
25
25
  *
26
- * @param env - 运行环境 ('production' | 'lowmem' | 'basic')
26
+ * @param env - 运行环境 ('production' | 'lowmem' | 'default')
27
27
  * @returns 对象包含文件路径数组和是否使用内置模板的标志
28
28
  */
29
29
  export async function getComposeFiles(env) {
@@ -43,18 +43,15 @@ export async function getComposeFiles(env) {
43
43
  // 映射 environment 到对应的 override 文件名
44
44
  const envFileMap = {
45
45
  'production': 'docker-compose.prod.yml',
46
- 'lowmem': 'docker-compose.lowmem.yml',
47
- 'basic': 'docker-compose.ports.yml'
46
+ 'lowmem': 'docker-compose.lowmem.yml'
48
47
  };
49
48
  if (env in envFileMap) {
50
49
  const fileName = envFileMap[env];
51
- // 注意:basic 对应的 ports.yml 是新增的,可能不存在于旧项目的根目录,
52
- // 但如果是在 CLI 内部运行,templateDir 里肯定有。
53
- // 如果是 production/lowmem,用户目录可能有 override。
50
+ // 注意:用户目录可能有 override 文件覆盖内置默认值
54
51
  const localOverride = path.join(workDir, fileName);
55
52
  const templateOverride = path.join(templateDir, fileName);
56
53
  // 策略调整:
57
- // basic -> 总是尝试加载 ports.yml (通常只存在于 template,或者用户没覆盖)
54
+ // default -> 不加载 override 文件,使用基础配置
58
55
  // production/lowmem -> 尝试加载对应的 override
59
56
  if (await fileExists(localOverride)) {
60
57
  files.push(localOverride);
@@ -94,6 +91,33 @@ export async function checkDocker() {
94
91
  logger.success('Docker 环境检查通过');
95
92
  }
96
93
  catch (error) {
94
+ // 检测是否是权限问题
95
+ const errorMessage = error.stderr || error.message || '';
96
+ const isPermissionError = errorMessage.includes('permission denied') ||
97
+ errorMessage.includes('Got permission denied') ||
98
+ errorMessage.includes('dial unix /var/run/docker.sock');
99
+ if (isPermissionError) {
100
+ logger.warning('检测到 Docker 权限问题');
101
+ logger.info('您的用户可能没有权限访问 Docker。');
102
+ // 如果是 CI 环境或非交互式环境,直接报错
103
+ if (process.env.CI || !process.stdout.isTTY) {
104
+ throw error;
105
+ }
106
+ // 尝试配置权限
107
+ await configureDockerPermissions();
108
+ // 配置后再次检查
109
+ try {
110
+ await execa('docker', ['--version']);
111
+ await execa('docker', ['compose', 'version']);
112
+ logger.success('Docker 权限配置成功!');
113
+ return;
114
+ }
115
+ catch {
116
+ logger.error('权限配置后仍无法访问 Docker');
117
+ logger.info('请尝试: 1) 运行 "newgrp docker" 2) 或重新登录');
118
+ throw error;
119
+ }
120
+ }
97
121
  logger.warning('未检测到 Docker 或 Docker Compose。');
98
122
  // 如果是 CI 环境或非交互式环境,直接报错
99
123
  if (process.env.CI || !process.stdout.isTTY) {
@@ -114,6 +138,22 @@ export async function checkDocker() {
114
138
  return;
115
139
  }
116
140
  catch (installError) {
141
+ // 特殊处理:需要 newgrp 的情况
142
+ if (installError.message === 'NEWGRP_REQUIRED') {
143
+ logger.warning('安装完成,但需要刷新权限。');
144
+ logger.info('请运行以下命令后重试:');
145
+ logger.info(' newgrp docker && npx nodebbs');
146
+ process.exit(0);
147
+ }
148
+ // 检测权限问题
149
+ const installErrMsg = installError.stderr || installError.message || '';
150
+ if (installErrMsg.includes('permission denied') || installErrMsg.includes('docker.sock')) {
151
+ logger.warning('Docker 已安装,但存在权限问题。');
152
+ logger.info('请运行以下命令后重试:');
153
+ logger.info(' newgrp docker && npx nodebbs');
154
+ logger.info('或者注销并重新登录。');
155
+ process.exit(0);
156
+ }
117
157
  logger.error(`安装失败: ${installError.message}`);
118
158
  logger.info('请访问 https://www.docker.com/get-started 手动安装。');
119
159
  throw installError;
@@ -152,11 +192,8 @@ async function installDocker() {
152
192
  logger.warning('无法自动启动 Docker 服务');
153
193
  logger.info('请手动运行: sudo systemctl start docker');
154
194
  }
155
- // 提示用户可能需要添加到 docker 组
156
- logger.warning('请确保您的用户已添加到 docker 组:');
157
- logger.info(' sudo usermod -aG docker $USER');
158
- logger.info('您可能需要注销并重新登录才能生效。');
159
- await confirm({ message: '是否已完成必要配置并准备继续?', default: true });
195
+ // 配置用户权限
196
+ await configureDockerPermissions();
160
197
  }
161
198
  finally {
162
199
  // 清理临时安装脚本
@@ -177,6 +214,39 @@ async function installDocker() {
177
214
  throw new Error(`不支持在 ${platform} 平台自动安装`);
178
215
  }
179
216
  }
217
+ /**
218
+ * 配置 Docker 用户权限
219
+ *
220
+ * 将当前用户添加到 docker 组,避免每次都需要 sudo。
221
+ */
222
+ async function configureDockerPermissions() {
223
+ const currentUser = process.env.USER || process.env.USERNAME || '';
224
+ if (!currentUser) {
225
+ logger.warning('无法获取当前用户名,请手动配置 Docker 权限');
226
+ logger.info('请运行: sudo usermod -aG docker $USER');
227
+ return;
228
+ }
229
+ logger.info(`正在将用户 "${currentUser}" 添加到 docker 组...`);
230
+ try {
231
+ await execa('sudo', ['usermod', '-aG', 'docker', currentUser], { stdio: 'inherit' });
232
+ logger.success(`已将用户 "${currentUser}" 添加到 docker 组`);
233
+ // 提示权限激活方式
234
+ logger.info('');
235
+ logger.warning('权限变更需要刷新才能生效。');
236
+ logger.info('请运行以下命令后重试:');
237
+ logger.info(' newgrp docker && npx nodebbs');
238
+ logger.info('');
239
+ logger.info('或者注销并重新登录后再运行 npx nodebbs');
240
+ throw new Error('NEWGRP_REQUIRED');
241
+ }
242
+ catch (error) {
243
+ if (error.message === 'NEWGRP_REQUIRED') {
244
+ throw error;
245
+ }
246
+ logger.error(`添加用户到 docker 组失败: ${error.message}`);
247
+ logger.info('请手动运行: sudo usermod -aG docker $USER');
248
+ }
249
+ }
180
250
  /**
181
251
  * 执行 Docker Compose 管理命令 (Lifecycle Commands)
182
252
  *
@@ -4,4 +4,4 @@ export declare function unsetEnvValue(key: string): Promise<void>;
4
4
  export declare function initEnv(): Promise<void>;
5
5
  export declare function initDockerIgnore(): Promise<void>;
6
6
  export declare function initImageEnv(): Promise<void>;
7
- export declare function checkEnv(envType: 'production' | 'lowmem' | 'basic'): Promise<void>;
7
+ export declare function checkEnv(envType: 'production' | 'lowmem' | 'default'): Promise<void>;
@@ -1,4 +1,4 @@
1
- export type EnvType = 'production' | 'lowmem' | 'basic';
1
+ export type EnvType = 'production' | 'lowmem' | 'default';
2
2
  export type DeploymentMode = 'source' | 'image';
3
3
  export declare const EnvFlag: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
4
4
  export declare function setStoredEnv(env: EnvType): Promise<void>;
@@ -6,12 +6,12 @@ import path from 'node:path';
6
6
  import { getEnvValue, setEnvValue, unsetEnvValue } from './env.js';
7
7
  export const EnvFlag = Flags.string({
8
8
  char: 'e',
9
- description: '部署环境 (production, lowmem, basic)',
10
- options: ['production', 'lowmem', 'basic'],
9
+ description: '部署环境 (production, lowmem, default)',
10
+ options: ['production', 'lowmem', 'default'],
11
11
  });
12
12
  async function getStoredEnv() {
13
13
  const env = await getEnvValue('DEPLOY_ENV');
14
- if (env && ['production', 'lowmem', 'basic'].includes(env)) {
14
+ if (env && ['production', 'lowmem', 'default'].includes(env)) {
15
15
  return env;
16
16
  }
17
17
  return null;
@@ -51,7 +51,7 @@ export async function selectEnvironment(env, options = {}) {
51
51
  choices: [
52
52
  { name: '标准生产环境 (2C4G+) [推荐]', value: 'production' },
53
53
  { name: '低配环境 (1C1G/1C2G)', value: 'lowmem' },
54
- { name: '基础环境 (仅用于测试)', value: 'basic' },
54
+ { name: '默认环境 (无资源限制)', value: 'default' },
55
55
  { name: '❌ 取消', value: '__CANCEL__' },
56
56
  ],
57
57
  loop: true,
@@ -61,14 +61,14 @@
61
61
  "flags": {
62
62
  "env": {
63
63
  "char": "e",
64
- "description": "部署环境 (production, lowmem, basic)",
64
+ "description": "部署环境 (production, lowmem, default)",
65
65
  "name": "env",
66
66
  "hasDynamicHelp": false,
67
67
  "multiple": false,
68
68
  "options": [
69
69
  "production",
70
70
  "lowmem",
71
- "basic"
71
+ "default"
72
72
  ],
73
73
  "type": "option"
74
74
  },
@@ -104,14 +104,14 @@
104
104
  "flags": {
105
105
  "env": {
106
106
  "char": "e",
107
- "description": "部署环境 (production, lowmem, basic)",
107
+ "description": "部署环境 (production, lowmem, default)",
108
108
  "name": "env",
109
109
  "hasDynamicHelp": false,
110
110
  "multiple": false,
111
111
  "options": [
112
112
  "production",
113
113
  "lowmem",
114
- "basic"
114
+ "default"
115
115
  ],
116
116
  "type": "option"
117
117
  },
@@ -147,14 +147,14 @@
147
147
  "flags": {
148
148
  "env": {
149
149
  "char": "e",
150
- "description": "部署环境 (production, lowmem, basic)",
150
+ "description": "部署环境 (production, lowmem, default)",
151
151
  "name": "env",
152
152
  "hasDynamicHelp": false,
153
153
  "multiple": false,
154
154
  "options": [
155
155
  "production",
156
156
  "lowmem",
157
- "basic"
157
+ "default"
158
158
  ],
159
159
  "type": "option"
160
160
  }
@@ -182,14 +182,14 @@
182
182
  "flags": {
183
183
  "env": {
184
184
  "char": "e",
185
- "description": "部署环境 (production, lowmem, basic)",
185
+ "description": "部署环境 (production, lowmem, default)",
186
186
  "name": "env",
187
187
  "hasDynamicHelp": false,
188
188
  "multiple": false,
189
189
  "options": [
190
190
  "production",
191
191
  "lowmem",
192
- "basic"
192
+ "default"
193
193
  ],
194
194
  "type": "option"
195
195
  }
@@ -217,14 +217,14 @@
217
217
  "flags": {
218
218
  "env": {
219
219
  "char": "e",
220
- "description": "部署环境 (production, lowmem, basic)",
220
+ "description": "部署环境 (production, lowmem, default)",
221
221
  "name": "env",
222
222
  "hasDynamicHelp": false,
223
223
  "multiple": false,
224
224
  "options": [
225
225
  "production",
226
226
  "lowmem",
227
- "basic"
227
+ "default"
228
228
  ],
229
229
  "type": "option"
230
230
  }
@@ -252,14 +252,14 @@
252
252
  "flags": {
253
253
  "env": {
254
254
  "char": "e",
255
- "description": "部署环境 (production, lowmem, basic)",
255
+ "description": "部署环境 (production, lowmem, default)",
256
256
  "name": "env",
257
257
  "hasDynamicHelp": false,
258
258
  "multiple": false,
259
259
  "options": [
260
260
  "production",
261
261
  "lowmem",
262
- "basic"
262
+ "default"
263
263
  ],
264
264
  "type": "option"
265
265
  }
@@ -287,14 +287,14 @@
287
287
  "flags": {
288
288
  "env": {
289
289
  "char": "e",
290
- "description": "部署环境 (production, lowmem, basic)",
290
+ "description": "部署环境 (production, lowmem, default)",
291
291
  "name": "env",
292
292
  "hasDynamicHelp": false,
293
293
  "multiple": false,
294
294
  "options": [
295
295
  "production",
296
296
  "lowmem",
297
- "basic"
297
+ "default"
298
298
  ],
299
299
  "type": "option"
300
300
  }
@@ -322,14 +322,14 @@
322
322
  "flags": {
323
323
  "env": {
324
324
  "char": "e",
325
- "description": "部署环境 (production, lowmem, basic)",
325
+ "description": "部署环境 (production, lowmem, default)",
326
326
  "name": "env",
327
327
  "hasDynamicHelp": false,
328
328
  "multiple": false,
329
329
  "options": [
330
330
  "production",
331
331
  "lowmem",
332
- "basic"
332
+ "default"
333
333
  ],
334
334
  "type": "option"
335
335
  }
@@ -357,14 +357,14 @@
357
357
  "flags": {
358
358
  "env": {
359
359
  "char": "e",
360
- "description": "部署环境 (production, lowmem, basic)",
360
+ "description": "部署环境 (production, lowmem, default)",
361
361
  "name": "env",
362
362
  "hasDynamicHelp": false,
363
363
  "multiple": false,
364
364
  "options": [
365
365
  "production",
366
366
  "lowmem",
367
- "basic"
367
+ "default"
368
368
  ],
369
369
  "type": "option"
370
370
  }
@@ -392,14 +392,14 @@
392
392
  "flags": {
393
393
  "env": {
394
394
  "char": "e",
395
- "description": "部署环境 (production, lowmem, basic)",
395
+ "description": "部署环境 (production, lowmem, default)",
396
396
  "name": "env",
397
397
  "hasDynamicHelp": false,
398
398
  "multiple": false,
399
399
  "options": [
400
400
  "production",
401
401
  "lowmem",
402
- "basic"
402
+ "default"
403
403
  ],
404
404
  "type": "option"
405
405
  }
@@ -458,14 +458,14 @@
458
458
  "flags": {
459
459
  "env": {
460
460
  "char": "e",
461
- "description": "部署环境 (production, lowmem, basic)",
461
+ "description": "部署环境 (production, lowmem, default)",
462
462
  "name": "env",
463
463
  "hasDynamicHelp": false,
464
464
  "multiple": false,
465
465
  "options": [
466
466
  "production",
467
467
  "lowmem",
468
- "basic"
468
+ "default"
469
469
  ],
470
470
  "type": "option"
471
471
  }
@@ -493,14 +493,14 @@
493
493
  "flags": {
494
494
  "env": {
495
495
  "char": "e",
496
- "description": "部署环境 (production, lowmem, basic)",
496
+ "description": "部署环境 (production, lowmem, default)",
497
497
  "name": "env",
498
498
  "hasDynamicHelp": false,
499
499
  "multiple": false,
500
500
  "options": [
501
501
  "production",
502
502
  "lowmem",
503
- "basic"
503
+ "default"
504
504
  ],
505
505
  "type": "option"
506
506
  }
@@ -528,14 +528,14 @@
528
528
  "flags": {
529
529
  "env": {
530
530
  "char": "e",
531
- "description": "部署环境 (production, lowmem, basic)",
531
+ "description": "部署环境 (production, lowmem, default)",
532
532
  "name": "env",
533
533
  "hasDynamicHelp": false,
534
534
  "multiple": false,
535
535
  "options": [
536
536
  "production",
537
537
  "lowmem",
538
- "basic"
538
+ "default"
539
539
  ],
540
540
  "type": "option"
541
541
  }
@@ -563,14 +563,14 @@
563
563
  "flags": {
564
564
  "env": {
565
565
  "char": "e",
566
- "description": "部署环境 (production, lowmem, basic)",
566
+ "description": "部署环境 (production, lowmem, default)",
567
567
  "name": "env",
568
568
  "hasDynamicHelp": false,
569
569
  "multiple": false,
570
570
  "options": [
571
571
  "production",
572
572
  "lowmem",
573
- "basic"
573
+ "default"
574
574
  ],
575
575
  "type": "option"
576
576
  }
@@ -598,14 +598,14 @@
598
598
  "flags": {
599
599
  "env": {
600
600
  "char": "e",
601
- "description": "部署环境 (production, lowmem, basic)",
601
+ "description": "部署环境 (production, lowmem, default)",
602
602
  "name": "env",
603
603
  "hasDynamicHelp": false,
604
604
  "multiple": false,
605
605
  "options": [
606
606
  "production",
607
607
  "lowmem",
608
- "basic"
608
+ "default"
609
609
  ],
610
610
  "type": "option"
611
611
  }
@@ -633,14 +633,14 @@
633
633
  "flags": {
634
634
  "env": {
635
635
  "char": "e",
636
- "description": "部署环境 (production, lowmem, basic)",
636
+ "description": "部署环境 (production, lowmem, default)",
637
637
  "name": "env",
638
638
  "hasDynamicHelp": false,
639
639
  "multiple": false,
640
640
  "options": [
641
641
  "production",
642
642
  "lowmem",
643
- "basic"
643
+ "default"
644
644
  ],
645
645
  "type": "option"
646
646
  },
@@ -675,14 +675,14 @@
675
675
  "flags": {
676
676
  "env": {
677
677
  "char": "e",
678
- "description": "部署环境 (production, lowmem, basic)",
678
+ "description": "部署环境 (production, lowmem, default)",
679
679
  "name": "env",
680
680
  "hasDynamicHelp": false,
681
681
  "multiple": false,
682
682
  "options": [
683
683
  "production",
684
684
  "lowmem",
685
- "basic"
685
+ "default"
686
686
  ],
687
687
  "type": "option"
688
688
  }
@@ -717,14 +717,14 @@
717
717
  },
718
718
  "env": {
719
719
  "char": "e",
720
- "description": "部署环境 (production, lowmem, basic)",
720
+ "description": "部署环境 (production, lowmem, default)",
721
721
  "name": "env",
722
722
  "hasDynamicHelp": false,
723
723
  "multiple": false,
724
724
  "options": [
725
725
  "production",
726
726
  "lowmem",
727
- "basic"
727
+ "default"
728
728
  ],
729
729
  "type": "option"
730
730
  }
@@ -752,14 +752,14 @@
752
752
  "flags": {
753
753
  "env": {
754
754
  "char": "e",
755
- "description": "部署环境 (production, lowmem, basic)",
755
+ "description": "部署环境 (production, lowmem, default)",
756
756
  "name": "env",
757
757
  "hasDynamicHelp": false,
758
758
  "multiple": false,
759
759
  "options": [
760
760
  "production",
761
761
  "lowmem",
762
- "basic"
762
+ "default"
763
763
  ],
764
764
  "type": "option"
765
765
  }
@@ -781,5 +781,5 @@
781
781
  ]
782
782
  }
783
783
  },
784
- "version": "0.3.2"
784
+ "version": "0.3.3"
785
785
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nodebbs",
3
3
  "description": "NodeBBS 论坛系统专业运维工具",
4
- "version": "0.3.2",
4
+ "version": "0.3.3",
5
5
  "author": "wengqianshan",
6
6
  "bin": {
7
7
  "nodebbs": "./bin/run.js"
@@ -1,8 +0,0 @@
1
- services:
2
- postgres:
3
- ports:
4
- - "${POSTGRES_PORT:-5432}:5432"
5
-
6
- redis:
7
- ports:
8
- - "${REDIS_PORT:-6379}:6379"