@serve.zone/appstore 33.24.1 → 33.25.0
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/changelog.md +10 -0
- package/dist_catalog/catalog.digest +1 -1
- package/dist_catalog/catalog.envelope.json +195 -6
- package/dist_catalog/catalog.json +193 -4
- package/package.json +2 -2
- package/readme.md +10 -2
package/changelog.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-11-14 - 33.25.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- Linus ruling 118 F2: add Cloudly template 1.31.0, the controller-host template.
|
|
8
|
+
- 1.31.0 is 1.29.18's config on the same Cloudly 33.34.1 image (`code.foss.global/serve.zone/cloudly@sha256:929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8`) with `hostRoles: ["controllerHost"]`, `host.roles` added to `requiresFeatures` and `platformOidc` removed; it is the new `latestVersion`. An Onebox that advertises `host.roles` installs it and no other template; Onebox 33.17.2 (appstore 33.6.0), Onebox main (33.21.2) and Cloudly 33.34.1 (33.15.1) activate the catalog, list 1.31.0 without installing it and keep every install target they have.
|
|
9
|
+
- No other app or published version changes: every published version states no `hostRoles` and is a cluster version.
|
|
10
|
+
- Move to `@serve.zone/interfaces` 32.86.0 (the release carrying `hostRoles`, `appStoreHostRolesFeatureId` and the `hostRoleUnsupported` judgement).
|
|
11
|
+
- This minor release's catalog revision is 33000025000000, which no signed catalog has used; 1.31.0 is unused too.
|
|
12
|
+
|
|
3
13
|
## 2026-11-14 - 33.24.1
|
|
4
14
|
|
|
5
15
|
### Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
sha256:
|
|
1
|
+
sha256:3bca9220ce6310eeb4516472641942cf2602921475b89989d83e858596b008c0
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"major": 1,
|
|
6
6
|
"minor": 0
|
|
7
7
|
},
|
|
8
|
-
"revision":
|
|
9
|
-
"publishedAt": "2026-11-
|
|
10
|
-
"sourceRevision": "
|
|
8
|
+
"revision": 33000025000000,
|
|
9
|
+
"publishedAt": "2026-11-14T11:43:19.000Z",
|
|
10
|
+
"sourceRevision": "67b903728902f11c6e3b5c3fb190da04ae834adc",
|
|
11
11
|
"apps": [
|
|
12
12
|
{
|
|
13
13
|
"info": {
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"Docs": "https://serve.zone"
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
|
-
"latestVersion": "1.
|
|
63
|
+
"latestVersion": "1.31.0",
|
|
64
64
|
"versions": [
|
|
65
65
|
{
|
|
66
66
|
"version": "1.0.0",
|
|
@@ -13341,6 +13341,195 @@
|
|
|
13341
13341
|
}
|
|
13342
13342
|
},
|
|
13343
13343
|
"configDigest": "sha256:7d88ac5ff1084b91a0b52799e681d29d1c852fcaefe4ad03d0f346e217f2a1f6"
|
|
13344
|
+
},
|
|
13345
|
+
{
|
|
13346
|
+
"version": "1.31.0",
|
|
13347
|
+
"config": {
|
|
13348
|
+
"image": "code.foss.global/serve.zone/cloudly@sha256:929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8",
|
|
13349
|
+
"targetPorts": [
|
|
13350
|
+
{
|
|
13351
|
+
"name": "web",
|
|
13352
|
+
"port": 3000,
|
|
13353
|
+
"protocol": "http",
|
|
13354
|
+
"default": true
|
|
13355
|
+
}
|
|
13356
|
+
],
|
|
13357
|
+
"envVars": [
|
|
13358
|
+
{
|
|
13359
|
+
"key": "SERVEZONE_ENVIRONMENT",
|
|
13360
|
+
"value": "production",
|
|
13361
|
+
"description": "Cloudly runtime environment.",
|
|
13362
|
+
"required": true
|
|
13363
|
+
},
|
|
13364
|
+
{
|
|
13365
|
+
"key": "SERVEZONE_PUBLIC_ORIGIN",
|
|
13366
|
+
"value": "https://${SERVICE_DOMAIN}",
|
|
13367
|
+
"description": "Canonical public Cloudly origin including protocol and optional public port.",
|
|
13368
|
+
"required": true
|
|
13369
|
+
},
|
|
13370
|
+
{
|
|
13371
|
+
"key": "SERVEZONE_LISTENPORT",
|
|
13372
|
+
"value": "3000",
|
|
13373
|
+
"description": "Internal Cloudly HTTP port inside the container.",
|
|
13374
|
+
"required": true
|
|
13375
|
+
},
|
|
13376
|
+
{
|
|
13377
|
+
"key": "SERVEZONE_SSLMODE",
|
|
13378
|
+
"value": "external",
|
|
13379
|
+
"description": "Use external TLS termination through Onebox or dcrouter.",
|
|
13380
|
+
"required": true
|
|
13381
|
+
},
|
|
13382
|
+
{
|
|
13383
|
+
"key": "SERVEZONE_SECRET_KEYRING_PATH",
|
|
13384
|
+
"value": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
13385
|
+
"description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
|
|
13386
|
+
"required": true
|
|
13387
|
+
},
|
|
13388
|
+
{
|
|
13389
|
+
"key": "SERVEZONE_SECRET_KEYRING_FILE",
|
|
13390
|
+
"description": "Existing Cloudly Secrets v2 keyring. Onebox stores it encrypted and mounts it only as a root-readable file; retain the existing keyring when upgrading.",
|
|
13391
|
+
"required": true,
|
|
13392
|
+
"secret": true,
|
|
13393
|
+
"delivery": {
|
|
13394
|
+
"type": "file",
|
|
13395
|
+
"targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
13396
|
+
"uid": 0,
|
|
13397
|
+
"gid": 0,
|
|
13398
|
+
"mode": 256
|
|
13399
|
+
}
|
|
13400
|
+
},
|
|
13401
|
+
{
|
|
13402
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
|
|
13403
|
+
"value": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
13404
|
+
"description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
|
|
13405
|
+
"required": true
|
|
13406
|
+
},
|
|
13407
|
+
{
|
|
13408
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
|
|
13409
|
+
"description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
|
|
13410
|
+
"required": true,
|
|
13411
|
+
"secret": true,
|
|
13412
|
+
"delivery": {
|
|
13413
|
+
"type": "file",
|
|
13414
|
+
"targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
13415
|
+
"uid": 0,
|
|
13416
|
+
"gid": 0,
|
|
13417
|
+
"mode": 256
|
|
13418
|
+
}
|
|
13419
|
+
},
|
|
13420
|
+
{
|
|
13421
|
+
"key": "MONGODB_URL",
|
|
13422
|
+
"value": "${MONGODB_URI}",
|
|
13423
|
+
"description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
|
|
13424
|
+
"required": true
|
|
13425
|
+
},
|
|
13426
|
+
{
|
|
13427
|
+
"key": "MONGODB_NAME",
|
|
13428
|
+
"value": "${MONGODB_DATABASE}",
|
|
13429
|
+
"description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
|
|
13430
|
+
"required": true
|
|
13431
|
+
},
|
|
13432
|
+
{
|
|
13433
|
+
"key": "MONGODB_USER",
|
|
13434
|
+
"value": "${MONGODB_USERNAME}",
|
|
13435
|
+
"description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
|
|
13436
|
+
"required": true
|
|
13437
|
+
},
|
|
13438
|
+
{
|
|
13439
|
+
"key": "MONGODB_PASS",
|
|
13440
|
+
"value": "${MONGODB_PASSWORD}",
|
|
13441
|
+
"description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
|
|
13442
|
+
"required": true
|
|
13443
|
+
},
|
|
13444
|
+
{
|
|
13445
|
+
"key": "S3_ENDPOINT",
|
|
13446
|
+
"value": "onebox-corestore",
|
|
13447
|
+
"description": "S3 endpoint host provisioned by Onebox Corestore.",
|
|
13448
|
+
"required": true
|
|
13449
|
+
},
|
|
13450
|
+
{
|
|
13451
|
+
"key": "S3_PORT",
|
|
13452
|
+
"value": "9000",
|
|
13453
|
+
"description": "S3 endpoint port provisioned by Onebox Corestore.",
|
|
13454
|
+
"required": true
|
|
13455
|
+
},
|
|
13456
|
+
{
|
|
13457
|
+
"key": "S3_USESSL",
|
|
13458
|
+
"value": "false",
|
|
13459
|
+
"description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
|
|
13460
|
+
"required": true
|
|
13461
|
+
},
|
|
13462
|
+
{
|
|
13463
|
+
"key": "S3_BUCKET",
|
|
13464
|
+
"value": "${S3_BUCKET}",
|
|
13465
|
+
"description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
|
|
13466
|
+
"required": true
|
|
13467
|
+
},
|
|
13468
|
+
{
|
|
13469
|
+
"key": "S3_ACCESSKEY",
|
|
13470
|
+
"value": "${S3_ACCESS_KEY}",
|
|
13471
|
+
"description": "S3 access key provisioned by Onebox Corestore.",
|
|
13472
|
+
"required": true
|
|
13473
|
+
},
|
|
13474
|
+
{
|
|
13475
|
+
"key": "S3_SECRETKEY",
|
|
13476
|
+
"value": "${S3_SECRET_KEY}",
|
|
13477
|
+
"description": "S3 secret key provisioned by Onebox Corestore.",
|
|
13478
|
+
"required": true
|
|
13479
|
+
},
|
|
13480
|
+
{
|
|
13481
|
+
"key": "CLOUDLY_BACKUP_CRON",
|
|
13482
|
+
"value": "15 2 * * *",
|
|
13483
|
+
"description": "Schedule of Cloudly's backup-all-services task, which backs up every workload service's databases (not its object storage); Cloudly registers the task only while this is set. Daily at 02:15 UTC, clear of Onebox's backup-archive-prune at 03:00.",
|
|
13484
|
+
"required": false
|
|
13485
|
+
},
|
|
13486
|
+
{
|
|
13487
|
+
"key": "SERVEZONE_ADMINACCOUNT",
|
|
13488
|
+
"description": "Optional private first-start Cloudly operator in username:password form. Required by the fresh empty-instance workflow, never the reviewer credential. Supply only through sealed secret input; no default or automatic generation. Remove the bootstrap input with the Onebox owner command after first boot; revoking its persisted Cloudly password is a separate fresh-human credential action. Existing installations leave this unset.",
|
|
13489
|
+
"required": false,
|
|
13490
|
+
"secret": true,
|
|
13491
|
+
"delivery": {
|
|
13492
|
+
"type": "launcher-environment",
|
|
13493
|
+
"variableName": "SERVEZONE_ADMINACCOUNT",
|
|
13494
|
+
"uid": 0,
|
|
13495
|
+
"gid": 0,
|
|
13496
|
+
"mode": 256
|
|
13497
|
+
}
|
|
13498
|
+
}
|
|
13499
|
+
],
|
|
13500
|
+
"platformRequirements": {
|
|
13501
|
+
"mongodb": true,
|
|
13502
|
+
"s3": true
|
|
13503
|
+
},
|
|
13504
|
+
"backupExclusions": [
|
|
13505
|
+
{
|
|
13506
|
+
"storageRequest": "legacy-s3",
|
|
13507
|
+
"keyPrefixes": [
|
|
13508
|
+
"runtime-logs/"
|
|
13509
|
+
],
|
|
13510
|
+
"reason": "Workload logs; a restore brings back state, not past logs."
|
|
13511
|
+
}
|
|
13512
|
+
],
|
|
13513
|
+
"hostRoles": [
|
|
13514
|
+
"controllerHost"
|
|
13515
|
+
],
|
|
13516
|
+
"minOneboxVersion": "33.8.0",
|
|
13517
|
+
"changelog": "Cloudly 1.31.0 is the controller-host template (Linus ruling 118 F2): 1.29.18 on the same published Cloudly 33.34.1 image 929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8, with hostRoles [\"controllerHost\"] and without platformOidc; nothing else changes. It requires host.roles: an Onebox that advertises host.roles (34.0.0 and later) installs it and no Cloudly template before it, while an Onebox 33.x and Cloudly list it without reading its config and never install it. Without platformOidc the host registers no platform OIDC client and injects no SERVEZONE_PLATFORM_OIDC_* names; sign-in is Cloudly's own. An upgrade from 1.29.18 changes only these declarations: the image and the data version 0.42.0 stay. An upgrade from an older template runs the forward-only data steps the rest of this changelog lists; stop the old Cloudly first. 1.31.0 sorts above every 1.30.x template, so no host that judges host roles moves an installation from it to a 1.30.x template on the older 33.26.0 image. An installation on a 1.30.x template is offered 1.31.0 on such a host: it moves forward to the 33.34.1 image and its data steps, and it runs without the databaseBackupExclusions declaration of 1.30.x until a later 1.31.x template declares it, so its database backups include the log collections again. The rest of this changelog is that of 1.29.18 and holds for this template: Move Cloudly to 33.34.1 on the config of 1.29.17: 1.29.18 differs from 1.29.17 only in its image and its changelog. The image is the published multi-platform index 929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8 (linux/amd64 and linux/arm64), not a rebuild or a floating tag. Cloudly 33.34.1 carries 33.33.0 and 33.34.0: the controller gateway channel and gateway adoption with one-time codes (a legacy gateway is called as before until an administrator adopts it), the controller lease (a second Cloudly on one database is refused by name), a bounded object storage wait at start and Cloudly-owned CoreMail storage, which stays dormant while coreMailEnabled is not set; 33.34.1 takes the CoreMail statistics page limit from the interfaces contract. It adds no environment variable this template must declare. No data step: the data version stays 0.42.0. Upgrade only with the old Cloudly service stopped first: Cloudly 33.32.0 and older take no controller lease, so a still-running old Cloudly is not refused and two controllers would share one database. Forward-only: once 33.34.1 has started on a database, no earlier Cloudly image runs on it. 33.32.0 and 33.33.0 would accept data version 0.42.0 because no image guard exists, so this rule is enforced by operation, not by code. Upgrade path, from every template it is offered to (1.28.3, 1.28.5, 1.28.6, 1.29.0 to 1.29.12, 1.29.14, 1.29.16 and 1.29.17, on a host that fulfils storage.object-storage.backup-exclusions): from 1.29.17 it runs no data step. From 1.29.16 it runs the forward-only data step of 33.32.0, legacy-gateway (0.41.0 to 0.42.0). From 1.29.14 or 1.29.12 it first also runs the two forward-only data steps of 33.31.0: npm-registry-unverified (0.39.0 to 0.40.0) and initial-location (0.40.0 to 0.41.0). From 1.29.11, 1.29.10 or 1.29.9 it first also runs the six forward-only data steps of 33.28.0: service-hostname-canonical (0.33.0 to 0.34.0), runtime-authority-tokens (0.34.0 to 0.35.0), runtime-assignment-failures (0.35.0 to 0.36.0), bounded-slot-history (0.36.0 to 0.37.0), spark-fleet-target (0.37.0 to 0.38.0) and node-action-carrier-expiry (0.38.0 to 0.39.0). From 1.29.8 or 1.29.7 it first also runs retire-stale-reconciliation-stages (0.32.0 to 0.33.0); from 1.29.6 to 1.29.2 also retire-corestore-environment-secrets (0.31.0 to 0.32.0); from 1.29.1, 1.29.0, 1.28.6, 1.28.5 or 1.28.3 also service-reconciliation-observations (0.30.0 to 0.31.0). Keep breaking, requiresManualReview, migrationRequired and backupBeforeUpgrade set. 1.29.18 sorts below 1.30.0, so a 1.30.x installation never takes it. 1.30.8 and 1.30.9 run the older Cloudly 33.26.0 image, which refuses data version 0.42.0: an installation on 1.29.18 must not move to 1.30.8 or 1.30.9, even on a host that later fulfils storage.database.backup-exclusions, and waits for a 1.30.x template on Cloudly 33.34.1 or later. 1.29.13 and 1.29.15 were signed locally and never published; their versions are never used again. A catalog publication does not install this version or upgrade a control plane. cloudly@1.29.12 holds the older cumulative history.",
|
|
13518
|
+
"breaking": true,
|
|
13519
|
+
"requiresManualReview": true,
|
|
13520
|
+
"migrationRequired": true,
|
|
13521
|
+
"backupBeforeUpgrade": true,
|
|
13522
|
+
"requiresFeatures": [
|
|
13523
|
+
"host.roles",
|
|
13524
|
+
"storage.object-storage.backup-exclusions"
|
|
13525
|
+
],
|
|
13526
|
+
"healthCheck": {
|
|
13527
|
+
"path": "/status",
|
|
13528
|
+
"port": 3000,
|
|
13529
|
+
"expectedStatus": 200
|
|
13530
|
+
}
|
|
13531
|
+
},
|
|
13532
|
+
"configDigest": "sha256:29d409d664e6e884f218d591e9b35f5233f1f938389cf4bf377f673c8719bc6f"
|
|
13344
13533
|
}
|
|
13345
13534
|
]
|
|
13346
13535
|
},
|
|
@@ -14114,11 +14303,11 @@
|
|
|
14114
14303
|
}
|
|
14115
14304
|
]
|
|
14116
14305
|
},
|
|
14117
|
-
"catalogDigest": "sha256:
|
|
14306
|
+
"catalogDigest": "sha256:3bca9220ce6310eeb4516472641942cf2602921475b89989d83e858596b008c0",
|
|
14118
14307
|
"signatures": [
|
|
14119
14308
|
{
|
|
14120
14309
|
"keyId": "sha256:58956c3537cdf542430d6685261824776d6128ebb9a93b3d77b53f2d031ba854",
|
|
14121
|
-
"signature": "
|
|
14310
|
+
"signature": "b6a5d8d8e49969ca18dae2a3406ea805a15b4fe423f243d841e90c6961225af4ed86123e8b1f76a9b2fa7adfbbc3019dae1f8073c42a8ac19cf85e3287f6df0e"
|
|
14122
14311
|
}
|
|
14123
14312
|
]
|
|
14124
14313
|
}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
"major": 1,
|
|
5
5
|
"minor": 0
|
|
6
6
|
},
|
|
7
|
-
"revision":
|
|
8
|
-
"publishedAt": "2026-11-
|
|
9
|
-
"sourceRevision": "
|
|
7
|
+
"revision": 33000025000000,
|
|
8
|
+
"publishedAt": "2026-11-14T11:43:19.000Z",
|
|
9
|
+
"sourceRevision": "67b903728902f11c6e3b5c3fb190da04ae834adc",
|
|
10
10
|
"apps": [
|
|
11
11
|
{
|
|
12
12
|
"info": {
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"Docs": "https://serve.zone"
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
|
-
"latestVersion": "1.
|
|
62
|
+
"latestVersion": "1.31.0",
|
|
63
63
|
"versions": [
|
|
64
64
|
{
|
|
65
65
|
"version": "1.0.0",
|
|
@@ -13340,6 +13340,195 @@
|
|
|
13340
13340
|
}
|
|
13341
13341
|
},
|
|
13342
13342
|
"configDigest": "sha256:7d88ac5ff1084b91a0b52799e681d29d1c852fcaefe4ad03d0f346e217f2a1f6"
|
|
13343
|
+
},
|
|
13344
|
+
{
|
|
13345
|
+
"version": "1.31.0",
|
|
13346
|
+
"config": {
|
|
13347
|
+
"image": "code.foss.global/serve.zone/cloudly@sha256:929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8",
|
|
13348
|
+
"targetPorts": [
|
|
13349
|
+
{
|
|
13350
|
+
"name": "web",
|
|
13351
|
+
"port": 3000,
|
|
13352
|
+
"protocol": "http",
|
|
13353
|
+
"default": true
|
|
13354
|
+
}
|
|
13355
|
+
],
|
|
13356
|
+
"envVars": [
|
|
13357
|
+
{
|
|
13358
|
+
"key": "SERVEZONE_ENVIRONMENT",
|
|
13359
|
+
"value": "production",
|
|
13360
|
+
"description": "Cloudly runtime environment.",
|
|
13361
|
+
"required": true
|
|
13362
|
+
},
|
|
13363
|
+
{
|
|
13364
|
+
"key": "SERVEZONE_PUBLIC_ORIGIN",
|
|
13365
|
+
"value": "https://${SERVICE_DOMAIN}",
|
|
13366
|
+
"description": "Canonical public Cloudly origin including protocol and optional public port.",
|
|
13367
|
+
"required": true
|
|
13368
|
+
},
|
|
13369
|
+
{
|
|
13370
|
+
"key": "SERVEZONE_LISTENPORT",
|
|
13371
|
+
"value": "3000",
|
|
13372
|
+
"description": "Internal Cloudly HTTP port inside the container.",
|
|
13373
|
+
"required": true
|
|
13374
|
+
},
|
|
13375
|
+
{
|
|
13376
|
+
"key": "SERVEZONE_SSLMODE",
|
|
13377
|
+
"value": "external",
|
|
13378
|
+
"description": "Use external TLS termination through Onebox or dcrouter.",
|
|
13379
|
+
"required": true
|
|
13380
|
+
},
|
|
13381
|
+
{
|
|
13382
|
+
"key": "SERVEZONE_SECRET_KEYRING_PATH",
|
|
13383
|
+
"value": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
13384
|
+
"description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
|
|
13385
|
+
"required": true
|
|
13386
|
+
},
|
|
13387
|
+
{
|
|
13388
|
+
"key": "SERVEZONE_SECRET_KEYRING_FILE",
|
|
13389
|
+
"description": "Existing Cloudly Secrets v2 keyring. Onebox stores it encrypted and mounts it only as a root-readable file; retain the existing keyring when upgrading.",
|
|
13390
|
+
"required": true,
|
|
13391
|
+
"secret": true,
|
|
13392
|
+
"delivery": {
|
|
13393
|
+
"type": "file",
|
|
13394
|
+
"targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
13395
|
+
"uid": 0,
|
|
13396
|
+
"gid": 0,
|
|
13397
|
+
"mode": 256
|
|
13398
|
+
}
|
|
13399
|
+
},
|
|
13400
|
+
{
|
|
13401
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
|
|
13402
|
+
"value": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
13403
|
+
"description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
|
|
13404
|
+
"required": true
|
|
13405
|
+
},
|
|
13406
|
+
{
|
|
13407
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
|
|
13408
|
+
"description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
|
|
13409
|
+
"required": true,
|
|
13410
|
+
"secret": true,
|
|
13411
|
+
"delivery": {
|
|
13412
|
+
"type": "file",
|
|
13413
|
+
"targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
13414
|
+
"uid": 0,
|
|
13415
|
+
"gid": 0,
|
|
13416
|
+
"mode": 256
|
|
13417
|
+
}
|
|
13418
|
+
},
|
|
13419
|
+
{
|
|
13420
|
+
"key": "MONGODB_URL",
|
|
13421
|
+
"value": "${MONGODB_URI}",
|
|
13422
|
+
"description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
|
|
13423
|
+
"required": true
|
|
13424
|
+
},
|
|
13425
|
+
{
|
|
13426
|
+
"key": "MONGODB_NAME",
|
|
13427
|
+
"value": "${MONGODB_DATABASE}",
|
|
13428
|
+
"description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
|
|
13429
|
+
"required": true
|
|
13430
|
+
},
|
|
13431
|
+
{
|
|
13432
|
+
"key": "MONGODB_USER",
|
|
13433
|
+
"value": "${MONGODB_USERNAME}",
|
|
13434
|
+
"description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
|
|
13435
|
+
"required": true
|
|
13436
|
+
},
|
|
13437
|
+
{
|
|
13438
|
+
"key": "MONGODB_PASS",
|
|
13439
|
+
"value": "${MONGODB_PASSWORD}",
|
|
13440
|
+
"description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
|
|
13441
|
+
"required": true
|
|
13442
|
+
},
|
|
13443
|
+
{
|
|
13444
|
+
"key": "S3_ENDPOINT",
|
|
13445
|
+
"value": "onebox-corestore",
|
|
13446
|
+
"description": "S3 endpoint host provisioned by Onebox Corestore.",
|
|
13447
|
+
"required": true
|
|
13448
|
+
},
|
|
13449
|
+
{
|
|
13450
|
+
"key": "S3_PORT",
|
|
13451
|
+
"value": "9000",
|
|
13452
|
+
"description": "S3 endpoint port provisioned by Onebox Corestore.",
|
|
13453
|
+
"required": true
|
|
13454
|
+
},
|
|
13455
|
+
{
|
|
13456
|
+
"key": "S3_USESSL",
|
|
13457
|
+
"value": "false",
|
|
13458
|
+
"description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
|
|
13459
|
+
"required": true
|
|
13460
|
+
},
|
|
13461
|
+
{
|
|
13462
|
+
"key": "S3_BUCKET",
|
|
13463
|
+
"value": "${S3_BUCKET}",
|
|
13464
|
+
"description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
|
|
13465
|
+
"required": true
|
|
13466
|
+
},
|
|
13467
|
+
{
|
|
13468
|
+
"key": "S3_ACCESSKEY",
|
|
13469
|
+
"value": "${S3_ACCESS_KEY}",
|
|
13470
|
+
"description": "S3 access key provisioned by Onebox Corestore.",
|
|
13471
|
+
"required": true
|
|
13472
|
+
},
|
|
13473
|
+
{
|
|
13474
|
+
"key": "S3_SECRETKEY",
|
|
13475
|
+
"value": "${S3_SECRET_KEY}",
|
|
13476
|
+
"description": "S3 secret key provisioned by Onebox Corestore.",
|
|
13477
|
+
"required": true
|
|
13478
|
+
},
|
|
13479
|
+
{
|
|
13480
|
+
"key": "CLOUDLY_BACKUP_CRON",
|
|
13481
|
+
"value": "15 2 * * *",
|
|
13482
|
+
"description": "Schedule of Cloudly's backup-all-services task, which backs up every workload service's databases (not its object storage); Cloudly registers the task only while this is set. Daily at 02:15 UTC, clear of Onebox's backup-archive-prune at 03:00.",
|
|
13483
|
+
"required": false
|
|
13484
|
+
},
|
|
13485
|
+
{
|
|
13486
|
+
"key": "SERVEZONE_ADMINACCOUNT",
|
|
13487
|
+
"description": "Optional private first-start Cloudly operator in username:password form. Required by the fresh empty-instance workflow, never the reviewer credential. Supply only through sealed secret input; no default or automatic generation. Remove the bootstrap input with the Onebox owner command after first boot; revoking its persisted Cloudly password is a separate fresh-human credential action. Existing installations leave this unset.",
|
|
13488
|
+
"required": false,
|
|
13489
|
+
"secret": true,
|
|
13490
|
+
"delivery": {
|
|
13491
|
+
"type": "launcher-environment",
|
|
13492
|
+
"variableName": "SERVEZONE_ADMINACCOUNT",
|
|
13493
|
+
"uid": 0,
|
|
13494
|
+
"gid": 0,
|
|
13495
|
+
"mode": 256
|
|
13496
|
+
}
|
|
13497
|
+
}
|
|
13498
|
+
],
|
|
13499
|
+
"platformRequirements": {
|
|
13500
|
+
"mongodb": true,
|
|
13501
|
+
"s3": true
|
|
13502
|
+
},
|
|
13503
|
+
"backupExclusions": [
|
|
13504
|
+
{
|
|
13505
|
+
"storageRequest": "legacy-s3",
|
|
13506
|
+
"keyPrefixes": [
|
|
13507
|
+
"runtime-logs/"
|
|
13508
|
+
],
|
|
13509
|
+
"reason": "Workload logs; a restore brings back state, not past logs."
|
|
13510
|
+
}
|
|
13511
|
+
],
|
|
13512
|
+
"hostRoles": [
|
|
13513
|
+
"controllerHost"
|
|
13514
|
+
],
|
|
13515
|
+
"minOneboxVersion": "33.8.0",
|
|
13516
|
+
"changelog": "Cloudly 1.31.0 is the controller-host template (Linus ruling 118 F2): 1.29.18 on the same published Cloudly 33.34.1 image 929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8, with hostRoles [\"controllerHost\"] and without platformOidc; nothing else changes. It requires host.roles: an Onebox that advertises host.roles (34.0.0 and later) installs it and no Cloudly template before it, while an Onebox 33.x and Cloudly list it without reading its config and never install it. Without platformOidc the host registers no platform OIDC client and injects no SERVEZONE_PLATFORM_OIDC_* names; sign-in is Cloudly's own. An upgrade from 1.29.18 changes only these declarations: the image and the data version 0.42.0 stay. An upgrade from an older template runs the forward-only data steps the rest of this changelog lists; stop the old Cloudly first. 1.31.0 sorts above every 1.30.x template, so no host that judges host roles moves an installation from it to a 1.30.x template on the older 33.26.0 image. An installation on a 1.30.x template is offered 1.31.0 on such a host: it moves forward to the 33.34.1 image and its data steps, and it runs without the databaseBackupExclusions declaration of 1.30.x until a later 1.31.x template declares it, so its database backups include the log collections again. The rest of this changelog is that of 1.29.18 and holds for this template: Move Cloudly to 33.34.1 on the config of 1.29.17: 1.29.18 differs from 1.29.17 only in its image and its changelog. The image is the published multi-platform index 929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8 (linux/amd64 and linux/arm64), not a rebuild or a floating tag. Cloudly 33.34.1 carries 33.33.0 and 33.34.0: the controller gateway channel and gateway adoption with one-time codes (a legacy gateway is called as before until an administrator adopts it), the controller lease (a second Cloudly on one database is refused by name), a bounded object storage wait at start and Cloudly-owned CoreMail storage, which stays dormant while coreMailEnabled is not set; 33.34.1 takes the CoreMail statistics page limit from the interfaces contract. It adds no environment variable this template must declare. No data step: the data version stays 0.42.0. Upgrade only with the old Cloudly service stopped first: Cloudly 33.32.0 and older take no controller lease, so a still-running old Cloudly is not refused and two controllers would share one database. Forward-only: once 33.34.1 has started on a database, no earlier Cloudly image runs on it. 33.32.0 and 33.33.0 would accept data version 0.42.0 because no image guard exists, so this rule is enforced by operation, not by code. Upgrade path, from every template it is offered to (1.28.3, 1.28.5, 1.28.6, 1.29.0 to 1.29.12, 1.29.14, 1.29.16 and 1.29.17, on a host that fulfils storage.object-storage.backup-exclusions): from 1.29.17 it runs no data step. From 1.29.16 it runs the forward-only data step of 33.32.0, legacy-gateway (0.41.0 to 0.42.0). From 1.29.14 or 1.29.12 it first also runs the two forward-only data steps of 33.31.0: npm-registry-unverified (0.39.0 to 0.40.0) and initial-location (0.40.0 to 0.41.0). From 1.29.11, 1.29.10 or 1.29.9 it first also runs the six forward-only data steps of 33.28.0: service-hostname-canonical (0.33.0 to 0.34.0), runtime-authority-tokens (0.34.0 to 0.35.0), runtime-assignment-failures (0.35.0 to 0.36.0), bounded-slot-history (0.36.0 to 0.37.0), spark-fleet-target (0.37.0 to 0.38.0) and node-action-carrier-expiry (0.38.0 to 0.39.0). From 1.29.8 or 1.29.7 it first also runs retire-stale-reconciliation-stages (0.32.0 to 0.33.0); from 1.29.6 to 1.29.2 also retire-corestore-environment-secrets (0.31.0 to 0.32.0); from 1.29.1, 1.29.0, 1.28.6, 1.28.5 or 1.28.3 also service-reconciliation-observations (0.30.0 to 0.31.0). Keep breaking, requiresManualReview, migrationRequired and backupBeforeUpgrade set. 1.29.18 sorts below 1.30.0, so a 1.30.x installation never takes it. 1.30.8 and 1.30.9 run the older Cloudly 33.26.0 image, which refuses data version 0.42.0: an installation on 1.29.18 must not move to 1.30.8 or 1.30.9, even on a host that later fulfils storage.database.backup-exclusions, and waits for a 1.30.x template on Cloudly 33.34.1 or later. 1.29.13 and 1.29.15 were signed locally and never published; their versions are never used again. A catalog publication does not install this version or upgrade a control plane. cloudly@1.29.12 holds the older cumulative history.",
|
|
13517
|
+
"breaking": true,
|
|
13518
|
+
"requiresManualReview": true,
|
|
13519
|
+
"migrationRequired": true,
|
|
13520
|
+
"backupBeforeUpgrade": true,
|
|
13521
|
+
"requiresFeatures": [
|
|
13522
|
+
"host.roles",
|
|
13523
|
+
"storage.object-storage.backup-exclusions"
|
|
13524
|
+
],
|
|
13525
|
+
"healthCheck": {
|
|
13526
|
+
"path": "/status",
|
|
13527
|
+
"port": 3000,
|
|
13528
|
+
"expectedStatus": 200
|
|
13529
|
+
}
|
|
13530
|
+
},
|
|
13531
|
+
"configDigest": "sha256:29d409d664e6e884f218d591e9b35f5233f1f938389cf4bf377f673c8719bc6f"
|
|
13343
13532
|
}
|
|
13344
13533
|
]
|
|
13345
13534
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serve.zone/appstore",
|
|
3
|
-
"version": "33.
|
|
3
|
+
"version": "33.25.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "serve.zone App Store: the signed runtime catalog and its consumer loader.",
|
|
6
6
|
"type": "module",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"author": "Task Venture Capital GmbH",
|
|
13
13
|
"license": "MIT",
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@serve.zone/interfaces": "32.
|
|
15
|
+
"@serve.zone/interfaces": "32.86.0",
|
|
16
16
|
"modern-tar": "0.8.5"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
package/readme.md
CHANGED
|
@@ -37,7 +37,7 @@ The catalog lists 19 apps. Every image is pinned to the digest of its multi-plat
|
|
|
37
37
|
| App ID | Name | App Store category | Latest | Image | Port |
|
|
38
38
|
| --- | --- | --- | --- | --- | --- |
|
|
39
39
|
| `adminer` | Adminer | Dev Tools | `1.0.0` | `adminer@sha256:74f29c416e148b98305e84446a18db7cd2c1038264dec464359d36774ef080ce` | `8080` |
|
|
40
|
-
| `cloudly` | Cloudly | Dev Tools | `1.
|
|
40
|
+
| `cloudly` | Cloudly | Dev Tools | `1.31.0` | `code.foss.global/serve.zone/cloudly@sha256:929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8` | `3000` |
|
|
41
41
|
| `ghost` | Ghost | CMS | `1.0.0` | `ghost@sha256:9482099b1c8700764dc3d38c293e09c16d70f8bacc14af589c47d90b4bebd017` | `2368` |
|
|
42
42
|
| `gitea` | Gitea | Dev Tools | `1.0.0` | `gitea/gitea@sha256:a9dc25679ebdd33356242d2e0667cc220043745e8339922879f187c20329a42e` | `3000` |
|
|
43
43
|
| `grafana` | Grafana | Monitoring | `1.0.0` | `grafana/grafana@sha256:b28bae15e219c998fb0e0424ed724930cc61b1f61fb404d47c862f9a23f9e572` | `3000` |
|
|
@@ -426,13 +426,15 @@ const consumer = { supportedFeatureIds, consumer: { kind: 'onebox', version: one
|
|
|
426
426
|
const apps = getAppStoreCatalogListing(activeCatalog, consumer); // IAppStoreApp[] for getAppStoreTemplates
|
|
427
427
|
const projection = projectAppStoreCatalogApp(catalogApp, consumer);
|
|
428
428
|
// projection.versions: every listed version, each with installRefusal (null, versionWithdrawn,
|
|
429
|
-
// featuresUnsupported or consumerVersionTooOld)
|
|
429
|
+
// featuresUnsupported, hostRoleUnsupported or consumerVersionTooOld)
|
|
430
430
|
// projection.latestInstallableVersion the newest version this consumer may install, or null
|
|
431
431
|
// projection.display { app: IAppStoreApp, meta: IAppStoreAppMeta }, or null without an install target
|
|
432
432
|
```
|
|
433
433
|
|
|
434
434
|
The display shapes list only the versions this consumer may install in `versions` and name the newest of them as `latestVersion`, so a version picker built from them never offers a withdrawn version, one gated on a feature the consumer lacks or one that needs a newer consumer release; `versionStates` states every listed version with its refusal. Under `semver` the newest install target is the highest one; under `branch` it is the catalog's `latestVersion` when that is an install target, and otherwise the app has none.
|
|
435
435
|
|
|
436
|
+
A version states the hosts it installs on in `hostRoles` (`@serve.zone/interfaces` `appstore.appStoreHostRoles`: `controllerHost`, the host that runs the controller itself, and `cluster`, a workload Cloudly places on its cluster); a version without it is a `cluster` version, which every version published before the member is. A host that advertises `host.roles` (`appstore.appStoreHostRolesFeatureId`) in `supportedFeatureIds` has its role judged: Onebox is the controller host and installs only versions naming `controllerHost` (today Cloudly `1.31.0`), Cloudly is `cluster` and keeps every install target it has. A host that does not advertise it is judged as before and lists a version declaring `hostRoles` without installing it.
|
|
437
|
+
|
|
436
438
|
### Testing A Consumer
|
|
437
439
|
|
|
438
440
|
`@serve.zone/appstore/testing` serves a consumer's tests, never its runtime: `createAppStoreTestSigningKey` makes a throwaway key and its trusted-key record, `createAppStoreTestCatalog` and `createAppStoreTestVersionConfig` a catalog the contract accepts, `signAppStoreTestCatalog` its envelope, `createAppStoreTestPackageTarball` the package tarball carrying it, `createAppStoreTestRegistry` a registry stub and `createAppStoreTestFetch` the `fetch` a loader under test is given.
|
|
@@ -557,3 +559,9 @@ The upgrade runs one forward-only data step, `legacy-gateway` (`0.41.0` to `0.42
|
|
|
557
559
|
Cloudly `1.29.18` is `1.29.17` on the published Cloudly `33.34.1` image at `code.foss.global/serve.zone/cloudly@sha256:929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8`; nothing else changes. Cloudly `33.34.1` carries `33.33.0` and `33.34.0`: the controller gateway channel and gateway adoption with one-time codes (a legacy gateway is called as before until an administrator adopts it), the controller lease, a bounded object storage wait at start and Cloudly-owned CoreMail storage, which stays dormant while `coreMailEnabled` is not set. It adds no environment variable this template must declare.
|
|
558
560
|
|
|
559
561
|
There is no data step: the data version stays `0.42.0`. Upgrade only with the old Cloudly service stopped first: Cloudly `33.32.0` and older take no controller lease, so a still-running old Cloudly is not refused and two controllers would share one database. Forward-only: once `33.34.1` has started on a database, no earlier Cloudly image runs on it; `33.32.0` and `33.33.0` would accept data version `0.42.0` because no image guard exists, so this rule is enforced by operation, not by code. From older templates the upgrade runs the forward-only data steps listed in the Cloudly 1.29.17 and 1.29.12 sections. `1.29.18` sorts below `1.30.0`, so a `1.30.x` installation never takes it, and an installation on `1.29.18` must not move to `1.30.8` or `1.30.9`, which run the older `33.26.0` image.
|
|
562
|
+
|
|
563
|
+
## Cloudly 1.31.0: the controller-host template
|
|
564
|
+
|
|
565
|
+
Cloudly `1.31.0` is `1.29.18` on the same published Cloudly `33.34.1` image at `code.foss.global/serve.zone/cloudly@sha256:929403aec14f3a05d66143adcf417f92c13d2f692514dff1efae07a7ab4326b8`, with `hostRoles: ["controllerHost"]` and without `platformOidc` (Linus ruling 118 F2); nothing else changes. It requires `host.roles`, so an Onebox that advertises it (34.0.0 and later) installs `1.31.0` and no other template of any app, while Onebox 33.x and Cloudly list it without reading its config and keep the targets they have. Without `platformOidc` the host registers no platform OIDC client and injects no `SERVEZONE_PLATFORM_OIDC_*` names; Cloudly's own sign-in applies.
|
|
566
|
+
|
|
567
|
+
An upgrade from `1.29.18` changes only these declarations: the image and the data version `0.42.0` stay. From an older template the upgrade runs the forward-only data steps listed in the Cloudly 1.29.18 section and the sections before it; stop the old Cloudly first. `1.31.0` sorts above every `1.30.x` template, which run the older `33.26.0` image.
|