@serve.zone/appstore 32.26.0 → 33.0.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.
Files changed (124) hide show
  1. package/.smartconfig.json +4 -1
  2. package/changelog.md +72 -0
  3. package/dist_catalog/catalog.digest +1 -0
  4. package/dist_catalog/catalog.envelope.json +7440 -0
  5. package/{dist_ts_client/data.generated.js → dist_catalog/catalog.json} +6742 -6741
  6. package/dist_ts_client/catalog.d.ts +16 -0
  7. package/dist_ts_client/catalog.js +12 -0
  8. package/dist_ts_client/index.d.ts +3 -1
  9. package/dist_ts_client/index.js +4 -2
  10. package/dist_ts_client/loader.d.ts +69 -0
  11. package/dist_ts_client/loader.js +361 -0
  12. package/dist_ts_client/plugins.d.ts +5 -0
  13. package/dist_ts_client/plugins.js +8 -0
  14. package/dist_ts_client/projection.d.ts +59 -0
  15. package/dist_ts_client/projection.js +83 -0
  16. package/dist_ts_client/storage.d.ts +15 -9
  17. package/dist_ts_client/storage.js +81 -657
  18. package/dist_ts_client/types.d.ts +86 -41
  19. package/dist_ts_client/types.js +1 -1
  20. package/dist_ts_testing/fixtures.d.ts +83 -0
  21. package/dist_ts_testing/fixtures.js +146 -0
  22. package/dist_ts_testing/index.d.ts +1 -0
  23. package/dist_ts_testing/index.js +2 -0
  24. package/dist_ts_testing/plugins.d.ts +7 -0
  25. package/dist_ts_testing/plugins.js +11 -0
  26. package/package.json +16 -11
  27. package/readme.md +162 -93
  28. package/ts_client/catalog.ts +26 -0
  29. package/ts_client/index.ts +3 -1
  30. package/ts_client/loader.ts +414 -0
  31. package/ts_client/plugins.ts +10 -0
  32. package/ts_client/projection.ts +148 -0
  33. package/ts_client/readme.md +17 -27
  34. package/ts_client/storage.ts +93 -882
  35. package/ts_client/types.ts +102 -42
  36. package/ts_testing/fixtures.ts +230 -0
  37. package/ts_testing/index.ts +1 -0
  38. package/ts_testing/plugins.ts +15 -0
  39. package/ts_testing/tspublish.json +3 -0
  40. package/apps/adminer/app.json +0 -10
  41. package/apps/adminer/versions/1.0.0/config.json +0 -6
  42. package/apps/cloudly/app.json +0 -14
  43. package/apps/cloudly/versions/1.0.0/config.json +0 -120
  44. package/apps/cloudly/versions/1.1.0/config.json +0 -120
  45. package/apps/cloudly/versions/1.1.1/config.json +0 -120
  46. package/apps/cloudly/versions/1.1.10/config.json +0 -173
  47. package/apps/cloudly/versions/1.1.2/config.json +0 -130
  48. package/apps/cloudly/versions/1.1.3/config.json +0 -130
  49. package/apps/cloudly/versions/1.1.4/config.json +0 -130
  50. package/apps/cloudly/versions/1.1.5/config.json +0 -149
  51. package/apps/cloudly/versions/1.1.6/config.json +0 -149
  52. package/apps/cloudly/versions/1.1.7/config.json +0 -149
  53. package/apps/cloudly/versions/1.1.8/config.json +0 -173
  54. package/apps/cloudly/versions/1.1.9/config.json +0 -173
  55. package/apps/cloudly/versions/1.10.0/config.json +0 -173
  56. package/apps/cloudly/versions/1.11.0/config.json +0 -173
  57. package/apps/cloudly/versions/1.12.0/config.json +0 -173
  58. package/apps/cloudly/versions/1.13.0/config.json +0 -173
  59. package/apps/cloudly/versions/1.14.0/config.json +0 -173
  60. package/apps/cloudly/versions/1.15.0/config.json +0 -173
  61. package/apps/cloudly/versions/1.16.0/config.json +0 -173
  62. package/apps/cloudly/versions/1.17.0/config.json +0 -173
  63. package/apps/cloudly/versions/1.18.0/config.json +0 -173
  64. package/apps/cloudly/versions/1.19.0/config.json +0 -173
  65. package/apps/cloudly/versions/1.2.0/config.json +0 -173
  66. package/apps/cloudly/versions/1.2.1/config.json +0 -173
  67. package/apps/cloudly/versions/1.20.0/config.json +0 -173
  68. package/apps/cloudly/versions/1.21.0/config.json +0 -173
  69. package/apps/cloudly/versions/1.22.0/config.json +0 -173
  70. package/apps/cloudly/versions/1.23.0/config.json +0 -173
  71. package/apps/cloudly/versions/1.24.0/config.json +0 -173
  72. package/apps/cloudly/versions/1.25.0/config.json +0 -173
  73. package/apps/cloudly/versions/1.26.0/config.json +0 -173
  74. package/apps/cloudly/versions/1.3.0/config.json +0 -173
  75. package/apps/cloudly/versions/1.4.0/config.json +0 -173
  76. package/apps/cloudly/versions/1.5.0/config.json +0 -173
  77. package/apps/cloudly/versions/1.6.0/config.json +0 -173
  78. package/apps/cloudly/versions/1.7.0/config.json +0 -173
  79. package/apps/cloudly/versions/1.8.0/config.json +0 -173
  80. package/apps/cloudly/versions/1.9.0/config.json +0 -173
  81. package/apps/ghost/app.json +0 -10
  82. package/apps/ghost/versions/1.0.0/config.json +0 -18
  83. package/apps/gitea/app.json +0 -10
  84. package/apps/gitea/versions/1.0.0/config.json +0 -16
  85. package/apps/gitops/app.json +0 -14
  86. package/apps/gitops/versions/1.0.0/config.json +0 -28
  87. package/apps/grafana/app.json +0 -10
  88. package/apps/grafana/versions/1.0.0/config.json +0 -9
  89. package/apps/mariadb/app.json +0 -10
  90. package/apps/mariadb/versions/1.0.0/config.json +0 -9
  91. package/apps/mattermost/app.json +0 -10
  92. package/apps/mattermost/versions/1.0.0/config.json +0 -6
  93. package/apps/n8n/app.json +0 -10
  94. package/apps/n8n/versions/1.0.0/config.json +0 -6
  95. package/apps/nextcloud/app.json +0 -10
  96. package/apps/nextcloud/versions/1.0.0/config.json +0 -16
  97. package/apps/nginx/app.json +0 -10
  98. package/apps/nginx/versions/1.0.0/config.json +0 -6
  99. package/apps/openbao/app.json +0 -16
  100. package/apps/openbao/versions/1.0.0/config.json +0 -52
  101. package/apps/plausible/app.json +0 -10
  102. package/apps/plausible/versions/1.0.0/config.json +0 -9
  103. package/apps/portainer/app.json +0 -10
  104. package/apps/portainer/versions/1.0.0/config.json +0 -6
  105. package/apps/postgres/app.json +0 -10
  106. package/apps/postgres/versions/1.0.0/config.json +0 -11
  107. package/apps/rustdesk-server/app.json +0 -14
  108. package/apps/rustdesk-server/versions/1.0.0/config.json +0 -19
  109. package/apps/siprouter/app.json +0 -14
  110. package/apps/siprouter/versions/1.0.0/config.json +0 -84
  111. package/apps/uptime-kuma/app.json +0 -10
  112. package/apps/uptime-kuma/versions/1.0.0/config.json +0 -6
  113. package/apps/valkey/app.json +0 -10
  114. package/apps/valkey/versions/1.0.0/config.json +0 -6
  115. package/apps/vaultwarden/app.json +0 -10
  116. package/apps/vaultwarden/versions/1.0.0/config.json +0 -6
  117. package/apps/wordpress/app.json +0 -10
  118. package/apps/wordpress/versions/1.0.0/config.json +0 -15
  119. package/appstore.json +0 -194
  120. package/dist_ts_client/classes.appstoreresolver.d.ts +0 -59
  121. package/dist_ts_client/classes.appstoreresolver.js +0 -736
  122. package/dist_ts_client/data.generated.d.ts +0 -2
  123. package/ts_client/classes.appstoreresolver.ts +0 -896
  124. package/ts_client/data.generated.ts +0 -7432
