@nocobase/app-installer 0.0.0-stage → 0.1.0-beta.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.
Files changed (61) hide show
  1. package/README.md +217 -2
  2. package/bin/run.js +43 -0
  3. package/dist/cli.js +171 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/install.js +383 -0
  6. package/dist/commands/install.js.map +1 -0
  7. package/dist/commands/rollback.js +287 -0
  8. package/dist/commands/rollback.js.map +1 -0
  9. package/dist/commands/status.js +155 -0
  10. package/dist/commands/status.js.map +1 -0
  11. package/dist/commands/upgrade.js +709 -0
  12. package/dist/commands/upgrade.js.map +1 -0
  13. package/dist/lib/app-cli.js +89 -0
  14. package/dist/lib/app-cli.js.map +1 -0
  15. package/dist/lib/backup.js +167 -0
  16. package/dist/lib/backup.js.map +1 -0
  17. package/dist/lib/confirm.js +36 -0
  18. package/dist/lib/confirm.js.map +1 -0
  19. package/dist/lib/current-link.js +22 -0
  20. package/dist/lib/current-link.js.map +1 -0
  21. package/dist/lib/ecosystem.js +86 -0
  22. package/dist/lib/ecosystem.js.map +1 -0
  23. package/dist/lib/env-file.js +87 -0
  24. package/dist/lib/env-file.js.map +1 -0
  25. package/dist/lib/errors.js +32 -0
  26. package/dist/lib/errors.js.map +1 -0
  27. package/dist/lib/health.js +55 -0
  28. package/dist/lib/health.js.map +1 -0
  29. package/dist/lib/initial-admin.js +39 -0
  30. package/dist/lib/initial-admin.js.map +1 -0
  31. package/dist/lib/interrupt.js +50 -0
  32. package/dist/lib/interrupt.js.map +1 -0
  33. package/dist/lib/invocation.js +33 -0
  34. package/dist/lib/invocation.js.map +1 -0
  35. package/dist/lib/layout.js +61 -0
  36. package/dist/lib/layout.js.map +1 -0
  37. package/dist/lib/lock.js +59 -0
  38. package/dist/lib/lock.js.map +1 -0
  39. package/dist/lib/mount-path.js +34 -0
  40. package/dist/lib/mount-path.js.map +1 -0
  41. package/dist/lib/output.js +61 -0
  42. package/dist/lib/output.js.map +1 -0
  43. package/dist/lib/pm2.js +92 -0
  44. package/dist/lib/pm2.js.map +1 -0
  45. package/dist/lib/prechecks.js +236 -0
  46. package/dist/lib/prechecks.js.map +1 -0
  47. package/dist/lib/registry.js +59 -0
  48. package/dist/lib/registry.js.map +1 -0
  49. package/dist/lib/release.js +328 -0
  50. package/dist/lib/release.js.map +1 -0
  51. package/dist/lib/run-command.js +108 -0
  52. package/dist/lib/run-command.js.map +1 -0
  53. package/dist/lib/service.js +100 -0
  54. package/dist/lib/service.js.map +1 -0
  55. package/dist/lib/source.js +100 -0
  56. package/dist/lib/source.js.map +1 -0
  57. package/dist/lib/state.js +73 -0
  58. package/dist/lib/state.js.map +1 -0
  59. package/dist/lib/version.js +51 -0
  60. package/dist/lib/version.js.map +1 -0
  61. package/package.json +51 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import path from 'node:path';
