@nocobase/app-installer 0.1.0-beta.6 → 0.1.0-beta.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 +39 -0
- package/dist/cli.js +43 -1
- package/dist/cli.js.map +1 -1
- package/dist/lib/offline-bundle.js +91 -0
- package/dist/lib/offline-bundle.js.map +1 -0
- package/dist/lib/remote.js +331 -0
- package/dist/lib/remote.js.map +1 -0
- package/dist/lib/run-command.js +7 -3
- package/dist/lib/run-command.js.map +1 -1
- package/dist/remote-entry.js +96 -0
- package/dist/remote-entry.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -213,3 +213,42 @@ Under `--json`, a failure prints `ok: false` and `status: "failure"` with `error
|
|
|
213
213
|
| `UNEXPECTED` | `1` | An error the installer does not recognise. The message is all there is; report it. |
|
|
214
214
|
| `UPGRADE_ROLLED_BACK` | `3` | The new release failed after the switch; the previous one runs again, on the restored databases when the new one may have migrated them. |
|
|
215
215
|
| `ROLLBACK_FAILED` | `4` | The application is down. Follow the suggestions: read the log, fix the cause, and run `rollback` again, which retries the restore. |
|
|
216
|
+
|
|
217
|
+
## SSH deployment without server internet access
|
|
218
|
+
|
|
219
|
+
Build the application locally for the server's platform, then deploy its archive. The local installer packages its own installed runtime dependencies and uploads them with the application; it does not invoke npm, npx or pnpm on the server. The remote Linux machine needs Node.js 24+, tar and pm2 on the non-interactive SSH session's PATH. It needs neither an Agent nor a Skill. External services that the application uses must remain reachable.
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
app-installer deploy --ssh deploy@server --dir /srv/apps/crm \
|
|
223
|
+
--archive storage/exports/dist.tar.gz --origin https://crm.example.com --json
|
|
224
|
+
app-installer status --ssh deploy@server --dir /srv/apps/crm --json
|
|
225
|
+
app-installer upgrade --ssh deploy@server --dir /srv/apps/crm \
|
|
226
|
+
--archive storage/exports/dist.tar.gz --json
|
|
227
|
+
app-installer rollback --ssh deploy@server --dir /srv/apps/crm --json
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
These commands are invoked through the installed `app-installer` binary on the local machine. `deploy` selects install when there is no `installer.json`, and upgrade when there is one. `install --ssh` always requests a fresh installation. An existing target retains its configuration: omit install-only flags, such as `--origin`, `--port` and `--set`, when deploying an update. Review an upgrade or rollback's confirmation notes and repeat with `--yes` to proceed. The remote operation always uses JSON, so it never waits for an invisible terminal prompt. Existing SQLite backup, external database `--backup-done`, release retention and rollback rules apply unchanged.
|
|
231
|
+
|
|
232
|
+
| Flag | Meaning |
|
|
233
|
+
| ---------------- | ------------------------------------------------------------------- |
|
|
234
|
+
| `--ssh` | `user@host` or an alias from SSH config; required for `deploy` |
|
|
235
|
+
| `--ssh-port` | Override the SSH port |
|
|
236
|
+
| `--ssh-identity` | Local private key file; otherwise use SSH config or the SSH agent |
|
|
237
|
+
| `--ssh-config` | Local SSH config file, including aliases and ProxyJump |
|
|
238
|
+
| `--ssh-timeout` | Maximum seconds for each transfer or remote execution, default 1800 |
|
|
239
|
+
|
|
240
|
+
SSH uses batch authentication and strict host-key checking. Establish and verify the server's host key in known_hosts beforehand; the installer never disables verification or asks for an SSH password. Use system SSH configuration for jump hosts and authentication. `--dir` must be an explicit absolute remote path; `--archive`, identity and config paths are local. Configure the remote account's non-interactive PATH for Node and pm2, without relying on an interactive shell's version-manager initialization.
|
|
241
|
+
|
|
242
|
+
`--set-from-env key=VARIABLE` reads a local environment variable and sends its value through encrypted SSH stdin, not command arguments or a temporary configuration file. The remote child receives only generated secret environment names. Do not put passwords in `--set`. Application configuration and secrets remain in the installation's persistent configuration as with a local install.
|
|
243
|
+
|
|
244
|
+
Before uploading, the installer checks the remote runtime, archive platform, writable parent and available disk space. Disk space is an estimate allowing twice the archive's expanded size plus installer overhead; large existing databases may require more space for backups. Uploaded files are checked with SHA-256 before execution. `--app`, npm upgrades and `--rebuild` are not supported remotely: build an archive locally instead. A remote operation that succeeds but whose public health URL is unreachable returns a warning and `result.remote.publicHealth: false`; private URLs may legitimately be unreachable from the local machine.
|
|
245
|
+
|
|
246
|
+
If SSH disconnects or times out after execution starts, `REMOTE_STATE_UNKNOWN` means the remote process may still be running. Query `status --ssh` before retrying, and inspect `pending` plus the persistent application logs if necessary. Do not assume the operation failed or automatically run another deployment. Pre-execution transfer failures leave the application unchanged. Successful operations remove their randomly named `/tmp/nocobase-deploy-*` directory; failures retain it for diagnosis and return its path. It contains archives and installer code, not transported secret values. Remove that directory only after confirming no remote operation is using it. Retrying creates a new transfer; resumable uploads are not implemented.
|
|
247
|
+
|
|
248
|
+
### Export an offline installer
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
app-installer bundle --out installer.tar.gz --json
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
This packages the currently installed installer and its runtime dependency graph without querying a registry. Extract it on the server, then use `node installer/bin/run.js install ... --archive ... --json`, or `status`, `upgrade` and `rollback` the same way. In a source checkout, build app-installer and its workspace dependencies before bundling. The bundle does not include Node or pm2, and recovery suggestions written as `npx ...` must be invoked through this offline entry instead on a disconnected server. SSH commands create and transfer this bundle automatically.
|
package/dist/cli.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { Flags } from '@oclif/core';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createOfflineBundle } from "./lib/offline-bundle.js";
|
|
4
|
+
import { SSH_FLAGS, runRemote } from "./lib/remote.js";
|
|
1
5
|
import { parse } from '@oclif/core/parser';
|
|
2
6
|
import { INSTALL_ARGS, INSTALL_FLAGS, install, } from "./commands/install.js";
|
|
3
7
|
import { ROLLBACK_FLAGS, rollback, } from "./commands/rollback.js";
|
|
@@ -28,11 +32,16 @@ export function formatHelp() {
|
|
|
28
32
|
` $ ${installerCommand('COMMAND [FLAGS]')}`,
|
|
29
33
|
'',
|
|
30
34
|
'COMMANDS',
|
|
35
|
+
' bundle Package this installer and its installed runtime dependencies: --out <file.tar.gz>.',
|
|
36
|
+
' deploy With --ssh and --archive, install a new directory or upgrade an existing installation.',
|
|
31
37
|
' install DIRECTORY Install into DIRECTORY (or --dir DIRECTORY) from --app or --archive, and start it with pm2.',
|
|
32
38
|
' upgrade Upgrade the installation in --dir, the current directory by default, to the latest npm application or a new --archive.',
|
|
33
39
|
' rollback Return to the release the last upgrade came from, or to --to.',
|
|
34
40
|
' status Report the release, endpoints, health, pm2 process and releases on disk.',
|
|
35
41
|
'',
|
|
42
|
+
'SSH FLAGS (install, deploy, upgrade, rollback, status)',
|
|
43
|
+
...describeFlags(SSH_FLAGS),
|
|
44
|
+
'',
|
|
36
45
|
'INSTALL FLAGS',
|
|
37
46
|
...describeFlags(INSTALL_FLAGS),
|
|
38
47
|
'',
|
|
@@ -123,7 +132,40 @@ export async function runInstaller(options) {
|
|
|
123
132
|
const removeInterruptHandlers = installInterruptHandlers(stderr);
|
|
124
133
|
try {
|
|
125
134
|
let outcome;
|
|
126
|
-
|
|
135
|
+
const remoteDefinitions = {
|
|
136
|
+
install: {
|
|
137
|
+
args: INSTALL_ARGS,
|
|
138
|
+
flags: { ...INSTALL_FLAGS, ...SSH_FLAGS },
|
|
139
|
+
},
|
|
140
|
+
deploy: { flags: { ...INSTALL_FLAGS, ...UPGRADE_FLAGS, ...SSH_FLAGS } },
|
|
141
|
+
upgrade: { flags: { ...UPGRADE_FLAGS, ...SSH_FLAGS } },
|
|
142
|
+
rollback: { flags: { ...ROLLBACK_FLAGS, ...SSH_FLAGS } },
|
|
143
|
+
status: { flags: { ...STATUS_FLAGS, ...SSH_FLAGS } },
|
|
144
|
+
};
|
|
145
|
+
const wantsRemote = command === 'deploy' ||
|
|
146
|
+
rest.some((arg) => arg === '--ssh' || arg.startsWith('--ssh='));
|
|
147
|
+
if (command === 'bundle') {
|
|
148
|
+
const parsed = await parseCommand(rest, {
|
|
149
|
+
flags: {
|
|
150
|
+
out: Flags.string({ required: true }),
|
|
151
|
+
json: Flags.boolean({ default: false }),
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
const out = path.resolve(options.cwd ?? process.cwd(), parsed.flags.out);
|
|
155
|
+
await createOfflineBundle(out);
|
|
156
|
+
outcome = {
|
|
157
|
+
status: 'success',
|
|
158
|
+
result: { archive: out, version: options.version },
|
|
159
|
+
summary: [`Offline installer: ${out}`],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
else if (wantsRemote && command in remoteDefinitions) {
|
|
163
|
+
const parsed = await parseCommand(rest, remoteDefinitions[command]);
|
|
164
|
+
outcome = await runRemote(command, parsed.flags, parsed.directory, rest
|
|
165
|
+
.filter((arg) => arg.startsWith('--'))
|
|
166
|
+
.map((arg) => arg.slice(2).split('=')[0].replace(/^no-/u, '')), deps);
|
|
167
|
+
}
|
|
168
|
+
else if (command === 'install') {
|
|
127
169
|
outcome = await install(await parseCommand(rest, {
|
|
128
170
|
args: INSTALL_ARGS,
|
|
129
171
|
flags: INSTALL_FLAGS,
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { cp, glob, mkdir, mkdtemp, readFile, realpath, rm, symlink, writeFile, } from 'node:fs/promises';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { create } from 'tar';
|
|
7
|
+
import { InstallerError } from "./errors.js";
|
|
8
|
+
/** Copies the installed runtime dependency graph, never resolving versions or contacting a registry. */
|
|
9
|
+
export async function createOfflineBundle(out, root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..')) {
|
|
10
|
+
const temp = await mkdtemp(path.join(os.tmpdir(), 'nocobase-installer-bundle-'));
|
|
11
|
+
const installer = path.join(temp, 'installer');
|
|
12
|
+
const copied = new Map();
|
|
13
|
+
try {
|
|
14
|
+
await mkdir(installer);
|
|
15
|
+
for (const file of ['bin', 'dist', 'package.json']) {
|
|
16
|
+
await cp(path.join(root, file), path.join(installer, file), {
|
|
17
|
+
recursive: true,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
await visit(root, installer);
|
|
21
|
+
await create({ cwd: temp, file: out, gzip: true, portable: true }, [
|
|
22
|
+
'installer',
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
catch (cause) {
|
|
26
|
+
throw new InstallerError('BUNDLE_FAILED', 'Could not package the installed installer and its runtime dependencies. In a source checkout, build app-installer and its dependencies first.', { cause });
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await rm(temp, { recursive: true, force: true });
|
|
30
|
+
}
|
|
31
|
+
async function visit(source, destination) {
|
|
32
|
+
const manifest = JSON.parse(await readFile(path.join(source, 'package.json'), 'utf8'));
|
|
33
|
+
// Workspace packages resolve source exports locally; the copied tree executes their compiled public exports.
|
|
34
|
+
if (manifest.publishConfig?.exports) {
|
|
35
|
+
manifest.exports = manifest.publishConfig.exports;
|
|
36
|
+
await writeFile(path.join(destination, 'package.json'), JSON.stringify(manifest));
|
|
37
|
+
}
|
|
38
|
+
const dependencies = {
|
|
39
|
+
...manifest.dependencies,
|
|
40
|
+
...manifest.optionalDependencies,
|
|
41
|
+
};
|
|
42
|
+
const require = createRequire(path.join(source, 'package.json'));
|
|
43
|
+
for (const name of Object.keys(dependencies)) {
|
|
44
|
+
let resolved;
|
|
45
|
+
for (const search of require.resolve.paths(name) ?? []) {
|
|
46
|
+
try {
|
|
47
|
+
resolved = await realpath(path.join(search, name));
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
/* Try the next Node resolution path. */
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (!resolved) {
|
|
55
|
+
if (name in (manifest.optionalDependencies ?? {}))
|
|
56
|
+
continue;
|
|
57
|
+
throw new Error(`Missing dependency ${name}`);
|
|
58
|
+
}
|
|
59
|
+
let target = copied.get(resolved);
|
|
60
|
+
if (!target) {
|
|
61
|
+
target = path.join(installer, 'node_modules', '.offline', String(copied.size));
|
|
62
|
+
copied.set(resolved, target);
|
|
63
|
+
const dependencyManifest = JSON.parse(await readFile(path.join(resolved, 'package.json'), 'utf8'));
|
|
64
|
+
if (dependencyManifest.publishConfig?.exports &&
|
|
65
|
+
dependencyManifest.files) {
|
|
66
|
+
// A linked workspace dependency may hold private development files; include only its published files.
|
|
67
|
+
await mkdir(target, { recursive: true });
|
|
68
|
+
await cp(path.join(resolved, 'package.json'), path.join(target, 'package.json'));
|
|
69
|
+
for await (const file of glob(dependencyManifest.files, {
|
|
70
|
+
cwd: resolved,
|
|
71
|
+
})) {
|
|
72
|
+
await cp(path.join(resolved, file), path.join(target, file), {
|
|
73
|
+
recursive: true,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
await cp(resolved, target, {
|
|
79
|
+
recursive: true,
|
|
80
|
+
filter: (file) => path.basename(file) !== 'node_modules',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
await visit(resolved, target);
|
|
84
|
+
}
|
|
85
|
+
const link = path.join(destination, 'node_modules', name);
|
|
86
|
+
await mkdir(path.dirname(link), { recursive: true });
|
|
87
|
+
await symlink(path.relative(path.dirname(link), target), link);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=offline-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-bundle.js","sourceRoot":"","sources":["../../src/lib/offline-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,EAAE,EACF,IAAI,EACJ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,OAAO,EACP,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAW7C,wGAAwG;AACxG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW,EACX,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;IAE1E,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CACrD,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC;YACnD,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;gBAC1D,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7B,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YACjE,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,cAAc,CACtB,eAAe,EACf,+IAA+I,EAC/I,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,UAAU,KAAK,CAAC,MAAc,EAAE,WAAmB;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAC9C,CAAC;QACd,6GAA6G;QAC7G,IAAI,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;YACpC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;YAClD,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EACtC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzB,CAAC;QACJ,CAAC;QACD,MAAM,YAAY,GAAG;YACnB,GAAG,QAAQ,CAAC,YAAY;YACxB,GAAG,QAAQ,CAAC,oBAAoB;SACjC,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7C,IAAI,QAA4B,CAAC;YACjC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACvD,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;oBACnD,MAAM;gBACR,CAAC;gBAAC,MAAM,CAAC;oBACP,wCAAwC;gBAC1C,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,EAAE,CAAC;oBAAE,SAAS;gBAC5D,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,CAAC,IAAI,CAChB,SAAS,EACT,cAAc,EACd,UAAU,EACV,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CACpB,CAAC;gBACF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7B,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAChD,CAAC;gBACd,IACE,kBAAkB,CAAC,aAAa,EAAE,OAAO;oBACzC,kBAAkB,CAAC,KAAK,EACxB,CAAC;oBACD,sGAAsG;oBACtG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzC,MAAM,EAAE,CACN,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAClC,CAAC;oBACF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;wBACtD,GAAG,EAAE,QAAQ;qBACd,CAAC,EAAE,CAAC;wBACH,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;4BAC3D,SAAS,EAAE,IAAI;yBAChB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE;wBACzB,SAAS,EAAE,IAAI;wBACf,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,cAAc;qBACzD,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAChC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YAC1D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { list } from 'tar';
|
|
2
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
3
|
+
import { createReadStream } from 'node:fs';
|
|
4
|
+
import { mkdtemp, rm, stat } from 'node:fs/promises';
|
|
5
|
+
import os from 'node:os';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { Flags } from '@oclif/core';
|
|
9
|
+
import { quoteForShell } from '@nocobase/cli-envelope';
|
|
10
|
+
import { createOfflineBundle } from "./offline-bundle.js";
|
|
11
|
+
import { CommandFailedError, runCommand } from "./run-command.js";
|
|
12
|
+
import { EXIT_INVALID, InstallerError } from "./errors.js";
|
|
13
|
+
import { INSTALLER_PACKAGE } from "./invocation.js";
|
|
14
|
+
import { checkHealth } from "./health.js";
|
|
15
|
+
export const SSH_FLAGS = {
|
|
16
|
+
ssh: Flags.string({
|
|
17
|
+
description: 'SSH destination (user@host or SSH config alias). The server needs no internet access.',
|
|
18
|
+
}),
|
|
19
|
+
'ssh-port': Flags.integer({
|
|
20
|
+
min: 1,
|
|
21
|
+
max: 65535,
|
|
22
|
+
description: 'SSH port; otherwise use system SSH configuration.',
|
|
23
|
+
}),
|
|
24
|
+
'ssh-identity': Flags.string({
|
|
25
|
+
description: 'Local SSH private key file; SSH agent and config work without this flag.',
|
|
26
|
+
}),
|
|
27
|
+
'ssh-config': Flags.string({
|
|
28
|
+
description: 'Local SSH config file, including ProxyJump and remote PATH setup.',
|
|
29
|
+
}),
|
|
30
|
+
'ssh-timeout': Flags.integer({
|
|
31
|
+
min: 1,
|
|
32
|
+
default: 1800,
|
|
33
|
+
description: 'Maximum seconds for each remote execution or transfer. A timeout does not imply rollback.',
|
|
34
|
+
}),
|
|
35
|
+
};
|
|
36
|
+
export async function sha256(file) {
|
|
37
|
+
const hash = createHash('sha256');
|
|
38
|
+
for await (const chunk of createReadStream(file))
|
|
39
|
+
hash.update(chunk);
|
|
40
|
+
return hash.digest('hex');
|
|
41
|
+
}
|
|
42
|
+
export function sshArgs(flags, scp = false) {
|
|
43
|
+
const host = flags.ssh;
|
|
44
|
+
if (typeof host !== 'string' ||
|
|
45
|
+
!/^(?:[\w.-]+@)?[\w.:[\]-]+$/u.test(host) ||
|
|
46
|
+
host.startsWith('-')) {
|
|
47
|
+
throw new InstallerError('INVALID_USAGE', '--ssh must be a host, user@host or SSH config alias, not a shell command or URL.', { exitCode: EXIT_INVALID });
|
|
48
|
+
}
|
|
49
|
+
const args = [
|
|
50
|
+
'-o',
|
|
51
|
+
'BatchMode=yes',
|
|
52
|
+
'-o',
|
|
53
|
+
'StrictHostKeyChecking=yes',
|
|
54
|
+
'-o',
|
|
55
|
+
'ConnectTimeout=15',
|
|
56
|
+
];
|
|
57
|
+
if (flags['ssh-port'])
|
|
58
|
+
args.push(scp ? '-P' : '-p', String(flags['ssh-port']));
|
|
59
|
+
if (flags['ssh-identity'])
|
|
60
|
+
args.push('-i', String(flags['ssh-identity']));
|
|
61
|
+
if (flags['ssh-config'])
|
|
62
|
+
args.push('-F', String(flags['ssh-config']));
|
|
63
|
+
return args;
|
|
64
|
+
}
|
|
65
|
+
/** Keep recovery commands on the machine whose files and processes they address. */
|
|
66
|
+
function remoteSuggestion(suggestion, flags) {
|
|
67
|
+
const run = suggestion.run;
|
|
68
|
+
if (!run)
|
|
69
|
+
return suggestion;
|
|
70
|
+
const installerIndex = run.command === 'npx'
|
|
71
|
+
? run.args.findIndex((arg) => arg.startsWith(INSTALLER_PACKAGE + '@'))
|
|
72
|
+
: -1;
|
|
73
|
+
if (installerIndex >= 0) {
|
|
74
|
+
const connection = Object.entries(flags)
|
|
75
|
+
.filter(([key, value]) => key in SSH_FLAGS && value !== undefined)
|
|
76
|
+
.flatMap(([key, value]) => [`--${key}`, String(value)]);
|
|
77
|
+
return {
|
|
78
|
+
...suggestion,
|
|
79
|
+
run: {
|
|
80
|
+
command: process.execPath,
|
|
81
|
+
args: [
|
|
82
|
+
fileURLToPath(new URL('../../bin/run.js', import.meta.url)),
|
|
83
|
+
...run.args.slice(installerIndex + 1),
|
|
84
|
+
...connection,
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Archive rebuilds and dependency changes belong in the local application project.
|
|
90
|
+
if (run.command === 'pnpm')
|
|
91
|
+
return {
|
|
92
|
+
...suggestion,
|
|
93
|
+
message: `In the local application project: ${suggestion.message}`,
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
...suggestion,
|
|
97
|
+
run: {
|
|
98
|
+
command: 'ssh',
|
|
99
|
+
args: [
|
|
100
|
+
...sshArgs(flags),
|
|
101
|
+
String(flags.ssh),
|
|
102
|
+
[run.command, ...run.args].map(quoteForShell).join(' '),
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/** Read the manifest without extracting executable files on the local machine. */
|
|
108
|
+
export async function inspectArchive(file) {
|
|
109
|
+
let text = '';
|
|
110
|
+
let bytes = 0;
|
|
111
|
+
let manifests = 0;
|
|
112
|
+
await list({
|
|
113
|
+
file,
|
|
114
|
+
onReadEntry(entry) {
|
|
115
|
+
bytes += entry.size;
|
|
116
|
+
if (entry.path.replace(/^\.\//u, '') === 'dist/package.json') {
|
|
117
|
+
manifests += 1;
|
|
118
|
+
if (entry.size > 1024 * 1024)
|
|
119
|
+
throw new Error('Archive manifest is too large');
|
|
120
|
+
entry.on('data', (chunk) => {
|
|
121
|
+
text += chunk.toString();
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
if (manifests !== 1)
|
|
127
|
+
throw new InstallerError('ARCHIVE_INVALID', 'Archive must contain exactly one dist/package.json.');
|
|
128
|
+
return { manifest: JSON.parse(text), bytes };
|
|
129
|
+
}
|
|
130
|
+
/** Runs before upload. Node and standard Linux tools are prerequisites, not downloaded on the server. */
|
|
131
|
+
const PREFLIGHT = `
|
|
132
|
+
const fs = require('node:fs'); const path = require('node:path');
|
|
133
|
+
const {spawnSync} = require('node:child_process');
|
|
134
|
+
let input=''; process.stdin.setEncoding('utf8'); process.stdin.on('data',x=>input+=x);
|
|
135
|
+
process.stdin.on('end',()=>{try {
|
|
136
|
+
const r=JSON.parse(input);
|
|
137
|
+
if(process.platform!=='linux'||Number(process.versions.node.split('.')[0])<24) throw Error('Linux and Node.js 24+ are required');
|
|
138
|
+
const t=r.target; const libc=process.report.getReport().header.glibcVersionRuntime?'glibc':'musl';
|
|
139
|
+
if(t&&(t.platform!==process.platform||t.arch!==process.arch||t.nodeMajor!==Number(process.versions.node.split('.')[0])||(t.libc&&t.libc!==libc)))throw Error('Archive build target does not match remote platform, architecture, libc or Node major');
|
|
140
|
+
for(const bin of ['tar','pm2']) {const p=spawnSync('sh',['-c','command -v '+bin],{encoding:'utf8'});if(p.status!==0)throw Error(bin+' is missing from the SSH session PATH');}
|
|
141
|
+
let parent=r.dir;while(!fs.existsSync(parent))parent=path.dirname(parent);
|
|
142
|
+
if(!fs.statSync(parent).isDirectory())throw Error('Target parent is not a directory');
|
|
143
|
+
fs.accessSync(parent,fs.constants.W_OK|fs.constants.X_OK);
|
|
144
|
+
for(const dir of [parent,'/tmp']) {const disk=fs.statfsSync(dir);if(disk.bavail*disk.bsize<r.bytes)throw Error('Insufficient disk space in '+dir);}
|
|
145
|
+
fs.mkdirSync(r.staging,{mode:0o700});
|
|
146
|
+
console.log(JSON.stringify({platform:process.platform,arch:process.arch,node:process.versions.node}));
|
|
147
|
+
}catch(e){console.error(e.message);process.exitCode=2;}});
|
|
148
|
+
`;
|
|
149
|
+
export async function runRemote(command, flags, directory, explicit, deps) {
|
|
150
|
+
const ssh = sshArgs(flags);
|
|
151
|
+
const host = String(flags.ssh);
|
|
152
|
+
const root = directory ?? flags.dir;
|
|
153
|
+
if (typeof root !== 'string' ||
|
|
154
|
+
!path.posix.isAbsolute(root) ||
|
|
155
|
+
path.posix.normalize(root) === '/' ||
|
|
156
|
+
root.includes('\0') ||
|
|
157
|
+
root.includes('\n')) {
|
|
158
|
+
throw new InstallerError('INVALID_USAGE', 'SSH operations require an explicit absolute target --dir other than /.', { exitCode: EXIT_INVALID });
|
|
159
|
+
}
|
|
160
|
+
if (directory && flags.dir && directory !== flags.dir)
|
|
161
|
+
throw new InstallerError('INVALID_USAGE', 'Directory argument and --dir disagree.', { exitCode: EXIT_INVALID });
|
|
162
|
+
if (flags.app || flags.rebuild || (command === 'upgrade' && flags.to))
|
|
163
|
+
throw new InstallerError('INVALID_USAGE', 'SSH deployment is archive-only; --app, --rebuild and npm --to require server internet access.', { exitCode: EXIT_INVALID });
|
|
164
|
+
if (['deploy', 'install', 'upgrade'].includes(command) && !flags.archive)
|
|
165
|
+
throw new InstallerError('INVALID_USAGE', '--archive is required for SSH installation and upgrade.', { exitCode: EXIT_INVALID });
|
|
166
|
+
const env = {};
|
|
167
|
+
for (const setting of (flags['set-from-env'] ?? [])) {
|
|
168
|
+
const name = setting.slice(setting.indexOf('=') + 1);
|
|
169
|
+
if (!setting.includes('=') ||
|
|
170
|
+
!/^[A-Za-z_][A-Za-z0-9_]*$/u.test(name) ||
|
|
171
|
+
process.env[name] === undefined)
|
|
172
|
+
throw new InstallerError('INVALID_USAGE', '--set-from-env must name an existing local environment variable.', { exitCode: EXIT_INVALID });
|
|
173
|
+
// Restrict transport to generated names: a user setting must not override PATH, NODE_OPTIONS or the remote runtime.
|
|
174
|
+
const generated = `NOCOBASE_REMOTE_SECRET_${Object.keys(env).length}`;
|
|
175
|
+
env[generated] = process.env[name];
|
|
176
|
+
}
|
|
177
|
+
const secrets = Object.values(env).filter(Boolean);
|
|
178
|
+
const redact = (text) => secrets.reduce((out, secret) => out
|
|
179
|
+
.split(JSON.stringify(secret).slice(1, -1))
|
|
180
|
+
.join('[REDACTED]')
|
|
181
|
+
.split(secret)
|
|
182
|
+
.join('[REDACTED]'), text);
|
|
183
|
+
const local = await mkdtemp(path.join(os.tmpdir(), 'nocobase-ssh-'));
|
|
184
|
+
const staging = `/tmp/nocobase-deploy-${randomUUID()}`;
|
|
185
|
+
const run = deps.run ?? runCommand;
|
|
186
|
+
const timeoutMs = Number(flags['ssh-timeout'] ?? 1800) * 1000;
|
|
187
|
+
let executing = false;
|
|
188
|
+
let staged = false;
|
|
189
|
+
try {
|
|
190
|
+
const bundle = path.join(local, 'installer.tar.gz');
|
|
191
|
+
await createOfflineBundle(bundle);
|
|
192
|
+
const archive = typeof flags.archive === 'string'
|
|
193
|
+
? path.resolve(deps.cwd ?? process.cwd(), flags.archive)
|
|
194
|
+
: undefined;
|
|
195
|
+
const bundleHash = await sha256(bundle);
|
|
196
|
+
const archiveHash = archive ? await sha256(archive) : undefined;
|
|
197
|
+
const inspected = archive ? await inspectArchive(archive) : undefined;
|
|
198
|
+
if (inspected && !inspected.manifest.nocobase?.buildTarget)
|
|
199
|
+
throw new InstallerError('ARCHIVE_INVALID', 'Archive is missing its build target.');
|
|
200
|
+
const bytes = (await stat(bundle)).size * 10 + (inspected?.bytes ?? 0) * 2;
|
|
201
|
+
deps.reporter.progress(`Checking SSH target ${host}`);
|
|
202
|
+
await run('ssh', [...ssh, host, `node -e ${quoteForShell(PREFLIGHT)}`], {
|
|
203
|
+
input: JSON.stringify({
|
|
204
|
+
dir: root,
|
|
205
|
+
staging,
|
|
206
|
+
bytes,
|
|
207
|
+
target: inspected?.manifest.nocobase?.buildTarget,
|
|
208
|
+
}),
|
|
209
|
+
timeoutMs: 30_000,
|
|
210
|
+
});
|
|
211
|
+
staged = true;
|
|
212
|
+
deps.reporter.progress('Uploading offline installer and application archive');
|
|
213
|
+
await run('scp', [...sshArgs(flags, true), bundle, `${host}:${staging}/installer.tar.gz`], { timeoutMs });
|
|
214
|
+
if (archive)
|
|
215
|
+
await run('scp', [...sshArgs(flags, true), archive, `${host}:${staging}/app.tar.gz`], { timeoutMs });
|
|
216
|
+
const verify = `const fs=require('node:fs'),crypto=require('node:crypto');(async()=>{for(const [file,expected] of ${JSON.stringify([[`${staging}/installer.tar.gz`, bundleHash], ...(archive ? [[`${staging}/app.tar.gz`, archiveHash]] : [])])}){const hash=crypto.createHash('sha256');for await(const chunk of fs.createReadStream(file))hash.update(chunk);if(hash.digest('hex')!==expected)throw Error('Upload checksum mismatch');}})().catch(e=>{console.error(e.message);process.exitCode=2});`;
|
|
217
|
+
await run('ssh', [
|
|
218
|
+
...ssh,
|
|
219
|
+
host,
|
|
220
|
+
`node -e ${quoteForShell(verify)} && tar -xzf ${quoteForShell(staging + '/installer.tar.gz')} -C ${quoteForShell(staging)}`,
|
|
221
|
+
], { timeoutMs });
|
|
222
|
+
const forwarded = Object.fromEntries(Object.entries(flags).filter(([key]) => !(key in SSH_FLAGS)));
|
|
223
|
+
forwarded.dir = root;
|
|
224
|
+
forwarded.archive = archive ? staging + '/app.tar.gz' : undefined;
|
|
225
|
+
if (flags['set-from-env'])
|
|
226
|
+
forwarded['set-from-env'] = flags['set-from-env'].map((x, i) => `${x.slice(0, x.indexOf('='))}=NOCOBASE_REMOTE_SECRET_${i}`);
|
|
227
|
+
const request = {
|
|
228
|
+
command,
|
|
229
|
+
flags: forwarded,
|
|
230
|
+
explicit,
|
|
231
|
+
env,
|
|
232
|
+
...(archive
|
|
233
|
+
? { archive: { file: staging + '/app.tar.gz', sha256: archiveHash } }
|
|
234
|
+
: {}),
|
|
235
|
+
};
|
|
236
|
+
executing = true;
|
|
237
|
+
let response;
|
|
238
|
+
let exitCode = 0;
|
|
239
|
+
try {
|
|
240
|
+
response = await run('ssh', [
|
|
241
|
+
...ssh,
|
|
242
|
+
host,
|
|
243
|
+
`node ${quoteForShell(staging + '/installer/dist/remote-entry.js')}`,
|
|
244
|
+
], { input: JSON.stringify(request), timeoutMs });
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
if (error instanceof InstallerError && error.code === 'INTERRUPTED')
|
|
248
|
+
throw new Error('Local SSH execution was interrupted before returning a remote result.', { cause: error });
|
|
249
|
+
if (!(error instanceof CommandFailedError) ||
|
|
250
|
+
error.exitCode === 255 ||
|
|
251
|
+
error.exitCode === null)
|
|
252
|
+
throw error;
|
|
253
|
+
response = error;
|
|
254
|
+
exitCode = error.exitCode;
|
|
255
|
+
}
|
|
256
|
+
let envelope;
|
|
257
|
+
try {
|
|
258
|
+
envelope = JSON.parse(redact(response.stdout));
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
throw new Error('Remote installer did not return a JSON result');
|
|
262
|
+
}
|
|
263
|
+
for (const warning of envelope.warnings ?? [])
|
|
264
|
+
deps.reporter.warn(warning);
|
|
265
|
+
if (envelope.ok && exitCode !== 0)
|
|
266
|
+
throw new Error('Remote process exited nonzero despite a success envelope');
|
|
267
|
+
if (!envelope.ok)
|
|
268
|
+
throw new InstallerError(envelope.error?.code ?? 'REMOTE_FAILED', envelope.error?.message ?? 'Remote operation failed.', {
|
|
269
|
+
exitCode: exitCode || 1,
|
|
270
|
+
details: {
|
|
271
|
+
...envelope.error?.details,
|
|
272
|
+
ssh: host,
|
|
273
|
+
directory: root,
|
|
274
|
+
staging,
|
|
275
|
+
},
|
|
276
|
+
suggestions: (envelope.error?.suggestions ?? []).map((suggestion) => remoteSuggestion(suggestion, flags)),
|
|
277
|
+
});
|
|
278
|
+
const result = envelope.result ?? {};
|
|
279
|
+
let publicHealth = null;
|
|
280
|
+
const url = typeof result.url === 'string'
|
|
281
|
+
? result.url
|
|
282
|
+
: result.endpoints?.url;
|
|
283
|
+
if (url && result.started !== false) {
|
|
284
|
+
publicHealth = await checkHealth(url.replace(/\/$/u, '') + '/api/healthz', deps.fetchImpl);
|
|
285
|
+
if (!publicHealth)
|
|
286
|
+
deps.reporter.warn('Remote operation succeeded, but the public health URL is not reachable from this machine. Check routing, firewall and reverse proxy.');
|
|
287
|
+
}
|
|
288
|
+
await run('ssh', [...ssh, host, `rm -rf -- ${quoteForShell(staging)}`], {
|
|
289
|
+
timeoutMs: 30_000,
|
|
290
|
+
}).catch(() => deps.reporter.warn(`Could not remove remote staging directory ${staging}.`));
|
|
291
|
+
return {
|
|
292
|
+
status: envelope.status ?? 'success',
|
|
293
|
+
result: {
|
|
294
|
+
...result,
|
|
295
|
+
remote: {
|
|
296
|
+
host,
|
|
297
|
+
directory: root,
|
|
298
|
+
publicHealth,
|
|
299
|
+
archiveSha256: archiveHash ?? null,
|
|
300
|
+
},
|
|
301
|
+
},
|
|
302
|
+
summary: [
|
|
303
|
+
`Remote ${command} succeeded on ${host}`,
|
|
304
|
+
` Directory ${root}`,
|
|
305
|
+
...(url ? [` URL ${url}`] : []),
|
|
306
|
+
],
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
if (error instanceof InstallerError)
|
|
311
|
+
throw error;
|
|
312
|
+
throw new InstallerError(executing ? 'REMOTE_STATE_UNKNOWN' : 'SSH_TRANSFER_FAILED', executing
|
|
313
|
+
? 'SSH execution did not return a complete result. The server may still be deploying; query status before retrying.'
|
|
314
|
+
: 'SSH precheck or transfer failed; the application was not changed.', {
|
|
315
|
+
details: {
|
|
316
|
+
ssh: host,
|
|
317
|
+
directory: root,
|
|
318
|
+
...(staged ? { staging } : {}),
|
|
319
|
+
diagnostic: redact(error instanceof CommandFailedError
|
|
320
|
+
? error.stderr
|
|
321
|
+
: error instanceof Error
|
|
322
|
+
? error.message
|
|
323
|
+
: String(error)),
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
finally {
|
|
328
|
+
await rm(local, { recursive: true, force: true });
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/lib/remote.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/run-command.js
CHANGED
|
@@ -45,9 +45,13 @@ export const runCommand = (command, args, options = {}) => new Promise((resolve,
|
|
|
45
45
|
const child = spawn(command, args, {
|
|
46
46
|
cwd: options.cwd,
|
|
47
47
|
env: options.env,
|
|
48
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
48
|
+
stdio: [options.input === undefined ? 'ignore' : 'pipe', 'pipe', 'pipe'],
|
|
49
49
|
detached: true,
|
|
50
50
|
});
|
|
51
|
+
child.stdin?.on('error', () => {
|
|
52
|
+
/* A child may exit before reading stdin; close reports its status. */
|
|
53
|
+
});
|
|
54
|
+
child.stdin?.end(options.input);
|
|
51
55
|
let stdout = '';
|
|
52
56
|
let stderr = '';
|
|
53
57
|
let stopReason;
|
|
@@ -65,11 +69,11 @@ export const runCommand = (command, args, options = {}) => new Promise((resolve,
|
|
|
65
69
|
: undefined;
|
|
66
70
|
timer?.unref();
|
|
67
71
|
const stopListening = onInterrupt(() => stop('interrupt'));
|
|
68
|
-
child.stdout
|
|
72
|
+
child.stdout?.on('data', (chunk) => {
|
|
69
73
|
stdout += chunk.toString();
|
|
70
74
|
options.echo?.write(chunk);
|
|
71
75
|
});
|
|
72
|
-
child.stderr
|
|
76
|
+
child.stderr?.on('data', (chunk) => {
|
|
73
77
|
stderr += chunk.toString();
|
|
74
78
|
options.echo?.write(chunk);
|
|
75
79
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/lib/run-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/lib/run-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Writable } from 'node:stream';
|
|
2
|
+
import { readAppEnv, endpointsOf } from "./lib/env-file.js";
|
|
3
|
+
import { layoutOf } from "./lib/layout.js";
|
|
4
|
+
/** Private SSH entry: the request and secrets arrive over stdin, never in process arguments or files. */
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { readFile } from 'node:fs/promises';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { createRequire } from 'node:module';
|
|
9
|
+
import { runInstaller } from "./cli.js";
|
|
10
|
+
import { INSTALL_FLAGS } from "./commands/install.js";
|
|
11
|
+
import { UPGRADE_FLAGS } from "./commands/upgrade.js";
|
|
12
|
+
import { ROLLBACK_FLAGS } from "./commands/rollback.js";
|
|
13
|
+
import { STATUS_FLAGS } from "./commands/status.js";
|
|
14
|
+
import { errorEnvelope, exitCodeOf } from "./lib/output.js";
|
|
15
|
+
import { InstallerError } from "./lib/errors.js";
|
|
16
|
+
import { sha256 } from "./lib/remote.js";
|
|
17
|
+
let input = '';
|
|
18
|
+
for await (const chunk of process.stdin)
|
|
19
|
+
input += String(chunk);
|
|
20
|
+
let command = 'remote';
|
|
21
|
+
try {
|
|
22
|
+
const request = JSON.parse(input);
|
|
23
|
+
command = request.command;
|
|
24
|
+
const root = String(request.flags.dir);
|
|
25
|
+
if (!path.isAbsolute(root) || root === '/')
|
|
26
|
+
throw new InstallerError('INVALID_USAGE', 'An absolute application directory is required.');
|
|
27
|
+
if (request.archive &&
|
|
28
|
+
(await sha256(request.archive.file)) !== request.archive.sha256)
|
|
29
|
+
throw new InstallerError('CHECKSUM_MISMATCH', 'Application archive checksum does not match.');
|
|
30
|
+
for (const [key, value] of Object.entries(request.env)) {
|
|
31
|
+
if (!/^NOCOBASE_REMOTE_SECRET_\d+$/u.test(key))
|
|
32
|
+
throw new InstallerError('INVALID_USAGE', 'Invalid transported environment variable.');
|
|
33
|
+
process.env[key] = value;
|
|
34
|
+
}
|
|
35
|
+
const stateFile = path.join(root, 'installer.json');
|
|
36
|
+
if (command === 'deploy')
|
|
37
|
+
command = existsSync(stateFile) ? 'upgrade' : 'install';
|
|
38
|
+
if (command === 'upgrade') {
|
|
39
|
+
const state = JSON.parse(await readFile(stateFile, 'utf8'));
|
|
40
|
+
if (state.source?.kind !== 'archive')
|
|
41
|
+
throw new InstallerError('REMOTE_SOURCE_UNSUPPORTED', 'Offline SSH upgrades require an archive installation.');
|
|
42
|
+
const installOnly = request.explicit.filter((key) => key in INSTALL_FLAGS && !(key in UPGRADE_FLAGS) && key !== 'json');
|
|
43
|
+
if (installOnly.length)
|
|
44
|
+
throw new InstallerError('INVALID_USAGE', `An existing installation preserves its configuration; remove install-only flags: ${installOnly.map((x) => '--' + x).join(', ')}.`);
|
|
45
|
+
}
|
|
46
|
+
const definitions = {
|
|
47
|
+
install: INSTALL_FLAGS,
|
|
48
|
+
upgrade: UPGRADE_FLAGS,
|
|
49
|
+
rollback: ROLLBACK_FLAGS,
|
|
50
|
+
status: STATUS_FLAGS,
|
|
51
|
+
};
|
|
52
|
+
if (!(command in definitions))
|
|
53
|
+
throw new InstallerError('INVALID_USAGE', 'Unsupported remote operation.');
|
|
54
|
+
const definition = definitions[command];
|
|
55
|
+
const argv = [command, '--json'];
|
|
56
|
+
for (const [key, value] of Object.entries(request.flags)) {
|
|
57
|
+
if (key === 'json' || !(key in definition) || value === undefined)
|
|
58
|
+
continue;
|
|
59
|
+
if (typeof value === 'boolean') {
|
|
60
|
+
if (value)
|
|
61
|
+
argv.push('--' + key);
|
|
62
|
+
else if (['start', 'restore'].includes(key))
|
|
63
|
+
argv.push('--no-' + key);
|
|
64
|
+
}
|
|
65
|
+
else if (Array.isArray(value))
|
|
66
|
+
for (const item of value)
|
|
67
|
+
argv.push(`--${key}=${item}`);
|
|
68
|
+
else
|
|
69
|
+
argv.push(`--${key}=${value}`);
|
|
70
|
+
}
|
|
71
|
+
const metadata = createRequire(import.meta.url)('../package.json');
|
|
72
|
+
let output = '';
|
|
73
|
+
const stdout = new Writable({
|
|
74
|
+
write(chunk, _encoding, callback) {
|
|
75
|
+
output += chunk.toString();
|
|
76
|
+
callback();
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
process.exitCode = await runInstaller({
|
|
80
|
+
argv,
|
|
81
|
+
version: metadata.version,
|
|
82
|
+
stdout,
|
|
83
|
+
});
|
|
84
|
+
const envelope = JSON.parse(output);
|
|
85
|
+
if (envelope.ok &&
|
|
86
|
+
envelope.result &&
|
|
87
|
+
['upgrade', 'rollback'].includes(command)) {
|
|
88
|
+
envelope.result.endpoints = endpointsOf(await readAppEnv(layoutOf(root)));
|
|
89
|
+
}
|
|
90
|
+
process.stdout.write(JSON.stringify(envelope) + '\n');
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
process.stdout.write(JSON.stringify(errorEnvelope(command, error, [])) + '\n');
|
|
94
|
+
process.exitCode = exitCodeOf(error);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=remote-entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-entry.js","sourceRoot":"","sources":["../src/remote-entry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/app-installer",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.7",
|
|
4
4
|
"description": "Install, upgrade and roll back a NocoBase 3 application on a server from a deployment archive.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"prettier": "@nocobase/dev-config/prettier",
|