@@ -1,173 +0,0 @@
1
- {
2
- "image": "code.foss.global/serve.zone/cloudly@sha256:fe1d10de09a8dc28f4dcf32b8e2cfed1ca7329b7d1b7405048a6e328afe5f9a6",
3
- "targetPorts": [
4
- {
5
- "name": "web",
6
- "port": 3000,
7
- "protocol": "http",
8
- "default": true
9
- }
10
- ],
11
- "envVars": [
12
- {
13
- "key": "SERVEZONE_ENVIRONMENT",
14
- "value": "production",
15
- "description": "Cloudly runtime environment.",
16
- "required": true
17
- },
18
- {
19
- "key": "SERVEZONE_PUBLIC_ORIGIN",
20
- "value": "https://${SERVICE_DOMAIN}",
21
- "description": "Canonical public Cloudly origin including protocol and optional public port.",
22
- "required": true
23
- },
24
- {
25
- "key": "SERVEZONE_LISTENPORT",
26
- "value": "3000",
27
- "description": "Internal Cloudly HTTP port inside the container.",
28
- "required": true
29
- },
30
- {
31
- "key": "SERVEZONE_SSLMODE",
32
- "value": "external",
33
- "description": "Use external TLS termination through Onebox or dcrouter.",
34
- "required": true
35
- },
36
- {
37
- "key": "SERVEZONE_SECRET_KEYRING_PATH",
38
- "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
39
- "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
40
- "required": true
41
- },
42
- {
43
- "key": "SERVEZONE_SECRET_KEYRING_FILE",
44
- "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.",
45
- "required": true,
46
- "secret": true,
47
- "delivery": {
48
- "type": "file",
49
- "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
50
- "uid": 0,
51
- "gid": 0,
52
- "mode": 256
53
- }
54
- },
55
- {
56
- "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
57
- "value": "/run/secrets/cloudly-workloadinit-approval.json",
58
- "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
59
- "required": true
60
- },
61
- {
62
- "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
63
- "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
64
- "required": true,
65
- "secret": true,
66
- "delivery": {
67
- "type": "file",
68
- "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
69
- "uid": 0,
70
- "gid": 0,
71
- "mode": 256
72
- }
73
- },
74
- {
75
- "key": "MONGODB_URL",
76
- "value": "${MONGODB_URI}",
77
- "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
78
- "required": true
79
- },
80
- {
81
- "key": "MONGODB_NAME",
82
- "value": "${MONGODB_DATABASE}",
83
- "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
84
- "required": true
85
- },
86
- {
87
- "key": "MONGODB_USER",
88
- "value": "${MONGODB_USERNAME}",
89
- "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
90
- "required": true
91
- },
92
- {
93
- "key": "MONGODB_PASS",
94
- "value": "${MONGODB_PASSWORD}",
95
- "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
96
- "required": true
97
- },
98
- {
99
- "key": "S3_ENDPOINT",
100
- "value": "onebox-corestore",
101
- "description": "S3 endpoint host provisioned by Onebox Corestore.",
102
- "required": true
103
- },
104
- {
105
- "key": "S3_PORT",
106
- "value": "9000",
107
- "description": "S3 endpoint port provisioned by Onebox Corestore.",
108
- "required": true
109
- },
110
- {
111
- "key": "S3_USESSL",
112
- "value": "false",
113
- "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
114
- "required": true
115
- },
116
- {
117
- "key": "S3_BUCKET",
118
- "value": "${S3_BUCKET}",
119
- "description": "S3 bucket provisioned by Onebox Corestore for Cloudly's registry.",
120
- "required": true
121
- },
122
- {
123
- "key": "S3_ACCESSKEY",
124
- "value": "${S3_ACCESS_KEY}",
125
- "description": "S3 access key provisioned by Onebox Corestore.",
126
- "required": true
127
- },
128
- {
129
- "key": "S3_SECRETKEY",
130
- "value": "${S3_SECRET_KEY}",
131
- "description": "S3 secret key provisioned by Onebox Corestore.",
132
- "required": true
133
- }
134
- ],
135
- "platformRequirements": {
136
- "mongodb": true,
137
- "s3": true
138
- },
139
- "platformOidc": {
140
- "redirectPath": "/auth/oidc/callback",
141
- "roles": [
142
- {
143
- "id": "admin",
144
- "label": "Administrator",
145
- "description": "Full Cloudly administration for this hosted instance."
146
- },
147
- {
148
- "id": "user",
149
- "label": "User",
150
- "description": "Standard authenticated Cloudly access for this hosted instance."
151
- }
152
- ],
153
- "environmentVariables": {
154
- "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
155
- "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
156
- "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
157
- "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
158
- "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
159
- },
160
- "clientAuthenticationMethod": "client_secret_basic"
161
- },
162
- "minOneboxVersion": "32.4.0",
163
- "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.",
164
- "breaking": true,
165
- "requiresManualReview": true,
166
- "migrationRequired": true,
167
- "backupBeforeUpgrade": true,
168
- "healthCheck": {
169
- "path": "/status",
170
- "port": 3000,
171
- "expectedStatus": 200
172
- }
173
- }
@@ -1,173 +0,0 @@
1
- {
2
- "image": "code.foss.global/serve.zone/cloudly@sha256:f4f88f0c3765d1b129fa4f3ff68438958e55d4fad598393fb0c686261e46c7ed",
3
- "targetPorts": [
4
- {
5
- "name": "web",
6
- "port": 3000,
7
- "protocol": "http",
8
- "default": true
9
- }
10
- ],
11
- "envVars": [
12
- {
13
- "key": "SERVEZONE_ENVIRONMENT",
14
- "value": "production",
15
- "description": "Cloudly runtime environment.",
16
- "required": true
17
- },
18
- {
19
- "key": "SERVEZONE_PUBLIC_ORIGIN",
20
- "value": "https://${SERVICE_DOMAIN}",
21
- "description": "Canonical public Cloudly origin including protocol and optional public port.",
22
- "required": true
23
- },
24
- {
25
- "key": "SERVEZONE_LISTENPORT",
26
- "value": "3000",
27
- "description": "Internal Cloudly HTTP port inside the container.",
28
- "required": true
29
- },
30
- {
31
- "key": "SERVEZONE_SSLMODE",
32
- "value": "external",
33
- "description": "Use external TLS termination through Onebox or dcrouter.",
34
- "required": true
35
- },
36
- {
37
- "key": "SERVEZONE_SECRET_KEYRING_PATH",
38
- "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
39
- "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
40
- "required": true
41
- },
42
- {
43
- "key": "SERVEZONE_SECRET_KEYRING_FILE",
44
- "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.",
45
- "required": true,
46
- "secret": true,
47
- "delivery": {
48
- "type": "file",
49
- "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
50
- "uid": 0,
51
- "gid": 0,
52
- "mode": 256
53
- }
54
- },
55
- {
56
- "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
57
- "value": "/run/secrets/cloudly-workloadinit-approval.json",
58
- "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
59
- "required": true
60
- },
61
- {
62
- "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
63
- "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
64
- "required": true,
65
- "secret": true,
66
- "delivery": {
67
- "type": "file",
68
- "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
69
- "uid": 0,
70
- "gid": 0,
71
- "mode": 256
72
- }
73
- },
74
- {
75
- "key": "MONGODB_URL",
76
- "value": "${MONGODB_URI}",
77
- "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
78
- "required": true
79
- },
80
- {
81
- "key": "MONGODB_NAME",
82
- "value": "${MONGODB_DATABASE}",
83
- "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
84
- "required": true
85
- },
86
- {
87
- "key": "MONGODB_USER",
88
- "value": "${MONGODB_USERNAME}",
89
- "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
90
- "required": true
91
- },
92
- {
93
- "key": "MONGODB_PASS",
94
- "value": "${MONGODB_PASSWORD}",
95
- "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
96
- "required": true
97
- },
98
- {
99
- "key": "S3_ENDPOINT",
100
- "value": "onebox-corestore",
101
- "description": "S3 endpoint host provisioned by Onebox Corestore.",
102
- "required": true
103
- },
104
- {
105
- "key": "S3_PORT",
106
- "value": "9000",
107
- "description": "S3 endpoint port provisioned by Onebox Corestore.",
108
- "required": true
109
- },
110
- {
111
- "key": "S3_USESSL",
112
- "value": "false",
113
- "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
114
- "required": true
115
- },
116
- {
117
- "key": "S3_BUCKET",
118
- "value": "${S3_BUCKET}",
119
- "description": "S3 bucket provisioned by Onebox Corestore for Cloudly's registry.",
120
- "required": true
121
- },
122
- {
123
- "key": "S3_ACCESSKEY",
124
- "value": "${S3_ACCESS_KEY}",
125
- "description": "S3 access key provisioned by Onebox Corestore.",
126
- "required": true
127
- },
128
- {
129
- "key": "S3_SECRETKEY",
130
- "value": "${S3_SECRET_KEY}",
131
- "description": "S3 secret key provisioned by Onebox Corestore.",
132
- "required": true
133
- }
134
- ],
135
- "platformRequirements": {
136
- "mongodb": true,
137
- "s3": true
138
- },
139
- "platformOidc": {
140
- "redirectPath": "/auth/oidc/callback",
141
- "roles": [
142
- {
143
- "id": "admin",
144
- "label": "Administrator",
145
- "description": "Full Cloudly administration for this hosted instance."
146
- },
147
- {
148
- "id": "user",
149
- "label": "User",
150
- "description": "Standard authenticated Cloudly access for this hosted instance."
151
- }
152
- ],
153
- "environmentVariables": {
154
- "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
155
- "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
156
- "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
157
- "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
158
- "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
159
- },
160
- "clientAuthenticationMethod": "client_secret_basic"
161
- },
162
- "minOneboxVersion": "32.4.0",
163
- "changelog": "Move Cloudly to 33.4.0, a feature release over 33.3.0: setServicePublishedPorts accepts a contiguous published-port range through hostPortEnd, each host port to the same inside port, and same-port outbound through symmetric: true, so a SIP router can publish udp 20000-20200 and answer from the ports it listens on. Entries of one protocol never overlap and cover at most 1024 ports in 64 entries; a range onto other inside ports, hostIp and an overlap are refused, and a symmetric entry owns its inside ports, so another entry of the same protocol publishing to any of them is refused published-port-symmetric-inside-overlap. A symmetric entry needs public egress: published-port-symmetric-without-egress refuses it on a published-port write and refuses clearing egress under it on an egress write. New handoff leases translate outbound flows only into the SNAT band 49152-65535, whose ports are refused published-port-reserved; a leased handoff is immutable, so a node keeps its 1024-65535 lease until its router is re-created. The service runtime producer refuses an attached spec whose policy document, written before these rules, holds a reserved port or a symmetric port without egress. A service network policy write for a service whose deletion has begun is refused service-deleting. Cluster ingress port routes, HTTP routes and inbound mail targets are authorized by a range that covers their port, while an edge (dcrouter) route stays one route per port. A projection carrying a range or a symmetric entry is withheld from a Pallet node whose session states a release below interfaces 32.31.0, or none: its compilation reports node-contract-behind and the node keeps its current head, so ranges and symmetric entries take effect on a node only once it runs a Pallet release built on interfaces 32.31.0 or later. Two entries claiming one port of one node are withheld as published-port-conflict. The runtime contract is unchanged from 1.6.0 and requires Onebox 32.4.0. From 1.6.0, startup runs the forward-only data migration from 0.21.0 to 0.22.0 through the step runtime-session-protocol-offer, which states protocol: null on every Pallet session row recorded before Cloudly stored the protocol offer its node stated, so such a node counts as unrecorded until it registers again; stop Cloudly and take a verified backup before upgrading, because the step has no inverse and rollback requires a full restore. From 1.5.0 the same step runs, and the service network egress of Cloudly 33.3.0 applies too: 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; 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, and 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. From 1.4.0 the same step runs, and the gateway admin bootstrap of Cloudly 33.2.0 applies too: 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.4.0 first, then Coreflow 33.2.0, which recognises the relay-node-unknown refusal. From 1.3.0 the same step runs, and the per-node database endpoint of Cloudly 33.1.0 applies too: roll out Cloudly 33.4.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 and then the step runtime-session-protocol-offer to 0.22.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 breaking, migration-required, backup-before-upgrade and manual-review because these flags are read from the target version alone, every upgrade from 1.6.0 or earlier runs the 0.21.0 to 0.22.0 step, and an upgrade from 1.2.1 or earlier still runs the migration from 0.20.0 on this image as well. 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.",
164
- "breaking": true,
165
- "requiresManualReview": true,
166
- "migrationRequired": true,
167
- "backupBeforeUpgrade": true,
168
- "healthCheck": {
169
- "path": "/status",
170
- "port": 3000,
171
- "expectedStatus": 200
172
- }
173
- }
@@ -1,173 +0,0 @@
1
- {
2
- "image": "code.foss.global/serve.zone/cloudly@sha256:9a803fbc9db00ffcf6ce4bd584c0c8b5a3016f3a94ce75629ddee2f52d2bf72c",
3
- "targetPorts": [
4
- {
5
- "name": "web",
6
- "port": 3000,
7
- "protocol": "http",
8
- "default": true
9
- }
10
- ],
11
- "envVars": [
12
- {
13
- "key": "SERVEZONE_ENVIRONMENT",
14
- "value": "production",
15
- "description": "Cloudly runtime environment.",
16
- "required": true
17
- },
18
- {
19
- "key": "SERVEZONE_PUBLIC_ORIGIN",
20
- "value": "https://${SERVICE_DOMAIN}",
21
- "description": "Canonical public Cloudly origin including protocol and optional public port.",
22
- "required": true
23
- },
24
- {
25
- "key": "SERVEZONE_LISTENPORT",
26
- "value": "3000",
27
- "description": "Internal Cloudly HTTP port inside the container.",
28
- "required": true
29
- },
30
- {
31
- "key": "SERVEZONE_SSLMODE",
32
- "value": "external",
33
- "description": "Use external TLS termination through Onebox or dcrouter.",
34
- "required": true
35
- },
36
- {
37
- "key": "SERVEZONE_SECRET_KEYRING_PATH",
38
- "value": "/run/secrets/cloudly-secrets-v2-keyring.json",
39
- "description": "Path to the Cloudly Secrets v2 keyring mounted by Onebox; the keyring value is never placed in the public environment.",
40
- "required": true
41
- },
42
- {
43
- "key": "SERVEZONE_SECRET_KEYRING_FILE",
44
- "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.",
45
- "required": true,
46
- "secret": true,
47
- "delivery": {
48
- "type": "file",
49
- "targetPath": "/run/secrets/cloudly-secrets-v2-keyring.json",
50
- "uid": 0,
51
- "gid": 0,
52
- "mode": 256
53
- }
54
- },
55
- {
56
- "key": "SERVEZONE_WORKLOADINIT_APPROVAL_PATH",
57
- "value": "/run/secrets/cloudly-workloadinit-approval.json",
58
- "description": "Private WorkloadInit release-approval artifact mounted by Onebox for Coreflow secret-runtime registration.",
59
- "required": true
60
- },
61
- {
62
- "key": "SERVEZONE_WORKLOADINIT_APPROVAL_FILE",
63
- "description": "Operator-approved WorkloadInit release authority. Onebox stores it encrypted and mounts it only as a root-readable file.",
64
- "required": true,
65
- "secret": true,
66
- "delivery": {
67
- "type": "file",
68
- "targetPath": "/run/secrets/cloudly-workloadinit-approval.json",
69
- "uid": 0,
70
- "gid": 0,
71
- "mode": 256
72
- }
73
- },
74
- {
75
- "key": "MONGODB_URL",
76
- "value": "${MONGODB_URI}",
77
- "description": "Authenticated MongoDB wire-protocol URL provisioned by Onebox Corestore.",
78
- "required": true
79
- },
80
- {
81
- "key": "MONGODB_NAME",
82
- "value": "${MONGODB_DATABASE}",
83
- "description": "MongoDB wire-protocol database name provisioned by Onebox Corestore.",
84
- "required": true
85
- },
86
- {
87
- "key": "MONGODB_USER",
88
- "value": "${MONGODB_USERNAME}",
89
- "description": "MongoDB wire-protocol username provisioned by Onebox Corestore.",
90
- "required": true
91
- },
92
- {
93
- "key": "MONGODB_PASS",
94
- "value": "${MONGODB_PASSWORD}",
95
- "description": "MongoDB wire-protocol password provisioned by Onebox Corestore.",
96
- "required": true
97
- },
98
- {
99
- "key": "S3_ENDPOINT",
100
- "value": "onebox-corestore",
101
- "description": "S3 endpoint host provisioned by Onebox Corestore.",
102
- "required": true
103
- },
104
- {
105
- "key": "S3_PORT",
106
- "value": "9000",
107
- "description": "S3 endpoint port provisioned by Onebox Corestore.",
108
- "required": true
109
- },
110
- {
111
- "key": "S3_USESSL",
112
- "value": "false",
113
- "description": "Use plain HTTP for internal Corestore S3 traffic on the Onebox network.",
114
- "required": true
115
- },
116
- {
117
- "key": "S3_BUCKET",
118
- "value": "${S3_BUCKET}",
119
- "description": "S3 bucket provisioned by Onebox Corestore for Cloudly's registry.",
120
- "required": true
121
- },
122
- {
123
- "key": "S3_ACCESSKEY",
124
- "value": "${S3_ACCESS_KEY}",
125
- "description": "S3 access key provisioned by Onebox Corestore.",
126
- "required": true
127
- },
128
- {
129
- "key": "S3_SECRETKEY",
130
- "value": "${S3_SECRET_KEY}",
131
- "description": "S3 secret key provisioned by Onebox Corestore.",
132
- "required": true
133
- }
134
- ],
135
- "platformRequirements": {
136
- "mongodb": true,
137
- "s3": true
138
- },
139
- "platformOidc": {
140
- "redirectPath": "/auth/oidc/callback",
141
- "roles": [
142
- {
143
- "id": "admin",
144
- "label": "Administrator",
145
- "description": "Full Cloudly administration for this hosted instance."
146
- },
147
- {
148
- "id": "user",
149
- "label": "User",
150
- "description": "Standard authenticated Cloudly access for this hosted instance."
151
- }
152
- ],
153
- "environmentVariables": {
154
- "issuerUrl": "SERVEZONE_PLATFORM_OIDC_ISSUER",
155
- "clientId": "SERVEZONE_PLATFORM_OIDC_CLIENT_ID",
156
- "clientSecret": "SERVEZONE_PLATFORM_OIDC_CLIENT_SECRET",
157
- "redirectUri": "SERVEZONE_PLATFORM_OIDC_REDIRECT_URI",
158
- "audience": "SERVEZONE_PLATFORM_OIDC_AUDIENCE"
159
- },
160
- "clientAuthenticationMethod": "client_secret_basic"
161
- },
162
- "minOneboxVersion": "32.4.0",
163
- "changelog": "Move Cloudly to 33.5.0, a feature release over 33.4.0: a deployment is reserved only by a deployment machine user. reserveServiceDeployment refuses any other verified actor, an administrator included, with DEPLOYMENT_MACHINE_IDENTITY_REQUIRED before anything is reserved, and the reserve-phase getDeploymentPreflight reports the same blocker; an existing api machine user with its grants already qualifies and needs no change. A deployer that signs in with a username and password, such as tsdeploy with TSDEPLOY_CLOUDLY_USERNAME and TSDEPLOY_CLOUDLY_PASSWORD, is an administrator and is refused, so switch it to a machine-user token before upgrading: create a deployment machine user per deployer with mutateDeploymentMachineUser or Access → Deployment machine users in the dashboard, attach its grants with configureServiceDeploymentMachineUser, and give its username and token to the deployer. An operation an administrator reserved earlier stays awaiting its image; clean it up with cleanupServiceDeployment. mutateDeploymentMachineUser creates an API machine user with one token (create), replaces every token of one with a new token (rotate-token) or removes its tokens while its grants stay (revoke-token); the token is answered once and expires at most a year after the mutation, and getDeploymentMachineUsers lists every deployment machine user with its token expiries and grants and never a token value. The identity getIdentityByToken issues and the registry bearer of a machine login now name the SHA-256 of their token, and every verification checks that the user still holds that unexpired token, so removing a token ends the sessions opened with it. A machine identity or registry bearer issued by an earlier release names no token and is refused, so its holder exchanges its token again: a deployer such as tsdeploy does so on every run, while a long-running API or administrator machine client that keeps its identity across a reconnect calls getIdentityByToken once more after the upgrade; cluster identities, including relays on the shared cluster token, and service workload identities are unaffected. Let no deployment run while Cloudly upgrades: a run in progress keeps its pre-upgrade identity and is refused for the rest of that run, so rerun it or resume it with deploy-retry. The cluster config broadcast now reaches the elected relay of every cluster, so a Corestore endpoint written on a node of a Pallet cluster, and every other broadcast, reaches that cluster's relay at once instead of when it reconnects, and setServiceRuntimeSpec refuses a spec the runtime spec contract rejects as Service runtime operation rejected: invalid. instead of Internal server error, and stores nothing. The runtime contract is unchanged from 1.7.0 and requires Onebox 32.4.0. Cloudly 33.5.0 stores the retained mutation answers in the new collection cloudly_deployment_machine_user_mutations and keeps the data version 0.22.0, so from 1.7.0 there is no data step. From 1.6.0, startup runs the forward-only data migration from 0.21.0 to 0.22.0 through the step runtime-session-protocol-offer, which states protocol: null on every Pallet session row recorded before Cloudly stored the protocol offer its node stated, so such a node counts as unrecorded until it registers again; stop Cloudly and take a verified backup before upgrading, because the step has no inverse and rollback requires a full restore. The published-port ranges of Cloudly 33.4.0 apply too: setServicePublishedPorts publishes a contiguous range through hostPortEnd and same-port outbound through symmetric: true, which needs public egress (published-port-symmetric-without-egress) and owns its inside ports (published-port-symmetric-inside-overlap); new handoff leases translate outbound flows only into the SNAT band 49152-65535, whose ports are refused published-port-reserved, while a node keeps its 1024-65535 lease until its router is re-created; a service network policy write for a service whose deletion has begun is refused service-deleting; and a projection carrying a range or a symmetric entry is withheld as node-contract-behind from a Pallet node whose session states a release below interfaces 32.31.0, or none. From 1.5.0 the same step runs, and the service network egress of Cloudly 33.3.0 applies too: 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; 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, and 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. From 1.4.0 the same step runs, and the gateway admin bootstrap of Cloudly 33.2.0 applies too: 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.5.0 first, then Coreflow 33.2.0, which recognises the relay-node-unknown refusal. From 1.3.0 the same step runs, and the per-node database endpoint of Cloudly 33.1.0 applies too: roll out Cloudly 33.5.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 and then the step runtime-session-protocol-offer to 0.22.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 breaking and manual-review because a username and password deployer, an administrator's deployment reservation and a machine identity or registry bearer issued earlier are refused, and migration-required and backup-before-upgrade because these flags are read from the target version alone, every upgrade from 1.6.0 or earlier runs the 0.21.0 to 0.22.0 step, and an upgrade from 1.2.1 or earlier still runs the migration from 0.20.0 on this image as well. 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.",
164
- "breaking": true,
165
- "requiresManualReview": true,
166
- "migrationRequired": true,
167
- "backupBeforeUpgrade": true,
168
- "healthCheck": {
169
- "path": "/status",
170
- "port": 3000,
171
- "expectedStatus": 200
172
- }
173
- }