@serve.zone/appstore 32.4.0 → 32.6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serve.zone/appstore",
3
- "version": "32.4.0",
3
+ "version": "32.6.0",
4
4
  "private": false,
5
5
  "description": "serve.zone App Store metadata, parser, and resolver client.",
6
6
  "type": "module",
@@ -16,7 +16,7 @@
16
16
  "devDependencies": {
17
17
  "@git.zone/tsbuild": "^5.0.0",
18
18
  "@git.zone/tsdoc": "2.2.2",
19
- "@git.zone/tstest": "6.3.0",
19
+ "@git.zone/tstest": "6.3.2",
20
20
  "@types/node": "26.6.2"
21
21
  },
22
22
  "files": [
package/readme.md CHANGED
@@ -33,7 +33,7 @@ The App Store currently lists 21 app templates.
33
33
  | App ID | Name | App Store category | Image | Port |
34
34
  | --- | --- | --- | --- | --- |
35
35
  | `adminer` | Adminer | Dev Tools | `adminer:latest` | `8080` |
36
- | `cloudly` | Cloudly | Dev Tools | `code.foss.global/serve.zone/cloudly@sha256:15796a1a784652cc8a59020125db14dc833c7e0e12d584209ccd6ada8f302bff` | `3000` |
36
+ | `cloudly` | Cloudly | Dev Tools | `code.foss.global/serve.zone/cloudly@sha256:fe1d10de09a8dc28f4dcf32b8e2cfed1ca7329b7d1b7405048a6e328afe5f9a6` | `3000` |
37
37
  | `ghost` | Ghost | CMS | `ghost:latest` | `2368` |
38
38
  | `gitea` | Gitea | Dev Tools | `gitea/gitea:latest` | `3000` |
39
39
  | `gitops` | GitOps | Dev Tools | `code.foss.global/serve.zone/gitops:2.13.0` | `3000` |
@@ -64,7 +64,7 @@ Some templates ask Onebox to provision local platform services and inject connec
64
64
 
65
65
  | App ID | Requirements | Notes |
66
66
  | --- | --- | --- |
67
- | `cloudly` | MongoDB, S3 | Version `1.4.0` pins Cloudly `33.1.0` and requires Onebox `32.4.0`. It keeps the `1.3.0` runtime contract and is marked breaking, migration-required, backup-before-upgrade and manual-review, because the flags are read from the target version alone. From `1.2.1` or earlier, startup runs the forward-only migration from `0.20.0` to `0.21.0`, dropping the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logging every relay name whose A record Cloudly had written at Cloudflare, which the operator removes at the provider. dcrouter holds every cluster relay name's A record and certificate from then on, `SERVEZONE_SSLMODE=letsencrypt` is refused, and the typed API changes as the Cloudly 33.0.0 changelog lists. Stop Cloudly and take a verified backup before upgrading; rollback is full-restore-only. From `1.3.0` there is no data step, but roll out Cloudly `33.1.0` before Coreflow `33.1.0` and Corestore `33.0.0`, and set every node's Corestore database endpoint, because a database binding on a node without one is not granted and its service is refused `database-endpoint-missing`. From `1.1.10` or earlier, startup first runs the `1.2.0` steps from `0.10.0` and needs completed Secrets v2 cutover retirement. Both the existing Secrets v2 keyring and operator-approved WorkloadInit authority are required encrypted inputs delivered as separate root-owned `0400` files; the public environment contains only their fixed paths. |
67
+ | `cloudly` | MongoDB, S3 | Version `1.6.0` pins Cloudly `33.3.0` and requires Onebox `32.4.0`. It keeps the `1.5.0` runtime contract and is marked breaking, migration-required, backup-before-upgrade and manual-review, because the flags are read from the target version alone and an upgrade from `1.2.1` or earlier still migrates on this image; from `1.4.0` and `1.5.0` there is no data step. Cloudly `33.3.0` lets an administrator set a service's network egress with `setServiceNetworkEgress` (public internet, and the platform endpoints of the protected authority), and refuses a workload whose database or object-storage binding sits on a node whose Corestore endpoint its network does not select as `database-endpoint-unselected` or `objectstorage-endpoint-unselected`; a replica already running keeps running while its target reports the refusal. From `1.4.0`, Cloudly `33.2.0`'s changes apply: Cloudly takes a dcrouter admin token once through `bootstrapExternalGatewayCredential` to provision its own gateway-client credential, starts a first enrollment with the gateway settings, and stages a gateway settings change the held credential cannot carry until the next bootstrap. From `1.2.1` or earlier, startup runs the forward-only migration from `0.20.0` to `0.21.0`, dropping the relay certificate and DNS collections of Cloudly's retired Cloudflare and Let's Encrypt integration and logging every relay name whose A record Cloudly had written at Cloudflare, which the operator removes at the provider. dcrouter holds every cluster relay name's A record and certificate from then on, `SERVEZONE_SSLMODE=letsencrypt` is refused, and the typed API changes as the Cloudly 33.0.0 changelog lists. Stop Cloudly and take a verified backup before upgrading; rollback is full-restore-only. Roll out Cloudly `33.3.0` before Coreflow `33.2.0`; Coreflow `33.1.0` is the minimum. From `1.3.0` there is no data step, but roll out Cloudly before Coreflow and Corestore `33.0.0`, and set every node's Corestore database endpoint, because a database binding on a node without one is not granted and its service is refused `database-endpoint-missing`, and existing database bindings return no credentials until they are granted again for the endpoint. From `1.1.10` or earlier, startup first runs the `1.2.0` steps from `0.10.0` and needs completed Secrets v2 cutover retirement. Both the existing Secrets v2 keyring and operator-approved WorkloadInit authority are required encrypted inputs delivered as separate root-owned `0400` files; the public environment contains only their fixed paths. |
68
68
  | `ghost` | MariaDB | Uses MySQL-style `database__connection__*` environment variables. |
69
69
  | `gitea` | MariaDB | Uses Gitea database environment variables with `${MARIADB_*}` placeholders. |
70
70
  | `nextcloud` | MariaDB, Valkey | Uses MySQL-compatible database variables. Valkey is declared as a platform requirement. |
@@ -34,7 +34,7 @@ export const appStorePackageData: IAppStorePackageData = {
34
34
  "description": "Multi-node serve.zone control plane for clusters, workload services, domains, and deployments.",
35
35
  "category": "Dev Tools",
36
36
  "iconName": "server",
37
- "latestVersion": "1.4.0",
37
+ "latestVersion": "1.6.0",
38
38
  "versions": [
39
39
  "1.0.0",
40
40
  "1.1.0",
@@ -51,7 +51,9 @@ export const appStorePackageData: IAppStorePackageData = {
51
51
  "1.2.0",
52
52
  "1.2.1",
53
53
  "1.3.0",
54
- "1.4.0"
54
+ "1.4.0",
55
+ "1.5.0",
56
+ "1.6.0"
55
57
  ],
56
58
  "maintainer": "serve.zone",
57
59
  "links": {
@@ -2512,6 +2514,352 @@ export const appStorePackageData: IAppStorePackageData = {
2512
2514
  "expectedStatus": 200
2513
2515
  }
2514
2516
  },
2517
+ "apps/cloudly/versions/1.5.0/config.json": {
2518
+ "image": "code.foss.global/serve.zone/cloudly@sha256:11bc9a39011c1fa21bf621067e0ff6d4c2fe8cb0306745eca825db13285ae756",
2519
+ "targetPorts": [
2520
+ {
2521
+ "name": "web",
2522
+ "port": 3000,
2523
+ "protocol": "http",
2524
+ "default": true
2525
+ }
2526
+ ],
2527
+ "envVars": [
2528
+ {
2529
+ "key": "SERVEZONE_ENVIRONMENT",
2530
+ "value": "production",
2531
+ "description": "Cloudly runtime environment.",
2532
+ "required": true
2533
+ },
2534
+ {
2535
+ "key": "SERVEZONE_PUBLIC_ORIGIN",
2536
+ "value": "https://${SERVICE_DOMAIN}",
2537
+ "description": "Canonical public Cloudly origin including protocol and optional public port.",
2538
+ "required": true
2539
+ },
2540
+ {
2541
+ "key": "SERVEZONE_LISTENPORT",
2542
+ "value": "3000",
2543
+ "description": "Internal Cloudly HTTP port inside the container.",
2544
+ "required": true
2545
+ },
2546
+ {
2547
+ "key": "SERVEZONE_SSLMODE",
2548
+ "value": "external",
2549
+ "description": "Use external TLS termination through Onebox or dcrouter.",
2550
+ "required": true
2551
+ },
2552
+ {
2553
+ "key": "SERVEZONE_SECRET_KEYRING_PATH",
2554
+ "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
2555
+ "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
2556
+ "required": true
2557
+ },
2558
+ {
2559
+ "key": "SERVEZONE_SECRET_KEYRING_FILE",
2560
+ "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.",
2561
+ "required": true,
2562
+ "secret": true,
2563
+ "delivery": {
2564
+ "type": "file",
2565
+ "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
2566
+ "uid": 0,
2567
+ "gid": 0,
2568
+ "mode": 256
2569
+ }
2570
+ },
2571
+ {
2572
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
2573
+ "value": "/run/secrets/cloudly-workloadinit-approval.json",
2574
+ "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
2575
+ "required": true
2576
+ },
2577
+ {
2578
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
2579
+ "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
2580
+ "required": true,
2581
+ "secret": true,
2582
+ "delivery": {
2583
+ "type": "file",
2584
+ "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
2585
+ "uid": 0,
2586
+ "gid": 0,
2587
+ "mode": 256
2588
+ }
2589
+ },
2590
+ {
2591
+ "key": "MONGODB_URL",
2592
+ "value": "${MONGODB_URI}",
2593
+ "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
2594
+ "required": true
2595
+ },
2596
+ {
2597
+ "key": "MONGODB_NAME",
2598
+ "value": "${MONGODB_DATABASE}",
2599
+ "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
2600
+ "required": true
2601
+ },
2602
+ {
2603
+ "key": "MONGODB_USER",
2604
+ "value": "${MONGODB_USERNAME}",
2605
+ "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
2606
+ "required": true
2607
+ },
2608
+ {
2609
+ "key": "MONGODB_PASS",
2610
+ "value": "${MONGODB_PASSWORD}",
2611
+ "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
2612
+ "required": true
2613
+ },
2614
+ {
2615
+ "key": "S3_ENDPOINT",
2616
+ "value": "onebox-corestore",
2617
+ "description": "S3 endpoint host provisioned by Onebox Corestore.",
2618
+ "required": true
2619
+ },
2620
+ {
2621
+ "key": "S3_PORT",
2622
+ "value": "9000",
2623
+ "description": "S3 endpoint port provisioned by Onebox Corestore.",
2624
+ "required": true
2625
+ },
2626
+ {
2627
+ "key": "S3_USESSL",
2628
+ "value": "false",
2629
+ "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
2630
+ "required": true
2631
+ },
2632
+ {
2633
+ "key": "S3_BUCKET",
2634
+ "value": "${S3_BUCKET}",
2635
+ "description": "S3 bucket provisioned by Onebox Corestore for Cloudly's registry.",
2636
+ "required": true
2637
+ },
2638
+ {
2639
+ "key": "S3_ACCESSKEY",
2640
+ "value": "${S3_ACCESS_KEY}",
2641
+ "description": "S3 access key provisioned by Onebox Corestore.",
2642
+ "required": true
2643
+ },
2644
+ {
2645
+ "key": "S3_SECRETKEY",
2646
+ "value": "${S3_SECRET_KEY}",
2647
+ "description": "S3 secret key provisioned by Onebox Corestore.",
2648
+ "required": true
2649
+ }
2650
+ ],
2651
+ "platformRequirements": {
2652
+ "mongodb": true,
2653
+ "s3": true
2654
+ },
2655
+ "platformOidc": {
2656
+ "redirectPath": "/auth/oidc/callback",
2657
+ "roles": [
2658
+ {
2659
+ "id": "admin",
2660
+ "label": "Administrator",
2661
+ "description": "Full Cloudly administration for this hosted instance."
2662
+ },
2663
+ {
2664
+ "id": "user",
2665
+ "label": "User",
2666
+ "description": "Standard authenticated Cloudly access for this hosted instance."
2667
+ }
2668
+ ],
2669
+ "environmentVariables": {
2670
+ "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
2671
+ "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
2672
+ "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
2673
+ "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
2674
+ "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
2675
+ },
2676
+ "clientAuthenticationMethod": "client_secret_basic"
2677
+ },
2678
+ "minOneboxVersion": "32.4.0",
2679
+ "changelog": "Move Cloudly to 33.2.0, a feature release over 33.1.0: an administrator hands Cloudly a dcrouter admin token once through bootstrapExternalGatewayCredential or servezone gateway bootstrap, from which Cloudly provisions and stores its own gateway-client credential without storing or logging the token; a first enrollment starts with the gateway settings and turns admin-bootstrap-required instead of refusing them for the missing credential; a gateway settings change the held credential cannot carry is staged while the running gateway client keeps serving, until the next bootstrap switches both; a runtime network address plan with a list out of its canonical order is refused plan-unsorted; and a relay naming a node Cloudly does not hold is refused relay-node-unknown. The runtime contract is unchanged from 1.4.0 and requires Onebox 32.4.0. From 1.4.0 there is no data step, as the data version stays 0.21.0: roll out Cloudly 33.2.0 first, then Coreflow 33.2.0, which recognises the relay-node-unknown refusal, and take a verified backup before upgrading. From 1.3.0 there is no data step either, but the per-node database endpoint of Cloudly 33.1.0 applies: roll out Cloudly 33.2.0 first, then Coreflow 33.2.0 (33.1.0 at minimum), then Corestore 33.0.0, and set every node's Corestore database endpoint with setClusterNodeCorestoreDatabaseEndpoint, because a database binding on a node without one is not granted and its service is refused database-endpoint-missing, and existing database bindings answer no credential material until they are granted again for the endpoint. 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, which 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 breaking, migration-required, backup-before-upgrade and manual-review because these flags are read from the target version alone and an upgrade from 1.2.1 or earlier still runs the migration on this image. 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.",
2680
+ "breaking": true,
2681
+ "requiresManualReview": true,
2682
+ "migrationRequired": true,
2683
+ "backupBeforeUpgrade": true,
2684
+ "healthCheck": {
2685
+ "path": "/status",
2686
+ "port": 3000,
2687
+ "expectedStatus": 200
2688
+ }
2689
+ },
2690
+ "apps/cloudly/versions/1.6.0/config.json": {
2691
+ "image": "code.foss.global/serve.zone/cloudly@sha256:fe1d10de09a8dc28f4dcf32b8e2cfed1ca7329b7d1b7405048a6e328afe5f9a6",
2692
+ "targetPorts": [
2693
+ {
2694
+ "name": "web",
2695
+ "port": 3000,
2696
+ "protocol": "http",
2697
+ "default": true
2698
+ }
2699
+ ],
2700
+ "envVars": [
2701
+ {
2702
+ "key": "SERVEZONE_ENVIRONMENT",
2703
+ "value": "production",
2704
+ "description": "Cloudly runtime environment.",
2705
+ "required": true
2706
+ },
2707
+ {
2708
+ "key": "SERVEZONE_PUBLIC_ORIGIN",
2709
+ "value": "https://${SERVICE_DOMAIN}",
2710
+ "description": "Canonical public Cloudly origin including protocol and optional public port.",
2711
+ "required": true
2712
+ },
2713
+ {
2714
+ "key": "SERVEZONE_LISTENPORT",
2715
+ "value": "3000",
2716
+ "description": "Internal Cloudly HTTP port inside the container.",
2717
+ "required": true
2718
+ },
2719
+ {
2720
+ "key": "SERVEZONE_SSLMODE",
2721
+ "value": "external",
2722
+ "description": "Use external TLS termination through Onebox or dcrouter.",
2723
+ "required": true
2724
+ },
2725
+ {
2726
+ "key": "SERVEZONE_SECRET_KEYRING_PATH",
2727
+ "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
2728
+ "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
2729
+ "required": true
2730
+ },
2731
+ {
2732
+ "key": "SERVEZONE_SECRET_KEYRING_FILE",
2733
+ "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.",
2734
+ "required": true,
2735
+ "secret": true,
2736
+ "delivery": {
2737
+ "type": "file",
2738
+ "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
2739
+ "uid": 0,
2740
+ "gid": 0,
2741
+ "mode": 256
2742
+ }
2743
+ },
2744
+ {
2745
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
2746
+ "value": "/run/secrets/cloudly-workloadinit-approval.json",
2747
+ "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
2748
+ "required": true
2749
+ },
2750
+ {
2751
+ "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
2752
+ "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
2753
+ "required": true,
2754
+ "secret": true,
2755
+ "delivery": {
2756
+ "type": "file",
2757
+ "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
2758
+ "uid": 0,
2759
+ "gid": 0,
2760
+ "mode": 256
2761
+ }
2762
+ },
2763
+ {
2764
+ "key": "MONGODB_URL",
2765
+ "value": "${MONGODB_URI}",
2766
+ "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
2767
+ "required": true
2768
+ },
2769
+ {
2770
+ "key": "MONGODB_NAME",
2771
+ "value": "${MONGODB_DATABASE}",
2772
+ "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
2773
+ "required": true
2774
+ },
2775
+ {
2776
+ "key": "MONGODB_USER",
2777
+ "value": "${MONGODB_USERNAME}",
2778
+ "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
2779
+ "required": true
2780
+ },
2781
+ {
2782
+ "key": "MONGODB_PASS",
2783
+ "value": "${MONGODB_PASSWORD}",
2784
+ "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
2785
+ "required": true
2786
+ },
2787
+ {
2788
+ "key": "S3_ENDPOINT",
2789
+ "value": "onebox-corestore",
2790
+ "description": "S3 endpoint host provisioned by Onebox Corestore.",
2791
+ "required": true
2792
+ },
2793
+ {
2794
+ "key": "S3_PORT",
2795
+ "value": "9000",
2796
+ "description": "S3 endpoint port provisioned by Onebox Corestore.",
2797
+ "required": true
2798
+ },
2799
+ {
2800
+ "key": "S3_USESSL",
2801
+ "value": "false",
2802
+ "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
2803
+ "required": true
2804
+ },
2805
+ {
2806
+ "key": "S3_BUCKET",
2807
+ "value": "${S3_BUCKET}",
2808
+ "description": "S3 bucket provisioned by Onebox Corestore for Cloudly's registry.",
2809
+ "required": true
2810
+ },
2811
+ {
2812
+ "key": "S3_ACCESSKEY",
2813
+ "value": "${S3_ACCESS_KEY}",
2814
+ "description": "S3 access key provisioned by Onebox Corestore.",
2815
+ "required": true
2816
+ },
2817
+ {
2818
+ "key": "S3_SECRETKEY",
2819
+ "value": "${S3_SECRET_KEY}",
2820
+ "description": "S3 secret key provisioned by Onebox Corestore.",
2821
+ "required": true
2822
+ }
2823
+ ],
2824
+ "platformRequirements": {
2825
+ "mongodb": true,
2826
+ "s3": true
2827
+ },
2828
+ "platformOidc": {
2829
+ "redirectPath": "/auth/oidc/callback",
2830
+ "roles": [
2831
+ {
2832
+ "id": "admin",
2833
+ "label": "Administrator",
2834
+ "description": "Full Cloudly administration for this hosted instance."
2835
+ },
2836
+ {
2837
+ "id": "user",
2838
+ "label": "User",
2839
+ "description": "Standard authenticated Cloudly access for this hosted instance."
2840
+ }
2841
+ ],
2842
+ "environmentVariables": {
2843
+ "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
2844
+ "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
2845
+ "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
2846
+ "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
2847
+ "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
2848
+ },
2849
+ "clientAuthenticationMethod": "client_secret_basic"
2850
+ },
2851
+ "minOneboxVersion": "32.4.0",
2852
+ "changelog": "Move Cloudly to 33.3.0, a feature release over 33.2.0: an administrator sets a service's network egress with setServiceNetworkEgress, which states whether the service's attached workloads reach the public internet and which platform endpoints of the protected authority they reach, and reads it with getServiceNetworkEgress; before this nothing could grant a workload public egress or a platform endpoint. A workload whose enabled database or object-storage binding sits on a node whose Corestore endpoint its network does not select is refused database-endpoint-unselected or objectstorage-endpoint-unselected instead of being started against a connection that stays dark, and an isolated network selects none; a replica already running keeps running while its target reports the refusal, so grant the endpoint through the service's egress before such a workload is placed again. The default runtime spec of a new service probes its process instead of its first TCP target port. The runtime contract is unchanged from 1.5.0 and requires Onebox 32.4.0. From 1.5.0 there is no data step, as the data version stays 0.21.0; take a verified backup before upgrading. From 1.4.0 there is no data step either, but the gateway admin bootstrap of Cloudly 33.2.0 applies: an administrator hands Cloudly a dcrouter admin token once through bootstrapExternalGatewayCredential or servezone gateway bootstrap, from which Cloudly provisions and stores its own gateway-client credential; a first enrollment turns admin-bootstrap-required, a gateway settings change the held credential cannot carry is staged, a runtime network address plan out of its canonical order is refused plan-unsorted, and a relay naming a node Cloudly does not hold is refused relay-node-unknown: roll out Cloudly 33.3.0 first, then Coreflow 33.2.0, which recognises the relay-node-unknown refusal. From 1.3.0 there is no data step either, but the per-node database endpoint of Cloudly 33.1.0 applies: roll out Cloudly 33.3.0 first, then Coreflow 33.2.0 (33.1.0 at minimum), then Corestore 33.0.0, and set every node's Corestore database endpoint with setClusterNodeCorestoreDatabaseEndpoint, because a database binding on a node without one is not granted and its service is refused database-endpoint-missing, and existing database bindings answer no credential material until they are granted again for the endpoint. 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, which 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 breaking, migration-required, backup-before-upgrade and manual-review because these flags are read from the target version alone and an upgrade from 1.2.1 or earlier still runs the migration on this image. 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.",
2853
+ "breaking": true,
2854
+ "requiresManualReview": true,
2855
+ "migrationRequired": true,
2856
+ "backupBeforeUpgrade": true,
2857
+ "healthCheck": {
2858
+ "path": "/status",
2859
+ "port": 3000,
2860
+ "expectedStatus": 200
2861
+ }
2862
+ },
2515
2863
  "apps/ghost/app.json": {
2516
2864
  "id": "ghost",
2517
2865
  "name": "Ghost",
@@ -3540,7 +3888,7 @@ export const appStorePackageData: IAppStorePackageData = {
3540
3888
  "description": "Multi-node serve.zone control plane for clusters, workload services, domains, and deployments.",
3541
3889
  "category": "Dev Tools",
3542
3890
  "iconName": "server",
3543
- "latestVersion": "1.4.0",
3891
+ "latestVersion": "1.6.0",
3544
3892
  "tags": [
3545
3893
  "serve.zone",
3546
3894
  "control-plane",