@serve.zone/appstore 33.24.0 → 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 CHANGED
@@ -1,5 +1,22 @@
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
+
13
+ ## 2026-11-14 - 33.24.1
14
+
15
+ ### Fixes
16
+
17
+ - move to `@serve.zone/interfaces` 32.85.0 (deps)
18
+ - The exact pin moves from 32.76.0 to 32.85.0, which no longer brings `@push.rocks/smartlog` 4 and `@push.rocks/smartrequest` 5 into a consumer's production tree (Linus ruling 113). No catalog content changes: no source, template, catalog entry or published version changes, and none of the interfaces contracts this package uses changed between the two versions.
19
+
3
20
  ## 2026-11-12 - 33.24.0
4
21
 
5
22
  ### Features
@@ -1 +1 @@
1
- sha256:8c5161e990032431c8b93d7539f106229321f37778686cadc1b65ff6dc6fa242
1
+ sha256:3bca9220ce6310eeb4516472641942cf2602921475b89989d83e858596b008c0
@@ -5,9 +5,9 @@
5
5
  "major": 1,
6
6
  "minor": 0
7
7
  },
8
- "revision": 33000024000000,
9
- "publishedAt": "2026-11-12T23:02:40.000Z",
10
- "sourceRevision": "86f7da899fea0e9a5dde166da829c49d8e332293",
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.30.9",
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:8c5161e990032431c8b93d7539f106229321f37778686cadc1b65ff6dc6fa242",
14306
+ "catalogDigest": "sha256:3bca9220ce6310eeb4516472641942cf2602921475b89989d83e858596b008c0",
14118
14307
  "signatures": [
14119
14308
  {
14120
14309
  "keyId": "sha256:58956c3537cdf542430d6685261824776d6128ebb9a93b3d77b53f2d031ba854",
14121
- "signature": "5eeae078751745b88a04a178d87aa7c099333a7b0deec78d581d012f69639316ab2fb428212b4553305d03ae3fe642d9f63e0cb6327e4520e8639bbdef994103"
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": 33000024000000,
8
- "publishedAt": "2026-11-12T23:02:40.000Z",
9
- "sourceRevision": "86f7da899fea0e9a5dde166da829c49d8e332293",
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.30.9",
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.24.0",
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.76.0",
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.30.9` | `code.foss.global/serve.zone/cloudly@sha256:b5b1d9f0ba494d4e8472f141c03b7b76a8590d256debfd9c144f1eb866c18069` | `3000` |
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.