2
+ import { InstallerError } from "./errors.js";
3
+ import { formatCommandLine } from '@nocobase/cli-envelope';
4
+ import { CommandFailedError, runCommand, tail, } from "./run-command.js";
5
+ /**
6
+ * Carries a suggestion of the release's CLI over into the installer's error, with its command folded into the message.
7
+ * None of them runs as-is from an installation root: they name the release's own `dist/cli/index.js`, which a failed
8
+ * install or upgrade has already removed and which reads the wrong configuration without `app.env`, or `pnpm add`,
9
+ * which would turn the installation root into a project.
10
+ */
11
+ export function toSuggestion(entry) {
12
+ const run = typeof entry.run === 'string'
13
+ ? entry.run
14
+ : entry.run
15
+ ? formatCommandLine(entry.run)
16
+ : undefined;
17
+ const message = entry.message ?? '';
18
+ return {
19
+ message: run
20
+ ? [message, `(the application CLI's command: ${run})`]
21
+ .filter(Boolean)
22
+ .join(' ')
23
+ : message,
24
+ };
25
+ }
26
+ /**
27
+ * The command as it may appear in a message: `config set` values are masked, since a `--set` may carry a secret that
28
+ * would otherwise end up in the JSON result and the terminal. `--from-env` pairs name a variable, not a value, and stay.
29
+ */
30
+ export function describeAppCommand(args) {
31
+ const setting = args[0] === 'config' && args[1] === 'set';
32
+ let fromEnv = false;
33
+ const shown = args.map((arg) => {
34
+ if (arg === '--from-env')
35
+ fromEnv = true;
36
+ if (!setting || fromEnv || arg.startsWith('-'))
37
+ return arg;
38
+ const index = arg.indexOf('=');
39
+ return index > 0 ? `${arg.slice(0, index + 1)}***` : arg;
40
+ });
41
+ return `nocobase ${shown.join(' ')}`;
42
+ }
43
+ /**
44
+ * Runs the release's own CLI, `node <release>/dist/cli/index.js <args> --json`, and returns its envelope. It is the code
45
+ * that runs in production, so configuration and migrations are checked by the same version that will serve them.
46
+ */
47
+ export async function runAppCli(args, options) {
48
+ const entry = path.join(options.releaseDir, 'dist/cli/index.js');
49
+ const label = describeAppCommand(args);
50
+ const run = options.run ?? runCommand;
51
+ let stdout;
52
+ let stderr;
53
+ try {
54
+ ({ stdout, stderr } = await run(process.execPath, [entry, ...args, '--json'], {
55
+ cwd: options.cwd,
56
+ env: { ...process.env, ...options.env },
57
+ timeoutMs: 30 * 60_000,
58
+ }));
59
+ }
60
+ catch (error) {
61
+ if (!(error instanceof CommandFailedError))
62
+ throw error;
63
+ stdout = error.stdout;
64
+ stderr = error.stderr;
65
+ }
66
+ let envelope;
67
+ try {
68
+ envelope = JSON.parse(stdout);
69
+ }
70
+ catch {
71
+ throw new InstallerError('APP_CLI_FAILED', `${label} did not print a JSON result.`, { details: { stderr: tail(stderr), stdout: tail(stdout) } });
72
+ }
73
+ if (!envelope.ok) {
74
+ throw new InstallerError(envelope.error?.code ?? 'APP_CLI_FAILED', `${label} failed: ${envelope.error?.message ?? 'no message'}`, {
75
+ suggestions: (envelope.error?.suggestions ?? []).map(toSuggestion),
76
+ details: { command: label },
77
+ });
78
+ }
79
+ return envelope;
80
+ }
81
+ /**
82
+ * Counts the migration and seed tasks a `db apply --dry-run` would run. `status` is not a reliable signal: a dry run
83
+ * reports `success-noop` even when tasks are pending, so the plan itself is read.
84
+ */
85
+ export function pendingTaskCount(envelope) {
86
+ const plan = envelope.result?.plan;
87
+ return (plan ?? []).reduce((count, entry) => count + (entry.tasks?.length ?? 0), 0);
88
+ }
89
+ //# sourceMappingURL=app-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-cli.js","sourceRoot":"","sources":["../../src/lib/app-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { copyFile, mkdir, readFile, readdir, rm, writeFile, } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { parse } from 'yaml';
5
+ import { EXIT_INVALID, InstallerError } from "./errors.js";
6
+ /** A SQLite database is the main file plus whichever journal files exist beside it. */
7
+ const SQLITE_SUFFIXES = ['', '-wal', '-shm', '-journal'];
8
+ /** Written into every backup, so a restore knows where each database goes even after `config.yml` changes. */
9
+ const MANIFEST = 'backup.json';
10
+ /** `${NAME}` references, resolved the way the runtime resolves them from its environment; `undefined` if one is unset. */
11
+ function interpolate(value, env) {
12
+ let missing = false;
13
+ const resolved = value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/gu, (_, name) => {
14
+ const found = env[name];
15
+ if (found === undefined)
16
+ missing = true;
17
+ return found ?? '';
18
+ });
19
+ return missing ? undefined : resolved;
20
+ }
21
+ /**
22
+ * The application's databases as `config.yml` declares them. A SQLite path is resolved against the storage directory,
23
+ * as the runtime resolves it; `:memory:` holds nothing to back up. A connection `config.yml` does not declare is not
24
+ * seen, which is why an upgrade stops when the default connection is SQLite and its file is missing.
25
+ */
26
+ export function readDatabaseInventory(layout, env) {
27
+ let document = {};
28
+ try {
29
+ document = (parse(readFileSync(layout.configFile, 'utf8')) ??
30
+ {});
31
+ }
32
+ catch (error) {
33
+ // Treating this as "no databases" would let an upgrade proceed without a backup and without --backup-done.
34
+ throw new InstallerError('CONFIG_UNREADABLE', `${layout.configFile} could not be read as YAML, so the databases to back up are unknown: ${error instanceof Error ? error.message : String(error)}`, { exitCode: EXIT_INVALID, cause: error });
35
+ }
36
+ const inventory = {
37
+ defaultConnection: typeof document.database?.default === 'string'
38
+ ? document.database.default
39
+ : 'main',
40
+ sqlite: [],
41
+ external: [],
42
+ unresolved: [],
43
+ };
44
+ const lookup = { ...process.env, ...env };
45
+ for (const [connection, raw] of Object.entries(document.database?.connections ?? {})) {
46
+ const config = (raw ?? {});
47
+ if (config.dialect !== 'sqlite') {
48
+ inventory.external.push(connection);
49
+ continue;
50
+ }
51
+ const declared = config.database ?? config.filename;
52
+ if (typeof declared !== 'string' || declared === '') {
53
+ inventory.unresolved.push(connection);
54
+ continue;
55
+ }
56
+ const file = interpolate(declared, lookup);
57
+ if (file === undefined) {
58
+ inventory.unresolved.push(connection);
59
+ continue;
60
+ }
61
+ if (file === ':memory:')
62
+ continue;
63
+ inventory.sqlite.push({
64
+ connection,
65
+ file: path.resolve(layout.storageDir, file),
66
+ });
67
+ }
68
+ return inventory;
69
+ }
70
+ /** UTC, so backups taken on machines in different time zones sort the same way. */
71
+ function stamp(date) {
72
+ const pad = (value) => String(value).padStart(2, '0');
73
+ return `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}${pad(date.getUTCDate())}-${pad(date.getUTCHours())}${pad(date.getUTCMinutes())}${pad(date.getUTCSeconds())}Z`;
74
+ }
75
+ export function backupName(from, to, date) {
76
+ return `${stamp(date)}_${from}_to_${to}`;
77
+ }
78
+ async function existingFiles(file) {
79
+ const base = path.basename(file);
80
+ const present = new Set(await readdir(path.dirname(file)).catch(() => []));
81
+ return SQLITE_SUFFIXES.map((suffix) => `${base}${suffix}`).filter((name) => present.has(name));
82
+ }
83
+ async function readManifest(layout, backupRelative) {
84
+ try {
85
+ return JSON.parse(await readFile(path.join(layout.root, backupRelative, MANIFEST), 'utf8'));
86
+ }
87
+ catch {
88
+ return undefined;
89
+ }
90
+ }
91
+ /**
92
+ * Whether a backup holds a database that can be restored. An upgrade of an application on an external database backs
93
+ * up only `config.yml` and `app.env`, and a backup interrupted before its copy finished has no manifest at all.
94
+ */
95
+ export function backupHasDatabase(layout, backupRelative) {
96
+ const file = path.join(layout.root, backupRelative, MANIFEST);
97
+ if (!existsSync(file))
98
+ return false;
99
+ try {
100
+ const manifest = JSON.parse(readFileSync(file, 'utf8'));
101
+ return manifest.databases.some((database) => database.files.length > 0);
102
+ }
103
+ catch {
104
+ return false;
105
+ }
106
+ }
107
+ export async function removeBackup(layout, backupRelative) {
108
+ await rm(path.join(layout.root, backupRelative), {
109
+ recursive: true,
110
+ force: true,
111
+ });
112
+ }
113
+ /** Where a connection's files go inside a backup: one directory per connection, so equal file names never collide. */
114
+ function backupDatabaseDir(target, connection) {
115
+ return path.join(target, 'sqlite', connection);
116
+ }
117
+ /**
118
+ * Copies the application's SQLite databases, `config.yml` and `app.env` while the application is stopped, so the files
119
+ * are consistent. The manifest is written last: a backup cut short has none and is never restored from. This is what
120
+ * a failed upgrade restores, not a replacement for regular backups of `storage/`, whose uploaded files it leaves out.
121
+ */
122
+ export async function backupForUpgrade(layout, name, databases) {
123
+ const target = path.join(layout.backupsDir, name);
124
+ await mkdir(target, { recursive: true });
125
+ await copyFile(layout.configFile, path.join(target, 'config.yml'));
126
+ await copyFile(layout.appEnv, path.join(target, 'app.env'));
127
+ const copied = [];
128
+ for (const database of databases) {
129
+ const files = await existingFiles(database.file);
130
+ const directory = backupDatabaseDir(target, database.connection);
131
+ await mkdir(directory, { recursive: true });
132
+ for (const file of files) {
133
+ await copyFile(path.join(path.dirname(database.file), file), path.join(directory, file));
134
+ }
135
+ copied.push({ ...database, files });
136
+ }
137
+ const manifest = { databases: copied };
138
+ await writeFile(path.join(target, MANIFEST), `${JSON.stringify(manifest, null, 2)}\n`);
139
+ return { relative: path.relative(layout.root, target), databases: copied };
140
+ }
141
+ /**
142
+ * Puts backed-up databases back where the manifest says they were. Journal files that exist now but were not in the
143
+ * backup are removed, since SQLite would otherwise replay a newer write-ahead log onto the older database; a database
144
+ * that did not exist when the backup was taken is removed, since it was created by the release being undone.
145
+ */
146
+ export async function restoreDatabase(layout, backupRelative) {
147
+ const source = path.join(layout.root, backupRelative);
148
+ const manifest = await readManifest(layout, backupRelative);
149
+ if (!manifest ||
150
+ !manifest.databases.some((database) => database.files.length > 0)) {
151
+ throw new Error(`${source} holds no SQLite database to restore.`);
152
+ }
153
+ for (const database of manifest.databases) {
154
+ const directory = path.dirname(database.file);
155
+ await mkdir(directory, { recursive: true });
156
+ for (const leftover of await existingFiles(database.file)) {
157
+ if (!database.files.includes(leftover)) {
158
+ await rm(path.join(directory, leftover), { force: true });
159
+ }
160
+ }
161
+ for (const file of database.files) {
162
+ await copyFile(path.join(backupDatabaseDir(source, database.connection), file), path.join(directory, file));
163
+ }
164
+ }
165
+ return manifest.databases;
166
+ }
167
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/lib/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { EXIT_INVALID, InstallerError } from "./errors.js";
3
+ /**
4
+ * Asks before an operation that takes the application down or discards data. `--yes` answers for scripts; without it, a run that
5
+ * cannot ask — `--json`, or no terminal — stops instead of guessing.
6
+ */
7
+ export async function confirm(lines, options) {
8
+ if (options.yes)
9
+ return;
10
+ const input = options.input ?? process.stdin;
11
+ const output = options.output ?? process.stderr;
12
+ if (options.json || !input.isTTY) {
13
+ throw new InstallerError('CONFIRMATION_REQUIRED', `${lines[0]} Pass --yes to proceed without a prompt.`, {
14
+ exitCode: EXIT_INVALID,
15
+ details: { notes: lines.slice(1) },
16
+ suggestions: [
17
+ { message: 'Run it again with --yes once you have read:' },
18
+ ...lines.slice(1).map((message) => ({ message })),
19
+ ],
20
+ });
21
+ }
22
+ output.write(`${lines.map((line) => ` ${line}`).join('\n')}\n`);
23
+ const readline = createInterface({ input, output });
24
+ try {
25
+ const answer = await readline.question('Continue? [y/N] ');
26
+ if (!/^y(es)?$/iu.test(answer.trim())) {
27
+ throw new InstallerError('CANCELLED', 'Cancelled; nothing was changed.', {
28
+ exitCode: EXIT_INVALID,
29
+ });
30
+ }
31
+ }
32
+ finally {
33
+ readline.close();
34
+ }
35
+ }
36
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/lib/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAS3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAwB,EACxB,OAAuB;IAEvB,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,cAAc,CACtB,uBAAuB,EACvB,GAAG,KAAK,CAAC,CAAC,CAAC,0CAA0C,EACrD;YACE,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YAClC,WAAW,EAAE;gBACX,EAAE,OAAO,EAAE,6CAA6C,EAAE;gBAC1D,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;aAClD;SACF,CACF,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,cAAc,CAAC,WAAW,EAAE,iCAAiC,EAAE;gBACvE,QAAQ,EAAE,YAAY;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { readlink, rename, rm, symlink } from 'node:fs/promises';
2
+ /**
3
+ * Points `current` at a release in one step: the new link is created beside it and renamed over it, so `current`
4
+ * always names a complete release and never goes missing in between.
5
+ */
6
+ export async function switchCurrent(layout, linkTarget) {
7
+ const temporary = `${layout.current}.${process.pid}.tmp`;
8
+ await rm(temporary, { force: true });
9
+ await symlink(linkTarget, temporary, 'dir');
10
+ await rename(temporary, layout.current);
11
+ }
12
+ export async function readCurrent(layout) {
13
+ try {
14
+ return await readlink(layout.current);
15
+ }
16
+ catch (error) {
17
+ if (error.code === 'ENOENT')
18
+ return undefined;
19
+ throw error;
20
+ }
21
+ }
22
+ //# sourceMappingURL=current-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-link.js","sourceRoot":"","sources":["../../src/lib/current-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGjE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,UAAkB;IAElB,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACzD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,MAAM,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc;IAC9C,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Builds `ecosystem.config.cjs`, the pm2 configuration every start goes through.
3
+ *
4
+ * pm2 runs `node launcher.mjs` rather than the application's entry file. The file names nothing that changes: which
5
+ * release runs and with which variables is decided by `launcher.mjs` each time the process starts, so a plain
6
+ * `pm2 restart` picks up a switched `current` and an edited `app.env`.
7
+ *
8
+ * pm2 runs `node` itself, with the script as its argument. Pointing `script` at a module instead has pm2's fork mode
9
+ * load it through `ProcessContainerFork.js`, where `import.meta.main` is false, so `standalone.js` never calls
10
+ * `startServer()` and the application silently never starts.
11
+ */
12
+ export function buildEcosystemConfig(options) {
13
+ return `// Written by app-installer. Starting the application always goes through this file.
14
+ const path = require('node:path');
15
+
16
+ const root = __dirname;
17
+
18
+ module.exports = {
19
+ apps: [
20
+ {
21
+ name: ${JSON.stringify(options.name)},
22
+ // Run node itself, so launcher.mjs, and the application after it, are the main module (import.meta.main).
23
+ script: ${JSON.stringify(options.nodePath)},
24
+ // launcher.mjs reads app.env and resolves \`current\` on every start, so \`pm2 restart\` applies changes to either.
25
+ args: [path.join(root, 'launcher.mjs')],
26
+ interpreter: 'none',
27
+ cwd: root,
28
+ autorestart: true,
29
+ min_uptime: '30s',
30
+ max_restarts: 10,
31
+ exp_backoff_restart_delay: 1000,
32
+ // pm2 sends SIGKILL 1.6s after SIGINT by default; the application finishes what it is doing first.
33
+ kill_timeout: 60000,${options.keepChildren
34
+ ? `
35
+ // The Hub stops its App Host child itself, and the child exits on its own if the Hub is killed.
36
+ treekill: false,`
37
+ : ''}
38
+ out_file: path.join(root, 'logs/app.out.log'),
39
+ error_file: path.join(root, 'logs/app.err.log'),
40
+ time: true,
41
+ },
42
+ ],
43
+ };
44
+ `;
45
+ }
46
+ /**
47
+ * Builds `launcher.mjs`, the script pm2 runs. On every start it reads `app.env`, resolves `current`, and replaces itself
48
+ * with `node <release>/dist/server/standalone.js` through `process.execve`.
49
+ *
50
+ * Replacing the process rather than starting a child keeps the application on the pid pm2 watches, receiving pm2's
51
+ * signals itself and running as the main module. A child would need its signals forwarded, and would outlive a
52
+ * launcher that pm2 kills, holding the port the next start needs. Node flags given to the launcher, such as
53
+ * `--max-old-space-size` in `args`, pass on to the application; pm2's `node_args` does not apply to an
54
+ * `interpreter: 'none'` process.
55
+ *
56
+ * pm2 gives the launcher an IPC channel, but the channel does not survive `process.execve`: the application starts
57
+ * without `process.send`, and pm2 options that rely on it, such as `wait_ready` and `shutdown_with_message`, are not
58
+ * available.
59
+ *
60
+ * The entry is resolved to its real path, so a running application keeps loading its modules from the release it
61
+ * started from even after `current` moves on.
62
+ */
63
+ export function buildLauncher() {
64
+ return `// Written by app-installer. pm2 runs this file; it starts the release \`current\` points at, with app.env applied.
65
+ import { readFileSync, realpathSync } from 'node:fs';
66
+ import path from 'node:path';
67
+ import { parseEnv } from 'node:util';
68
+
69
+ const root = import.meta.dirname;
70
+ const env = {
71
+ ...process.env,
72
+ ...parseEnv(readFileSync(path.join(root, 'app.env'), 'utf8')),
73
+ };
74
+ const entry = realpathSync(path.join(root, 'current/dist/server/standalone.js'));
75
+
76
+ // Become the application rather than start it as a child: same pid for pm2, signals delivered directly, and
77
+ // standalone.js is the main module, which is what makes it start the server. Node flags and arguments pass on
78
+ // unchanged.
79
+ process.execve(
80
+ process.execPath,
81
+ [process.execPath, ...process.execArgv, entry, ...process.argv.slice(2)],
82
+ env,
83
+ );
84
+ `;
85
+ }
86
+ //# sourceMappingURL=ecosystem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem.js","sourceRoot":"","sources":["../../src/lib/ecosystem.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAyB;IAC5D,OAAO;;;;;;;;cAQK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;;gBAE1B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;;;;;;;;;;4BAWxC,OAAO,CAAC,YAAY;QAClB,CAAC,CAAC;;uBAEW;QACb,CAAC,CAAC,EACN;;;;;;;CAOL,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;CAoBR,CAAC;AACF,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { parseEnv } from 'node:util';
3
+ /**
4
+ * Builds `app.env`, the one set of runtime variables both the application and the installer's own CLI calls read.
5
+ * `launcher.mjs` reads it on every start, so an edit takes effect with `pm2 restart`.
6
+ *
7
+ * `APP_CONFIG_FILE` and `APP_STORAGE_DIR` are absolute on purpose. A built server treats the directory above `dist/` as
8
+ * its deployment root and keeps `config.yml` and `storage/` there by default, which here is the release directory an
9
+ * upgrade replaces. `dist/.env` carries neither variable, so leaving one out silently moves the application's data into
10
+ * the release.
11
+ */
12
+ export function buildAppEnv(layout, options) {
13
+ const entries = [
14
+ ['NODE_ENV', 'production'],
15
+ ...(options.basePath === undefined
16
+ ? []
17
+ : [['APP_BASE_PATH', options.basePath]]),
18
+ ['APP_CONFIG_FILE', layout.configFile],
19
+ ['APP_STORAGE_DIR', layout.storageDir],
20
+ ['APP_PUBLIC_ORIGIN', options.origin],
21
+ ['APP_SERVER_HOST', options.host],
22
+ ['APP_SERVER_PORT', String(options.port)],
23
+ // A failed start exits non-zero, so pm2 restarts it and the installer sees the failure.
24
+ ['NOCOBASE_STRICT_STARTUP', 'true'],
25
+ ];
26
+ return [
27
+ '# Written by app-installer. Read by launcher.mjs on every start and by every app-installer command.',
28
+ ...entries.map(([key, value]) => `${key}=${quote(value)}`),
29
+ '',
30
+ ].join('\n');
31
+ }
32
+ function quote(value) {
33
+ return /^[\w@%+=:,./-]*$/u.test(value) ? value : JSON.stringify(value);
34
+ }
35
+ export async function readAppEnv(layout) {
36
+ return parseEnv(await readFile(layout.appEnv, 'utf8'));
37
+ }
38
+ const DEFAULT_HOST = '127.0.0.1';
39
+ const DEFAULT_PORT = '13000';
40
+ // The server mounts an application that sets no APP_BASE_PATH at `DEFAULT_APP_BASE_PATH` from
41
+ // `@nocobase/app-server/support`. app-installer runs as its own npx tool, without the server's code, so it repeats the
42
+ // value only to tell where such an installation is reached; it never writes it.
43
+ const DEFAULT_BASE_PATH = '/main';
44
+ function parsePort(value) {
45
+ const port = Number(value.trim());
46
+ return value.trim() !== '' &&
47
+ Number.isInteger(port) &&
48
+ port >= 1 &&
49
+ port <= 65535
50
+ ? port
51
+ : null;
52
+ }
53
+ /** The path the application is mounted at, as a URL prefix: `/crm` stays, and the origin root is `''`. */
54
+ export function mountPathOf(env) {
55
+ return basePrefix(env);
56
+ }
57
+ /** The base path as a URL prefix: `/crm` stays, and the root `/` contributes nothing. */
58
+ function basePrefix(env) {
59
+ const trimmed = (env.APP_BASE_PATH ?? DEFAULT_BASE_PATH)
60
+ .trim()
61
+ .replace(/^\/+|\/+$/gu, '');
62
+ return trimmed ? `/${trimmed}` : '';
63
+ }
64
+ /**
65
+ * Where the application is reached and where it listens, as `app.env` says. The file is edited by hand to change
66
+ * either, so a trailing slash on the origin is dropped, as `install` drops it from `--origin`, and a port that is not
67
+ * one reads as `null` rather than as a number the application is not using.
68
+ */
69
+ export function endpointsOf(env) {
70
+ const host = env.APP_SERVER_HOST ?? DEFAULT_HOST;
71
+ const rawPort = env.APP_SERVER_PORT ?? DEFAULT_PORT;
72
+ const origin = (env.APP_PUBLIC_ORIGIN ?? `http://${host}:${rawPort}`).replace(/\/+$/u, '');
73
+ return {
74
+ url: `${origin}${basePrefix(env)}/`,
75
+ origin,
76
+ host,
77
+ port: parsePort(rawPort),
78
+ };
79
+ }
80
+ /** The address the installer checks health on: the listening address, with a wildcard bind reached through loopback. */
81
+ export function healthUrl(env) {
82
+ const { host, port } = endpointsOf(env);
83
+ const reachable = host === '0.0.0.0' || host === '::' || host === '' ? '127.0.0.1' : host;
84
+ const hostPart = reachable.includes(':') ? `[${reachable}]` : reachable;
85
+ return `http://${hostPart}:${port ?? env.APP_SERVER_PORT}${basePrefix(env)}/api/healthz`;
86
+ }
87
+ //# sourceMappingURL=env-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-file.js","sourceRoot":"","sources":["../../src/lib/env-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Exit codes are part of the contract: CI and agents branch on them.
3
+ *
4
+ * - `0` success, including a run that found nothing to do
5
+ * - `1` the operation failed, and the running application was not touched
6
+ * - `2` invalid usage or a failed precheck, before anything was written
7
+ * - `3` an upgrade failed after the switch and was rolled back; the previous release is running again
8
+ * - `4` rolling back failed too; the application needs a person, and the error says what to do
9
+ */
10
+ export const EXIT_OK = 0;
11
+ export const EXIT_FAILED = 1;
12
+ export const EXIT_INVALID = 2;
13
+ export const EXIT_ROLLED_BACK = 3;
14
+ export const EXIT_ROLLBACK_FAILED = 4;
15
+ export class InstallerError extends Error {
16
+ code;
17
+ exitCode;
18
+ suggestions;
19
+ details;
20
+ constructor(code, message, options = {}) {
21
+ super(message, { cause: options.cause });
22
+ this.name = 'InstallerError';
23
+ this.code = code;
24
+ this.exitCode = options.exitCode ?? EXIT_FAILED;
25
+ this.suggestions = options.suggestions ?? [];
26
+ this.details = options.details;
27
+ }
28
+ }
29
+ export function isInstallerError(error) {
30
+ return error instanceof InstallerError;
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AACzB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAatC,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,WAAW,CAAe;IAC1B,OAAO,CAAsC;IAE7D,YACE,IAAY,EACZ,OAAe,EACf,UAAiC,EAAE;QAEnC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,KAAK,YAAY,cAAc,CAAC;AACzC,CAAC"}