@or3/cloud 0.1.62 → 0.1.64
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 +5 -0
- package/assets/dashboard-operator.mjs +4 -29
- package/dist/cli.mjs +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -58,6 +58,11 @@ npx @or3/cloud stop
|
|
|
58
58
|
npx @or3/cloud restart
|
|
59
59
|
```
|
|
60
60
|
|
|
61
|
+
The canonical procedure for both development and managed deployments is
|
|
62
|
+
[Updating OR3](https://github.com/Saluana/or3-chat/blob/or3-cloud/docs/cloud-updates.md).
|
|
63
|
+
This package is the managed path: it accepts only published stable releases and
|
|
64
|
+
never a development image.
|
|
65
|
+
|
|
61
66
|
Run `verify` after every update and before declaring a deployment healthy. It
|
|
62
67
|
checks the managed image digest, deep provider health, Basic Auth sign-in,
|
|
63
68
|
session hydration, SQLite sync, a disposable filesystem upload/download/delete
|
|
@@ -643,36 +643,8 @@ async function completeOperatorHandoff(jobId, project) {
|
|
|
643
643
|
) {
|
|
644
644
|
const environment = await deploymentEnv();
|
|
645
645
|
if (envValue(environment, 'OR3_DASHBOARD_UPDATES_ENABLED') !== 'true') return;
|
|
646
|
-
const serviceFilters = [
|
|
647
|
-
'--filter', `label=com.docker.compose.project=${project}`,
|
|
648
|
-
'--filter', 'label=com.docker.compose.service=or3-operator',
|
|
649
|
-
];
|
|
650
646
|
let lastOutput = '';
|
|
651
647
|
for (let attempt = 0; attempt < 6; attempt += 1) {
|
|
652
|
-
// Old protocol-v1 operators may start their own Compose replacement
|
|
653
|
-
// after writing the terminal job. Removing every container for this
|
|
654
|
-
// one stateless service also kills that in-container Compose child and
|
|
655
|
-
// clears any half-created successor without touching the application.
|
|
656
|
-
for (let sweep = 0; sweep < 2; sweep += 1) {
|
|
657
|
-
const listed = await runProcess('docker', ['ps', '-aq', ...serviceFilters], {
|
|
658
|
-
cwd: deploymentDirectory,
|
|
659
|
-
env: process.env,
|
|
660
|
-
timeoutMs: 30_000,
|
|
661
|
-
});
|
|
662
|
-
lastOutput = listed.output;
|
|
663
|
-
const containerIds = listed.code === 0
|
|
664
|
-
? listed.output.split(/\s+/).filter((value) => /^[0-9a-f]{12,64}$/i.test(value))
|
|
665
|
-
: [];
|
|
666
|
-
if (containerIds.length > 0) {
|
|
667
|
-
const removed = await runProcess('docker', ['rm', '--force', ...containerIds], {
|
|
668
|
-
cwd: deploymentDirectory,
|
|
669
|
-
env: process.env,
|
|
670
|
-
timeoutMs: 30_000,
|
|
671
|
-
});
|
|
672
|
-
lastOutput = `${lastOutput}\n${removed.output}`.trim();
|
|
673
|
-
}
|
|
674
|
-
await delay(750);
|
|
675
|
-
}
|
|
676
648
|
const compose = [
|
|
677
649
|
'compose',
|
|
678
650
|
'--project-name', project,
|
|
@@ -681,7 +653,10 @@ async function completeOperatorHandoff(jobId, project) {
|
|
|
681
653
|
'-f', join(deploymentDirectory, 'compose.yaml'),
|
|
682
654
|
'-f', join(deploymentDirectory, 'compose.operator.yaml'),
|
|
683
655
|
];
|
|
684
|
-
|
|
656
|
+
// Compose owns the replacement transaction. Removing the current
|
|
657
|
+
// operator first creates an avoidable gap and, on some daemons, races
|
|
658
|
+
// the service's restart policy so that no successor remains.
|
|
659
|
+
const restarted = await runProcess('docker', [...compose, 'up', '-d', '--no-deps', '--force-recreate', 'or3-operator'], {
|
|
685
660
|
cwd: deploymentDirectory,
|
|
686
661
|
env: process.env,
|
|
687
662
|
timeoutMs: 60_000,
|
package/dist/cli.mjs
CHANGED
|
@@ -30,7 +30,7 @@ import { fileURLToPath } from "node:url";
|
|
|
30
30
|
import { createGunzip } from "node:zlib";
|
|
31
31
|
var execFile = promisify(execFileCallback);
|
|
32
32
|
var PACKAGE_ROOT = resolve(fileURLToPath(new URL("../", import.meta.url)));
|
|
33
|
-
var PACKAGE_VERSION = "0.1.
|
|
33
|
+
var PACKAGE_VERSION = "0.1.64";
|
|
34
34
|
var IMAGE_REPOSITORY = "ghcr.io/saluana/or3-chat";
|
|
35
35
|
var ASSET_ROOT = resolve(fileURLToPath(new URL("../assets/", import.meta.url)));
|
|
36
36
|
var STATE_SCHEMA_VERSION = 1;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@or3/cloud",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.64",
|
|
4
4
|
"description": "Install and operate the OR3 Cloud container distribution",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
"or3Cloud": {
|
|
19
19
|
"dashboardUpdateProtocol": 1,
|
|
20
20
|
"dashboardUpdateMinimumSourceVersion": "0.1.40",
|
|
21
|
-
"imageDigest": "sha256:
|
|
22
|
-
"operatorImageDigest": "sha256:
|
|
23
|
-
"sourceRevision": "
|
|
21
|
+
"imageDigest": "sha256:c0899969a8a93c91b68933c898984d927e9af1db2f24d45c065d9a3d47336a28",
|
|
22
|
+
"operatorImageDigest": "sha256:cbbb6f3cbc51c07a98cace1deb0cca9784b0eaf7cbf727f739b44068d85aac90",
|
|
23
|
+
"sourceRevision": "e63d5aeae215de841d5e440730367918c2802575"
|
|
24
24
|
},
|
|
25
25
|
"files": [
|
|
26
26
|
"dist",
|