@serve.zone/appstore 33.5.0 → 33.7.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 +27 -0
- package/dist_catalog/catalog.digest +1 -1
- package/dist_catalog/catalog.envelope.json +573 -6
- package/dist_catalog/catalog.json +571 -4
- package/dist_ts_client/storage.d.ts +3 -2
- package/dist_ts_client/storage.js +19 -5
- package/dist_ts_client/types.d.ts +11 -0
- package/package.json +2 -2
- package/readme.md +30 -4
- package/ts_client/readme.md +1 -1
- package/ts_client/storage.ts +22 -4
- package/ts_client/types.ts +15 -0
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"major": 1,
|
|
6
6
|
"minor": 0
|
|
7
7
|
},
|
|
8
|
-
"revision":
|
|
9
|
-
"publishedAt": "2026-10-
|
|
10
|
-
"sourceRevision": "
|
|
8
|
+
"revision": 33000007000000,
|
|
9
|
+
"publishedAt": "2026-10-14T01:06:51.000Z",
|
|
10
|
+
"sourceRevision": "29eab2aff549d4f31431c45f5308c068d48c3fa9",
|
|
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.29.0",
|
|
64
64
|
"versions": [
|
|
65
65
|
{
|
|
66
66
|
"version": "1.0.0",
|
|
@@ -7542,6 +7542,573 @@
|
|
|
7542
7542
|
}
|
|
7543
7543
|
},
|
|
7544
7544
|
"configDigest": "sha256:b069bdf3d8e9c9077a9fbe818abfb227b1677d576e2f51efbcc6829fdfc9e595"
|
|
7545
|
+
},
|
|
7546
|
+
{
|
|
7547
|
+
"version": "1.28.5",
|
|
7548
|
+
"config": {
|
|
7549
|
+
"image": "code.foss.global/serve.zone/cloudly@sha256:ff692cf950da26d1d50e717c06eff1c58201b699e6bb94d65a541cd861abbedc",
|
|
7550
|
+
"targetPorts": [
|
|
7551
|
+
{
|
|
7552
|
+
"name": "web",
|
|
7553
|
+
"port": 3000,
|
|
7554
|
+
"protocol": "http",
|
|
7555
|
+
"default": true
|
|
7556
|
+
}
|
|
7557
|
+
],
|
|
7558
|
+
"envVars": [
|
|
7559
|
+
{
|
|
7560
|
+
"key": "SERVEZONE_ENVIRONMENT",
|
|
7561
|
+
"value": "production",
|
|
7562
|
+
"description": "Cloudly runtime environment.",
|
|
7563
|
+
"required": true
|
|
7564
|
+
},
|
|
7565
|
+
{
|
|
7566
|
+
"key": "SERVEZONE_PUBLIC_ORIGIN",
|
|
7567
|
+
"value": "https://${SERVICE_DOMAIN}",
|
|
7568
|
+
"description": "Canonical public Cloudly origin including protocol and optional public port.",
|
|
7569
|
+
"required": true
|
|
7570
|
+
},
|
|
7571
|
+
{
|
|
7572
|
+
"key": "SERVEZONE_LISTENPORT",
|
|
7573
|
+
"value": "3000",
|
|
7574
|
+
"description": "Internal Cloudly HTTP port inside the container.",
|
|
7575
|
+
"required": true
|
|
7576
|
+
},
|
|
7577
|
+
{
|
|
7578
|
+
"key": "SERVEZONE_SSLMODE",
|
|
7579
|
+
"value": "external",
|
|
7580
|
+
"description": "Use external TLS termination through Onebox or dcrouter.",
|
|
7581
|
+
"required": true
|
|
7582
|
+
},
|
|
7583
|
+
{
|
|
7584
|
+
"key": "SERVEZONE_SECRET_KEYRING_PATH",
|
|
7585
|
+
"value": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
7586
|
+
"description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
|
|
7587
|
+
"required": true
|
|
7588
|
+
},
|
|
7589
|
+
{
|
|
7590
|
+
"key": "SERVEZONE_SECRET_KEYRING_FILE",
|
|
7591
|
+
"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.",
|
|
7592
|
+
"required": true,
|
|
7593
|
+
"secret": true,
|
|
7594
|
+
"delivery": {
|
|
7595
|
+
"type": "file",
|
|
7596
|
+
"targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
7597
|
+
"uid": 0,
|
|
7598
|
+
"gid": 0,
|
|
7599
|
+
"mode": 256
|
|
7600
|
+
}
|
|
7601
|
+
},
|
|
7602
|
+
{
|
|
7603
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
|
|
7604
|
+
"value": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
7605
|
+
"description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
|
|
7606
|
+
"required": true
|
|
7607
|
+
},
|
|
7608
|
+
{
|
|
7609
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
|
|
7610
|
+
"description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
|
|
7611
|
+
"required": true,
|
|
7612
|
+
"secret": true,
|
|
7613
|
+
"delivery": {
|
|
7614
|
+
"type": "file",
|
|
7615
|
+
"targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
7616
|
+
"uid": 0,
|
|
7617
|
+
"gid": 0,
|
|
7618
|
+
"mode": 256
|
|
7619
|
+
}
|
|
7620
|
+
},
|
|
7621
|
+
{
|
|
7622
|
+
"key": "MONGODB_URL",
|
|
7623
|
+
"value": "${MONGODB_URI}",
|
|
7624
|
+
"description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
|
|
7625
|
+
"required": true
|
|
7626
|
+
},
|
|
7627
|
+
{
|
|
7628
|
+
"key": "MONGODB_NAME",
|
|
7629
|
+
"value": "${MONGODB_DATABASE}",
|
|
7630
|
+
"description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
|
|
7631
|
+
"required": true
|
|
7632
|
+
},
|
|
7633
|
+
{
|
|
7634
|
+
"key": "MONGODB_USER",
|
|
7635
|
+
"value": "${MONGODB_USERNAME}",
|
|
7636
|
+
"description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
|
|
7637
|
+
"required": true
|
|
7638
|
+
},
|
|
7639
|
+
{
|
|
7640
|
+
"key": "MONGODB_PASS",
|
|
7641
|
+
"value": "${MONGODB_PASSWORD}",
|
|
7642
|
+
"description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
|
|
7643
|
+
"required": true
|
|
7644
|
+
},
|
|
7645
|
+
{
|
|
7646
|
+
"key": "S3_ENDPOINT",
|
|
7647
|
+
"value": "onebox-corestore",
|
|
7648
|
+
"description": "S3 endpoint host provisioned by Onebox Corestore.",
|
|
7649
|
+
"required": true
|
|
7650
|
+
},
|
|
7651
|
+
{
|
|
7652
|
+
"key": "S3_PORT",
|
|
7653
|
+
"value": "9000",
|
|
7654
|
+
"description": "S3 endpoint port provisioned by Onebox Corestore.",
|
|
7655
|
+
"required": true
|
|
7656
|
+
},
|
|
7657
|
+
{
|
|
7658
|
+
"key": "S3_USESSL",
|
|
7659
|
+
"value": "false",
|
|
7660
|
+
"description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
|
|
7661
|
+
"required": true
|
|
7662
|
+
},
|
|
7663
|
+
{
|
|
7664
|
+
"key": "S3_BUCKET",
|
|
7665
|
+
"value": "${S3_BUCKET}",
|
|
7666
|
+
"description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
|
|
7667
|
+
"required": true
|
|
7668
|
+
},
|
|
7669
|
+
{
|
|
7670
|
+
"key": "S3_ACCESSKEY",
|
|
7671
|
+
"value": "${S3_ACCESS_KEY}",
|
|
7672
|
+
"description": "S3 access key provisioned by Onebox Corestore.",
|
|
7673
|
+
"required": true
|
|
7674
|
+
},
|
|
7675
|
+
{
|
|
7676
|
+
"key": "S3_SECRETKEY",
|
|
7677
|
+
"value": "${S3_SECRET_KEY}",
|
|
7678
|
+
"description": "S3 secret key provisioned by Onebox Corestore.",
|
|
7679
|
+
"required": true
|
|
7680
|
+
}
|
|
7681
|
+
],
|
|
7682
|
+
"platformRequirements": {
|
|
7683
|
+
"mongodb": true,
|
|
7684
|
+
"s3": true
|
|
7685
|
+
},
|
|
7686
|
+
"backupExclusions": [
|
|
7687
|
+
{
|
|
7688
|
+
"storageRequest": "legacy-s3",
|
|
7689
|
+
"keyPrefixes": [
|
|
7690
|
+
"runtime-logs/"
|
|
7691
|
+
],
|
|
7692
|
+
"reason": "Workload logs; a restore brings back state, not past logs."
|
|
7693
|
+
}
|
|
7694
|
+
],
|
|
7695
|
+
"platformOidc": {
|
|
7696
|
+
"redirectPath": "/auth/oidc/callback",
|
|
7697
|
+
"roles": [
|
|
7698
|
+
{
|
|
7699
|
+
"id": "admin",
|
|
7700
|
+
"label": "Administrator",
|
|
7701
|
+
"description": "Full Cloudly administration for this hosted instance."
|
|
7702
|
+
},
|
|
7703
|
+
{
|
|
7704
|
+
"id": "user",
|
|
7705
|
+
"label": "User",
|
|
7706
|
+
"description": "Standard authenticated Cloudly access for this hosted instance."
|
|
7707
|
+
}
|
|
7708
|
+
],
|
|
7709
|
+
"environmentVariables": {
|
|
7710
|
+
"issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
|
|
7711
|
+
"clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
|
|
7712
|
+
"clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
|
|
7713
|
+
"redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
|
|
7714
|
+
"audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
|
|
7715
|
+
},
|
|
7716
|
+
"clientAuthenticationMethod": "client_secret_basic"
|
|
7717
|
+
},
|
|
7718
|
+
"minOneboxVersion": "33.8.0",
|
|
7719
|
+
"changelog": "Declare Cloudly's workload logs non-backup data without moving the image: this template runs the Cloudly 33.19.1 image of 1.28.3 and differs from 1.28.3 only in its changelog and two members. backupExclusions names the key prefix runtime-logs/ of Cloudly's own bucket, the object storage platformRequirements.s3 provisions (storage request legacy-s3), under which Cloudly keeps the payloads of workload logs, and requiresFeatures names storage.object-storage.backup-exclusions. A host that fulfils that feature leaves the objects under runtime-logs/ out of Cloudly's backups, and a restore brings back Cloudly's state, not its past workload logs: it neither restores nor removes objects under that prefix, and Cloudly reports a log batch whose payload it no longer has as a gap. A host that does not fulfil the feature keeps listing this version and refuses it as an install or upgrade target. From 1.28.3 the upgrade moves the template only: Cloudly runs the same image on the same data and no data step runs. 1.28.5 sorts above 1.28.4 but runs the older image, Cloudly 33.19.1 instead of 33.19.2: it exists for a host on 1.28.3 that moves its template without moving Cloudly. From 1.28.4, upgrade to 1.28.6, which carries the same declaration on the Cloudly 33.19.2 image of 1.28.4; 1.28.5 would run Cloudly 33.19.1 on that data, which it reads because Cloudly 33.19.2 added no data step and no collection, but without the fixes of 33.19.2. The rest of this changelog is that of 1.28.3 and holds for this template: Move Cloudly to 33.19.1, which carries Cloudly 33.18.3, 33.18.4, 33.18.5, 33.19.0 and 33.19.1 over 33.18.2. Runtime log intake no longer holds a node's request while its payload uploads: an admitted reportRuntimeAssignmentLogs costs one append transaction that queues the batch with its payload in the new collection cloudly_runtime_log_queue, and the node is answered once it commits. A background drain writes the payloads, up to 32 at once, and commits the ledger rows and removes the queue rows in coalesced transactions that fence no controller record; every other node request under a request budget counts as critical work, and the drain waits for it at most 1 s per step. A resend of a batch the ledger or the queue already holds is answered replay with nothing written, and while the queue is at its bounds (1024 batches, 64 MiB, 8 concurrent intakes) a report is refused at once with the retryable log-intake-saturated. Object writes list nothing (@lossless.org/client 1.23.3), workload logs are kept for at least 30 days whatever shorter logs.retentionMs a spec states, and one runtime log intake line, logged on its own timer at most once a minute, reports intake latency, queue depth, the drain and refusals. A node that applied its network head is no longer handed a successor that only drops the head's withdrawals, and a successor of the projection a node's receipt names lists only the tombstones its own step retires, so a node with more than 256 retired leases or handoffs stays within the contract's bound. Route verification reads the certificate a route presents on a connection of its own, without pooling or TLS session resumption, so it records the route's subject alternative names; a connection that exposes no certificate fails with TLS_PEER_CERTIFICATE_UNAVAILABLE and a certificate without names with TLS_SUBJECT_ALT_NAMES_MISSING. readServiceDeploymentStatus (@serve.zone/interfaces 32.54.0) reads a deployment operation's status without changing it, and a failed service deletion answers SERVICE_DELETION_FAILED and logs its cause. The first start creates the collection cloudly_runtime_log_queue. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Cloudly 33.19.1 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.2, 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.2 and requires Onebox 33.8.0. From 1.28.1 or earlier, the fixes of Cloudly 33.18.2 apply too: A node's network configuration advances only as fast as the node applies it: Cloudly signed a node's successor projection once the node stored its head, so every new version invalidated the application in flight. Cloudly now composes the successor only once the node's authenticated application receipt names the exact head, under a session speaking @serve.zone/interfaces 32.50.0 or later; a storage acknowledgement, a failed or absent application or a reconnect is no such proof, while a receipt whose nativeJournal is null, proving every packet table released, lets the node advance after a failed application too. Changes staged meanwhile coalesce into one successor from the current durable state; the producer reports the node awaiting-application, naming the held head, and logs one warning per held head. A withdrawn cluster ingress flow wanted again no longer lets the rest of the projection go on: the whole projection waits for the receipt. A rotated signing key still re-signs the held head at its own generation. Upgrade every node to Pallet 36.3.0 or later, speaking @serve.zone/interfaces 32.50.0 or later, before this Cloudly update: a node that sends no application receipt, Pallet 36.2.1 or earlier, or whose session speaks @serve.zone/interfaces below 32.50.0, keeps the projection it holds and receives no successor. The receipt wire contract is unchanged. Cloudly 33.18.2 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.1 and requires Onebox 33.8.0. The changes of the Cloudly releases before 33.18.2 that an upgrade from 1.28.0 or earlier also takes are described in the changelog of cloudly@1.28.2, which repeats those of every earlier template; this changelog keeps their upgrade path only, because a catalog changelog is bounded at 65536 characters. From 1.2.1 or earlier, startup runs the forward-only data migration from 0.20.0 to 0.21.0 through the step retire-cluster-relay-acme and then the steps runtime-session-protocol-offer to 0.22.0, deployment-machine-user-grants to 0.23.0, corestore-control-token-state to 0.24.0, runtime-log-attempts to 0.25.0, cluster-node-hostname-intent to 0.26.0, deployment-operation-route-evidence to 0.27.0, service-secret-target-predecessor to 0.28.0, route-claim-absent-owners to 0.29.0 and bounded-runtime-history to 0.30.0; retire-cluster-relay-acme drops the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logs every relay name whose A record Cloudly had written at Cloudflare: remove each such record at the provider. A cluster relay then requires a dcrouter that advertises dns.clientRecords and certificates.exactIssuance, SERVEZONE_SSLMODE=letsencrypt is refused (this template keeps external), and the typed API changes as the Breaking Changes of the Cloudly 33.0.0 changelog list; review them, stop Cloudly and take a verified backup before upgrading, because the 32.9 image refuses the migrated data and rollback requires a full restore. The upgrade is marked migration-required and backup-before-upgrade because hosts read these flags from the target version alone and every upgrade from 1.26.0 or earlier runs the 0.28.0 to 0.30.0 steps, one from 1.24.0 or earlier, and from 1.25.0 whose first start failed, the 0.25.0 to 0.28.0 steps before them, one from 1.19.0 or earlier the 0.24.0 to 0.25.0 step before that, one from 1.15.0 or earlier the 0.23.0 to 0.24.0 step before that, one from 1.8.0 or earlier the 0.22.0 to 0.23.0 step before that, one from 1.6.0 or earlier the 0.21.0 to 0.22.0 step before that and one from 1.2.1 or earlier the migration from 0.20.0 as well, and breaking and manual-review because every Cloudly before 33.17.3 refuses the 0.30.0 data, the 0.30.0 step deletes every archived deployment record, the 0.23.0 step removes stored grants forward-only, Cloudly 33.18.0 ignores APPSTORE_URL and loads the App Store catalog from its catalog registries and, from 1.7.0 or earlier, a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused. An installation on 1.1.10 or earlier also runs the 1.2.0 steps first, from 0.10.0, and requires completed Secrets v2 cutover retirement. Preserve existing user and storage identities, OIDC bindings, the encrypted keyring and WorkloadInit approval as dedicated root-readable files.",
|
|
7720
|
+
"breaking": true,
|
|
7721
|
+
"requiresManualReview": true,
|
|
7722
|
+
"migrationRequired": true,
|
|
7723
|
+
"backupBeforeUpgrade": true,
|
|
7724
|
+
"requiresFeatures": [
|
|
7725
|
+
"storage.object-storage.backup-exclusions"
|
|
7726
|
+
],
|
|
7727
|
+
"healthCheck": {
|
|
7728
|
+
"path": "/status",
|
|
7729
|
+
"port": 3000,
|
|
7730
|
+
"expectedStatus": 200
|
|
7731
|
+
}
|
|
7732
|
+
},
|
|
7733
|
+
"configDigest": "sha256:15c6742639a1fbf402d0b3d080029600f6a828e53f3103f5c303d9be89c49c2f"
|
|
7734
|
+
},
|
|
7735
|
+
{
|
|
7736
|
+
"version": "1.28.6",
|
|
7737
|
+
"config": {
|
|
7738
|
+
"image": "code.foss.global/serve.zone/cloudly@sha256:0dd5399877c894b86f55d7a56df2da597bfcb7d1c8ec8adec547bfebb5d091d9",
|
|
7739
|
+
"targetPorts": [
|
|
7740
|
+
{
|
|
7741
|
+
"name": "web",
|
|
7742
|
+
"port": 3000,
|
|
7743
|
+
"protocol": "http",
|
|
7744
|
+
"default": true
|
|
7745
|
+
}
|
|
7746
|
+
],
|
|
7747
|
+
"envVars": [
|
|
7748
|
+
{
|
|
7749
|
+
"key": "SERVEZONE_ENVIRONMENT",
|
|
7750
|
+
"value": "production",
|
|
7751
|
+
"description": "Cloudly runtime environment.",
|
|
7752
|
+
"required": true
|
|
7753
|
+
},
|
|
7754
|
+
{
|
|
7755
|
+
"key": "SERVEZONE_PUBLIC_ORIGIN",
|
|
7756
|
+
"value": "https://${SERVICE_DOMAIN}",
|
|
7757
|
+
"description": "Canonical public Cloudly origin including protocol and optional public port.",
|
|
7758
|
+
"required": true
|
|
7759
|
+
},
|
|
7760
|
+
{
|
|
7761
|
+
"key": "SERVEZONE_LISTENPORT",
|
|
7762
|
+
"value": "3000",
|
|
7763
|
+
"description": "Internal Cloudly HTTP port inside the container.",
|
|
7764
|
+
"required": true
|
|
7765
|
+
},
|
|
7766
|
+
{
|
|
7767
|
+
"key": "SERVEZONE_SSLMODE",
|
|
7768
|
+
"value": "external",
|
|
7769
|
+
"description": "Use external TLS termination through Onebox or dcrouter.",
|
|
7770
|
+
"required": true
|
|
7771
|
+
},
|
|
7772
|
+
{
|
|
7773
|
+
"key": "SERVEZONE_SECRET_KEYRING_PATH",
|
|
7774
|
+
"value": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
7775
|
+
"description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
|
|
7776
|
+
"required": true
|
|
7777
|
+
},
|
|
7778
|
+
{
|
|
7779
|
+
"key": "SERVEZONE_SECRET_KEYRING_FILE",
|
|
7780
|
+
"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.",
|
|
7781
|
+
"required": true,
|
|
7782
|
+
"secret": true,
|
|
7783
|
+
"delivery": {
|
|
7784
|
+
"type": "file",
|
|
7785
|
+
"targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
7786
|
+
"uid": 0,
|
|
7787
|
+
"gid": 0,
|
|
7788
|
+
"mode": 256
|
|
7789
|
+
}
|
|
7790
|
+
},
|
|
7791
|
+
{
|
|
7792
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
|
|
7793
|
+
"value": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
7794
|
+
"description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
|
|
7795
|
+
"required": true
|
|
7796
|
+
},
|
|
7797
|
+
{
|
|
7798
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
|
|
7799
|
+
"description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
|
|
7800
|
+
"required": true,
|
|
7801
|
+
"secret": true,
|
|
7802
|
+
"delivery": {
|
|
7803
|
+
"type": "file",
|
|
7804
|
+
"targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
7805
|
+
"uid": 0,
|
|
7806
|
+
"gid": 0,
|
|
7807
|
+
"mode": 256
|
|
7808
|
+
}
|
|
7809
|
+
},
|
|
7810
|
+
{
|
|
7811
|
+
"key": "MONGODB_URL",
|
|
7812
|
+
"value": "${MONGODB_URI}",
|
|
7813
|
+
"description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
|
|
7814
|
+
"required": true
|
|
7815
|
+
},
|
|
7816
|
+
{
|
|
7817
|
+
"key": "MONGODB_NAME",
|
|
7818
|
+
"value": "${MONGODB_DATABASE}",
|
|
7819
|
+
"description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
|
|
7820
|
+
"required": true
|
|
7821
|
+
},
|
|
7822
|
+
{
|
|
7823
|
+
"key": "MONGODB_USER",
|
|
7824
|
+
"value": "${MONGODB_USERNAME}",
|
|
7825
|
+
"description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
|
|
7826
|
+
"required": true
|
|
7827
|
+
},
|
|
7828
|
+
{
|
|
7829
|
+
"key": "MONGODB_PASS",
|
|
7830
|
+
"value": "${MONGODB_PASSWORD}",
|
|
7831
|
+
"description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
|
|
7832
|
+
"required": true
|
|
7833
|
+
},
|
|
7834
|
+
{
|
|
7835
|
+
"key": "S3_ENDPOINT",
|
|
7836
|
+
"value": "onebox-corestore",
|
|
7837
|
+
"description": "S3 endpoint host provisioned by Onebox Corestore.",
|
|
7838
|
+
"required": true
|
|
7839
|
+
},
|
|
7840
|
+
{
|
|
7841
|
+
"key": "S3_PORT",
|
|
7842
|
+
"value": "9000",
|
|
7843
|
+
"description": "S3 endpoint port provisioned by Onebox Corestore.",
|
|
7844
|
+
"required": true
|
|
7845
|
+
},
|
|
7846
|
+
{
|
|
7847
|
+
"key": "S3_USESSL",
|
|
7848
|
+
"value": "false",
|
|
7849
|
+
"description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
|
|
7850
|
+
"required": true
|
|
7851
|
+
},
|
|
7852
|
+
{
|
|
7853
|
+
"key": "S3_BUCKET",
|
|
7854
|
+
"value": "${S3_BUCKET}",
|
|
7855
|
+
"description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
|
|
7856
|
+
"required": true
|
|
7857
|
+
},
|
|
7858
|
+
{
|
|
7859
|
+
"key": "S3_ACCESSKEY",
|
|
7860
|
+
"value": "${S3_ACCESS_KEY}",
|
|
7861
|
+
"description": "S3 access key provisioned by Onebox Corestore.",
|
|
7862
|
+
"required": true
|
|
7863
|
+
},
|
|
7864
|
+
{
|
|
7865
|
+
"key": "S3_SECRETKEY",
|
|
7866
|
+
"value": "${S3_SECRET_KEY}",
|
|
7867
|
+
"description": "S3 secret key provisioned by Onebox Corestore.",
|
|
7868
|
+
"required": true
|
|
7869
|
+
}
|
|
7870
|
+
],
|
|
7871
|
+
"platformRequirements": {
|
|
7872
|
+
"mongodb": true,
|
|
7873
|
+
"s3": true
|
|
7874
|
+
},
|
|
7875
|
+
"backupExclusions": [
|
|
7876
|
+
{
|
|
7877
|
+
"storageRequest": "legacy-s3",
|
|
7878
|
+
"keyPrefixes": [
|
|
7879
|
+
"runtime-logs/"
|
|
7880
|
+
],
|
|
7881
|
+
"reason": "Workload logs; a restore brings back state, not past logs."
|
|
7882
|
+
}
|
|
7883
|
+
],
|
|
7884
|
+
"platformOidc": {
|
|
7885
|
+
"redirectPath": "/auth/oidc/callback",
|
|
7886
|
+
"roles": [
|
|
7887
|
+
{
|
|
7888
|
+
"id": "admin",
|
|
7889
|
+
"label": "Administrator",
|
|
7890
|
+
"description": "Full Cloudly administration for this hosted instance."
|
|
7891
|
+
},
|
|
7892
|
+
{
|
|
7893
|
+
"id": "user",
|
|
7894
|
+
"label": "User",
|
|
7895
|
+
"description": "Standard authenticated Cloudly access for this hosted instance."
|
|
7896
|
+
}
|
|
7897
|
+
],
|
|
7898
|
+
"environmentVariables": {
|
|
7899
|
+
"issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
|
|
7900
|
+
"clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
|
|
7901
|
+
"clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
|
|
7902
|
+
"redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
|
|
7903
|
+
"audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
|
|
7904
|
+
},
|
|
7905
|
+
"clientAuthenticationMethod": "client_secret_basic"
|
|
7906
|
+
},
|
|
7907
|
+
"minOneboxVersion": "33.8.0",
|
|
7908
|
+
"changelog": "Declare Cloudly's workload logs non-backup data on the Cloudly 33.19.2 image of 1.28.4: this template differs from 1.28.4 only in its changelog and two members. backupExclusions names the key prefix runtime-logs/ of Cloudly's own bucket, the object storage platformRequirements.s3 provisions (storage request legacy-s3), under which Cloudly keeps the payloads of workload logs, and requiresFeatures names storage.object-storage.backup-exclusions. A host that fulfils that feature leaves the objects under runtime-logs/ out of Cloudly's backups, and a restore brings back Cloudly's state, not its past workload logs: it neither restores nor removes objects under that prefix, and Cloudly reports a log batch whose payload it no longer has as a gap. A host that does not fulfil the feature keeps listing this version and refuses it as an install or upgrade target. From 1.28.4 the upgrade moves the template only: Cloudly runs the same image on the same data and no data step runs. From 1.28.5, which carries the same declaration on the Cloudly 33.19.1 image of 1.28.3, it moves Cloudly to 33.19.2 as an upgrade from 1.28.3 does. The rest of this changelog is that of 1.28.4 and holds for this template: Move Cloudly to 33.19.2, a fixes-only patch over 33.19.1. A greenfield deployment, a legacy import's successor included, proves its namespace blank on the nodes of the Pallet clusters (phase switching or pallet) and nowhere else: a reservation whose service had no rollout plan yet asked every registered node, so a fleet that still keeps a Coreflow-owned Swarm cluster without a relay could never reserve one, and a legacy import's reserve preflight answered NO-GO with CORESTORE_INVENTORY_UNAVAILABLE and NAMESPACE_NOT_PROVEN_BLANK. The deployment preflight and reserveServiceDeployment read the same nodes; a Pallet node whose inventory cannot be read still blocks, a fleet with no Pallet cluster node refuses the reservation CORESTORE_INVENTORY_UNAVAILABLE, and an existing service's preflight still reads its plan's clusters. A greenfield rollout without a Pallet runtime spec is refused GREENFIELD_PALLET_RUNTIME_SPEC_REQUIRED, which is not retryable, instead of falling back to Coreflow placement onto Swarm nodes the namespace proof never covered: state the spec with setServiceRuntimeSpec, then promote again. A rollout with a Pallet spec plans onto the spec's nodes as before. A node's network compilation proves each workload lease once and each protected authority revision and allocation eligibility proof once per transaction (before, every lease was read up to three times per compilation and each read re-proved the same revision and proof, about 24 proof reads per endpoint), so a compilation with 100 endpoints reads 539 records instead of 2,839 (7.8 s instead of 19.8 s on Cloudly's test fixture), and every compilation signs and refuses exactly as before. Cloudly 33.19.2 adds no data step and no collection and keeps the data version 0.30.0, so an upgrade from 1.28.3 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.3 and requires Onebox 33.8.0. From 1.28.2 or earlier, the changes of Cloudly 33.18.3, 33.18.4, 33.18.5, 33.19.0 and 33.19.1 apply too: Runtime log intake no longer holds a node's request while its payload uploads: an admitted reportRuntimeAssignmentLogs costs one append transaction that queues the batch with its payload in the new collection cloudly_runtime_log_queue, and the node is answered once it commits. A background drain writes the payloads, up to 32 at once, and commits the ledger rows and removes the queue rows in coalesced transactions that fence no controller record; every other node request under a request budget counts as critical work, and the drain waits for it at most 1 s per step. A resend of a batch the ledger or the queue already holds is answered replay with nothing written, and while the queue is at its bounds (1024 batches, 64 MiB, 8 concurrent intakes) a report is refused at once with the retryable log-intake-saturated. Object writes list nothing (@lossless.org/client 1.23.3), workload logs are kept for at least 30 days whatever shorter logs.retentionMs a spec states, and one runtime log intake line, logged on its own timer at most once a minute, reports intake latency, queue depth, the drain and refusals. A node that applied its network head is no longer handed a successor that only drops the head's withdrawals, and a successor of the projection a node's receipt names lists only the tombstones its own step retires, so a node with more than 256 retired leases or handoffs stays within the contract's bound. Route verification reads the certificate a route presents on a connection of its own, without pooling or TLS session resumption, so it records the route's subject alternative names; a connection that exposes no certificate fails with TLS_PEER_CERTIFICATE_UNAVAILABLE and a certificate without names with TLS_SUBJECT_ALT_NAMES_MISSING. readServiceDeploymentStatus (@serve.zone/interfaces 32.54.0) reads a deployment operation's status without changing it, and a failed service deletion answers SERVICE_DELETION_FAILED and logs its cause. The first start after 1.28.2 or earlier creates the collection cloudly_runtime_log_queue. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Cloudly 33.19.1 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.2, 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.2 and requires Onebox 33.8.0. From 1.28.1 or earlier, Cloudly 33.18.2 advances a node's network configuration only once the node's authenticated application receipt names its head. Upgrade every node to Pallet 36.3.0 or later, speaking @serve.zone/interfaces 32.50.0 or later, before this Cloudly update: a node that sends no application receipt, Pallet 36.2.1 or earlier, or whose session speaks @serve.zone/interfaces below 32.50.0, keeps the projection it holds and receives no successor. The receipt wire contract is unchanged. The changes of Cloudly 33.18.2 and the releases before it that an upgrade from 1.28.1 or earlier also takes are described in the changelog of cloudly@1.28.2, which repeats those of every earlier template; this changelog keeps their upgrade path only, because a catalog changelog is bounded at 65536 characters. From 1.2.1 or earlier, startup runs the forward-only data migration from 0.20.0 to 0.21.0 through the step retire-cluster-relay-acme and then the steps runtime-session-protocol-offer to 0.22.0, deployment-machine-user-grants to 0.23.0, corestore-control-token-state to 0.24.0, runtime-log-attempts to 0.25.0, cluster-node-hostname-intent to 0.26.0, deployment-operation-route-evidence to 0.27.0, service-secret-target-predecessor to 0.28.0, route-claim-absent-owners to 0.29.0 and bounded-runtime-history to 0.30.0; retire-cluster-relay-acme drops the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logs every relay name whose A record Cloudly had written at Cloudflare: remove each such record at the provider. A cluster relay then requires a dcrouter that advertises dns.clientRecords and certificates.exactIssuance, SERVEZONE_SSLMODE=letsencrypt is refused (this template keeps external), and the typed API changes as the Breaking Changes of the Cloudly 33.0.0 changelog list; review them, stop Cloudly and take a verified backup before upgrading, because the 32.9 image refuses the migrated data and rollback requires a full restore. The upgrade is marked migration-required and backup-before-upgrade because hosts read these flags from the target version alone and every upgrade from 1.26.0 or earlier runs the 0.28.0 to 0.30.0 steps, one from 1.24.0 or earlier, and from 1.25.0 whose first start failed, the 0.25.0 to 0.28.0 steps before them, one from 1.19.0 or earlier the 0.24.0 to 0.25.0 step before that, one from 1.15.0 or earlier the 0.23.0 to 0.24.0 step before that, one from 1.8.0 or earlier the 0.22.0 to 0.23.0 step before that, one from 1.6.0 or earlier the 0.21.0 to 0.22.0 step before that and one from 1.2.1 or earlier the migration from 0.20.0 as well, and breaking and manual-review because every Cloudly before 33.17.3 refuses the 0.30.0 data, the 0.30.0 step deletes every archived deployment record, the 0.23.0 step removes stored grants forward-only, Cloudly 33.18.0 ignores APPSTORE_URL and loads the App Store catalog from its catalog registries and, from 1.7.0 or earlier, a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused. An installation on 1.1.10 or earlier also runs the 1.2.0 steps first, from 0.10.0, and requires completed Secrets v2 cutover retirement. Preserve existing user and storage identities, OIDC bindings, the encrypted keyring and WorkloadInit approval as dedicated root-readable files.",
|
|
7909
|
+
"breaking": true,
|
|
7910
|
+
"requiresManualReview": true,
|
|
7911
|
+
"migrationRequired": true,
|
|
7912
|
+
"backupBeforeUpgrade": true,
|
|
7913
|
+
"requiresFeatures": [
|
|
7914
|
+
"storage.object-storage.backup-exclusions"
|
|
7915
|
+
],
|
|
7916
|
+
"healthCheck": {
|
|
7917
|
+
"path": "/status",
|
|
7918
|
+
"port": 3000,
|
|
7919
|
+
"expectedStatus": 200
|
|
7920
|
+
}
|
|
7921
|
+
},
|
|
7922
|
+
"configDigest": "sha256:110432c0d224cd8433e796c63092b603738ad89c98e9f8e2b4bff36d2056e90e"
|
|
7923
|
+
},
|
|
7924
|
+
{
|
|
7925
|
+
"version": "1.29.0",
|
|
7926
|
+
"config": {
|
|
7927
|
+
"image": "code.foss.global/serve.zone/cloudly@sha256:0fa3b6a1fcf0d003c2e7397fbc774dbc35815d5c75492b4ec12f2474961f683e",
|
|
7928
|
+
"targetPorts": [
|
|
7929
|
+
{
|
|
7930
|
+
"name": "web",
|
|
7931
|
+
"port": 3000,
|
|
7932
|
+
"protocol": "http",
|
|
7933
|
+
"default": true
|
|
7934
|
+
}
|
|
7935
|
+
],
|
|
7936
|
+
"envVars": [
|
|
7937
|
+
{
|
|
7938
|
+
"key": "SERVEZONE_ENVIRONMENT",
|
|
7939
|
+
"value": "production",
|
|
7940
|
+
"description": "Cloudly runtime environment.",
|
|
7941
|
+
"required": true
|
|
7942
|
+
},
|
|
7943
|
+
{
|
|
7944
|
+
"key": "SERVEZONE_PUBLIC_ORIGIN",
|
|
7945
|
+
"value": "https://${SERVICE_DOMAIN}",
|
|
7946
|
+
"description": "Canonical public Cloudly origin including protocol and optional public port.",
|
|
7947
|
+
"required": true
|
|
7948
|
+
},
|
|
7949
|
+
{
|
|
7950
|
+
"key": "SERVEZONE_LISTENPORT",
|
|
7951
|
+
"value": "3000",
|
|
7952
|
+
"description": "Internal Cloudly HTTP port inside the container.",
|
|
7953
|
+
"required": true
|
|
7954
|
+
},
|
|
7955
|
+
{
|
|
7956
|
+
"key": "SERVEZONE_SSLMODE",
|
|
7957
|
+
"value": "external",
|
|
7958
|
+
"description": "Use external TLS termination through Onebox or dcrouter.",
|
|
7959
|
+
"required": true
|
|
7960
|
+
},
|
|
7961
|
+
{
|
|
7962
|
+
"key": "SERVEZONE_SECRET_KEYRING_PATH",
|
|
7963
|
+
"value": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
7964
|
+
"description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
|
|
7965
|
+
"required": true
|
|
7966
|
+
},
|
|
7967
|
+
{
|
|
7968
|
+
"key": "SERVEZONE_SECRET_KEYRING_FILE",
|
|
7969
|
+
"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.",
|
|
7970
|
+
"required": true,
|
|
7971
|
+
"secret": true,
|
|
7972
|
+
"delivery": {
|
|
7973
|
+
"type": "file",
|
|
7974
|
+
"targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
|
|
7975
|
+
"uid": 0,
|
|
7976
|
+
"gid": 0,
|
|
7977
|
+
"mode": 256
|
|
7978
|
+
}
|
|
7979
|
+
},
|
|
7980
|
+
{
|
|
7981
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
|
|
7982
|
+
"value": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
7983
|
+
"description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
|
|
7984
|
+
"required": true
|
|
7985
|
+
},
|
|
7986
|
+
{
|
|
7987
|
+
"key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
|
|
7988
|
+
"description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
|
|
7989
|
+
"required": true,
|
|
7990
|
+
"secret": true,
|
|
7991
|
+
"delivery": {
|
|
7992
|
+
"type": "file",
|
|
7993
|
+
"targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
|
|
7994
|
+
"uid": 0,
|
|
7995
|
+
"gid": 0,
|
|
7996
|
+
"mode": 256
|
|
7997
|
+
}
|
|
7998
|
+
},
|
|
7999
|
+
{
|
|
8000
|
+
"key": "MONGODB_URL",
|
|
8001
|
+
"value": "${MONGODB_URI}",
|
|
8002
|
+
"description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
|
|
8003
|
+
"required": true
|
|
8004
|
+
},
|
|
8005
|
+
{
|
|
8006
|
+
"key": "MONGODB_NAME",
|
|
8007
|
+
"value": "${MONGODB_DATABASE}",
|
|
8008
|
+
"description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
|
|
8009
|
+
"required": true
|
|
8010
|
+
},
|
|
8011
|
+
{
|
|
8012
|
+
"key": "MONGODB_USER",
|
|
8013
|
+
"value": "${MONGODB_USERNAME}",
|
|
8014
|
+
"description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
|
|
8015
|
+
"required": true
|
|
8016
|
+
},
|
|
8017
|
+
{
|
|
8018
|
+
"key": "MONGODB_PASS",
|
|
8019
|
+
"value": "${MONGODB_PASSWORD}",
|
|
8020
|
+
"description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
|
|
8021
|
+
"required": true
|
|
8022
|
+
},
|
|
8023
|
+
{
|
|
8024
|
+
"key": "S3_ENDPOINT",
|
|
8025
|
+
"value": "onebox-corestore",
|
|
8026
|
+
"description": "S3 endpoint host provisioned by Onebox Corestore.",
|
|
8027
|
+
"required": true
|
|
8028
|
+
},
|
|
8029
|
+
{
|
|
8030
|
+
"key": "S3_PORT",
|
|
8031
|
+
"value": "9000",
|
|
8032
|
+
"description": "S3 endpoint port provisioned by Onebox Corestore.",
|
|
8033
|
+
"required": true
|
|
8034
|
+
},
|
|
8035
|
+
{
|
|
8036
|
+
"key": "S3_USESSL",
|
|
8037
|
+
"value": "false",
|
|
8038
|
+
"description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
|
|
8039
|
+
"required": true
|
|
8040
|
+
},
|
|
8041
|
+
{
|
|
8042
|
+
"key": "S3_BUCKET",
|
|
8043
|
+
"value": "${S3_BUCKET}",
|
|
8044
|
+
"description": "Cloudly's own S3 bucket, provisioned by Onebox Corestore: registry storage and kept workload logs.",
|
|
8045
|
+
"required": true
|
|
8046
|
+
},
|
|
8047
|
+
{
|
|
8048
|
+
"key": "S3_ACCESSKEY",
|
|
8049
|
+
"value": "${S3_ACCESS_KEY}",
|
|
8050
|
+
"description": "S3 access key provisioned by Onebox Corestore.",
|
|
8051
|
+
"required": true
|
|
8052
|
+
},
|
|
8053
|
+
{
|
|
8054
|
+
"key": "S3_SECRETKEY",
|
|
8055
|
+
"value": "${S3_SECRET_KEY}",
|
|
8056
|
+
"description": "S3 secret key provisioned by Onebox Corestore.",
|
|
8057
|
+
"required": true
|
|
8058
|
+
}
|
|
8059
|
+
],
|
|
8060
|
+
"platformRequirements": {
|
|
8061
|
+
"mongodb": true,
|
|
8062
|
+
"s3": true
|
|
8063
|
+
},
|
|
8064
|
+
"backupExclusions": [
|
|
8065
|
+
{
|
|
8066
|
+
"storageRequest": "legacy-s3",
|
|
8067
|
+
"keyPrefixes": [
|
|
8068
|
+
"runtime-logs/"
|
|
8069
|
+
],
|
|
8070
|
+
"reason": "Workload logs; a restore brings back state, not past logs."
|
|
8071
|
+
}
|
|
8072
|
+
],
|
|
8073
|
+
"platformOidc": {
|
|
8074
|
+
"redirectPath": "/auth/oidc/callback",
|
|
8075
|
+
"roles": [
|
|
8076
|
+
{
|
|
8077
|
+
"id": "admin",
|
|
8078
|
+
"label": "Administrator",
|
|
8079
|
+
"description": "Full Cloudly administration for this hosted instance."
|
|
8080
|
+
},
|
|
8081
|
+
{
|
|
8082
|
+
"id": "user",
|
|
8083
|
+
"label": "User",
|
|
8084
|
+
"description": "Standard authenticated Cloudly access for this hosted instance."
|
|
8085
|
+
}
|
|
8086
|
+
],
|
|
8087
|
+
"environmentVariables": {
|
|
8088
|
+
"issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
|
|
8089
|
+
"clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
|
|
8090
|
+
"clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
|
|
8091
|
+
"redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
|
|
8092
|
+
"audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
|
|
8093
|
+
},
|
|
8094
|
+
"clientAuthenticationMethod": "client_secret_basic"
|
|
8095
|
+
},
|
|
8096
|
+
"minOneboxVersion": "33.8.0",
|
|
8097
|
+
"changelog": "Move Cloudly to 33.20.0, which serves non-public hostnames to dcrouter alone, writes workload logs as segments and lets a service whose retained rollout plan cannot run be redeployed. A node's cluster ingress serves non-public hostnames, restricted to dcrouter: before, Cloudly compiled only PUBLIC domains into the cluster route table, so a STANDARD hostname got a hub route and a private DNS answer while nothing on the node served it. A domain whose sourceProfileRef is not PUBLIC now compiles, on a moved and on a Pallet-born cluster, into a route whose sourceAllowList is the new setting dcrouterForwardSourceAddresses, the addresses dcrouter's forwarded connections arrive from at a node (set in the dashboard's dcrouter panel or with updateSettings; @serve.zone/interfaces 32.55.1 refuses IPv4-mapped IPv6 prefixes there, write the IPv4 prefix). A change of the setting revokes and reissues the route and refreshes every cluster ingress at once, and the ingress-to-workload grant covers every domain's target port. A non-public domain is left out by name while public routes are still served: while dcrouterForwardSourceAddresses is unset, while the cluster's ingress has not registered route-source-allowlist, and while the live cluster relay speaks @serve.zone/interfaces below 32.55.0. To serve a non-public hostname, the cluster's Coreflow and CoreTraffic must run releases on @serve.zone/interfaces 32.55.0 or later, and CoreTraffic must register the capability. Public port mappings stay public-only. Workload log payloads are written as segments, one object per capture every few minutes instead of one per batch: one object per batch grew Cloudly's bucket by about 7,000 objects an hour. A committed batch keeps its payload inline in the database, in the new collection cloudly_runtime_log_inline_payloads, so it reads as soon as it is committed; the drain then writes a capture's inline payloads as one segment, runtime-logs/<serviceId>/<assignmentId>/<captureId>/<first>-<last>.jsonl, and only after the write moves the ledger rows onto it and removes the inline payloads. A segment is due 5 minutes after its capture's oldest inline payload was committed, at 1 MiB, when the capture's final batch is inline, and early, largest capture first, once all inline payloads pass 16 MiB; at 32 MiB the drain commits nothing more until segments are written, so the queue's bounds refuse new reports with the retryable log-intake-saturated. A stop writes no segment early, and the next start writes the inline payloads when due. Rows committed before this version name their own object as before and age out under the 30-day retention. All payload objects stay below runtime-logs/, the prefix this template declares non-backup. The ledger collection cloudly_runtime_log_batches gains no index, so a start builds none over the existing ledger. A spec-owned service whose retained rollout plan the current runtime cannot execute, such as a Swarm-era promotion written before @serve.zone/interfaces 23.0.0 made the sealed containerInvocation required, can be redeployed: its runtime producer refuses the plan image-plan-missing instead of failing its build step on every pass, and while no deployment operation is in flight the reserve preflight answers GO with the auditable RECOVERY_REDEPLOY_OVER_FAILED_RUNTIME warning, which names the plan and the rules it breaks, instead of NO-GO with CURRENT_RUNTIME_DIGEST_MISSING and RUNTIME_ATTESTATION_MISMATCH. An attested runtime, a mutable current reference, a valid plan over an unattested runtime and an operation in flight still block as before. Cloudly 33.20.0 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.6 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.6 and requires Onebox 33.8.0. Its first start creates the collection cloudly_runtime_log_inline_payloads. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Every workload log batch this version commits names where its payload is, and Cloudly 33.19.2 and earlier refuse such a ledger row whenever they read it, so a return to 1.28.6 or an earlier template after this version committed a log batch requires the backup taken before the upgrade. Like 1.28.5 and 1.28.6, this template declares Cloudly's workload logs non-backup data: backupExclusions names the key prefix runtime-logs/ of Cloudly's own bucket, the object storage platformRequirements.s3 provisions (storage request legacy-s3), and requiresFeatures names storage.object-storage.backup-exclusions. A host that fulfils that feature leaves the objects under runtime-logs/ out of Cloudly's backups, and a restore brings back Cloudly's state, not its past workload logs: it neither restores nor removes objects under that prefix, and Cloudly reports a log batch whose payload it no longer has as a gap. A host that does not fulfil the feature keeps listing this version and refuses it as an install or upgrade target. From 1.28.6 the upgrade moves Cloudly from 33.19.2 to 33.20.0. From 1.28.5, which runs the Cloudly 33.19.1 image of 1.28.3, it also takes the changes of Cloudly 33.19.2; from 1.28.4 or earlier the template also gains the declaration. The rest of this changelog is that of 1.28.4, the Cloudly 33.19.2 template, and describes the changes of Cloudly 33.19.2 and the releases before it that an upgrade from 1.28.5 or earlier also takes: Move Cloudly to 33.19.2, a fixes-only patch over 33.19.1. A greenfield deployment, a legacy import's successor included, proves its namespace blank on the nodes of the Pallet clusters (phase switching or pallet) and nowhere else: a reservation whose service had no rollout plan yet asked every registered node, so a fleet that still keeps a Coreflow-owned Swarm cluster without a relay could never reserve one, and a legacy import's reserve preflight answered NO-GO with CORESTORE_INVENTORY_UNAVAILABLE and NAMESPACE_NOT_PROVEN_BLANK. The deployment preflight and reserveServiceDeployment read the same nodes; a Pallet node whose inventory cannot be read still blocks, a fleet with no Pallet cluster node refuses the reservation CORESTORE_INVENTORY_UNAVAILABLE, and an existing service's preflight still reads its plan's clusters. A greenfield rollout without a Pallet runtime spec is refused GREENFIELD_PALLET_RUNTIME_SPEC_REQUIRED, which is not retryable, instead of falling back to Coreflow placement onto Swarm nodes the namespace proof never covered: state the spec with setServiceRuntimeSpec, then promote again. A rollout with a Pallet spec plans onto the spec's nodes as before. A node's network compilation proves each workload lease once and each protected authority revision and allocation eligibility proof once per transaction (before, every lease was read up to three times per compilation and each read re-proved the same revision and proof, about 24 proof reads per endpoint), so a compilation with 100 endpoints reads 539 records instead of 2,839 (7.8 s instead of 19.8 s on Cloudly's test fixture), and every compilation signs and refuses exactly as before. Cloudly 33.19.2 adds no data step and no collection and keeps the data version 0.30.0, so an upgrade from 1.28.3 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.3 and requires Onebox 33.8.0. From 1.28.2 or earlier, the changes of Cloudly 33.18.3, 33.18.4, 33.18.5, 33.19.0 and 33.19.1 apply too: Runtime log intake no longer holds a node's request while its payload uploads: an admitted reportRuntimeAssignmentLogs costs one append transaction that queues the batch with its payload in the new collection cloudly_runtime_log_queue, and the node is answered once it commits. A background drain writes the payloads, up to 32 at once, and commits the ledger rows and removes the queue rows in coalesced transactions that fence no controller record; every other node request under a request budget counts as critical work, and the drain waits for it at most 1 s per step. A resend of a batch the ledger or the queue already holds is answered replay with nothing written, and while the queue is at its bounds (1024 batches, 64 MiB, 8 concurrent intakes) a report is refused at once with the retryable log-intake-saturated. Object writes list nothing (@lossless.org/client 1.23.3), workload logs are kept for at least 30 days whatever shorter logs.retentionMs a spec states, and one runtime log intake line, logged on its own timer at most once a minute, reports intake latency, queue depth, the drain and refusals. A node that applied its network head is no longer handed a successor that only drops the head's withdrawals, and a successor of the projection a node's receipt names lists only the tombstones its own step retires, so a node with more than 256 retired leases or handoffs stays within the contract's bound. Route verification reads the certificate a route presents on a connection of its own, without pooling or TLS session resumption, so it records the route's subject alternative names; a connection that exposes no certificate fails with TLS_PEER_CERTIFICATE_UNAVAILABLE and a certificate without names with TLS_SUBJECT_ALT_NAMES_MISSING. readServiceDeploymentStatus (@serve.zone/interfaces 32.54.0) reads a deployment operation's status without changing it, and a failed service deletion answers SERVICE_DELETION_FAILED and logs its cause. The first start after 1.28.2 or earlier creates the collection cloudly_runtime_log_queue. On the platform Corestore 32.2.4 (NoSQLDB 10.6.1) a collection creation waits at most 5 s for the open transactions on the Cloudly database, and a transaction an earlier Cloudly left open by exiting before its stop completed (it logs that its shutdown deadline passed) holds that database until its session expires 30 minutes later, so that first start fails with EFENCE_BUSY until then: after an unclean stop of the previous Cloudly, start this version no earlier than 30 minutes after that exit. Cloudly 33.19.1 adds no data step and keeps the data version 0.30.0, so an upgrade from 1.28.2, 1.28.1 or 1.28.0 runs no data step; it changes neither the Dockerfile nor the qenv.yml requirements, and the runtime contract is unchanged from 1.28.2 and requires Onebox 33.8.0. From 1.28.1 or earlier, Cloudly 33.18.2 advances a node's network configuration only once the node's authenticated application receipt names its head. Upgrade every node to Pallet 36.3.0 or later, speaking @serve.zone/interfaces 32.50.0 or later, before this Cloudly update: a node that sends no application receipt, Pallet 36.2.1 or earlier, or whose session speaks @serve.zone/interfaces below 32.50.0, keeps the projection it holds and receives no successor. The receipt wire contract is unchanged. The changes of Cloudly 33.18.2 and the releases before it that an upgrade from 1.28.1 or earlier also takes are described in the changelog of cloudly@1.28.2, which repeats those of every earlier template; this changelog keeps their upgrade path only, because a catalog changelog is bounded at 65536 characters. From 1.2.1 or earlier, startup runs the forward-only data migration from 0.20.0 to 0.21.0 through the step retire-cluster-relay-acme and then the steps runtime-session-protocol-offer to 0.22.0, deployment-machine-user-grants to 0.23.0, corestore-control-token-state to 0.24.0, runtime-log-attempts to 0.25.0, cluster-node-hostname-intent to 0.26.0, deployment-operation-route-evidence to 0.27.0, service-secret-target-predecessor to 0.28.0, route-claim-absent-owners to 0.29.0 and bounded-runtime-history to 0.30.0; retire-cluster-relay-acme drops the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logs every relay name whose A record Cloudly had written at Cloudflare: remove each such record at the provider. A cluster relay then requires a dcrouter that advertises dns.clientRecords and certificates.exactIssuance, SERVEZONE_SSLMODE=letsencrypt is refused (this template keeps external), and the typed API changes as the Breaking Changes of the Cloudly 33.0.0 changelog list; review them, stop Cloudly and take a verified backup before upgrading, because the 32.9 image refuses the migrated data and rollback requires a full restore. The upgrade is marked migration-required and backup-before-upgrade because hosts read these flags from the target version alone and every upgrade from 1.26.0 or earlier runs the 0.28.0 to 0.30.0 steps, one from 1.24.0 or earlier, and from 1.25.0 whose first start failed, the 0.25.0 to 0.28.0 steps before them, one from 1.19.0 or earlier the 0.24.0 to 0.25.0 step before that, one from 1.15.0 or earlier the 0.23.0 to 0.24.0 step before that, one from 1.8.0 or earlier the 0.22.0 to 0.23.0 step before that, one from 1.6.0 or earlier the 0.21.0 to 0.22.0 step before that and one from 1.2.1 or earlier the migration from 0.20.0 as well, and breaking and manual-review because every Cloudly before 33.17.3 refuses the 0.30.0 data, the 0.30.0 step deletes every archived deployment record, the 0.23.0 step removes stored grants forward-only, Cloudly 33.18.0 ignores APPSTORE_URL and loads the App Store catalog from its catalog registries and, from 1.7.0 or earlier, a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused. An installation on 1.1.10 or earlier also runs the 1.2.0 steps first, from 0.10.0, and requires completed Secrets v2 cutover retirement. Preserve existing user and storage identities, OIDC bindings, the encrypted keyring and WorkloadInit approval as dedicated root-readable files.",
|
|
8098
|
+
"breaking": true,
|
|
8099
|
+
"requiresManualReview": true,
|
|
8100
|
+
"migrationRequired": true,
|
|
8101
|
+
"backupBeforeUpgrade": true,
|
|
8102
|
+
"requiresFeatures": [
|
|
8103
|
+
"storage.object-storage.backup-exclusions"
|
|
8104
|
+
],
|
|
8105
|
+
"healthCheck": {
|
|
8106
|
+
"path": "/status",
|
|
8107
|
+
"port": 3000,
|
|
8108
|
+
"expectedStatus": 200
|
|
8109
|
+
}
|
|
8110
|
+
},
|
|
8111
|
+
"configDigest": "sha256:1544df3a1e4e7d3413118e225e234f81061ed9fbc1d824b5827c4a14a31fd3c9"
|
|
7545
8112
|
}
|
|
7546
8113
|
]
|
|
7547
8114
|
},
|
|
@@ -8315,11 +8882,11 @@
|
|
|
8315
8882
|
}
|
|
8316
8883
|
]
|
|
8317
8884
|
},
|
|
8318
|
-
"catalogDigest": "sha256:
|
|
8885
|
+
"catalogDigest": "sha256:747ea478ea4c79aacc22e70a7c9a2568101fb78f8f50373dfbd5fee57fb63c16",
|
|
8319
8886
|
"signatures": [
|
|
8320
8887
|
{
|
|
8321
8888
|
"keyId": "sha256:58956c3537cdf542430d6685261824776d6128ebb9a93b3d77b53f2d031ba854",
|
|
8322
|
-
"signature": "
|
|
8889
|
+
"signature": "a2cb33cecda2ff7631961f9013b6f374071471a6d658d2c634ebcac96d1e976ef366e6e715b71bd74d334d6ae052b5cf2a94663ba174d27e1e98d29c0ac9690a"
|
|
8323
8890
|
}
|
|
8324
8891
|
]
|
|
8325
8892
|
}
|