ghostdock 0.0.19 → 0.0.20
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/dist/cli-reference.md +750 -656
- package/dist/cli.md +279 -268
- package/dist/index.js +5706 -3683
- package/package.json +1 -1
package/dist/cli.md
CHANGED
|
@@ -37,10 +37,10 @@ bun run --cwd packages/cli dev -- --help # run from source without building
|
|
|
37
37
|
Every command prints for people by default: one line per event, a symbol, then the message.
|
|
38
38
|
|
|
39
39
|
```
|
|
40
|
-
$ ghostdock
|
|
40
|
+
$ ghostdock vm list
|
|
41
41
|
⚓ Marketing site quiet-harbor running
|
|
42
42
|
◌ teal-jetty stopped
|
|
43
|
-
$ ghostdock
|
|
43
|
+
$ ghostdock site publish ./dist
|
|
44
44
|
↗ https://foggy-teal-bollard.static.ghostdock.app
|
|
45
45
|
✓ Published site foggy-teal-bollard.
|
|
46
46
|
```
|
|
@@ -48,27 +48,27 @@ $ ghostdock sites publish ./dist
|
|
|
48
48
|
`⚓` ready, `✓` done, `↗` a URL, `◌` stopped or gone, `✗` failed, `▂▄▆` in progress. Every line
|
|
49
49
|
carries the name and id the next command needs.
|
|
50
50
|
|
|
51
|
-
Commands that wait show a progress line on stderr while they run. Starting a
|
|
52
|
-
(`
|
|
51
|
+
Commands that wait show a progress line on stderr while they run. Starting a VM
|
|
52
|
+
(`vm create`, `vm wake`) prints how long each step took, measured on the server, each
|
|
53
53
|
step with its own time:
|
|
54
54
|
|
|
55
55
|
```
|
|
56
|
-
$ ghostdock
|
|
56
|
+
$ ghostdock vm wake quiet-harbor
|
|
57
57
|
⚓ quiet-harbor running
|
|
58
|
-
⚓
|
|
58
|
+
⚓ VM started in 125ms
|
|
59
59
|
✓ container started in 3.0s
|
|
60
60
|
```
|
|
61
61
|
|
|
62
62
|
The container line is missing when no container was started, or when the host is older and did
|
|
63
|
-
not report it. `
|
|
64
|
-
the `boot` field: `{ trigger,
|
|
63
|
+
not report it. `vm status` prints the same lines for the last start. With `--json` they are
|
|
64
|
+
the `boot` field: `{ trigger, vm: { startedAt, readyAt, ms }, container: { … } | null }`, or
|
|
65
65
|
`null` when the command started nothing.
|
|
66
66
|
|
|
67
67
|
**Scripts and agents pass `--json`.** It prints the result as one JSON document on stdout, with
|
|
68
68
|
every field, and nothing else there. It works on every command and anywhere on the line:
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
ghostdock
|
|
71
|
+
ghostdock vm list --json | jq -r '.vms[].name'
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
- **stdout is the result, stderr is everything else**: notices (`Using organization acme …`),
|
|
@@ -96,28 +96,29 @@ Commands are grouped by resource, like `gh` or `kubectl`: `ghostdock <resource>
|
|
|
96
96
|
|
|
97
97
|
<!-- generated:command-groups:start (bun run sync:cli-reference; do not edit) -->
|
|
98
98
|
```
|
|
99
|
-
ghostdock
|
|
100
|
-
ghostdock docker
|
|
101
|
-
ghostdock env
|
|
102
|
-
ghostdock
|
|
103
|
-
ghostdock login
|
|
104
|
-
ghostdock logout
|
|
105
|
-
ghostdock network
|
|
106
|
-
ghostdock
|
|
107
|
-
ghostdock
|
|
108
|
-
ghostdock
|
|
109
|
-
ghostdock registry
|
|
110
|
-
ghostdock
|
|
111
|
-
ghostdock
|
|
112
|
-
ghostdock
|
|
113
|
-
ghostdock
|
|
114
|
-
ghostdock tools
|
|
115
|
-
ghostdock
|
|
99
|
+
ghostdock app Published apps of an organization.
|
|
100
|
+
ghostdock docker Docker over the private network: a VM's Docker engine from this machine.
|
|
101
|
+
ghostdock env Manage organization environment variables and secrets.
|
|
102
|
+
ghostdock image Organization image catalog: OCI bookmarks, Dockerfiles and Compose files.
|
|
103
|
+
ghostdock login Sign in and store a device access token for this machine…
|
|
104
|
+
ghostdock logout Revoke the device session and remove stored credentials.
|
|
105
|
+
ghostdock network The private network: reach your VMs by address and name from this machine.
|
|
106
|
+
ghostdock organization Organizations you belong to.
|
|
107
|
+
ghostdock project Deployable projects, their deployments and environment.
|
|
108
|
+
ghostdock provider Providers of an organization.
|
|
109
|
+
ghostdock registry Log in to the organization container registry.
|
|
110
|
+
ghostdock site Static sites on the CDN.
|
|
111
|
+
ghostdock skill List and read Agent Skills (same catalog as MCP skill://index.json).
|
|
112
|
+
ghostdock snapshot VM snapshots.
|
|
113
|
+
ghostdock template
|
|
114
|
+
ghostdock tools List available agent tools.
|
|
115
|
+
ghostdock vm Create, run and manage VMs.
|
|
116
|
+
ghostdock whoami Show the account this CLI is currently authenticated as.
|
|
116
117
|
```
|
|
117
118
|
<!-- generated:command-groups:end -->
|
|
118
119
|
|
|
119
120
|
Run `ghostdock <command> --help` at any level for its subcommands or flags, e.g.
|
|
120
|
-
`ghostdock
|
|
121
|
+
`ghostdock vm --help` or `ghostdock vm url create --help`.
|
|
121
122
|
|
|
122
123
|
Most commands are generated from the tool catalog — see **Invoking a tool** below. Every command
|
|
123
124
|
is listed in the [command index](#command-index); [`cli-reference.md`](cli-reference.md) has each
|
|
@@ -129,18 +130,18 @@ Every organization-scoped command acts on one organization, taken from the first
|
|
|
129
130
|
|
|
130
131
|
1. `--org <id-or-slug>` on the command
|
|
131
132
|
2. the `GHOSTDOCK_ORG` environment variable
|
|
132
|
-
3. the default set with `ghostdock
|
|
133
|
+
3. the default set with `ghostdock organization use <id-or-slug>`, stored in
|
|
133
134
|
`~/.config/ghostdock/settings.json`
|
|
134
135
|
|
|
135
136
|
With one organization there is nothing to do: `login` makes it the default, and every command,
|
|
136
137
|
in any directory, uses it.
|
|
137
138
|
|
|
138
139
|
```bash
|
|
139
|
-
ghostdock
|
|
140
|
-
ghostdock
|
|
141
|
-
ghostdock
|
|
142
|
-
ghostdock
|
|
143
|
-
ghostdock
|
|
140
|
+
ghostdock organization use acme # the default (login sets one when it can)
|
|
141
|
+
ghostdock vm list # stderr: Using organization acme (default from ~/.config/ghostdock/settings.json)
|
|
142
|
+
ghostdock vm list --org beta # --org always wins
|
|
143
|
+
ghostdock organization current # which organization, and where it comes from
|
|
144
|
+
ghostdock organization use --clear
|
|
144
145
|
```
|
|
145
146
|
|
|
146
147
|
When the organization does not come from `--org`, the command says which one it uses on stderr,
|
|
@@ -181,7 +182,7 @@ or the timeout elapses. Exits `0` on success, non-zero otherwise.
|
|
|
181
182
|
|
|
182
183
|
**`--code` — paste-code fallback:**
|
|
183
184
|
|
|
184
|
-
If the CLI can't poll (e.g. it's running in a
|
|
185
|
+
If the CLI can't poll (e.g. it's running in a VM with no long-lived process, or the browser
|
|
185
186
|
approval happened on a different machine), the browser's "Having trouble? Show code" link reveals a
|
|
186
187
|
short one-time code. Redeem it directly:
|
|
187
188
|
|
|
@@ -204,7 +205,7 @@ default organization when that is unambiguous:
|
|
|
204
205
|
- With exactly one organization, that one becomes the default.
|
|
205
206
|
- With several, a person at a terminal picks one from a numbered list (Enter skips). Without a
|
|
206
207
|
terminal (agents, CI) nothing is asked: `login` lists them and points to
|
|
207
|
-
`ghostdock
|
|
208
|
+
`ghostdock organization use`.
|
|
208
209
|
|
|
209
210
|
See [Choosing an organization](#choosing-an-organization) for how commands pick it up.
|
|
210
211
|
|
|
@@ -240,19 +241,19 @@ ghostdock tools --json # the full catalog (including each tool's JSON Schema)
|
|
|
240
241
|
|
|
241
242
|
Requires login — prints a hint and exits `1` if there's no valid session.
|
|
242
243
|
|
|
243
|
-
### `ghostdock
|
|
244
|
+
### `ghostdock skill`
|
|
244
245
|
|
|
245
246
|
Lists and reads **Agent Skills** for the authenticated account — the same catalog MCP
|
|
246
247
|
clients discover at `skill://index.json` (SEP-2640 / Agent Skills discovery 0.2.0).
|
|
247
|
-
Prefer resources. The MCP tools `
|
|
248
|
+
Prefer resources. The MCP tools `skill_list` and `skill_get` are fallbacks for clients that
|
|
248
249
|
cannot use `resources/list` and `resources/read` — skip them if those work.
|
|
249
250
|
|
|
250
251
|
```bash
|
|
251
|
-
ghostdock
|
|
252
|
-
ghostdock
|
|
253
|
-
ghostdock
|
|
254
|
-
ghostdock
|
|
255
|
-
ghostdock
|
|
252
|
+
ghostdock skill list # name, description, and skill:// URI per skill
|
|
253
|
+
ghostdock skill list --json # official discovery index ($schema + skills[])
|
|
254
|
+
ghostdock skill get skill://github/SKILL.md # print SKILL.md
|
|
255
|
+
ghostdock skill get github # same, by name
|
|
256
|
+
ghostdock skill get org_1/release-notes # organization skill
|
|
256
257
|
```
|
|
257
258
|
|
|
258
259
|
`--json` on `get` prints `{ uri, name, description, markdown }`. If the same name exists
|
|
@@ -263,19 +264,19 @@ Requires login — prints a hint and exits `1` if there's no valid session.
|
|
|
263
264
|
### Invoking a tool
|
|
264
265
|
|
|
265
266
|
Every catalog tool is a command at its own path, with one `--flag` per schema property
|
|
266
|
-
(`
|
|
267
|
-
`ghostdock
|
|
267
|
+
(`autoWake` -> `--auto-wake`). The one thing a command acts on is positional instead:
|
|
268
|
+
`ghostdock vm stop <vm>`, `ghostdock vm url delete <url-id>`,
|
|
268
269
|
`ghostdock env get <name>`. The organization is always the `--org` flag, by id or slug: a slug is easier to type, an id keeps
|
|
269
270
|
working after the organization is renamed (renaming changes the slug). The MCP tool name is the same path joined with
|
|
270
|
-
underscores: `ghostdock
|
|
271
|
+
underscores: `ghostdock vm url create` calls the `vm_url_create` tool. Run
|
|
271
272
|
`ghostdock <command> --help` to see a command's full description, its flags and which are
|
|
272
273
|
required; a group's `--help` lists its commands with one line each. Output is a line per item
|
|
273
274
|
for people; `--json` prints the tool's result as it comes back over MCP.
|
|
274
275
|
|
|
275
276
|
```bash
|
|
276
|
-
ghostdock
|
|
277
|
+
ghostdock organization list
|
|
277
278
|
# • Acme org_123
|
|
278
|
-
ghostdock
|
|
279
|
+
ghostdock organization list --json
|
|
279
280
|
# {"organizations": [{"id": "org_123", "name": "Acme", "slug": "acme"}]}
|
|
280
281
|
```
|
|
281
282
|
|
|
@@ -291,97 +292,97 @@ Command descriptions are short on purpose. Concepts and workflows live in the bu
|
|
|
291
292
|
Skills, the same documents MCP agents read:
|
|
292
293
|
|
|
293
294
|
```bash
|
|
294
|
-
ghostdock
|
|
295
|
-
ghostdock
|
|
296
|
-
ghostdock
|
|
297
|
-
ghostdock
|
|
298
|
-
ghostdock
|
|
295
|
+
ghostdock skill get vm # sources, manifests, lifecycle, providers, URLs and TCP
|
|
296
|
+
ghostdock skill get vm-boot # processes that must come back after idle-stop
|
|
297
|
+
ghostdock skill get environment # organization entries, bindings, local entries, secrets
|
|
298
|
+
ghostdock skill get publishing # sites publish vs projects publish, outcomes, redeploys
|
|
299
|
+
ghostdock skill get incus-setup # connecting your own Incus host
|
|
299
300
|
```
|
|
300
301
|
|
|
301
|
-
###
|
|
302
|
+
### VMs
|
|
302
303
|
|
|
303
|
-
Read `ghostdock
|
|
304
|
+
Read `ghostdock skill get vm` before your first VM: what it can boot from, manifests,
|
|
304
305
|
idle-stop and auto-delete, providers, URLs.
|
|
305
306
|
|
|
306
|
-
Every
|
|
307
|
-
that takes a
|
|
308
|
-
The long `
|
|
309
|
-
while the
|
|
310
|
-
a new one later. The display name is a separate label you can edit. For example, create a
|
|
307
|
+
Every VM has a name like `quiet-harbor`, unique within its organization, and every command
|
|
308
|
+
that takes a VM accepts it with the organization (`--org`, `GHOSTDOCK_ORG` or the default).
|
|
309
|
+
The long `vmId` in `--json` output works too, in the same organization. A name never changes
|
|
310
|
+
while the VM exists, so scripts can keep it; once a VM is deleted, its name may be given to
|
|
311
|
+
a new one later. The display name is a separate label you can edit. For example, create a VM,
|
|
311
312
|
then expose a URL:
|
|
312
313
|
|
|
313
314
|
```bash
|
|
314
|
-
ghostdock
|
|
315
|
-
ghostdock
|
|
315
|
+
ghostdock vm create --org org_123 --display-name "Marketing site"
|
|
316
|
+
ghostdock vm url create quiet-harbor --port 8080 --auto-wake true --public true
|
|
316
317
|
```
|
|
317
318
|
|
|
318
|
-
#### Containers in a
|
|
319
|
+
#### Containers in a VM
|
|
319
320
|
|
|
320
|
-
On Ghostdock Cloud a
|
|
321
|
-
`ssh get`, `
|
|
322
|
-
|
|
321
|
+
On Ghostdock Cloud a VM runs one Docker engine; everything in it is an ordinary container.
|
|
322
|
+
`vm ssh get`, `vm file`, `vm command` and `vm shell` land in one of them: `--container <name>`, else the
|
|
323
|
+
VM's default container, else the one running container. With several running and no default,
|
|
323
324
|
the CLI asks which one at the keyboard and offers to make it the default; without a terminal it
|
|
324
325
|
fails and lists the names. A command runs as `docker exec` does there: as the container's
|
|
325
326
|
`ghostdock.login.user`, else the image's `USER`, else root.
|
|
326
327
|
|
|
327
328
|
```bash
|
|
328
|
-
ghostdock
|
|
329
|
-
ghostdock
|
|
330
|
-
ghostdock
|
|
331
|
-
ghostdock
|
|
329
|
+
ghostdock vm container list quiet-harbor
|
|
330
|
+
ghostdock vm default-container quiet-harbor --container web # --clear true removes it
|
|
331
|
+
ghostdock vm command run quiet-harbor --container db --command 'pg_isready'
|
|
332
|
+
ghostdock vm container unlock quiet-harbor workstation
|
|
332
333
|
```
|
|
333
334
|
|
|
334
335
|
A shell session lives in its container: pass the same `--container` to every `shells` and
|
|
335
336
|
`commands` call on it.
|
|
336
337
|
|
|
337
|
-
#### Environment in a
|
|
338
|
+
#### Environment in a VM
|
|
338
339
|
|
|
339
|
-
A
|
|
340
|
+
A VM exports **nothing** by default (unless you boot from an organization snapshot or catalog
|
|
340
341
|
image whose manifest supplies defaults). `environment` has three parts: `organization` (plain same-name opt-ins from the
|
|
341
|
-
catalogue, see [`ghostdock env`](#ghostdock-env)), `bindings` (slot ← org entry remaps), and `local` (
|
|
342
|
+
catalogue, see [`ghostdock env`](#ghostdock-env)), `bindings` (slot ← org entry remaps), and `local` (VM-only variables/secrets). A local entry overrides an
|
|
342
343
|
organization export of the same name. Prefer the CLI when setting secret values so they are not
|
|
343
344
|
pasted into the agent conversation.
|
|
344
345
|
|
|
345
346
|
```bash
|
|
346
347
|
# At create time, in one call:
|
|
347
|
-
ghostdock
|
|
348
|
+
ghostdock vm create --org org_123 \
|
|
348
349
|
--environment '{"organization":["VITE_API_URL","BUILD_TOKEN"],"bindings":[{"name":"DATABASE_URL","organization":"PROD_DATABASE_URL"}],"local":[{"name":"API_KEY","value":"sk_live","kind":"secret"}]}'
|
|
349
350
|
|
|
350
351
|
# Afterwards:
|
|
351
|
-
ghostdock
|
|
352
|
-
ghostdock
|
|
352
|
+
ghostdock vm env get quiet-harbor
|
|
353
|
+
ghostdock vm env select quiet-harbor --environment '["VITE_API_URL"]' \
|
|
353
354
|
--bindings '[{"name":"DATABASE_URL","organization":"PROD_DATABASE_URL"}]'
|
|
354
|
-
ghostdock
|
|
355
|
-
ghostdock
|
|
356
|
-
ghostdock
|
|
355
|
+
ghostdock vm env select quiet-harbor --environment '[]' # clears plain + remaps (omit bindings)
|
|
356
|
+
ghostdock vm env set API_KEY --vm quiet-harbor --value sk_live --kind secret
|
|
357
|
+
ghostdock vm env delete API_KEY --vm quiet-harbor
|
|
357
358
|
```
|
|
358
359
|
|
|
359
360
|
Values arrive as real environment variables, so read them with `process.env` / `$VAR` inside the
|
|
360
|
-
|
|
361
|
-
readable through `
|
|
362
|
-
(selected + overriddenByLocal) and the
|
|
361
|
+
VM. **Do not pass secrets in `vm command run` strings** — the command text is retained and
|
|
362
|
+
readable through `vm command logs`. `vm env get` reports every organization entry
|
|
363
|
+
(selected + overriddenByLocal) and the VM's own local entries; `vm status` reports
|
|
363
364
|
just the resolved names.
|
|
364
365
|
|
|
365
366
|
New shell commands and SSH sessions see a change immediately. Processes already running keep the
|
|
366
|
-
values they booted with until restarted (pass `--restart` to `
|
|
367
|
-
`
|
|
367
|
+
values they booted with until restarted (pass `--restart` to `vm env select` /
|
|
368
|
+
`vm env set` / `vm env delete` to restart a running VM
|
|
368
369
|
instead).
|
|
369
370
|
|
|
370
371
|
### Images
|
|
371
372
|
|
|
372
|
-
Organization image catalog: OCI bookmarks (`
|
|
373
|
-
(`
|
|
373
|
+
Organization image catalog: OCI bookmarks (`image add`), stored Dockerfiles
|
|
374
|
+
(`image add-dockerfile`), and refs currently in use on VMs. `image list` and `image get`
|
|
374
375
|
cover the same catalog family as those add tools — each org row includes `kind`, a redacted
|
|
375
376
|
`manifest` (from `ghostdock.*` Docker/OCI labels), `requiredEnvironment`, and `requiredUrls` (same
|
|
376
|
-
shape as snapshots). `
|
|
377
|
+
shape as snapshots). `vm create` with `--source '{"type":"image","id":"..."}'` boots a catalog
|
|
377
378
|
row by id and applies its manifest (URLs + env) like an organization snapshot.
|
|
378
379
|
|
|
379
380
|
```bash
|
|
380
|
-
ghostdock
|
|
381
|
-
ghostdock
|
|
382
|
-
ghostdock
|
|
383
|
-
ghostdock
|
|
384
|
-
ghostdock
|
|
381
|
+
ghostdock image list --org org_123
|
|
382
|
+
ghostdock image get img_abc --org org_123
|
|
383
|
+
ghostdock image add --org org_123 --ref ghcr.io/acme/app:latest --label "Acme app"
|
|
384
|
+
ghostdock image add-dockerfile --org org_123 --name my-stack --dockerfile "$(cat Dockerfile)"
|
|
385
|
+
ghostdock vm create --org org_123 \
|
|
385
386
|
--source '{"type":"image","id":"img_abc"}' \
|
|
386
387
|
--environment '{"local":[{"name":"API_KEY","kind":"secret","value":"sk_test"}]}'
|
|
387
388
|
```
|
|
@@ -392,81 +393,81 @@ persisting a catalog row. That JSON source is Dockerfile text only: COPY/ADD of
|
|
|
392
393
|
inline files (must include `docker-compose.yml`/`yaml` or `compose.yml`/`yaml`) and runs
|
|
393
394
|
`docker compose up`; `ghostdock.*` service labels become the create-time manifest. A directory or
|
|
394
395
|
ZIP — Dockerfile build context, or a Compose project with extra files — is
|
|
395
|
-
[`ghostdock
|
|
396
|
-
be passed as `{ type: "image", ref }` even when it does not appear in `
|
|
396
|
+
[`ghostdock vm build`](#ghostdock-vm-build), not this command. Any OCI ref may still
|
|
397
|
+
be passed as `{ type: "image", ref }` even when it does not appear in `image list`. Catalog compose
|
|
397
398
|
rows still boot via `{ type: "image", id }`.
|
|
398
399
|
|
|
399
|
-
### `ghostdock
|
|
400
|
+
### `ghostdock site publish`
|
|
400
401
|
|
|
401
|
-
Publish a local directory or ZIP to the CDN (durable public URL, no
|
|
402
|
+
Publish a local directory or ZIP to the CDN (durable public URL, no VM):
|
|
402
403
|
|
|
403
404
|
```bash
|
|
404
|
-
ghostdock
|
|
405
|
-
ghostdock
|
|
405
|
+
ghostdock site publish --org org_123 ./dist
|
|
406
|
+
ghostdock site publish --org org_123 --zip ./site.zip
|
|
406
407
|
```
|
|
407
408
|
|
|
408
|
-
MCP `
|
|
409
|
+
MCP `site_publish` is for small inline payloads. Use this command for a real directory or large ZIP.
|
|
409
410
|
|
|
410
|
-
### `ghostdock
|
|
411
|
+
### `ghostdock project publish`
|
|
411
412
|
|
|
412
413
|
Inspect a local source tree and publish (CDN when pre-built static, otherwise Compose from a DeploymentSpec).
|
|
413
414
|
Required secrets without values return `awaiting_configuration` instead of a live URL.
|
|
414
|
-
Re-invoke with `--environment` (same JSON shape as `
|
|
415
|
-
On `build_failed`, `start_failed`, or `verify_failed`, inspect the kept
|
|
415
|
+
Re-invoke with `--environment` (same JSON shape as `vm create`) after configuring.
|
|
416
|
+
On `build_failed`, `start_failed`, or `verify_failed`, inspect the kept VM (unless verification tore it down), then re-invoke with `--spec` (JSON `DeploymentSpec`). The spec is executed on a fresh VM and stored for later replay. Do not pass `--spec` with `--replan`. Every terminal outcome stores the upload and returns authenticated `fileUrls`. Detected tests always run after the stack is up; pass `--require-verify` to refuse a deploy when they fail.
|
|
416
417
|
|
|
417
418
|
```bash
|
|
418
|
-
ghostdock
|
|
419
|
-
ghostdock
|
|
420
|
-
ghostdock
|
|
421
|
-
ghostdock
|
|
419
|
+
ghostdock project publish --org org_123 ./app
|
|
420
|
+
ghostdock project publish --org org_123 --auto-stop-interval-minutes -1 --zip ./app.zip
|
|
421
|
+
ghostdock project publish --org org_123 --project-id proj_123 ./app
|
|
422
|
+
ghostdock project publish --org org_123 ./app \
|
|
422
423
|
--environment '{"organization":["DATABASE_URL"],"local":[{"name":"API_KEY","value":"sk_live","kind":"secret"}]}'
|
|
423
|
-
ghostdock
|
|
424
|
-
ghostdock
|
|
425
|
-
ghostdock
|
|
424
|
+
ghostdock project publish --org org_123 ./app --spec '{"version":1,"run":{"kind":"static","outputDir":"."},"env":[]}'
|
|
425
|
+
ghostdock project publish --org org_123 --require-verify ./app
|
|
426
|
+
ghostdock project publish --org org_123 --provider prov_123 ./app
|
|
426
427
|
```
|
|
427
428
|
|
|
428
|
-
MCP `
|
|
429
|
+
MCP `project_publish` is for small inline payloads. Use this command for a real directory or large ZIP.
|
|
429
430
|
|
|
430
|
-
### `ghostdock
|
|
431
|
+
### `ghostdock vm build`
|
|
431
432
|
|
|
432
|
-
Create a
|
|
433
|
-
`--zip`) and the server builds it. MCP `
|
|
433
|
+
Create a VM from a local Dockerfile or Compose directory. The CLI zips the directory (or sends
|
|
434
|
+
`--zip`) and the server builds it. MCP `vm_create` stays inline text only.
|
|
434
435
|
|
|
435
436
|
```bash
|
|
436
|
-
ghostdock
|
|
437
|
-
ghostdock
|
|
438
|
-
ghostdock
|
|
439
|
-
--
|
|
437
|
+
ghostdock vm build --org org_123 --kind dockerfile ./app
|
|
438
|
+
ghostdock vm build --org org_123 --kind compose --zip ./stack.zip
|
|
439
|
+
ghostdock vm build --org org_123 --kind dockerfile \
|
|
440
|
+
--provider prov_123 --display-name "API" ./app
|
|
440
441
|
```
|
|
441
442
|
|
|
442
443
|
The Dockerfile (`Dockerfile` or `dockerfile`) or a compose file (`docker-compose.yml`/`yaml`,
|
|
443
444
|
`compose.yml`/`yaml`) must sit at the directory root, or at the root of the ZIP. A ZIP that wraps
|
|
444
445
|
the project in one folder is unwrapped. Pass one directory or `--zip`, not both.
|
|
445
446
|
|
|
446
|
-
### `ghostdock
|
|
447
|
+
### `ghostdock vm file upload`
|
|
447
448
|
|
|
448
|
-
`
|
|
449
|
+
`vm file upload` is convenient for small payloads. For a local directory,
|
|
449
450
|
multiple files, or a large ZIP, use the dedicated multipart upload command instead:
|
|
450
451
|
|
|
451
452
|
```bash
|
|
452
|
-
ghostdock
|
|
453
|
-
ghostdock
|
|
454
|
-
ghostdock
|
|
455
|
-
ghostdock
|
|
453
|
+
ghostdock vm file upload quiet-harbor ./dist
|
|
454
|
+
ghostdock vm file upload quiet-harbor ./index.html ./assets
|
|
455
|
+
ghostdock vm file upload quiet-harbor --zip ./site.zip
|
|
456
|
+
ghostdock vm file upload quiet-harbor ./dist --container web --start
|
|
456
457
|
```
|
|
457
458
|
|
|
458
459
|
Each positional path may be a file or directory. Directory contents are uploaded recursively,
|
|
459
|
-
preserving their relative paths; a file is uploaded by its basename. A `
|
|
460
|
-
at least one path or `--zip`. Uploading to a stopped
|
|
461
|
-
The files land in a container as the other `
|
|
462
|
-
[Containers in a
|
|
460
|
+
preserving their relative paths; a file is uploaded by its basename. A `vm file upload` call needs
|
|
461
|
+
at least one path or `--zip`. Uploading to a stopped VM resumes it automatically.
|
|
462
|
+
The files land in a container as the other `vm file` commands do (see
|
|
463
|
+
[Containers in a VM](#containers-in-a-vm)): `--container <name>`, else the default,
|
|
463
464
|
else the one running, and the CLI asks which one when it cannot tell. A stopped target container
|
|
464
465
|
is started after a "Start it?" at the keyboard, or at once with `--start`.
|
|
465
466
|
|
|
466
467
|
### `ghostdock env`
|
|
467
468
|
|
|
468
|
-
Manage the environment variables and secrets an organization offers to its
|
|
469
|
-
A
|
|
469
|
+
Manage the environment variables and secrets an organization offers to its VMs and projects.
|
|
470
|
+
A VM inherits nothing automatically — select the entries it needs on that VM.
|
|
470
471
|
|
|
471
472
|
```bash
|
|
472
473
|
ghostdock env list --org org_123
|
|
@@ -504,42 +505,42 @@ With `--json`, `list`, `get` and `set` print the tool's result instead. These co
|
|
|
504
505
|
`env list`, `env get`, `env set` and
|
|
505
506
|
`env delete` tools, which are also available directly (and over MCP).
|
|
506
507
|
|
|
507
|
-
Names must be valid environment variable names, and names the
|
|
508
|
+
Names must be valid environment variable names, and names the VM runtime owns (`PATH`,
|
|
508
509
|
`HOME`, anything starting with `GHOSTDOCK_`, …) are rejected. Prefix a name with `VITE_`
|
|
509
510
|
only when browser code must read it: Vite inlines those into the published bundle, so a `VITE_`
|
|
510
511
|
secret is public.
|
|
511
512
|
|
|
512
513
|
### `ghostdock network`
|
|
513
514
|
|
|
514
|
-
Reach your organizations'
|
|
515
|
+
Reach your organizations' VMs from this machine by private address and name, over
|
|
515
516
|
WireGuard ([ADR 0027](../../docs/adr/0027-private-sandbox-network.md)). Everything on a
|
|
516
|
-
|
|
517
|
-
`http://quiet-harbor.acme.ghostdock.internal/`, as it would on `localhost` inside the
|
|
518
|
-
Nothing reaches your machine from a
|
|
517
|
+
VM's address is reachable: a container that publishes port 80 answers on
|
|
518
|
+
`http://quiet-harbor.acme.ghostdock.internal/`, as it would on `localhost` inside the VM.
|
|
519
|
+
Nothing reaches your machine from a VM.
|
|
519
520
|
|
|
520
521
|
```bash
|
|
521
522
|
ghostdock network connect # your organization's default provider; sudo once
|
|
522
523
|
ghostdock network connect helsinki # or name a provider (name or id)
|
|
523
|
-
ghostdock network ls --org acme #
|
|
524
|
+
ghostdock network ls --org acme # VMs, addresses, names, and what is reachable
|
|
524
525
|
curl http://quiet-harbor.acme.ghostdock.internal:8080/
|
|
525
526
|
open https://quiet-harbor--acme.ghostdock.net:8080/ # in a browser: HTTPS, any port
|
|
526
527
|
open https://quiet-harbor.ghostdock.net:8080/ # the short name, for the connect organization
|
|
527
|
-
ghostdock network connect --org beta # short names now mean beta's
|
|
528
|
+
ghostdock network connect --org beta # short names now mean beta's VMs
|
|
528
529
|
ghostdock network status
|
|
529
530
|
ghostdock network disconnect
|
|
530
531
|
```
|
|
531
532
|
|
|
532
|
-
- **One provider at a time.** Each
|
|
533
|
-
only the
|
|
534
|
-
the organization (`--org`, `GHOSTDOCK_ORG`, the default from `
|
|
535
|
-
default
|
|
533
|
+
- **One provider at a time.** Each provider is its own gateway, and a device reaches
|
|
534
|
+
only the VMs on the provider it connected through. Without an argument, `connect` takes
|
|
535
|
+
the organization (`--org`, `GHOSTDOCK_ORG`, the default from `organization use`) and its
|
|
536
|
+
default provider, else the platform default. Connecting through another provider
|
|
536
537
|
replaces the connection: same interface and address, new gateway. `network status` says which
|
|
537
|
-
provider you are connected through; `network ls` marks
|
|
538
|
+
provider you are connected through; `network ls` marks VMs elsewhere as
|
|
538
539
|
`not reachable: on <provider>` with the `connect` command that reaches them. A provider
|
|
539
540
|
without a private network (Incus, for now) is refused by the server; one your organization
|
|
540
541
|
may not use answers 403.
|
|
541
542
|
- **Needs `wg-quick`** (`brew install wireguard-tools`, `apt install wireguard-tools`). macOS
|
|
542
|
-
and Linux. On Windows, run the CLI in WSL: then only tools inside WSL reach
|
|
543
|
+
and Linux. On Windows, run the CLI in WSL: then only tools inside WSL reach VMs.
|
|
543
544
|
- **Tunnel MTU 1280**, so the tunnel works on networks with a smaller path than 1500 bytes
|
|
544
545
|
(DS-Lite, VPNs, mobile). A config written before 2026-10-20 has 1420: `network status` and
|
|
545
546
|
`network ls` then say *This machine's tunnel has MTU 1420, the network now uses 1280*. Run
|
|
@@ -547,32 +548,32 @@ ghostdock network disconnect
|
|
|
547
548
|
- **One key per machine**, kept in `~/.config/ghostdock/network/`.
|
|
548
549
|
Only the public key is sent. The device belongs to the login it was connected with:
|
|
549
550
|
`ghostdock logout` takes it out of the network, and so does not connecting for 90 days.
|
|
550
|
-
- **Names**: `<
|
|
551
|
+
- **Names**: `<vm>.<org>.ghostdock.internal`, for every organization you are a member
|
|
551
552
|
of. A name always says its organization, so a browser origin never changes hands between
|
|
552
|
-
organizations. Only AAAA records exist: the network is IPv6, and the
|
|
553
|
-
- **In a browser**, use the HTTPS name `https://<
|
|
553
|
+
organizations. Only AAAA records exist: the network is IPv6, and the VM sees IPv4.
|
|
554
|
+
- **In a browser**, use the HTTPS name `https://<vm>--<org>.ghostdock.net:<port>`
|
|
554
555
|
(`network ls` shows it): any port, a real certificate, so the page is a secure context
|
|
555
556
|
(clipboard, `Secure` cookies, service workers). The host's `gdo-ingress` terminates TLS and
|
|
556
|
-
forwards to the
|
|
557
|
+
forwards to the VM's port; it serves only devices of the VM's organization, and
|
|
557
558
|
refuses background requests (fetch, forms, iframes, websockets) from pages outside that
|
|
558
559
|
organization; pages on another HTTPS name of the same organization, any port, may call it. The
|
|
559
|
-
|
|
560
|
+
VM sees the request from `198.18.0.0`, and your device's address in
|
|
560
561
|
`X-Forwarded-For`. The desktop image's Desktop opens only this way, never on the raw
|
|
561
562
|
address.
|
|
562
|
-
- **Short names** in a browser: `https://<
|
|
563
|
+
- **Short names** in a browser: `https://<vm>.ghostdock.net:<port>` means the VM of
|
|
563
564
|
this machine's organization: the one `network connect` resolved (`--org`, `GHOSTDOCK_ORG`,
|
|
564
|
-
the default from `
|
|
565
|
-
`network ls` shows a
|
|
565
|
+
the default from `organization use`). `connect` says which; `network status` too, and
|
|
566
|
+
`network ls` shows a VM's short name next to its full one when it is that
|
|
566
567
|
organization's. With one organization you need nothing else. To use another organization's
|
|
567
568
|
short names, connect again with `--org <other>`: there is no other way to change it, so a
|
|
568
569
|
short name never changes meaning behind your back (`cd` into another project does not
|
|
569
|
-
change it). Full names (`<
|
|
570
|
+
change it). Full names (`<vm>--<org>`) keep working for every organization and never
|
|
570
571
|
change meaning: use them in scripts, CI, `.env` files and links you share.
|
|
571
572
|
- **When the organization changes,** each short-name site clears its browser data once
|
|
572
|
-
(local storage, cache, cookies) before the other organization's
|
|
573
|
+
(local storage, cache, cookies) before the other organization's VM sees a request, so
|
|
573
574
|
it never reads the first one's data. Cookies are cleared for the whole site, not only the
|
|
574
575
|
short name: every site under the net domain's registrable domain (`ghostdock.net`: every
|
|
575
|
-
|
|
576
|
+
VM app there, full names included; a net domain under the app's domain, as on staging:
|
|
576
577
|
the Ghostdock app too). `connect` names the site when the organization changes. A tab opened on a short name before the
|
|
577
578
|
change keeps the old page until you reload it: reload or close those tabs (`connect` says
|
|
578
579
|
so). The page *Switching organization* is that clearing and reloads by itself; *Clear this
|
|
@@ -586,17 +587,17 @@ ghostdock network disconnect
|
|
|
586
587
|
`308` to `https://quiet-harbor--acme.ghostdock.net:3000/app`. Any other browser request on
|
|
587
588
|
the raw address (`fetch`, images, scripts, forms, websockets) gets `403` with
|
|
588
589
|
`X-Ghostdock-Blocked: browser-https-only` and the HTTPS address in the body. This keeps
|
|
589
|
-
websites you visit while connected from using your connection against your
|
|
590
|
+
websites you visit while connected from using your connection against your VMs,
|
|
590
591
|
including through DNS rebinding.
|
|
591
592
|
- **What counts as a browser:** a `User-Agent` that starts with `Mozilla/`, which every
|
|
592
593
|
browser sends on its own requests. Browsers send no `Sec-Fetch-*` headers over plain
|
|
593
594
|
`http://` to an address like this, so those cannot be the signal. (Firefox lets a page
|
|
594
595
|
set its own `User-Agent` on a `fetch`; the `Host` check below stops that one.) Tools that send a
|
|
595
596
|
browser's `User-Agent` (Playwright, Puppeteer, their request APIs) count as browsers too:
|
|
596
|
-
point them at the HTTPS name. A frontend outside the
|
|
597
|
-
calls the
|
|
597
|
+
point them at the HTTPS name. A frontend outside the VM (a dev server on your laptop)
|
|
598
|
+
calls the VM's API by its HTTPS name as well.
|
|
598
599
|
- **Tools** (`curl`, SDKs, test runners, Prometheus) pass untouched, and every other
|
|
599
|
-
protocol does too, as long as they address the
|
|
600
|
+
protocol does too, as long as they address the VM by its IP address, its
|
|
600
601
|
`.internal` name (or a container's, `web.quiet-harbor.acme.ghostdock.internal`), or
|
|
601
602
|
`localhost`: any other `Host` gets `421` (`X-Ghostdock-Blocked: host-not-allowed`). That
|
|
602
603
|
check is what stops DNS rebinding for a page that sets its own `User-Agent`. A name of
|
|
@@ -604,17 +605,17 @@ ghostdock network disconnect
|
|
|
604
605
|
- **One difference for tools:** a port where nothing listens accepts the connection and
|
|
605
606
|
then resets it, so port checks such as `nc -z` report it open; check with a real request
|
|
606
607
|
instead.
|
|
607
|
-
- **In the
|
|
608
|
+
- **In the VM,** firewall rules for these clients belong in the input path
|
|
608
609
|
(`iptables -A INPUT`, an nft `hook input` chain): `FORWARD` and `DOCKER-USER` rules no
|
|
609
610
|
longer see them, because the guard connects to a published container port from inside
|
|
610
611
|
the VM.
|
|
611
612
|
- **The network pause** ([ADR 0033](../../docs/adr/0033-gdo-net-dead-mans-switch.md)): a
|
|
612
|
-
device that sent no traffic to a
|
|
613
|
+
device that sent no traffic to a VM for its idle timeout (default 4 h), or whose session
|
|
613
614
|
since the last connect reached its maximum (default 12 h), is paused at the gateway. Your
|
|
614
615
|
organizations set both (Settings → Security). If you are in several, the strictest value
|
|
615
616
|
applies. `connect` ends with this device's own numbers and names the organization that set a
|
|
616
617
|
stricter one.
|
|
617
|
-
- **While paused**, names still resolve, but every port of a
|
|
618
|
+
- **While paused**, names still resolve, but every port of a VM answers `Connection
|
|
618
619
|
refused`, and UDP and ping get *administratively prohibited*. Browsers get a pause page
|
|
619
620
|
with a *Reconnect* button, and Docker gets `Ghostdock: network access for this device is
|
|
620
621
|
paused (idle 4 h)`. Every `ghostdock` command prints `! Network access for this device is
|
|
@@ -635,7 +636,7 @@ ghostdock network disconnect
|
|
|
635
636
|
|
|
636
637
|
### `ghostdock docker context`
|
|
637
638
|
|
|
638
|
-
Point your own `docker` and `docker compose` at a
|
|
639
|
+
Point your own `docker` and `docker compose` at a VM's Docker engine, over the private
|
|
639
640
|
network with mutual TLS ([ADR 0032](../../docs/adr/0032-docker-api-over-gdo-net.md)). Connect
|
|
640
641
|
first: the context uses this machine's device.
|
|
641
642
|
|
|
@@ -651,8 +652,8 @@ docker compose up -d
|
|
|
651
652
|
ghostdock docker context north-pier --no-use # create only: docker --context ghostdock-acme-north-pier ps
|
|
652
653
|
```
|
|
653
654
|
|
|
654
|
-
- **One Docker context per
|
|
655
|
-
`tcp://<
|
|
655
|
+
- **One Docker context per VM**, `ghostdock-<org>-<vm>`, for
|
|
656
|
+
`tcp://<vm>.<org>.ghostdock.internal:2376`. Running the command again updates it;
|
|
656
657
|
without `--no-use` it also becomes Docker's current context (`docker context use`). A
|
|
657
658
|
`DOCKER_HOST` or `DOCKER_CONTEXT` in your shell wins over that: the command says so.
|
|
658
659
|
- **One client certificate per organization and machine**, in
|
|
@@ -663,25 +664,25 @@ ghostdock docker context north-pier --no-use # create only: docker --context g
|
|
|
663
664
|
- **Renewal:** `ghostdock network connect` and `ghostdock docker context` renew every
|
|
664
665
|
certificate of this machine with less than 10 days left, and update the contexts they wrote
|
|
665
666
|
(`~/.config/ghostdock/docker/contexts.json`). An expired certificate fails Docker's TLS
|
|
666
|
-
handshake with Docker's own error: run `ghostdock docker context <
|
|
667
|
+
handshake with Docker's own error: run `ghostdock docker context <vm>` again.
|
|
667
668
|
- **`no such host`** on a `ghostdock.internal` address means this machine is not connected:
|
|
668
669
|
run `ghostdock network connect`. The context's description in `docker context ls` says so
|
|
669
670
|
too.
|
|
670
671
|
- **Renamed organization:** the context's host keeps the old name, which stops resolving. Run
|
|
671
|
-
`ghostdock docker context <
|
|
672
|
-
- **Only from this device:** the
|
|
672
|
+
`ghostdock docker context <vm>` again to update the host.
|
|
673
|
+
- **Only from this device:** the VM checks every request with the app (membership, device,
|
|
673
674
|
the network pause). A copied key and certificate do not work from another machine; a refusal
|
|
674
675
|
comes back as Docker's `Error response from daemon: Ghostdock: …` with what to run.
|
|
675
|
-
- **Warnings:** a
|
|
676
|
-
`network connect` command that reaches it), and a
|
|
677
|
-
Docker over the network (restart it to update). A
|
|
676
|
+
- **Warnings:** a VM on another provider than this machine's connection (with the
|
|
677
|
+
`network connect` command that reaches it), and a VM whose base image is too old for
|
|
678
|
+
Docker over the network (restart it to update). A VM that cannot have a Docker engine
|
|
678
679
|
over the network (its provider has no private network, it has no address there yet, or a
|
|
679
680
|
name that is not a DNS label) gets no context, and the command says why.
|
|
680
|
-
- **A stopped
|
|
681
|
+
- **A stopped VM** gets its context too: the first connection to it starts it (wake on
|
|
681
682
|
SYN), and its Docker engine answers once it runs. A start that takes longer than Docker's
|
|
682
683
|
32 s dial timeout fails that one command with Docker's `i/o timeout`; the next one works.
|
|
683
684
|
- **Needs Docker's CLI** (`docker` on `PATH`: Docker Desktop, OrbStack, or the CLI alone). The
|
|
684
|
-
Docker engine itself runs in the
|
|
685
|
+
Docker engine itself runs in the VM.
|
|
685
686
|
|
|
686
687
|
## Command index
|
|
687
688
|
|
|
@@ -689,17 +690,17 @@ Every command with its arguments and what it does. Run `ghostdock <command> --he
|
|
|
689
690
|
or read [`cli-reference.md`](cli-reference.md) for every command's full description and flags.
|
|
690
691
|
|
|
691
692
|
<!-- generated:command-index:start (bun run sync:cli-reference; do not edit) -->
|
|
692
|
-
####
|
|
693
|
+
#### app
|
|
693
694
|
|
|
694
695
|
| Command | What it does |
|
|
695
696
|
| --- | --- |
|
|
696
|
-
| `ghostdock
|
|
697
|
+
| `ghostdock app list [flags]` | List the live published apps (sites) of an organization, with their URLs. |
|
|
697
698
|
|
|
698
699
|
#### docker
|
|
699
700
|
|
|
700
701
|
| Command | What it does |
|
|
701
702
|
| --- | --- |
|
|
702
|
-
| `ghostdock docker context <
|
|
703
|
+
| `ghostdock docker context <vm> [flags]` | Point Docker at a VM's Docker engine over the private network: plain `docker`… |
|
|
703
704
|
|
|
704
705
|
#### env
|
|
705
706
|
|
|
@@ -710,18 +711,18 @@ or read [`cli-reference.md`](cli-reference.md) for every command's full descript
|
|
|
710
711
|
| `ghostdock env list [flags]` | List variables and secrets. |
|
|
711
712
|
| `ghostdock env set <name> [flags]` | Create or replace a variable or secret. |
|
|
712
713
|
|
|
713
|
-
####
|
|
714
|
+
#### image
|
|
714
715
|
|
|
715
716
|
| Command | What it does |
|
|
716
717
|
| --- | --- |
|
|
717
|
-
| `ghostdock
|
|
718
|
-
| `ghostdock
|
|
719
|
-
| `ghostdock
|
|
720
|
-
| `ghostdock
|
|
721
|
-
| `ghostdock
|
|
722
|
-
| `ghostdock
|
|
723
|
-
| `ghostdock
|
|
724
|
-
| `ghostdock
|
|
718
|
+
| `ghostdock image add --ref <string> [flags]` | Bookmark an OCI image ref in the organization’s image catalog. |
|
|
719
|
+
| `ghostdock image add-compose --name <string> [flags]` | Add a Compose project to the organization’s image catalog. |
|
|
720
|
+
| `ghostdock image add-dockerfile --name <string> --dockerfile <string> [flags]` | Add a Dockerfile to the organization’s image catalog. |
|
|
721
|
+
| `ghostdock image get <image-id> [flags]` | Get one catalog image with its spec, manifest and requirements. |
|
|
722
|
+
| `ghostdock image list [flags]` | List the images an organization can boot VMs from. |
|
|
723
|
+
| `ghostdock image remove <image-id> [flags]` | Remove an image from the organization’s catalog. |
|
|
724
|
+
| `ghostdock image update-compose <image-id> [flags]` | Replace a catalog Compose image’s files, reference, override and/or name. |
|
|
725
|
+
| `ghostdock image update-dockerfile <image-id> --dockerfile <string> [flags]` | Replace a catalog Dockerfile, optionally renaming it. |
|
|
725
726
|
|
|
726
727
|
#### login
|
|
727
728
|
|
|
@@ -743,44 +744,44 @@ or read [`cli-reference.md`](cli-reference.md) for every command's full descript
|
|
|
743
744
|
| `ghostdock network devices <command>` | Your devices in the private network. |
|
|
744
745
|
| `ghostdock network devices remove <id>` | Remove one of your devices from the private network. |
|
|
745
746
|
| `ghostdock network disconnect` | Take this machine out of the private network, and remove split DNS an earlier… |
|
|
746
|
-
| `ghostdock network ls [flags]` |
|
|
747
|
+
| `ghostdock network ls [flags]` | VMs of an organization with their private addresses and names, and which are… |
|
|
747
748
|
| `ghostdock network status` | Whether this machine is connected, through which provider, and as which device. |
|
|
748
749
|
|
|
749
|
-
####
|
|
750
|
+
#### organization
|
|
750
751
|
|
|
751
752
|
| Command | What it does |
|
|
752
753
|
| --- | --- |
|
|
753
|
-
| `ghostdock
|
|
754
|
-
| `ghostdock
|
|
755
|
-
| `ghostdock
|
|
754
|
+
| `ghostdock organization current [flags]` | Show which organization commands use, and where it comes from. |
|
|
755
|
+
| `ghostdock organization list` | List the organizations you belong to, with their ids and slugs. |
|
|
756
|
+
| `ghostdock organization use [org] [flags]` | Set the default organization for commands run without --org (in every… |
|
|
756
757
|
|
|
757
|
-
####
|
|
758
|
+
#### project
|
|
758
759
|
|
|
759
760
|
| Command | What it does |
|
|
760
761
|
| --- | --- |
|
|
761
|
-
| `ghostdock
|
|
762
|
-
| `ghostdock
|
|
763
|
-
| `ghostdock
|
|
764
|
-
| `ghostdock
|
|
765
|
-
| `ghostdock
|
|
766
|
-
| `ghostdock
|
|
767
|
-
| `ghostdock
|
|
768
|
-
| `ghostdock
|
|
769
|
-
| `ghostdock
|
|
770
|
-
| `ghostdock
|
|
771
|
-
| `ghostdock
|
|
772
|
-
| `ghostdock
|
|
773
|
-
|
|
774
|
-
####
|
|
762
|
+
| `ghostdock project create --display-name <string> [flags]` | Create an empty project. |
|
|
763
|
+
| `ghostdock project deployment get <deployment-id> --project-id <string> [flags]` | Get one deploy attempt, with links to its stored files. |
|
|
764
|
+
| `ghostdock project deployment list <project-id> [flags]` | List a project’s deploy attempts, newest first. |
|
|
765
|
+
| `ghostdock project env delete <name> --project-id <string> [flags]` | Delete one of a project’s own variables or secrets. |
|
|
766
|
+
| `ghostdock project env get <project-id> [flags]` | Get a project’s stored environment. |
|
|
767
|
+
| `ghostdock project env select <project-id> --environment <array> [flags]` | Replace the organization entries a project exports. |
|
|
768
|
+
| `ghostdock project env set <name> --project-id <string> --value <string> --kind <string> [flags]` | Create or replace one of a project’s own variables or secrets. |
|
|
769
|
+
| `ghostdock project get <project-id> [flags]` | Get a project with its latest attempt and live deployment. |
|
|
770
|
+
| `ghostdock project list [flags]` | List an organization’s projects. |
|
|
771
|
+
| `ghostdock project publish [path] [flags]` | Inspect local source with the deploy agent and publish to the CDN or a VM. |
|
|
772
|
+
| `ghostdock project redeploy <project-id> [flags]` | Deploy a project’s stored source again, with its current environment. |
|
|
773
|
+
| `ghostdock project update <project-id> --display-name <string> [flags]` | Rename a project. |
|
|
774
|
+
|
|
775
|
+
#### provider
|
|
775
776
|
|
|
776
777
|
| Command | What it does |
|
|
777
778
|
| --- | --- |
|
|
778
|
-
| `ghostdock
|
|
779
|
-
| `ghostdock
|
|
780
|
-
| `ghostdock
|
|
781
|
-
| `ghostdock
|
|
782
|
-
| `ghostdock
|
|
783
|
-
| `ghostdock
|
|
779
|
+
| `ghostdock provider disconnect <provider> [flags]` | Disconnect one of the organization’s own providers. |
|
|
780
|
+
| `ghostdock provider list [flags]` | List the providers an organization can create VMs on. |
|
|
781
|
+
| `ghostdock provider rename <provider> --name <string> [flags]` | Rename one of the organization’s own providers. |
|
|
782
|
+
| `ghostdock provider set-default <provider> [flags]` | Set the provider used when a create omits provider. |
|
|
783
|
+
| `ghostdock provider start-incus [flags]` | Start connecting an Incus host as a provider. |
|
|
784
|
+
| `ghostdock provider verify-incus <provider> [flags]` | Check or finish connecting an Incus host. |
|
|
784
785
|
|
|
785
786
|
#### registry
|
|
786
787
|
|
|
@@ -789,79 +790,38 @@ or read [`cli-reference.md`](cli-reference.md) for every command's full descript
|
|
|
789
790
|
| `ghostdock registry credentials [flags]` | Print registry host, username, and the one-hour password. |
|
|
790
791
|
| `ghostdock registry login [flags]` | Fetch a one-hour password and run docker login --password-stdin. |
|
|
791
792
|
|
|
792
|
-
####
|
|
793
|
+
#### site
|
|
793
794
|
|
|
794
795
|
| Command | What it does |
|
|
795
796
|
| --- | --- |
|
|
796
|
-
| `ghostdock
|
|
797
|
-
| `ghostdock
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
| `ghostdock sandboxes commands run <sandbox-id> --command <string> [flags]` | Run a shell command in a sandbox. |
|
|
801
|
-
| `ghostdock sandboxes containers list <sandbox-id> [flags]` | List the containers of a sandbox, running or not. |
|
|
802
|
-
| `ghostdock sandboxes containers lock <sandbox-id> <container> [flags]` | Lock a container against removal. |
|
|
803
|
-
| `ghostdock sandboxes containers logs <sandbox-id> <container> [flags]` | Read a container’s output, as docker logs does. |
|
|
804
|
-
| `ghostdock sandboxes containers restart <sandbox-id> <container> [flags]` | Restart a container, as docker restart does (stopping as docker stop does). |
|
|
805
|
-
| `ghostdock sandboxes containers start <sandbox-id> <container> [flags]` | Start a stopped container, as docker start does. |
|
|
806
|
-
| `ghostdock sandboxes containers stop <sandbox-id> <container> [flags]` | Stop a container, as docker stop does. |
|
|
807
|
-
| `ghostdock sandboxes containers unlock <sandbox-id> <container> [flags]` | Unlock a container so Docker can remove or recreate it. |
|
|
808
|
-
| `ghostdock sandboxes create --source <object> [flags]` | Create a sandbox from a snapshot, OCI image, Dockerfile or Compose files. |
|
|
809
|
-
| `ghostdock sandboxes default-container <sandbox-id> [flags]` | Show, set or clear the sandbox’s default container. |
|
|
810
|
-
| `ghostdock sandboxes delete <sandbox-id> [flags]` | Permanently delete a sandbox and its files. |
|
|
811
|
-
| `ghostdock sandboxes env delete <name> --sandbox-id <string> [flags]` | Delete one of a sandbox’s own variables or secrets. |
|
|
812
|
-
| `ghostdock sandboxes env get <sandbox-id> [flags]` | Get a sandbox’s environment: selections, bindings and local entries. |
|
|
813
|
-
| `ghostdock sandboxes env select <sandbox-id> --environment <array> [flags]` | Replace the organization entries a sandbox exports. |
|
|
814
|
-
| `ghostdock sandboxes env set <name> --sandbox-id <string> --value <string> [flags]` | Create or replace one of a sandbox’s own variables or secrets. |
|
|
815
|
-
| `ghostdock sandboxes files list <sandbox-id> [flags]` | List the files in a sandbox directory. |
|
|
816
|
-
| `ghostdock sandboxes files read <path> --sandbox-id <string> [flags]` | Read a file from a sandbox: utf8 text, or base64 for small binaries. |
|
|
817
|
-
| `ghostdock sandboxes files upload <sandbox-id> [path] [flags]` | Upload local files or directories to a sandbox's container, into its start… |
|
|
818
|
-
| `ghostdock sandboxes list [flags]` | List the sandboxes of an organization, with their lifecycle and deadlines. |
|
|
819
|
-
| `ghostdock sandboxes mcps create <sandbox-id> --name <string> --port <integer> [flags]` | Expose an MCP server running in a sandbox. |
|
|
820
|
-
| `ghostdock sandboxes mcps delete <mcp-id>` | Delete an MCP endpoint of a sandbox. |
|
|
821
|
-
| `ghostdock sandboxes mcps list <sandbox-id> [flags]` | List the MCP endpoints a sandbox exposes (name, port, path, autoWake). |
|
|
822
|
-
| `ghostdock sandboxes mcps update <mcp-id> [flags]` | Change an MCP endpoint’s name, port, path or autoWake setting. |
|
|
823
|
-
| `ghostdock sandboxes resize <sandbox-id> [flags]` | Change a sandbox’s CPU and/or memory. |
|
|
824
|
-
| `ghostdock sandboxes resize-disk <sandbox-id> --disk-gib <number> [flags]` | Grow a sandbox’s disk. |
|
|
825
|
-
| `ghostdock sandboxes shells close <session-id> --sandbox-id <string> [flags]` | Close a shell session. |
|
|
826
|
-
| `ghostdock sandboxes shells create <sandbox-id> [flags]` | Open a shell session that keeps cwd and environment between commands. |
|
|
827
|
-
| `ghostdock sandboxes ssh get <sandbox-id> [flags]` | Get temporary SSH access to a sandbox (command and token, 60 minutes). |
|
|
828
|
-
| `ghostdock sandboxes ssh revoke <sandbox-id> [flags]` | Revoke a sandbox’s active SSH access. |
|
|
829
|
-
| `ghostdock sandboxes status <sandbox-id> [flags]` | Get a sandbox’s status and lifecycle deadlines without waking it. |
|
|
830
|
-
| `ghostdock sandboxes stop <sandbox-id> [flags]` | Stop a running sandbox without deleting its files. |
|
|
831
|
-
| `ghostdock sandboxes storage delete <sandbox-id> --kind <string> --name <string> [flags]` | Delete a named volume or a top-level sandbox folder, with everything in it. |
|
|
832
|
-
| `ghostdock sandboxes storage list <sandbox-id> [flags]` | List a sandbox’s volumes and sandbox folders. |
|
|
833
|
-
| `ghostdock sandboxes tools call <name> --sandbox-id <string> --arguments <object> [flags]` | Call a tool on an MCP server inside a sandbox. |
|
|
834
|
-
| `ghostdock sandboxes tools list <sandbox-id> [flags]` | List the tools of the MCP servers a sandbox exposes. |
|
|
835
|
-
| `ghostdock sandboxes update <sandbox-id> [flags]` | Change a sandbox’s display name, idle-stop interval or lifecycle. |
|
|
836
|
-
| `ghostdock sandboxes urls create <sandbox-id> --port <integer> [flags]` | Expose a sandbox port as a URL. |
|
|
837
|
-
| `ghostdock sandboxes urls delete <url-id>` | Delete a sandbox URL. |
|
|
838
|
-
| `ghostdock sandboxes urls list <sandbox-id> [flags]` | List the URLs that expose a sandbox’s ports, with protocol, access and title. |
|
|
839
|
-
| `ghostdock sandboxes urls update <url-id> [flags]` | Change a sandbox URL’s port, protocol, autoWake, public setting or title. |
|
|
840
|
-
| `ghostdock sandboxes wake <sandbox-id> [flags]` | Start a stopped sandbox, or reset the idle-stop countdown of a running one. |
|
|
841
|
-
|
|
842
|
-
#### sites
|
|
797
|
+
| `ghostdock site publish [path] [flags]` | Publish a local directory or ZIP to the CDN. |
|
|
798
|
+
| `ghostdock site unpublish <site-id> [flags]` | Take a published static site offline. |
|
|
799
|
+
|
|
800
|
+
#### skill
|
|
843
801
|
|
|
844
802
|
| Command | What it does |
|
|
845
803
|
| --- | --- |
|
|
846
|
-
| `ghostdock
|
|
847
|
-
| `ghostdock
|
|
804
|
+
| `ghostdock skill get <uri>` | Print one SKILL.md (URI from the discovery index, or a skill name). |
|
|
805
|
+
| `ghostdock skill list` | List the Agent Skills discovery index. |
|
|
848
806
|
|
|
849
|
-
####
|
|
807
|
+
#### snapshot
|
|
850
808
|
|
|
851
809
|
| Command | What it does |
|
|
852
810
|
| --- | --- |
|
|
853
|
-
| `ghostdock
|
|
854
|
-
| `ghostdock
|
|
811
|
+
| `ghostdock snapshot create <vm> --name <string> [flags]` | Save a VM’s filesystem as a reusable organization snapshot. |
|
|
812
|
+
| `ghostdock snapshot delete <snapshot-id> [flags]` | Permanently delete an organization snapshot (provider artifact and record). |
|
|
813
|
+
| `ghostdock snapshot get <snapshot-id> [flags]` | Get one snapshot with its manifest and required environment, URLs and MCPs. |
|
|
814
|
+
| `ghostdock snapshot list [flags]` | List the snapshots an organization can boot VMs from. |
|
|
815
|
+
| `ghostdock snapshot update-manifest <snapshot-id> --manifest <object> [flags]` | Replace a snapshot’s manifest (URLs, environment, MCPs). |
|
|
855
816
|
|
|
856
|
-
####
|
|
817
|
+
#### template
|
|
857
818
|
|
|
858
819
|
| Command | What it does |
|
|
859
820
|
| --- | --- |
|
|
860
|
-
| `ghostdock
|
|
861
|
-
| `ghostdock
|
|
862
|
-
| `ghostdock
|
|
863
|
-
| `ghostdock
|
|
864
|
-
| `ghostdock snapshots update-manifest <snapshot-id> --manifest <object> [flags]` | Replace a snapshot’s manifest (URLs, environment, MCPs). |
|
|
821
|
+
| `ghostdock template create --name <string> --title <string> --spec <object> [flags]` | Save a VM create request as a template of the organization. |
|
|
822
|
+
| `ghostdock template delete <template> [flags]` | Delete a template of the organization by its name. |
|
|
823
|
+
| `ghostdock template list [flags]` | List the templates to create a VM from (headless, desktop, nginx, …). |
|
|
824
|
+
| `ghostdock template update <template> [flags]` | Change a template of the organization by its name. |
|
|
865
825
|
|
|
866
826
|
#### tools
|
|
867
827
|
|
|
@@ -869,6 +829,57 @@ or read [`cli-reference.md`](cli-reference.md) for every command's full descript
|
|
|
869
829
|
| --- | --- |
|
|
870
830
|
| `ghostdock tools` | List available agent tools. |
|
|
871
831
|
|
|
832
|
+
#### vm
|
|
833
|
+
|
|
834
|
+
| Command | What it does |
|
|
835
|
+
| --- | --- |
|
|
836
|
+
| `ghostdock vm build [path] --kind <value> [flags]` | Create a VM from a local Dockerfile or Compose directory. |
|
|
837
|
+
| `ghostdock vm command get <command-id> --vm <string> --session-id <string> [flags]` | Get a shell command’s status and exit code. |
|
|
838
|
+
| `ghostdock vm command kill <command-id> --vm <string> --session-id <string> [flags]` | Interrupt a running shell command. |
|
|
839
|
+
| `ghostdock vm command logs <command-id> --vm <string> --session-id <string> [flags]` | Get a page of a shell command’s stdout and stderr. |
|
|
840
|
+
| `ghostdock vm command run <vm> --command <string> [flags]` | Run a shell command in a VM. |
|
|
841
|
+
| `ghostdock vm container list <vm> [flags]` | List the containers of a VM, running or not. |
|
|
842
|
+
| `ghostdock vm container lock <vm> <container> [flags]` | Lock a container against removal. |
|
|
843
|
+
| `ghostdock vm container logs <vm> <container> [flags]` | Read a container’s output, as docker logs does. |
|
|
844
|
+
| `ghostdock vm container restart <vm> <container> [flags]` | Restart a container, as docker restart does (stopping as docker stop does). |
|
|
845
|
+
| `ghostdock vm container start <vm> <container> [flags]` | Start a stopped container, as docker start does. |
|
|
846
|
+
| `ghostdock vm container stop <vm> <container> [flags]` | Stop a container, as docker stop does. |
|
|
847
|
+
| `ghostdock vm container unlock <vm> <container> [flags]` | Unlock a container so Docker can remove or recreate it. |
|
|
848
|
+
| `ghostdock vm create --source <object> [flags]` | Create a VM from a snapshot, OCI image, Dockerfile or Compose files. |
|
|
849
|
+
| `ghostdock vm default-container <vm> [flags]` | Show, set or clear the VM’s default container. |
|
|
850
|
+
| `ghostdock vm delete <vm> [flags]` | Permanently delete a VM and its files. |
|
|
851
|
+
| `ghostdock vm env delete <name> --vm <string> [flags]` | Delete one of a VM’s own variables or secrets. |
|
|
852
|
+
| `ghostdock vm env get <vm> [flags]` | Get a VM’s environment: selections, bindings and local entries. |
|
|
853
|
+
| `ghostdock vm env select <vm> --environment <array> [flags]` | Replace the organization entries a VM exports. |
|
|
854
|
+
| `ghostdock vm env set <name> --vm <string> --value <string> [flags]` | Create or replace one of a VM’s own variables or secrets. |
|
|
855
|
+
| `ghostdock vm file list <vm> [flags]` | List the files in a VM directory. |
|
|
856
|
+
| `ghostdock vm file read <path> --vm <string> [flags]` | Read a file from a VM: utf8 text, or base64 for small binaries. |
|
|
857
|
+
| `ghostdock vm file upload <vm> [path] [flags]` | Upload local files or directories to a VM's container, into its start folder… |
|
|
858
|
+
| `ghostdock vm list [flags]` | List the VMs of an organization, with their lifecycle and deadlines. |
|
|
859
|
+
| `ghostdock vm mcp create <vm> --name <string> --port <integer> [flags]` | Expose an MCP server running in a VM. |
|
|
860
|
+
| `ghostdock vm mcp delete <mcp-id>` | Delete an MCP endpoint of a VM. |
|
|
861
|
+
| `ghostdock vm mcp list <vm> [flags]` | List the MCP endpoints a VM exposes (name, port, path, autoWake). |
|
|
862
|
+
| `ghostdock vm mcp update <mcp-id> [flags]` | Change an MCP endpoint’s name, port, path or autoWake setting. |
|
|
863
|
+
| `ghostdock vm resize <vm> [flags]` | Change a VM’s CPU and/or memory. |
|
|
864
|
+
| `ghostdock vm resize-disk <vm> --disk-gib <number> [flags]` | Grow a VM’s disk. |
|
|
865
|
+
| `ghostdock vm shell close <session-id> --vm <string> [flags]` | Close a shell session. |
|
|
866
|
+
| `ghostdock vm shell create <vm> [flags]` | Open a shell session that keeps cwd and environment between commands. |
|
|
867
|
+
| `ghostdock vm ssh get <vm> [flags]` | Get temporary SSH access to a VM (command and token, 60 minutes). |
|
|
868
|
+
| `ghostdock vm ssh revoke <vm> [flags]` | Revoke a VM’s active SSH access. |
|
|
869
|
+
| `ghostdock vm status <vm> [flags]` | Get a VM’s status and lifecycle deadlines without waking it. |
|
|
870
|
+
| `ghostdock vm stop <vm> [flags]` | Stop a running VM without deleting its files. |
|
|
871
|
+
| `ghostdock vm storage delete <vm> --kind <string> --name <string> [flags]` | Delete a named volume or a top-level VM folder, with everything in it. |
|
|
872
|
+
| `ghostdock vm storage list <vm> [flags]` | List a VM’s volumes and VM folders. |
|
|
873
|
+
| `ghostdock vm tool call <name> --vm <string> --arguments <object> [flags]` | Call a tool on an MCP server inside a VM. |
|
|
874
|
+
| `ghostdock vm tool list <vm> [flags]` | List the tools of the MCP servers a VM exposes. |
|
|
875
|
+
| `ghostdock vm up <template> [flags]` | Create a VM from a template by its name: `ghostdock vm up nginx`. |
|
|
876
|
+
| `ghostdock vm update <vm> [flags]` | Change a VM’s display name, idle-stop interval or lifecycle. |
|
|
877
|
+
| `ghostdock vm url create <vm> --port <integer> [flags]` | Expose a VM port as a URL. |
|
|
878
|
+
| `ghostdock vm url delete <url-id>` | Delete a VM URL. |
|
|
879
|
+
| `ghostdock vm url list <vm> [flags]` | List the URLs that expose a VM’s ports, with protocol, access and title. |
|
|
880
|
+
| `ghostdock vm url update <url-id> [flags]` | Change a VM URL’s port, protocol, autoWake, public setting or title. |
|
|
881
|
+
| `ghostdock vm wake <vm> [flags]` | Start a stopped VM, or reset the idle-stop countdown of a running one. |
|
|
882
|
+
|
|
872
883
|
#### whoami
|
|
873
884
|
|
|
874
885
|
| Command | What it does |
|
|
@@ -884,7 +895,7 @@ and secrets, see [`ghostdock env`](#ghostdock-env).
|
|
|
884
895
|
| Variable | Purpose | Default |
|
|
885
896
|
| ------------------------------- | ------------------------------------------------------------- | --------------------------------- |
|
|
886
897
|
| `GHOSTDOCK_BASE_URL` | API origin the CLI talks to. Override for local dev / self-hosted instances. | Local/dev builds default to `http://localhost:3000`. npm-published builds default to the production API origin baked at publish time. Override with `--base-url` or this env var. |
|
|
887
|
-
| `GHOSTDOCK_ORG` | Organization (id or slug) for commands run without `--org`. Takes precedence over the default from `
|
|
898
|
+
| `GHOSTDOCK_ORG` | Organization (id or slug) for commands run without `--org`. Takes precedence over the default from `organization use`. | unset |
|
|
888
899
|
| `XDG_CONFIG_HOME` | Base directory for the CLI's per-machine state (`ghostdock/credentials.json`, `ghostdock/settings.json`, `ghostdock/network/`, `ghostdock/docker/`). | `~/.config` (native Windows: `%APPDATA%`) |
|
|
889
900
|
| `GHOSTDOCK_CREDENTIALS_PATH` | Absolute path to the credentials file, overriding the default. `settings.json` (the default organization) sits in the same directory, so each credentials file keeps its own default — handy for a second account. | `~/.config/ghostdock/credentials.json` |
|
|
890
901
|
|