@alexberardi/jarvis-admin 0.1.84 → 0.1.86
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/package.json +1 -1
- package/public/assets/index-4TF68MKN.css +1 -0
- package/public/assets/index-BoF60OKD.js +18 -0
- package/public/index.html +2 -2
- package/server/dist/data/service-registry.json +1 -1
- package/server/dist/index.js +8 -0
- package/server/dist/index.js.map +1 -1
- package/server/dist/routes/update.d.ts.map +1 -1
- package/server/dist/routes/update.js +41 -4
- package/server/dist/routes/update.js.map +1 -1
- package/server/dist/services/upgrade/resume.d.ts +23 -0
- package/server/dist/services/upgrade/resume.d.ts.map +1 -0
- package/server/dist/services/upgrade/resume.js +80 -0
- package/server/dist/services/upgrade/resume.js.map +1 -0
- package/server/src/data/service-registry.json +1 -1
- package/public/assets/index-4y8tSbZj.js +0 -18
- package/public/assets/index-CAv1RM9y.css +0 -1
package/public/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<link rel="icon" type="image/png" href="/favicon.png" />
|
|
7
7
|
<title>Jarvis Admin</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-BoF60OKD.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-4TF68MKN.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/server/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { createDockerService } from './services/docker.js';
|
|
|
10
10
|
import { createComposeService } from './services/compose.js';
|
|
11
11
|
import { createRegistryService } from './services/registry.js';
|
|
12
12
|
import { ensureDockerOnPath } from './services/docker-path.js';
|
|
13
|
+
import { resumeUpgradeIfPending } from './services/upgrade/resume.js';
|
|
13
14
|
import { shouldRedirectWhenInstalled } from './services/admin-lifecycle.js';
|
|
14
15
|
const REPO = 'alexberardi/jarvis-admin';
|
|
15
16
|
function openBrowser(url) {
|
|
@@ -107,6 +108,13 @@ async function main() {
|
|
|
107
108
|
const app = await buildApp({ config, docker, compose, registry });
|
|
108
109
|
await app.listen({ port: config.port, host: '0.0.0.0' });
|
|
109
110
|
console.log(`jarvis-admin server listening on port ${config.port}`);
|
|
111
|
+
// A standalone upgrade can't finish in one pass: selfUpdate() swaps the binary
|
|
112
|
+
// and restarts the process, killing the request mid-flight. It leaves a marker
|
|
113
|
+
// so THIS boot can finish the job (compose regen → pull → restart → verify).
|
|
114
|
+
// Deliberately not awaited: it pulls images and restarts containers, which
|
|
115
|
+
// takes minutes, and the UI must be up while it runs — that's where the user
|
|
116
|
+
// watches /api/update/status.
|
|
117
|
+
void resumeUpgradeIfPending(app, VERSION);
|
|
110
118
|
openBrowser(`http://localhost:${config.port}`);
|
|
111
119
|
}
|
|
112
120
|
main().catch((err) => {
|
package/server/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAO9C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAkBD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGtE"}
|
|
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { requireSuperuser } from '../middleware/auth.js';
|
|
5
|
+
import { savePersistedConfig } from '../config.js';
|
|
5
6
|
import { checkForUpdate } from '../services/update-checker.js';
|
|
6
7
|
const UPGRADE_MARKER = join(homedir(), '.jarvis', 'upgrade-in-progress.json');
|
|
7
8
|
function getUpgradeStatus() {
|
|
@@ -17,25 +18,61 @@ function getUpgradeStatus() {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
export async function updateRoutes(app) {
|
|
21
|
+
/**
|
|
22
|
+
* Read the box-level update opt-in.
|
|
23
|
+
*
|
|
24
|
+
* Unauthenticated, like `/check` — it's a single boolean about this box's own
|
|
25
|
+
* configuration, and the SPA needs it before login to render the update card
|
|
26
|
+
* honestly.
|
|
27
|
+
*/
|
|
28
|
+
app.get('/settings', async (_request, reply) => {
|
|
29
|
+
return reply.send({ allowUpdates: app.config.allowUpdates });
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Flip the box-level update opt-in (superuser only).
|
|
33
|
+
*
|
|
34
|
+
* This exists because the flag used to be reachable ONLY by hand-editing a
|
|
35
|
+
* launchd plist (or compose .env) and restarting the service — which put the
|
|
36
|
+
* documented update path out of reach of the non-technical self-hosters it was
|
|
37
|
+
* written for.
|
|
38
|
+
*
|
|
39
|
+
* Persisted to ~/.jarvis/admin.json, which `loadConfig` already prefers over
|
|
40
|
+
* the `JARVIS_ALLOW_UPDATES` env var, so it survives a restart. We also mutate
|
|
41
|
+
* the live config so it takes effect immediately — otherwise the user would
|
|
42
|
+
* flip the switch and nothing would happen until they restarted, which is the
|
|
43
|
+
* very papercut we're removing.
|
|
44
|
+
*/
|
|
45
|
+
app.post('/settings', { preHandler: requireSuperuser }, async (request, reply) => {
|
|
46
|
+
const body = request.body;
|
|
47
|
+
const allowUpdates = body?.allowUpdates;
|
|
48
|
+
if (typeof allowUpdates !== 'boolean') {
|
|
49
|
+
return reply.code(400).send({ error: 'allowUpdates must be a boolean' });
|
|
50
|
+
}
|
|
51
|
+
savePersistedConfig({ allowUpdates });
|
|
52
|
+
app.config.allowUpdates = allowUpdates;
|
|
53
|
+
app.log.info({ allowUpdates }, 'update opt-in changed');
|
|
54
|
+
return reply.send({ allowUpdates });
|
|
55
|
+
});
|
|
20
56
|
/** Check for available updates (no auth required — informational) */
|
|
21
57
|
app.get('/check', async (_request, reply) => {
|
|
22
58
|
const info = await checkForUpdate(false, app.config.allowUpdates);
|
|
23
|
-
return reply.send(info);
|
|
59
|
+
return reply.send({ ...info, updatesEnabled: app.config.allowUpdates });
|
|
24
60
|
});
|
|
25
61
|
/** Force a fresh update check */
|
|
26
62
|
app.post('/check', async (_request, reply) => {
|
|
27
63
|
const info = await checkForUpdate(true, app.config.allowUpdates);
|
|
28
|
-
return reply.send(info);
|
|
64
|
+
return reply.send({ ...info, updatesEnabled: app.config.allowUpdates });
|
|
29
65
|
});
|
|
30
66
|
/** Get current upgrade status (is an upgrade in progress?) */
|
|
31
67
|
app.get('/status', async (_request, reply) => {
|
|
32
68
|
return reply.send(getUpgradeStatus());
|
|
33
69
|
});
|
|
34
70
|
/** Apply an update — SSE endpoint that orchestrates the full upgrade */
|
|
35
|
-
app.post('/apply', { preHandler: requireSuperuser }, async (
|
|
71
|
+
app.post('/apply', { preHandler: requireSuperuser }, async (_request, reply) => {
|
|
36
72
|
if (!app.config.allowUpdates) {
|
|
37
73
|
return reply.code(403).send({
|
|
38
|
-
error: 'Updates are disabled.
|
|
74
|
+
error: 'Updates are disabled. Turn on "Check for updates" in the admin UI ' +
|
|
75
|
+
'(or POST /api/update/settings {"allowUpdates":true}).',
|
|
39
76
|
});
|
|
40
77
|
}
|
|
41
78
|
const info = await checkForUpdate(true, app.config.allowUpdates);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAA;AAS7E,SAAS,gBAAgB;IACvB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;IAC9B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAI5D,CAAA;QACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAoB;IACrD,qEAAqE;IACrE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
/**
|
|
3
|
+
* Finish an upgrade that was interrupted by the admin restarting into its new
|
|
4
|
+
* binary.
|
|
5
|
+
*
|
|
6
|
+
* The standalone upgrade path can't complete in one pass: `selfUpdate()` swaps
|
|
7
|
+
* the binary and restarts the process, which kills the request (and the SSE
|
|
8
|
+
* stream) mid-flight. It leaves `~/.jarvis/upgrade-in-progress.json` behind so
|
|
9
|
+
* the NEW binary can pick up where the old one died — compose regen, image pull,
|
|
10
|
+
* service restart, health verify.
|
|
11
|
+
*
|
|
12
|
+
* That hand-off was never wired: `resumeUpgrade()` existed, and nothing called
|
|
13
|
+
* it. The result was that the Update button on native installs updated the admin
|
|
14
|
+
* binary and *nothing else* — services stayed on their old images, the marker
|
|
15
|
+
* sat at "binary-updated" forever, and `/api/update/status` reported an upgrade
|
|
16
|
+
* permanently in progress.
|
|
17
|
+
*
|
|
18
|
+
* Called from startup, deliberately NOT awaited by the listen path: the upgrade
|
|
19
|
+
* pulls images and restarts containers, which takes minutes, and the admin UI
|
|
20
|
+
* has to be up during it (that's where the user watches `/api/update/status`).
|
|
21
|
+
*/
|
|
22
|
+
export declare function resumeUpgradeIfPending(app: FastifyInstance, runningVersion: string): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=resume.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/services/upgrade/resume.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAwB9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { savePersistedConfig } from '../../config.js';
|
|
5
|
+
const MARKER = () => join(homedir(), '.jarvis', 'upgrade-in-progress.json');
|
|
6
|
+
function readMarker() {
|
|
7
|
+
const path = MARKER();
|
|
8
|
+
if (!existsSync(path))
|
|
9
|
+
return null;
|
|
10
|
+
try {
|
|
11
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// Corrupt marker: we can't know what it wanted. Drop it rather than block boot.
|
|
15
|
+
unlinkSync(path);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Finish an upgrade that was interrupted by the admin restarting into its new
|
|
21
|
+
* binary.
|
|
22
|
+
*
|
|
23
|
+
* The standalone upgrade path can't complete in one pass: `selfUpdate()` swaps
|
|
24
|
+
* the binary and restarts the process, which kills the request (and the SSE
|
|
25
|
+
* stream) mid-flight. It leaves `~/.jarvis/upgrade-in-progress.json` behind so
|
|
26
|
+
* the NEW binary can pick up where the old one died — compose regen, image pull,
|
|
27
|
+
* service restart, health verify.
|
|
28
|
+
*
|
|
29
|
+
* That hand-off was never wired: `resumeUpgrade()` existed, and nothing called
|
|
30
|
+
* it. The result was that the Update button on native installs updated the admin
|
|
31
|
+
* binary and *nothing else* — services stayed on their old images, the marker
|
|
32
|
+
* sat at "binary-updated" forever, and `/api/update/status` reported an upgrade
|
|
33
|
+
* permanently in progress.
|
|
34
|
+
*
|
|
35
|
+
* Called from startup, deliberately NOT awaited by the listen path: the upgrade
|
|
36
|
+
* pulls images and restarts containers, which takes minutes, and the admin UI
|
|
37
|
+
* has to be up during it (that's where the user watches `/api/update/status`).
|
|
38
|
+
*/
|
|
39
|
+
export async function resumeUpgradeIfPending(app, runningVersion) {
|
|
40
|
+
const marker = readMarker();
|
|
41
|
+
if (!marker)
|
|
42
|
+
return;
|
|
43
|
+
// Already failed once. Don't retry on every boot — that would turn a broken
|
|
44
|
+
// upgrade into a pull/restart loop. Leave it so the UI can surface the error.
|
|
45
|
+
if (marker.phase === 'error') {
|
|
46
|
+
app.log.warn({ marker }, 'previous upgrade failed; not retrying automatically (clear ~/.jarvis/upgrade-in-progress.json to reset)');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// The marker was written for a different version than the one now running, so
|
|
50
|
+
// the binary swap did not land the way the updater thought (rollback, or a
|
|
51
|
+
// hand-installed binary). Resuming would regenerate compose for a version we
|
|
52
|
+
// aren't running — worse than doing nothing.
|
|
53
|
+
if (marker.version !== runningVersion) {
|
|
54
|
+
app.log.warn({ markerVersion: marker.version, runningVersion }, 'discarding stale upgrade marker (version mismatch)');
|
|
55
|
+
unlinkSync(MARKER());
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
app.log.info({ version: marker.version }, 'resuming upgrade after binary restart');
|
|
59
|
+
try {
|
|
60
|
+
const { resumeUpgrade } = await import('./orchestrator.js');
|
|
61
|
+
await resumeUpgrade(app, marker, (data) => {
|
|
62
|
+
app.log.info({ upgrade: data }, 'upgrade progress');
|
|
63
|
+
});
|
|
64
|
+
unlinkSync(MARKER());
|
|
65
|
+
// Only now is the upgrade real: the binary AND the services are on the new
|
|
66
|
+
// version. Recording it earlier would claim success for a stack that never
|
|
67
|
+
// moved.
|
|
68
|
+
savePersistedConfig({ installedVersion: marker.version });
|
|
69
|
+
app.log.info({ version: marker.version }, 'upgrade complete');
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
73
|
+
// Keep the marker so the failure is visible (and so we don't silently
|
|
74
|
+
// pretend the upgrade finished), but mark it failed so the next boot doesn't
|
|
75
|
+
// retry into the same wall.
|
|
76
|
+
writeFileSync(MARKER(), JSON.stringify({ ...marker, phase: 'error', error: message }));
|
|
77
|
+
app.log.error({ err: message, version: marker.version }, 'upgrade resume failed');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/services/upgrade/resume.ts"],"names":[],"mappings":"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"}
|