void 0.20.1 → 0.20.3
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/README.md +5 -1
- package/dist/{auth-W9WII-mN.mjs → auth-DPl6kck4.mjs} +46 -26
- package/dist/{auth-cmd-CAH62yDU.mjs → auth-cmd-CzwquNiP.mjs} +5 -4
- package/dist/auth-link-ElDTgF7j.mjs +28 -0
- package/dist/{build-cmd-CJvZvPQO.mjs → build-cmd-BpJe6boP.mjs} +3 -3
- package/dist/{cache-BlNeQjuP.mjs → cache-D98YTqeE.mjs} +3 -3
- package/dist/{cancel-deploy-CmlAZ9P6.mjs → cancel-deploy-CPbEQLMG.mjs} +3 -3
- package/dist/cf-access-DRsQRe6k.mjs +75 -0
- package/dist/cli/cli.mjs +309 -1958
- package/dist/cli/env-schema-probe.mjs +11 -2
- package/dist/client-BQBrZoCX.mjs +989 -0
- package/dist/{cloudflare-auth-B1QtTO1b.mjs → cloudflare-auth-6M5llVPC.mjs} +2 -2
- package/dist/{cloudflare-cmd-B6_OZx2V.mjs → cloudflare-cmd-4RPGN3KB.mjs} +2 -2
- package/dist/{cloudflare-connect-j5D4hhrG.mjs → cloudflare-connect-t1UU5svD.mjs} +2 -2
- package/dist/{cloudflare-operations-CPTpRW6d.mjs → cloudflare-operations-BzWnlC1_.mjs} +1 -1
- package/dist/{config-BQFq7QvD.mjs → config-uNGuFsI2.mjs} +1 -1
- package/dist/{connect-C04Wdy_h.mjs → connect-WCQZ_u3m.mjs} +6 -6
- package/dist/{create-project-ChGZ1DFd.mjs → create-project-D0oXA090.mjs} +7 -7
- package/dist/{db-D2d_mUsB.mjs → db-DJ-9qs3S.mjs} +47 -30
- package/dist/{delete-D8GigDk8.mjs → delete-BZ4-WaGm.mjs} +3 -3
- package/dist/{deploy-iXZ3F0N6.mjs → deploy-BAhhcg5q.mjs} +135 -117
- package/dist/{dev-inbox-DkgRWLkW.mjs → dev-inbox-P0u4tM8Y.mjs} +1 -1
- package/dist/{domain-B1VmoSr0.mjs → domain-BxAyhxXN.mjs} +4 -4
- package/dist/email-Bj7Cvdwp.mjs +795 -0
- package/dist/{env-D4Emu-M_.mjs → env-DBKmK4vc.mjs} +1 -0
- package/dist/{env-BcQzYgoG.mjs → env-DP_EErve.mjs} +5 -5
- package/dist/{env-validation-ENpMy6Ez.mjs → env-validation-CF6KvTRf.mjs} +3 -1
- package/dist/{gen-DI2YwdBM.mjs → gen-B_wPnVTK.mjs} +2 -2
- package/dist/{github-cmd-xItS5Zwf.mjs → github-cmd-C-z_xRrQ.mjs} +15 -21
- package/dist/{headers-D8QfRX9Y.mjs → headers-BAHwgHdW.mjs} +1 -1
- package/dist/help-CwOX-zmI.mjs +2216 -0
- package/dist/{inbound-afAcWeQ9.d.mts → inbound-CH5Mksyy.d.mts} +34 -48
- package/dist/{inbound-2d0zi2yS.mjs → inbound-aVHEUhKo.mjs} +130 -100
- package/dist/index.mjs +54 -17
- package/dist/{init-BD-9THgn.mjs → init-BGktCXgA.mjs} +11 -11
- package/dist/{link-RMdgjF1v.mjs → link-D2kbqhWb.mjs} +4 -4
- package/dist/{list-3F52R_yO.mjs → list-CvkK_G7k.mjs} +4 -4
- package/dist/{login-pV69H-ZO.mjs → login-WIjNc77c.mjs} +28 -10
- package/dist/{logs-DFHHD6wE.mjs → logs-dLUFCapG.mjs} +4 -4
- package/dist/{mime-BJD7d_qL.mjs → mime-D5Nmdzf7.mjs} +23 -9
- package/dist/{node-Dk3H2jmU.mjs → node-Ez5KW5rn.mjs} +2 -2
- package/dist/operator-auth-B3e08unv.mjs +52 -0
- package/dist/operator-client-LUZnlnYk.mjs +82 -0
- package/dist/{operator-cmd-DYWRbWUA.mjs → operator-cmd-CKJ7xIRs.mjs} +35 -55
- package/dist/{output-tFQLLj26.mjs → output-B0cfNSx5.mjs} +316 -2
- package/dist/pages/index.mjs +2 -2
- package/dist/platform-auth-config-CdVWRRJr.mjs +368 -0
- package/dist/platform-auth-protection-Drl0qhrn.mjs +219 -0
- package/dist/platform-auth-recovery-CmKEWpDo.mjs +310 -0
- package/dist/{platform-cmd-DxJ2FRwR.mjs → platform-cmd-5q_k56xS.mjs} +16 -6
- package/dist/{platform-domain-ChvbJkdy.mjs → platform-domain-4GiDlcqx.mjs} +4 -4
- package/dist/{platform-lifecycle-DN4MzJF_.mjs → platform-lifecycle-R9xAxvtG.mjs} +1716 -204
- package/dist/{platform-management-Db2PXw0B.mjs → platform-management-BfWsXHEW.mjs} +35 -7
- package/dist/{platform-recovery-C_YO-tIs.mjs → platform-recovery-CbK-I1FB.mjs} +6 -5
- package/dist/{prepare-CBetXvsN.mjs → prepare-CtDJjoOj.mjs} +2 -2
- package/dist/{prepare-BfJvFUtJ.mjs → prepare-blNRQvQl.mjs} +2 -2
- package/dist/prerender-render.d.mts +11 -0
- package/dist/prerender-render.mjs +111 -0
- package/dist/{project-cmd-Mo0V9yKS.mjs → project-cmd-CTdmnzvc.mjs} +32 -14
- package/dist/project-team-CGxsQe3_.mjs +132 -0
- package/dist/project-token-Cirx7uwZ.mjs +75 -0
- package/dist/{provision-Blnstcm2.mjs → provision-CSJOjjQk.mjs} +2 -0
- package/dist/{requests-BcKOVpRg.mjs → requests-4Nq59hOr.mjs} +3 -3
- package/dist/{rollback-Bx85-0xh.mjs → rollback-Dr7u0Ljx.mjs} +4 -4
- package/dist/runtime/ai.mjs +3 -2
- package/dist/runtime/email/testing.d.mts +1 -1
- package/dist/runtime/email/testing.mjs +3 -3
- package/dist/runtime/email-protocol.d.mts +15 -0
- package/dist/runtime/email-protocol.mjs +70 -0
- package/dist/runtime/email.d.mts +2 -2
- package/dist/runtime/email.mjs +189 -96
- package/dist/runtime/remote/index.mjs +54 -11
- package/dist/runtime/sandbox.d.mts +4 -56
- package/dist/runtime/sandbox.mjs +81 -220
- package/dist/{secret-ByhJ9AMl.mjs → secret-AcPi-FoA.mjs} +5 -5
- package/dist/{skills-Q46GZMO-.mjs → skills-C0RvGjeE.mjs} +1 -1
- package/dist/{subcommand-prompt-WfySCQ7S.mjs → subcommand-prompt-Bmyn5Rlc.mjs} +1 -1
- package/package.json +12 -7
- package/skills/void/SKILL.md +35 -4
- package/skills/void/docs/guide/deployment.md +16 -14
- package/skills/void/docs/guide/email.md +114 -120
- package/skills/void/docs/guide/platform/administration/access.md +163 -0
- package/skills/void/docs/guide/platform/administration/email.md +121 -0
- package/skills/void/docs/guide/platform/administration/operations.md +97 -0
- package/skills/void/docs/guide/platform/administration/projects.md +54 -0
- package/skills/void/docs/guide/platform/development/local.md +119 -0
- package/skills/void/docs/guide/platform/development/runtime.md +124 -0
- package/skills/void/docs/guide/platform/development/schema-ci.md +95 -0
- package/skills/void/docs/guide/platform/installation/ci.md +55 -0
- package/skills/void/docs/guide/platform/installation/credentials.md +80 -0
- package/skills/void/docs/guide/platform/installation/domains.md +68 -0
- package/skills/void/docs/guide/platform/installation/first-deployment.md +82 -0
- package/skills/void/docs/guide/platform/installation/maintenance.md +137 -0
- package/skills/void/docs/guide/platform/installation/prerequisites.md +86 -0
- package/skills/void/docs/guide/platform/installation/setup.md +169 -0
- package/skills/void/docs/guide/platform/installation/uninstall.md +54 -0
- package/skills/void/docs/guide/platform-administration.md +6 -202
- package/skills/void/docs/guide/platform-development.md +5 -254
- package/skills/void/docs/guide/project-collaboration.md +94 -0
- package/skills/void/docs/guide/sandboxes.md +9 -24
- package/skills/void/docs/guide/self-hosted-platform.md +13 -542
- package/skills/void/docs/reference/api.md +34 -34
- package/skills/void/docs/reference/cli.md +276 -31
- package/skills/void/docs/reference/config.md +1 -1
- package/skills/void/docs/reference/resource-inference.md +10 -10
- package/dist/cf-access-AJ1ehiFR.mjs +0 -42
- package/dist/cf-access-DsSsZUPr.mjs +0 -67
- package/dist/client-Clirrol3.mjs +0 -705
- package/dist/email-uKyQYUVY.mjs +0 -1016
|
@@ -6,207 +6,11 @@ outline: deep
|
|
|
6
6
|
|
|
7
7
|
`void platform` lets you manage the people and apps on a Void platform from your terminal. You can give teammates access, inspect their projects, follow deployment logs, and check the platform's health.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
The operator commands for users, projects, deployments, and system status require an administrator account. Connection and installation lifecycle commands use their own authentication. If you're setting up a platform for the first time, start with [Install a Void Platform](/guide/self-hosted-platform).
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Administration Guides
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
```sh
|
|
18
|
-
void connect https://platform.example.com --no-login
|
|
19
|
-
void platform auth login
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
The first command saves the connection. The second opens your browser to sign in and saves an administrator session in your system keychain. Sessions last for one hour and are stored separately for each platform.
|
|
23
|
-
|
|
24
|
-
You can check which account is signed in at any time:
|
|
25
|
-
|
|
26
|
-
```sh
|
|
27
|
-
void platform auth status
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
This shows your account, the session's expiry, and the features available on the platform. To end the session, run `void platform auth logout`.
|
|
31
|
-
|
|
32
|
-
## Choosing a Platform
|
|
33
|
-
|
|
34
|
-
If you manage more than one platform, list your connections and choose a default:
|
|
35
|
-
|
|
36
|
-
```sh
|
|
37
|
-
void platform list
|
|
38
|
-
void platform use <connection-id>
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
You can also select a platform for a single command with `--connection`:
|
|
42
|
-
|
|
43
|
-
```sh
|
|
44
|
-
void platform user list --connection <connection-id>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Use an ID or URL from the connection list. Administrative commands use this selection even when you run them inside an app with a different deployment destination.
|
|
48
|
-
|
|
49
|
-
## Giving People Access
|
|
50
|
-
|
|
51
|
-
A newly installed platform restricts signup to approved identities. To let a teammate join with GitHub, add their login to the allowlist:
|
|
52
|
-
|
|
53
|
-
```sh
|
|
54
|
-
void platform signup allow github teammate
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Void shows the change and asks you to confirm it. The teammate can then run `void connect` with the platform's URL and sign in.
|
|
58
|
-
|
|
59
|
-
You can allow an email address or a whole email domain in the same way:
|
|
60
|
-
|
|
61
|
-
```sh
|
|
62
|
-
void platform signup allow email teammate@example.com
|
|
63
|
-
void platform signup allow email '*@example.com'
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Email patterns apply across the platform's sign-in providers. Quote a domain pattern so your shell passes the `*` to Void.
|
|
67
|
-
|
|
68
|
-
To invite someone else by email, use:
|
|
69
|
-
|
|
70
|
-
```sh
|
|
71
|
-
void platform invitation send alex@example.org
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
An invitation grants signup access and sends an email when the platform has email delivery configured. If delivery is unavailable or fails, the result tells you; the person can still join using the platform's URL.
|
|
75
|
-
|
|
76
|
-
Inspect the current access settings and invitations with:
|
|
77
|
-
|
|
78
|
-
```sh
|
|
79
|
-
void platform signup show
|
|
80
|
-
void platform invitation list
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Invitation history remains available after an involved account is removed. The stored actor ID
|
|
84
|
-
remains visible when that account's login no longer exists.
|
|
85
|
-
|
|
86
|
-
`void platform signup open` allows anyone to sign up. Use `void platform signup restrict` to require an allowlist match again. Removing an allowlist entry affects future signup; it does not suspend an existing account.
|
|
87
|
-
|
|
88
|
-
## Managing Users and Projects
|
|
89
|
-
|
|
90
|
-
Start by finding the user you want to inspect:
|
|
91
|
-
|
|
92
|
-
```sh
|
|
93
|
-
void platform user list --search teammate
|
|
94
|
-
void platform user show <user-id>
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Use the ID from the list in the second command. The detail view shows the user's projects and usage. You can change their plan or list just their projects:
|
|
98
|
-
|
|
99
|
-
```sh
|
|
100
|
-
void platform user plan <user-id> pro
|
|
101
|
-
void platform project list --user <user-id>
|
|
102
|
-
void platform project show <project-id>
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
Project details include resources, domains, and recent builds and deployments. The [command reference](../reference/cli.md#operator-commands) also covers suspending and restoring users, deleting projects, and removing accounts.
|
|
106
|
-
|
|
107
|
-
New users on a self-hosted installation start with the `custom` profile, which
|
|
108
|
-
does not cap application requests, AI usage, deployment frequency, or retained
|
|
109
|
-
Worker deployments. Named profiles such as `pro` apply the platform's quota and
|
|
110
|
-
retention policies; they do not purchase Cloudflare services or bill your users.
|
|
111
|
-
Storage figures are not a hard storage-quota boundary. Set an operating budget
|
|
112
|
-
and retention policy before opening signup beyond your invited team.
|
|
113
|
-
|
|
114
|
-
The last active administrator cannot be deleted or suspended, including through
|
|
115
|
-
the browser admin UI. Another administrator must still have access. Automatic
|
|
116
|
-
usage limits do not remove administrator access and do not count as a manual
|
|
117
|
-
suspension.
|
|
118
|
-
|
|
119
|
-
When removing another administrator, Void revokes their administrator access
|
|
120
|
-
before changing application traffic or deleting resources. If cleanup fails,
|
|
121
|
-
access stays revoked and the error describes the partial result. A remaining
|
|
122
|
-
administrator can inspect it and retry cleanup.
|
|
123
|
-
|
|
124
|
-
## Previewing Changes
|
|
125
|
-
|
|
126
|
-
Commands that change the platform show the affected objects before asking for confirmation. To inspect a change without applying it, add `--plan`:
|
|
127
|
-
|
|
128
|
-
```sh
|
|
129
|
-
void platform user suspend <user-id> --reason "Investigating unexpected traffic" --plan
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
The preview shows which account will be suspended and the effect on its projects. Run the command again without `--plan` to confirm interactively, or use `--yes` when the change is ready to apply:
|
|
133
|
-
|
|
134
|
-
```sh
|
|
135
|
-
void platform user suspend <user-id> --reason "Investigating unexpected traffic" --yes
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
Scripts must use `--yes` to apply these changes. Authentication commands run directly and do not use `--plan` or `--yes`. After a change, `void platform system events` shows the administrator, affected objects, and recorded outcome.
|
|
139
|
-
|
|
140
|
-
Changes can take longer when an account owns many resources. Requests that change the platform allow five minutes by default; use `--timeout` to set a different limit in seconds:
|
|
141
|
-
|
|
142
|
-
```sh
|
|
143
|
-
void platform user delete <user-id> --timeout 600 --plan
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
If a request times out or loses its connection, some work may already have finished. Check the affected objects and `system events` before retrying. Void reports partial results when it can and does not automatically repeat the change.
|
|
147
|
-
|
|
148
|
-
## Following Logs
|
|
149
|
-
|
|
150
|
-
To investigate a deployment, find its ID and follow its runtime logs:
|
|
151
|
-
|
|
152
|
-
```sh
|
|
153
|
-
void platform deployment list --project <project-id>
|
|
154
|
-
void platform deployment logs <deployment-id> --since 10m --follow
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
Runtime logs include application messages, exceptions, and HTTP status codes. Without `--follow`, the command reads a page of historical logs. Use `--since` to choose a duration, an ISO date, or a timestamp in milliseconds.
|
|
158
|
-
|
|
159
|
-
Logs can become available after a request finishes. Following checks a five-minute overlap to pick up delayed records without printing them again. Records delayed longer than that may need a later historical query.
|
|
160
|
-
|
|
161
|
-
Build logs use the build's ID:
|
|
162
|
-
|
|
163
|
-
```sh
|
|
164
|
-
void platform build logs <build-id> --follow
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
Following waits for the final logs before stopping, including diagnostics written after the build's status changes. For a GitHub Actions build, the command gives you the URL of its logs.
|
|
168
|
-
|
|
169
|
-
## Checking the Platform
|
|
170
|
-
|
|
171
|
-
Use the overview to see recent activity, or run a health check to test the platform's services and database:
|
|
172
|
-
|
|
173
|
-
```sh
|
|
174
|
-
void platform system overview
|
|
175
|
-
void platform system health
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
Health checks use the services configured for the selected platform. An unhealthy result exits with a nonzero status, so the same command can be used in a script.
|
|
179
|
-
|
|
180
|
-
The browser dashboard's **System Status** checks refresh every 30 seconds. Failed checks show an HTTP status or connection error beside the service name. If the dashboard cannot refresh the checks, it reports that status is unavailable instead of displaying stale results.
|
|
181
|
-
|
|
182
|
-
Use `void platform upgrade`, `repair`, `disable`, and `enable` to maintain your platform. See [platform maintenance](./self-hosted-platform.md#resume-repair-recover-and-upgrade).
|
|
183
|
-
|
|
184
|
-
For disaster recovery, keep a matching PostgreSQL backup, provider data backups, installation identity and complete project-encryption keyring, and immutable runtime artifacts. Keep traffic disabled while restoring data, run `discover` to reconstruct verified local metadata, and review `repair --plan` before recreating missing installer-owned infrastructure. Neither command restores backed-up data. See [Prepare for disaster recovery](./self-hosted-platform.md#prepare-for-disaster-recovery) for the full sequence.
|
|
185
|
-
|
|
186
|
-
## Using Scripts
|
|
187
|
-
|
|
188
|
-
Add `--json` to read a command's result from another program:
|
|
189
|
-
|
|
190
|
-
```sh
|
|
191
|
-
void platform user list --page 1 --limit 50 --json
|
|
192
|
-
void platform system health --json
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
Results go to standard output. Command errors go to standard error as JSON and exit with a nonzero status. With `--follow`, each log response is a separate JSON line.
|
|
196
|
-
|
|
197
|
-
Operator tokens expire after one hour. For CI, mint a new operator token at the start of each job from a valid full API login session belonging to an active administrator. Choose the platform explicitly, inject the full session as `VOID_TOKEN` from your secret manager, and capture the exchange output directly into the protected job environment:
|
|
198
|
-
|
|
199
|
-
```sh
|
|
200
|
-
export VOID_API_URL=https://platform.example.com
|
|
201
|
-
VOID_OPERATOR_TOKEN="$(
|
|
202
|
-
printf '%s' "$VOID_TOKEN" | void platform auth token --token-stdin
|
|
203
|
-
)" || exit 1
|
|
204
|
-
export VOID_OPERATOR_TOKEN
|
|
205
|
-
unset VOID_TOKEN
|
|
206
|
-
void platform system health --json
|
|
207
|
-
unset VOID_OPERATOR_TOKEN
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
Disable shell tracing for the exchange and do not write either token to logs or plaintext files. A full API login session expires after 30 days and can be revoked sooner; renew it through the normal authenticated login flow and update the protected CI secret. A job that runs longer than one hour must repeat the exchange while its full API session is still valid. An expired operator token cannot refresh itself, and Void does not issue permanent service tokens for administrator automation.
|
|
211
|
-
|
|
212
|
-
`auth login --token-stdin` performs the same elevation and saves the one-hour operator token in the system keychain for interactive use. See [operator authentication](../reference/cli.md#operator-authentication) for the full command syntax.
|
|
13
|
+
- [Sign-in and Access](/guide/platform/administration/access)
|
|
14
|
+
- [Users and Projects](/guide/platform/administration/projects)
|
|
15
|
+
- [Email](/guide/platform/administration/email)
|
|
16
|
+
- [Operations](/guide/platform/administration/operations)
|
|
@@ -6,259 +6,10 @@ outline: deep
|
|
|
6
6
|
|
|
7
7
|
The framework, CLI, and platform live in one repository. You can change the platform, test it locally, and deploy a runtime built from your fork into your own Cloudflare account.
|
|
8
8
|
|
|
9
|
-
If you want to run the released platform without changing its implementation, start with [Install a Void Platform](
|
|
9
|
+
If you want to run the released platform without changing its implementation, start with [Install a Void Platform](/guide/self-hosted-platform). Use [Platform Administration](/guide/platform-administration) for managing an installed platform.
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Development Guides
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
git clone https://github.com/your-org/void.git
|
|
17
|
-
cd void
|
|
18
|
-
vp install
|
|
19
|
-
vpr install:void-dev
|
|
20
|
-
void-dev --help
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Use the Node.js version recorded in `.node-version`. The workspace uses public npm packages; a GitHub Packages token is not required.
|
|
24
|
-
|
|
25
|
-
`install:void-dev` builds the CLI, shared packages, and platform runtime, then makes this checkout's built CLI globally available as `void-dev`. Public packages export their built files, so run `vp run build:core` after later source changes to refresh the alias. The installer refuses to replace an unrelated global command. Remove only this checkout's alias with `vpr uninstall:void-dev`. All commands in this guide run from the repository root.
|
|
26
|
-
|
|
27
|
-
## Finding the Implementation
|
|
28
|
-
|
|
29
|
-
| Directory | Purpose |
|
|
30
|
-
| ---------------------------------------------------- | -------------------------------------------------------------------- |
|
|
31
|
-
| `packages/void` | Framework, application runtime, and CLI |
|
|
32
|
-
| `packages/platform` | Installer contracts, packaged Workers, and platform migrations |
|
|
33
|
-
| `packages/deploy-core`, `packages/deploy-cloudflare` | Shared deployment contracts and Cloudflare upload code |
|
|
34
|
-
| `platform/packages/api` | Users, projects, deployments, provisioning, and administrator API/UI |
|
|
35
|
-
| `platform/packages/dispatch` | Application routing and static assets |
|
|
36
|
-
| `platform/packages/proxy` | AI, remote bindings, and revalidation |
|
|
37
|
-
| `platform/packages/tail` | Runtime log ingestion |
|
|
38
|
-
| `platform/packages/dashboard` | Dashboard source and local UI components in `ui/` |
|
|
39
|
-
|
|
40
|
-
The `@voidcloud/*` names identify workspace implementation packages. Their `private: true` flags prevent publishing those packages to npm. Deployable core Workers are bundled into the public `@void/platform` package.
|
|
41
|
-
|
|
42
|
-
The core installer creates the API, dispatch, proxy, and tail Workers. The dashboard and managed GitHub build services are available in the source tree but are not included in that installation. Adding an optional service requires its infrastructure, bindings, authentication, and capability configuration together.
|
|
43
|
-
|
|
44
|
-
## Running the API Locally
|
|
45
|
-
|
|
46
|
-
Start a local PostgreSQL server and make `psql` and `pg_isready` available on your path. Then create the development database, apply its migrations, and seed an administrator:
|
|
47
|
-
|
|
48
|
-
```sh
|
|
49
|
-
vp run --filter @voidcloud/api setup --admin-email dev@example.com
|
|
50
|
-
vp run --filter @voidcloud/api dev --local --enable-containers=false --host localhost --port 8787
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
The command disables the optional build containers, so basic API and admin work
|
|
54
|
-
does not require Docker. To develop managed builds, install Docker and run the
|
|
55
|
-
API with containers enabled.
|
|
56
|
-
|
|
57
|
-
Open `http://localhost:8787/admin/`. Setup writes local development values to the API and dashboard `.dev.vars` files, including the development authentication bypass and local database connection. Those files are ignored by Git. Production installations get separate credentials through the installer.
|
|
58
|
-
|
|
59
|
-
The API's development bypass lets you work on the browser admin UI without setting up OAuth. Operator CLI sessions still require administrator authentication; they do not use the browser bypass.
|
|
60
|
-
|
|
61
|
-
## Running the Dashboard Locally
|
|
62
|
-
|
|
63
|
-
The dashboard is a separate source app. After API setup, start it in another terminal:
|
|
64
|
-
|
|
65
|
-
```sh
|
|
66
|
-
vp run --filter @voidcloud/dashboard dev
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Its local `.dev.vars` should point to the API you started:
|
|
70
|
-
|
|
71
|
-
```dotenv
|
|
72
|
-
API_URL=http://localhost:8787
|
|
73
|
-
SITE_DOMAIN=apps.example.com
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Open the Vite URL and choose **Dev login (local API)**. That button appears for a localhost API and uses the local development sign-in endpoint.
|
|
77
|
-
|
|
78
|
-
You can also point the dashboard at an API that you operate. If Cloudflare Access protects that API, install `cloudflared` and opt into the dashboard's local token helper with matching origins:
|
|
79
|
-
|
|
80
|
-
```dotenv
|
|
81
|
-
API_URL=https://platform.example.com
|
|
82
|
-
CF_ACCESS_APP_URL=https://platform.example.com
|
|
83
|
-
SITE_DOMAIN=apps.example.com
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
The helper refreshes an Access session before the dev server starts. A configured `CF_ACCESS_CLIENT_ID` and `CF_ACCESS_CLIENT_SECRET` pair can be used for automation instead. This is dashboard development configuration; Access credentials are separate from platform login credentials.
|
|
87
|
-
|
|
88
|
-
## Testing Changes
|
|
89
|
-
|
|
90
|
-
Run tests for the area you changed while developing:
|
|
91
|
-
|
|
92
|
-
```sh
|
|
93
|
-
vp test run platform/packages/api/test/integration/operator-auth.test.ts
|
|
94
|
-
vp run check
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Before preparing a release, build the packages and run the complete checks:
|
|
98
|
-
|
|
99
|
-
```sh
|
|
100
|
-
vp run build:all
|
|
101
|
-
vp run check
|
|
102
|
-
vp lint
|
|
103
|
-
vp run lint:platform
|
|
104
|
-
vp fmt --check
|
|
105
|
-
vp test run
|
|
106
|
-
vp run build:docs
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
Platform integration tests use their local test database by default. To test against PostgreSQL, set `VOID_TEST_DATABASE_URL` to a disposable database: these tests clear tables between cases.
|
|
110
|
-
|
|
111
|
-
To exercise a deployed application, deploy a disposable copy of `playground/kitchen-sink` and pass its URL as `SMOKE_URL` to the smoke test described in `platform/scripts/kitchen-sink-smoke-test.md`. That test creates and removes application data.
|
|
112
|
-
|
|
113
|
-
## Deploying Your Runtime
|
|
114
|
-
|
|
115
|
-
Build the runtime. From a Git checkout, the build automatically records the current commit in the runtime manifest. An uncommitted checkout is recorded with a `-dirty` suffix:
|
|
116
|
-
|
|
117
|
-
```sh
|
|
118
|
-
vp run build:core
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
Build systems may set `VOID_PLATFORM_SOURCE_REVISION` when they need to override automatic detection with another immutable revision. A source archive without Git metadata builds normally but leaves the revision unrecorded.
|
|
122
|
-
|
|
123
|
-
The runtime is written to `packages/platform/dist/runtime`. Use the built CLI to preview a new installation from those files:
|
|
124
|
-
|
|
125
|
-
```sh
|
|
126
|
-
void-dev platform install \
|
|
127
|
-
--name my-team \
|
|
128
|
-
--application-domain example.app \
|
|
129
|
-
--zone example.app \
|
|
130
|
-
--runtime packages/platform/dist/runtime \
|
|
131
|
-
--plan
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
Before applying the plan, complete the [first-install walkthrough](./self-hosted-platform.md). Run the command without `--plan` to install. For testing before your domain is ready, replace `--application-domain` and `--zone` with `--workers-dev`; PostgreSQL and the runtime/GitHub/R2 credentials are still needed. Use `void-dev` in place of `void` and keep `--runtime packages/platform/dist/runtime` on install and resume commands. For an interrupted installation, keep that runtime build available until it completes.
|
|
135
|
-
|
|
136
|
-
Later, run `void-dev platform domain set example.app`. Domain setup uses the existing installed runtime and needs no `--runtime`, rebuild, or app redeploy. It keeps the platform API URL and original workers.dev app URLs available.
|
|
137
|
-
|
|
138
|
-
For an existing installation, preview an upgrade using its connection ID:
|
|
139
|
-
|
|
140
|
-
```sh
|
|
141
|
-
void-dev platform upgrade <installation-id> \
|
|
142
|
-
--runtime packages/platform/dist/runtime --plan
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Then run it without `--plan` to apply the upgrade. Source-built runtimes go through the same artifact, database, ownership, and health checks as released runtimes. The CLI preserves a disabled installation's state and records the source revision in its installation checkpoint.
|
|
146
|
-
|
|
147
|
-
## Deploying Source Builds from CI {#source-build-ci}
|
|
148
|
-
|
|
149
|
-
Build `@void/platform` from your checkout and pass its runtime directory to `install`, `upgrade`, `repair`, `enable`, or `rollback` with `--runtime`. Custom runtimes get the same integrity, migration, health, and rollback checks as packaged releases.
|
|
150
|
-
|
|
151
|
-
Void records the runtime's manifest digest, whether it was packaged or custom, and its source revision. A build from a Git checkout automatically records `HEAD`, or `<HEAD>-dirty` when the checkout has uncommitted files. Build systems can set `VOID_PLATFORM_SOURCE_REVISION` to override automatic detection.
|
|
152
|
-
|
|
153
|
-
A fresh CI runner can discover the installation each time. Set `CLOUDFLARE_API_TOKEN` and `VOID_PLATFORM_DATABASE_URL` through its protected environment, then:
|
|
154
|
-
|
|
155
|
-
::: details CI commands and recovery inputs
|
|
156
|
-
|
|
157
|
-
```sh
|
|
158
|
-
vp run build:core
|
|
159
|
-
|
|
160
|
-
export VOID_PLATFORM_REGISTRY_DIR="$RUNNER_TEMP/void-platform-registry"
|
|
161
|
-
export VOID_PLATFORM_RECOVERY_KEY="$(openssl rand -base64 32)"
|
|
162
|
-
node packages/void/dist/cli/cli.mjs platform discover --account "$CLOUDFLARE_ACCOUNT_ID" \
|
|
163
|
-
--installation "$VOID_PLATFORM_INSTALLATION"
|
|
164
|
-
node packages/void/dist/cli/cli.mjs platform upgrade "$VOID_PLATFORM_INSTALLATION" \
|
|
165
|
-
--runtime packages/platform/dist/runtime --plan
|
|
166
|
-
node packages/void/dist/cli/cli.mjs platform upgrade "$VOID_PLATFORM_INSTALLATION" \
|
|
167
|
-
--runtime packages/platform/dist/runtime --yes
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
Omit the installation selector only if the account has one discoverable installation. Run one deployment per installation at a time, and let it finish before starting the next. Cancelling during migrations or Worker rollout can leave an installation waiting for recovery.
|
|
171
|
-
|
|
172
|
-
Keep the management token, database URL, JWT signing secret, and complete project-encryption keyring in a protected CI environment. Upgrades inherit deployed Worker secrets. The original values are needed when recreating a missing Worker; configuration credentials are also needed when explicitly rotating them.
|
|
173
|
-
|
|
174
|
-
:::
|
|
175
|
-
|
|
176
|
-
## Changing the Platform Schema
|
|
177
|
-
|
|
178
|
-
The schema lives in `platform/packages/api/src/schema.ts`. Generate a migration after changing it:
|
|
179
|
-
|
|
180
|
-
```sh
|
|
181
|
-
vp run --filter @voidcloud/api db:generate
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
Review the generated SQL and migration journal before committing them. Released migrations are append-only. An upgrade applies new migrations while the previous Workers may still serve requests, so schema changes must remain compatible with that code.
|
|
185
|
-
|
|
186
|
-
`platform/packages/api/drizzle/compatibility.json` records which earlier runtimes have been verified against the new schema. Add an edge only after testing that compatibility. The runtime build checks that the migration files and recorded schema history agree. See `packages/platform/README.md` for the manifest contract.
|
|
187
|
-
|
|
188
|
-
## CI in a Fork
|
|
189
|
-
|
|
190
|
-
The uncredentialed test workflows use GitHub-hosted runners in forks. They build and test the workspace without requiring Void Cloud accounts, tokens, or deployment access.
|
|
191
|
-
|
|
192
|
-
If your fork has a released platform version, set the repository variable
|
|
193
|
-
`VOID_PLATFORM_PRODUCTION_REF` to its immutable 40-character commit SHA. Platform
|
|
194
|
-
pull requests then create that version's database, seed representative user,
|
|
195
|
-
project, and encrypted-secret records, and apply the proposed migrations. The
|
|
196
|
-
check verifies existing data and runs the previous runtime against the upgraded
|
|
197
|
-
schema. Mutable branch or tag names are rejected.
|
|
198
|
-
|
|
199
|
-
Without an explicit SHA, required compatibility checks use the latest successful
|
|
200
|
-
GitHub deployment to `Prod` (or `VOID_PLATFORM_PRODUCTION_ENV`). They require
|
|
201
|
-
read access to deployment history and stop if no completed deployment is found.
|
|
202
|
-
Advancing the production branch does not change the selected baseline. Fork
|
|
203
|
-
workflows that call platform CI must grant `deployments: read` alongside
|
|
204
|
-
`contents: read`.
|
|
205
|
-
|
|
206
|
-
The upstream repository also contains workflows for deploying Void Cloud and publishing the official npm packages. Forks should configure their own release workflow around the built CLI and `platform upgrade --runtime`; the [source-build CI example](#source-build-ci) shows the required inputs. Keep production credentials in protected environments restricted to the appropriate release refs.
|
|
207
|
-
|
|
208
|
-
Public releases use matching versions for the CLI, scaffolder, adapters, and
|
|
209
|
-
packaged platform. The publish workflow rejects mismatched versions and previously
|
|
210
|
-
unpublished `void` versions that npm cannot reuse. Stable versions use `latest`;
|
|
211
|
-
prereleases use their named channel, such as `beta` or `rc`. Numeric prereleases
|
|
212
|
-
use `next`. The scaffolder installs its exact matching CLI version, so
|
|
213
|
-
`create-void@beta` cannot silently select the stable CLI. Packaged platform
|
|
214
|
-
runtimes record the release commit as their source revision.
|
|
215
|
-
|
|
216
|
-
The npm release job uses [trusted publishing](https://docs.npmjs.com/trusted-publishers/)
|
|
217
|
-
from GitHub-hosted runners, with `id-token: write` and no stored npm publishing
|
|
218
|
-
token. Configure a trusted publisher for each public package using this
|
|
219
|
-
repository, `publish.yml`, and the `Release` environment, allowing direct
|
|
220
|
-
`npm publish`. A brand-new package
|
|
221
|
-
needs an initial authenticated publication before its trusted publisher can be
|
|
222
|
-
configured; subsequent releases use OIDC.
|
|
223
|
-
|
|
224
|
-
The managed build fallback CLI also derives its version from
|
|
225
|
-
`packages/void/package.json`; there are no separate version pins to update.
|
|
226
|
-
Build its image from the repository root with
|
|
227
|
-
`docker build --file platform/packages/api/container/Dockerfile .`.
|
|
228
|
-
The root `.dockerignore` limits that build context to the agent, Dockerfile,
|
|
229
|
-
and public SDK manifest.
|
|
230
|
-
|
|
231
|
-
Publishing requires both SDK CI and platform CI, including the platform unit and
|
|
232
|
-
API integration suites. Release tags also run the Windows SDK checks; a passing
|
|
233
|
-
SDK-only build cannot publish a changed control plane.
|
|
234
|
-
|
|
235
|
-
### Retrying a Release
|
|
236
|
-
|
|
237
|
-
To retry a failed release without moving an existing tag, add `+retry.N` to a
|
|
238
|
-
new Git tag, with `N` starting at `1`. Keep the package versions unchanged:
|
|
239
|
-
|
|
240
|
-
| Git tag | Package version | npm channel |
|
|
241
|
-
| ------------------------ | --------------- | ----------- |
|
|
242
|
-
| `v0.21.0` | `0.21.0` | `latest` |
|
|
243
|
-
| `v0.21.0+retry.1` | `0.21.0` | `latest` |
|
|
244
|
-
| `v0.21.0-beta.1+retry.2` | `0.21.0-beta.1` | `beta` |
|
|
245
|
-
|
|
246
|
-
For example, when the packages are at `0.21.0`, commit the release fix and tag
|
|
247
|
-
that commit:
|
|
248
|
-
|
|
249
|
-
```sh
|
|
250
|
-
git tag -a 'v0.21.0+retry.1' -m 'Retry 0.21.0 publication.'
|
|
251
|
-
git push origin 'refs/tags/v0.21.0+retry.1'
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
The retry suffix belongs only in the Git tag, not in `package.json`. A `-1`
|
|
255
|
-
suffix is a distinct prerelease version, not a retry. Tag and package versions
|
|
256
|
-
are checked before dependency installation and the full CI jobs; retries still
|
|
257
|
-
run the normal release checks.
|
|
258
|
-
|
|
259
|
-
Retries publish only package versions that are still missing from npm. They
|
|
260
|
-
cannot replace an already-published version. If an earlier attempt partially
|
|
261
|
-
published the release and you changed its package contents, bump the version
|
|
262
|
-
instead of combining different contents under the same version.
|
|
263
|
-
|
|
264
|
-
For implementation history, use the design archive at `platform/meta/design-docs/README.md`. Its proposals explain earlier decisions; the source and current guides define the supported behavior.
|
|
13
|
+
- [Local Development](/guide/platform/development/local)
|
|
14
|
+
- [Runtime and Source Builds](/guide/platform/development/runtime)
|
|
15
|
+
- [Schema and CI](/guide/platform/development/schema-ci)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
outline: deep
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Project Collaboration
|
|
6
|
+
|
|
7
|
+
A project hosted on a Void platform can have one owner and additional readers, collaborators, and project administrators. Team access is a platform feature; it is not available for projects deployed directly to Cloudflare.
|
|
8
|
+
|
|
9
|
+
## Roles
|
|
10
|
+
|
|
11
|
+
| Role | Access |
|
|
12
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| Reader | View the project, usage, resources, deployments, builds, logs, and member roster. Cannot deploy. |
|
|
14
|
+
| Collaborator | Reader access plus deploy, rollback, cancellation, migrations, secrets, database configuration, and deploy prerequisites. |
|
|
15
|
+
| Project administrator | Collaborator access plus domains, email destinations, GitHub configuration, invitations, roles, and member removal. |
|
|
16
|
+
| Owner | Project administrator access plus project deletion. |
|
|
17
|
+
|
|
18
|
+
Only the owner can create, list, renew, or revoke the project's CI deploy
|
|
19
|
+
credentials. Those credentials run unattended deployments as the billing owner
|
|
20
|
+
and remain independent of a member's login session, so collaborators and
|
|
21
|
+
project administrators deploy with their own account instead of minting a
|
|
22
|
+
durable owner credential.
|
|
23
|
+
|
|
24
|
+
The owner's plan, limits, and suspension state govern the project. A member's
|
|
25
|
+
own plan does not change the project's available usage, and acting through a
|
|
26
|
+
collaborator does not bypass an owner suspension. A project administrator is
|
|
27
|
+
not an installation administrator and receives no platform-wide access.
|
|
28
|
+
|
|
29
|
+
## Invite a Registered User
|
|
30
|
+
|
|
31
|
+
An owner or project administrator can invite someone by the email address registered to their existing account on the same platform:
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
void project team invite teammate@example.com --role collaborator
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Pass `--project <slug>` to manage a project other than the linked project. An unknown email is rejected. A project invitation neither creates an account nor adds the address to a restricted-signup allowlist.
|
|
38
|
+
|
|
39
|
+
Invitations expire after seven days. If the platform cannot send invitation
|
|
40
|
+
email, the CLI prints the invitation ID and connection and acceptance commands
|
|
41
|
+
to share with the invited user. The invitation also appears when that user runs
|
|
42
|
+
`void project team pending` on the same platform.
|
|
43
|
+
|
|
44
|
+
List the roster and sent invitations with:
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
void project team list
|
|
48
|
+
void project team invitations
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Respond to an Invitation
|
|
52
|
+
|
|
53
|
+
Connect to the platform from your invitation, then see invitations addressed to
|
|
54
|
+
your account and respond using the invitation ID:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
void connect https://api.example.com
|
|
58
|
+
void project team pending
|
|
59
|
+
void project team accept <invitation-id>
|
|
60
|
+
# or
|
|
61
|
+
void project team decline <invitation-id>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
An invitation is bound to the registered account. Forwarding its ID does not let another user accept it.
|
|
65
|
+
|
|
66
|
+
These three commands use the active platform connection selected by
|
|
67
|
+
`void connect`, even inside a directory linked to another project or deployed
|
|
68
|
+
directly to Cloudflare. `VOID_API_URL` takes precedence when set. If you use
|
|
69
|
+
`VOID_TOKEN`, set `VOID_API_URL` to the matching platform; a token without that
|
|
70
|
+
URL selects Void Cloud. Each command shows the platform it contacts.
|
|
71
|
+
|
|
72
|
+
Accepting an invitation grants access without linking your current directory.
|
|
73
|
+
Open the invited application's directory and run `void project link` if it is
|
|
74
|
+
not linked yet. If it is already linked to another project, use a separate
|
|
75
|
+
checkout without `.void/project.json`, connect to the invited platform there,
|
|
76
|
+
and run `void project link`.
|
|
77
|
+
|
|
78
|
+
If the invitation is missing, check the platform and signed-in account. To
|
|
79
|
+
switch accounts, set `VOID_API_URL` to the invitation's platform URL, unset
|
|
80
|
+
`VOID_TOKEN` if present, then run `void auth logout` and `void auth login` using
|
|
81
|
+
the invited email address. For an expired or revoked invitation, ask a project
|
|
82
|
+
administrator to invite you again.
|
|
83
|
+
|
|
84
|
+
## Change or Remove Access
|
|
85
|
+
|
|
86
|
+
Owners and project administrators can change any non-owner member or revoke a pending invitation:
|
|
87
|
+
|
|
88
|
+
```sh
|
|
89
|
+
void project team role <user-id> reader
|
|
90
|
+
void project team remove <user-id>
|
|
91
|
+
void project team revoke <invitation-id>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
A non-owner member can leave with `void project team leave`. The owner cannot leave; an installation administrator must [transfer ownership](./platform/administration/projects.md#transferring-project-ownership) first.
|
|
@@ -4,23 +4,6 @@ outline: deep
|
|
|
4
4
|
|
|
5
5
|
# Sandboxes
|
|
6
6
|
|
|
7
|
-
> **Managed platform beta paused:** New managed Sandbox deployments and retained
|
|
8
|
-
> Sandbox rollbacks are currently disabled. Native Cloudflare deployments keep
|
|
9
|
-
> using Cloudflare Sandboxes directly. Platform operators upgrading an existing
|
|
10
|
-
> installation must preview and complete
|
|
11
|
-
> `void platform system sandbox-drain` before reopening platform traffic. The
|
|
12
|
-
> preview is bounded; pass its `nextCursor` back with `--cursor` to inspect later
|
|
13
|
-
> pages. Apply is resumable through a leased database checkpoint: rerun it after
|
|
14
|
-
> active deployments settle, after it advances a page, or after resolving any
|
|
15
|
-
> ownership verification blocker.
|
|
16
|
-
|
|
17
|
-
For an `unverified_container` blocker, use the reported resource, project,
|
|
18
|
-
binding, application ID, and application name to compare the application's
|
|
19
|
-
Durable Object namespace with the project's managed dispatch script. Never
|
|
20
|
-
delete an account application by name alone. Remove the application and stale
|
|
21
|
-
resource row only after proving that both belong to this platform installation,
|
|
22
|
-
then rerun the drain.
|
|
23
|
-
|
|
24
7
|
Use a Cloudflare Sandbox to run commands, work with files, and expose ports from server code. Each session gets an isolated container.
|
|
25
8
|
|
|
26
9
|
```ts
|
|
@@ -36,7 +19,7 @@ export const POST = defineHandler(async (c) => {
|
|
|
36
19
|
});
|
|
37
20
|
```
|
|
38
21
|
|
|
39
|
-
Importing from `void/sandbox` enables the `SANDBOX` Durable Object
|
|
22
|
+
Importing from `void/sandbox` enables the required Sandbox resources. Native Cloudflare deployments add the `SANDBOX` Durable Object and Container metadata to the Worker. Void Platform deployments provide the same runtime API through a managed Sandbox controller.
|
|
40
23
|
|
|
41
24
|
## Configuration
|
|
42
25
|
|
|
@@ -59,8 +42,8 @@ Available fields:
|
|
|
59
42
|
|
|
60
43
|
| Field | Default | Description |
|
|
61
44
|
| ------------------- | -------------------------- | --------------------------------------------------------------------- |
|
|
62
|
-
| `binding` | `SANDBOX` |
|
|
63
|
-
| `className` | `Sandbox` | Durable Object class
|
|
45
|
+
| `binding` | `SANDBOX` | Binding name for local and native Cloudflare use |
|
|
46
|
+
| `className` | `Sandbox` | Durable Object class for local and native Cloudflare use |
|
|
64
47
|
| `containerName` | `void-sandbox` | Cloudflare container app name |
|
|
65
48
|
| `image` | Matching sandbox SDK image | Dockerfile path or registry image for local and native Cloudflare use |
|
|
66
49
|
| `imageBuildContext` | Directory of `image` | Docker build context for local and native Cloudflare use |
|
|
@@ -81,13 +64,13 @@ await sandbox.writeFile('/tmp/input.txt', 'hello');
|
|
|
81
64
|
const result = await sandbox.exec('cat /tmp/input.txt');
|
|
82
65
|
```
|
|
83
66
|
|
|
84
|
-
|
|
67
|
+
For code that must run on both deployment targets, use `getSandbox()`. Direct access through `c.env.SANDBOX` is available only on local and native Cloudflare deployments; managed platforms intentionally expose the application Sandbox API without the underlying lifecycle namespace.
|
|
85
68
|
|
|
86
69
|
## State persistence
|
|
87
70
|
|
|
88
|
-
A sandbox has a
|
|
71
|
+
A sandbox has a Durable Object identity and a container that can restart:
|
|
89
72
|
|
|
90
|
-
`getSandbox(id)` selects the same Durable Object for that ID
|
|
73
|
+
`getSandbox(id)` selects the same Durable Object for that ID within a deployment. Native Cloudflare deployments preserve that namespace across Worker versions. Each managed platform deployment has its own namespace; rolling back to a retained deployment reconnects to that deployment's namespace.
|
|
91
74
|
|
|
92
75
|
Files, running processes, exposed ports, and in-memory shell sessions last only as long as the container. It can stop after inactivity (the SDK defaults to `sleepAfter: "10m"`), crash, or restart during platform scheduling. `keepAlive: true` disables the idle timer but doesn't prevent other restarts.
|
|
93
76
|
|
|
@@ -95,6 +78,8 @@ Save anything you need to keep in Durable Object storage, your database, KV, or
|
|
|
95
78
|
|
|
96
79
|
## Deployment
|
|
97
80
|
|
|
98
|
-
`void deploy`
|
|
81
|
+
`void deploy` creates a deployment-scoped Sandbox controller and container application in the Void platform account. The controller owns container lifetime, concurrency admission, and runtime accounting; the application receives only the Sandbox operations exposed by `getSandbox()`.
|
|
99
82
|
|
|
100
83
|
Platform deploys require a registry image reference. The default sandbox works without extra config. If `sandbox.image` points at a custom local Dockerfile, also set `sandbox.platformImage` to an image you have already pushed to a registry.
|
|
84
|
+
|
|
85
|
+
Managed Sandboxes require Workers Paid on the platform's Cloudflare account. The platform runtime token needs Account / Containers: Edit and Account / Cloudchamber: Edit. These are checked only when an application that uses Sandbox is deployed; installing or upgrading a platform and deploying other applications does not probe Containers access.
|