@nocobase/cli 2.2.0-beta.7 → 2.2.0-beta.9
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/assets/env-proxy/nginx/app.conf.tpl +23 -0
- package/assets/env-proxy/nginx/nocobase.conf.tpl +5 -0
- package/assets/env-proxy/nginx/snippets/dist-location.conf +5 -0
- package/assets/env-proxy/nginx/snippets/gzip.conf +17 -0
- package/assets/env-proxy/nginx/snippets/log-format-http.conf +13 -0
- package/assets/env-proxy/nginx/snippets/maps-http.conf +14 -0
- package/assets/env-proxy/nginx/snippets/mime-types.conf +98 -0
- package/assets/env-proxy/nginx/snippets/proxy-location.conf +18 -0
- package/assets/env-proxy/nginx/snippets/spa-location.conf +6 -0
- package/assets/env-proxy/nginx/snippets/uploads-location.conf +21 -0
- package/dist/commands/app/start.js +4 -1
- package/dist/commands/install.js +53 -138
- package/dist/commands/proxy/caddy/generate.js +93 -7
- package/dist/commands/proxy/nginx/generate.js +98 -7
- package/dist/commands/revision/create.js +1 -1
- package/dist/commands/self/update.js +2 -2
- package/dist/commands/source/download.js +16 -12
- package/dist/lib/app-managed-resources.js +3 -4
- package/dist/lib/auth-store.js +82 -6
- package/dist/lib/cli-config.js +71 -1
- package/dist/lib/docker-image.js +94 -6
- package/dist/lib/env-auth.js +291 -45
- package/dist/lib/env-config.js +5 -0
- package/dist/lib/env-proxy-config.js +48 -0
- package/dist/lib/env-proxy.js +164 -58
- package/dist/lib/prompt-validators.js +1 -1
- package/dist/lib/proxy-caddy.js +77 -9
- package/dist/lib/proxy-nginx.js +71 -11
- package/dist/lib/run-npm.js +4 -0
- package/dist/lib/self-manager.js +251 -46
- package/dist/lib/startup-update.js +1 -1
- package/dist/locale/en-US.json +2 -2
- package/dist/locale/zh-CN.json +2 -2
- package/package.json +3 -2
package/dist/lib/cli-config.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { loadExactAuthConfig, saveAuthConfig } from './auth-store.js';
|
|
10
10
|
import { resolveCliHomeRoot, resolveDefaultConfigScope } from './cli-home.js';
|
|
11
11
|
import { CLI_LOCALE_FLAG_OPTIONS, normalizeCliLocale, resolveCliLocale } from './cli-locale.js';
|
|
12
|
+
import { DEFAULT_NB_IMAGE_REGISTRY, DEFAULT_NB_IMAGE_VARIANT, NB_IMAGE_REGISTRY_OPTIONS, NB_IMAGE_VARIANT_OPTIONS, normalizeNbImageRegistry, normalizeNbImageVariant, } from './docker-image.js';
|
|
12
13
|
export const DEFAULT_LICENSE_PKG_URL = 'https://pkg.nocobase.com/';
|
|
13
14
|
export const DEFAULT_DOCKER_NETWORK = 'nocobase';
|
|
14
15
|
export const DEFAULT_DOCKER_CONTAINER_PREFIX = 'nb';
|
|
@@ -16,6 +17,7 @@ export const DEFAULT_DOCKER_BIN = 'docker';
|
|
|
16
17
|
export const DEFAULT_CADDY_BIN = 'caddy';
|
|
17
18
|
export const DEFAULT_GIT_BIN = 'git';
|
|
18
19
|
export const DEFAULT_NGINX_BIN = 'nginx';
|
|
20
|
+
export const DEFAULT_PNPM_BIN = 'pnpm';
|
|
19
21
|
export const PROXY_PROVIDER_OPTIONS = ['nginx', 'caddy'];
|
|
20
22
|
export const DEFAULT_PROXY_PROVIDER = 'nginx';
|
|
21
23
|
export const NGINX_PROXY_DRIVER_OPTIONS = ['local', 'docker'];
|
|
@@ -36,10 +38,13 @@ export const SUPPORTED_CLI_CONFIG_KEYS = [
|
|
|
36
38
|
'license.pkg-url',
|
|
37
39
|
'docker.network',
|
|
38
40
|
'docker.container-prefix',
|
|
41
|
+
'nb-image-registry',
|
|
42
|
+
'nb-image-variant',
|
|
39
43
|
'bin.docker',
|
|
40
44
|
'bin.caddy',
|
|
41
45
|
'bin.git',
|
|
42
46
|
'bin.nginx',
|
|
47
|
+
'bin.pnpm',
|
|
43
48
|
'proxy.nb-cli-root',
|
|
44
49
|
'proxy.caddy-driver',
|
|
45
50
|
'proxy.nginx-driver',
|
|
@@ -127,7 +132,11 @@ function pruneSettings(config) {
|
|
|
127
132
|
delete config.settings?.license;
|
|
128
133
|
}
|
|
129
134
|
const docker = config.settings?.docker;
|
|
130
|
-
if (docker &&
|
|
135
|
+
if (docker &&
|
|
136
|
+
!trimValue(docker.network) &&
|
|
137
|
+
!trimValue(docker.containerPrefix) &&
|
|
138
|
+
!trimValue(docker.nbImageRegistry) &&
|
|
139
|
+
!trimValue(docker.nbImageVariant)) {
|
|
131
140
|
delete config.settings?.docker;
|
|
132
141
|
}
|
|
133
142
|
const bin = config.settings?.bin;
|
|
@@ -136,6 +145,7 @@ function pruneSettings(config) {
|
|
|
136
145
|
!trimValue(bin.caddy) &&
|
|
137
146
|
!trimValue(bin.git) &&
|
|
138
147
|
!trimValue(bin.nginx) &&
|
|
148
|
+
!trimValue(bin.pnpm) &&
|
|
139
149
|
!trimValue(bin.yarn)) {
|
|
140
150
|
delete config.settings?.bin;
|
|
141
151
|
}
|
|
@@ -179,6 +189,10 @@ export function getExplicitCliConfigValue(config, key) {
|
|
|
179
189
|
return trimValue(config.settings?.docker?.network);
|
|
180
190
|
case 'docker.container-prefix':
|
|
181
191
|
return trimValue(config.settings?.docker?.containerPrefix);
|
|
192
|
+
case 'nb-image-registry':
|
|
193
|
+
return normalizeNbImageRegistry(config.settings?.docker?.nbImageRegistry);
|
|
194
|
+
case 'nb-image-variant':
|
|
195
|
+
return normalizeNbImageVariant(config.settings?.docker?.nbImageVariant);
|
|
182
196
|
case 'bin.docker':
|
|
183
197
|
return trimValue(config.settings?.bin?.docker);
|
|
184
198
|
case 'bin.caddy':
|
|
@@ -187,6 +201,8 @@ export function getExplicitCliConfigValue(config, key) {
|
|
|
187
201
|
return trimValue(config.settings?.bin?.git);
|
|
188
202
|
case 'bin.nginx':
|
|
189
203
|
return trimValue(config.settings?.bin?.nginx);
|
|
204
|
+
case 'bin.pnpm':
|
|
205
|
+
return trimValue(config.settings?.bin?.pnpm);
|
|
190
206
|
case 'proxy.nb-cli-root':
|
|
191
207
|
return trimValue(config.settings?.proxy?.nbCliRoot);
|
|
192
208
|
case 'proxy.caddy-driver':
|
|
@@ -225,6 +241,10 @@ export function getEffectiveCliConfigValue(config, key) {
|
|
|
225
241
|
return trimValue(config.name) || DEFAULT_DOCKER_NETWORK;
|
|
226
242
|
case 'docker.container-prefix':
|
|
227
243
|
return trimValue(config.name) || DEFAULT_DOCKER_CONTAINER_PREFIX;
|
|
244
|
+
case 'nb-image-registry':
|
|
245
|
+
return explicit ?? DEFAULT_NB_IMAGE_REGISTRY;
|
|
246
|
+
case 'nb-image-variant':
|
|
247
|
+
return explicit ?? DEFAULT_NB_IMAGE_VARIANT;
|
|
228
248
|
case 'bin.docker':
|
|
229
249
|
return DEFAULT_DOCKER_BIN;
|
|
230
250
|
case 'bin.caddy':
|
|
@@ -233,6 +253,8 @@ export function getEffectiveCliConfigValue(config, key) {
|
|
|
233
253
|
return DEFAULT_GIT_BIN;
|
|
234
254
|
case 'bin.nginx':
|
|
235
255
|
return DEFAULT_NGINX_BIN;
|
|
256
|
+
case 'bin.pnpm':
|
|
257
|
+
return DEFAULT_PNPM_BIN;
|
|
236
258
|
case 'proxy.nb-cli-root':
|
|
237
259
|
return explicit ?? resolveCliHomeRoot();
|
|
238
260
|
case 'proxy.caddy-driver':
|
|
@@ -298,6 +320,20 @@ export function normalizeCliConfigValue(key, value) {
|
|
|
298
320
|
}
|
|
299
321
|
return driver;
|
|
300
322
|
}
|
|
323
|
+
if (key === 'nb-image-registry') {
|
|
324
|
+
const registry = normalizeNbImageRegistry(normalized);
|
|
325
|
+
if (!registry) {
|
|
326
|
+
throw new Error(`Config key "${key}" must be one of: ${NB_IMAGE_REGISTRY_OPTIONS.join(', ')}`);
|
|
327
|
+
}
|
|
328
|
+
return registry;
|
|
329
|
+
}
|
|
330
|
+
if (key === 'nb-image-variant') {
|
|
331
|
+
const variant = normalizeNbImageVariant(normalized);
|
|
332
|
+
if (!variant) {
|
|
333
|
+
throw new Error(`Config key "${key}" must be one of: ${NB_IMAGE_VARIANT_OPTIONS.join(', ')}`);
|
|
334
|
+
}
|
|
335
|
+
return variant;
|
|
336
|
+
}
|
|
301
337
|
return normalized;
|
|
302
338
|
}
|
|
303
339
|
export async function loadCliConfig(options = {}) {
|
|
@@ -363,6 +399,18 @@ export async function setCliConfigValue(key, value, options = {}) {
|
|
|
363
399
|
containerPrefix: normalized,
|
|
364
400
|
};
|
|
365
401
|
break;
|
|
402
|
+
case 'nb-image-registry':
|
|
403
|
+
config.settings.docker = {
|
|
404
|
+
...(config.settings.docker ?? {}),
|
|
405
|
+
nbImageRegistry: normalized,
|
|
406
|
+
};
|
|
407
|
+
break;
|
|
408
|
+
case 'nb-image-variant':
|
|
409
|
+
config.settings.docker = {
|
|
410
|
+
...(config.settings.docker ?? {}),
|
|
411
|
+
nbImageVariant: normalized,
|
|
412
|
+
};
|
|
413
|
+
break;
|
|
366
414
|
case 'bin.docker':
|
|
367
415
|
config.settings.bin = {
|
|
368
416
|
...(config.settings.bin ?? {}),
|
|
@@ -387,6 +435,12 @@ export async function setCliConfigValue(key, value, options = {}) {
|
|
|
387
435
|
nginx: normalized,
|
|
388
436
|
};
|
|
389
437
|
break;
|
|
438
|
+
case 'bin.pnpm':
|
|
439
|
+
config.settings.bin = {
|
|
440
|
+
...(config.settings.bin ?? {}),
|
|
441
|
+
pnpm: normalized,
|
|
442
|
+
};
|
|
443
|
+
break;
|
|
390
444
|
case 'proxy.nb-cli-root':
|
|
391
445
|
config.settings.proxy = {
|
|
392
446
|
...(config.settings.proxy ?? {}),
|
|
@@ -476,6 +530,16 @@ export async function deleteCliConfigValue(key, options = {}) {
|
|
|
476
530
|
delete config.settings.docker.containerPrefix;
|
|
477
531
|
}
|
|
478
532
|
break;
|
|
533
|
+
case 'nb-image-registry':
|
|
534
|
+
if (config.settings.docker) {
|
|
535
|
+
delete config.settings.docker.nbImageRegistry;
|
|
536
|
+
}
|
|
537
|
+
break;
|
|
538
|
+
case 'nb-image-variant':
|
|
539
|
+
if (config.settings.docker) {
|
|
540
|
+
delete config.settings.docker.nbImageVariant;
|
|
541
|
+
}
|
|
542
|
+
break;
|
|
479
543
|
case 'bin.docker':
|
|
480
544
|
if (config.settings.bin) {
|
|
481
545
|
delete config.settings.bin.docker;
|
|
@@ -496,6 +560,11 @@ export async function deleteCliConfigValue(key, options = {}) {
|
|
|
496
560
|
delete config.settings.bin.nginx;
|
|
497
561
|
}
|
|
498
562
|
break;
|
|
563
|
+
case 'bin.pnpm':
|
|
564
|
+
if (config.settings.bin) {
|
|
565
|
+
delete config.settings.bin.pnpm;
|
|
566
|
+
}
|
|
567
|
+
break;
|
|
499
568
|
case 'proxy.nb-cli-root':
|
|
500
569
|
if (config.settings.proxy) {
|
|
501
570
|
delete config.settings.proxy.nbCliRoot;
|
|
@@ -556,6 +625,7 @@ const CONFIGURABLE_COMMAND_KEYS = {
|
|
|
556
625
|
caddy: 'bin.caddy',
|
|
557
626
|
git: 'bin.git',
|
|
558
627
|
nginx: 'bin.nginx',
|
|
628
|
+
pnpm: 'bin.pnpm',
|
|
559
629
|
yarn: 'bin.yarn',
|
|
560
630
|
};
|
|
561
631
|
export function isConfigurableCommandName(value) {
|
package/dist/lib/docker-image.js
CHANGED
|
@@ -9,7 +9,30 @@
|
|
|
9
9
|
export const DEFAULT_DOCKER_REGISTRY = 'nocobase/nocobase';
|
|
10
10
|
export const DEFAULT_DOCKER_REGISTRY_ZH_CN = 'registry.cn-shanghai.aliyuncs.com/nocobase/nocobase';
|
|
11
11
|
export const DEFAULT_DOCKER_VERSION = 'alpha';
|
|
12
|
+
export const NB_IMAGE_REGISTRY_OPTIONS = ['dockerhub', 'aliyun'];
|
|
13
|
+
export const DEFAULT_NB_IMAGE_REGISTRY = 'dockerhub';
|
|
14
|
+
export const NB_IMAGE_VARIANT_OPTIONS = ['standard', 'no-nginx', 'full', 'full-no-nginx'];
|
|
15
|
+
export const DEFAULT_NB_IMAGE_VARIANT = 'full';
|
|
12
16
|
export const DOCKER_IMAGE_FULL_SUFFIX = '-full';
|
|
17
|
+
export const DOCKER_IMAGE_NO_NGINX_SUFFIX = '-no-nginx';
|
|
18
|
+
export const DOCKER_IMAGE_FULL_NO_NGINX_SUFFIX = '-full-no-nginx';
|
|
19
|
+
export const DEFAULT_KINGBASE_IMAGE = 'registry.cn-shanghai.aliyuncs.com/nocobase/kingbase:v009r001c001b0030_single_x86';
|
|
20
|
+
const OFFICIAL_DOCKER_REGISTRY_REPOSITORIES = {
|
|
21
|
+
dockerhub: DEFAULT_DOCKER_REGISTRY,
|
|
22
|
+
aliyun: DEFAULT_DOCKER_REGISTRY_ZH_CN,
|
|
23
|
+
};
|
|
24
|
+
const DEFAULT_BUILTIN_DB_IMAGES = {
|
|
25
|
+
postgres: 'postgres:16',
|
|
26
|
+
mysql: 'mysql:8',
|
|
27
|
+
mariadb: 'mariadb:11',
|
|
28
|
+
kingbase: DEFAULT_KINGBASE_IMAGE,
|
|
29
|
+
};
|
|
30
|
+
const ALIYUN_BUILTIN_DB_IMAGES = {
|
|
31
|
+
postgres: 'registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16',
|
|
32
|
+
mysql: 'registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8',
|
|
33
|
+
mariadb: 'registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11',
|
|
34
|
+
kingbase: DEFAULT_KINGBASE_IMAGE,
|
|
35
|
+
};
|
|
13
36
|
const OFFICIAL_FULL_IMAGE_REGISTRIES = new Set([
|
|
14
37
|
DEFAULT_DOCKER_REGISTRY,
|
|
15
38
|
DEFAULT_DOCKER_REGISTRY_ZH_CN,
|
|
@@ -17,21 +40,86 @@ const OFFICIAL_FULL_IMAGE_REGISTRIES = new Set([
|
|
|
17
40
|
function trimValue(value) {
|
|
18
41
|
return String(value ?? '').trim();
|
|
19
42
|
}
|
|
43
|
+
export function normalizeNbImageRegistry(value) {
|
|
44
|
+
const normalized = trimValue(value);
|
|
45
|
+
if (!normalized) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return NB_IMAGE_REGISTRY_OPTIONS.includes(normalized)
|
|
49
|
+
? normalized
|
|
50
|
+
: undefined;
|
|
51
|
+
}
|
|
52
|
+
export function normalizeNbImageVariant(value) {
|
|
53
|
+
const normalized = trimValue(value);
|
|
54
|
+
if (!normalized) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
return NB_IMAGE_VARIANT_OPTIONS.includes(normalized)
|
|
58
|
+
? normalized
|
|
59
|
+
: undefined;
|
|
60
|
+
}
|
|
61
|
+
export function resolveOfficialDockerRegistry(value) {
|
|
62
|
+
const registry = normalizeNbImageRegistry(value) ?? DEFAULT_NB_IMAGE_REGISTRY;
|
|
63
|
+
return OFFICIAL_DOCKER_REGISTRY_REPOSITORIES[registry];
|
|
64
|
+
}
|
|
65
|
+
export function inferNbImageRegistryFromRepository(value) {
|
|
66
|
+
const repository = trimValue(value);
|
|
67
|
+
return Object.entries(OFFICIAL_DOCKER_REGISTRY_REPOSITORIES).find(([, candidate]) => candidate === repository)?.[0];
|
|
68
|
+
}
|
|
69
|
+
function hasKnownVariantSuffix(tag) {
|
|
70
|
+
return (tag.endsWith(DOCKER_IMAGE_FULL_NO_NGINX_SUFFIX) ||
|
|
71
|
+
tag.endsWith(DOCKER_IMAGE_NO_NGINX_SUFFIX) ||
|
|
72
|
+
tag.endsWith(DOCKER_IMAGE_FULL_SUFFIX));
|
|
73
|
+
}
|
|
20
74
|
export function shouldUseFullDockerImageTag(registry) {
|
|
21
75
|
return OFFICIAL_FULL_IMAGE_REGISTRIES.has(trimValue(registry));
|
|
22
76
|
}
|
|
23
|
-
export function normalizeDockerImageTag(registry, version) {
|
|
77
|
+
export function normalizeDockerImageTag(registry, version, options) {
|
|
24
78
|
const tag = trimValue(version) || DEFAULT_DOCKER_VERSION;
|
|
25
|
-
if (
|
|
79
|
+
if (hasKnownVariantSuffix(tag)) {
|
|
26
80
|
return tag;
|
|
27
81
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
82
|
+
const explicitVariant = normalizeNbImageVariant(options?.variant) ?? normalizeNbImageVariant(options?.defaultVariant);
|
|
83
|
+
const inferredVariant = shouldUseFullDockerImageTag(registry) ? DEFAULT_NB_IMAGE_VARIANT : 'standard';
|
|
84
|
+
const variant = explicitVariant ?? inferredVariant;
|
|
85
|
+
switch (variant) {
|
|
86
|
+
case 'standard':
|
|
87
|
+
return tag;
|
|
88
|
+
case 'no-nginx':
|
|
89
|
+
return `${tag}${DOCKER_IMAGE_NO_NGINX_SUFFIX}`;
|
|
90
|
+
case 'full':
|
|
91
|
+
return `${tag}${DOCKER_IMAGE_FULL_SUFFIX}`;
|
|
92
|
+
case 'full-no-nginx':
|
|
93
|
+
return `${tag}${DOCKER_IMAGE_FULL_NO_NGINX_SUFFIX}`;
|
|
94
|
+
}
|
|
31
95
|
}
|
|
32
96
|
export function resolveDockerImageRef(registry, version, options) {
|
|
33
97
|
const resolvedRegistry = trimValue(registry) || options?.defaultRegistry || DEFAULT_DOCKER_REGISTRY;
|
|
34
98
|
const rawVersion = trimValue(version) || options?.defaultVersion || DEFAULT_DOCKER_VERSION;
|
|
35
|
-
const normalizedTag = normalizeDockerImageTag(resolvedRegistry, rawVersion
|
|
99
|
+
const normalizedTag = normalizeDockerImageTag(resolvedRegistry, rawVersion, {
|
|
100
|
+
variant: options?.variant,
|
|
101
|
+
defaultVariant: options?.defaultVariant,
|
|
102
|
+
});
|
|
36
103
|
return `${resolvedRegistry}:${normalizedTag}`;
|
|
37
104
|
}
|
|
105
|
+
function extractDockerImageTag(imageRef) {
|
|
106
|
+
const ref = trimValue(imageRef);
|
|
107
|
+
const lastSlashIndex = ref.lastIndexOf('/');
|
|
108
|
+
const lastColonIndex = ref.lastIndexOf(':');
|
|
109
|
+
if (lastColonIndex <= lastSlashIndex) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
return ref.slice(lastColonIndex + 1) || undefined;
|
|
113
|
+
}
|
|
114
|
+
export function resolveDockerImageContainerPort(imageRef) {
|
|
115
|
+
const tag = extractDockerImageTag(imageRef);
|
|
116
|
+
return tag?.endsWith(DOCKER_IMAGE_NO_NGINX_SUFFIX) ? '13000' : '80';
|
|
117
|
+
}
|
|
118
|
+
export function resolveBuiltinDbImage(dbDialect, options) {
|
|
119
|
+
const dialect = trimValue(dbDialect) || 'postgres';
|
|
120
|
+
const configuredRegistry = normalizeNbImageRegistry(options?.registry) ??
|
|
121
|
+
inferNbImageRegistryFromRepository(options?.registry) ??
|
|
122
|
+
DEFAULT_NB_IMAGE_REGISTRY;
|
|
123
|
+
const defaults = configuredRegistry === 'aliyun' ? ALIYUN_BUILTIN_DB_IMAGES : DEFAULT_BUILTIN_DB_IMAGES;
|
|
124
|
+
return defaults[dialect] ?? defaults.postgres;
|
|
125
|
+
}
|