Cherry Servers
Order, inspect, wait for and delete Cherry Servers bare-metal and VPS servers, with their projects, SSH keys and live plan stock. One model type per API resource; a server is ready only when the API reports it deployed and it answers SSH with the expected host keys.
Fixes: the wait-ready and delete workflows did not work in 2026.10.16.1 or 2026.10.16.2 (they read definition inputs that were never set); upgrade to this version before using them. Every delete (server, SSH key, project) is now an action, so deleting one record no longer marks every record of a shared definition as deleted. On bare metal, wait_ready now waits until the API reports the server deployed and active, because the public IP and host keys can change during deploy; read the address from state after wait_ready, never from create. New: project delete (refuses a project that still holds servers); the create workflow takes os_partition_size, spot_market, tags, and vault key names for user data and the marker-check key. Security: pass ssh_private_key and user_data as vault references only; the swamp CLI currently prints literal sensitive arguments, including from --stdin (swamp-club lab 3555). Every method and both workflows were run live end to end on VPS and bare metal; the annually billing cycle was not.
| Argument | Type | Description |
|---|---|---|
| id | number | Server ID. |
| Argument | Type | Description |
|---|---|---|
| host_key_policy | enum | strict: keys must match known_hosts; accept-new: trust on first use, then enforce the recorded keys; insecure: record without enforcing. |
| known_hosts? | string | Expected host keys in known_hosts or ssh-keyscan format; required for strict. |
| port? | number | SSH port. |
| marker_path? | string | Absolute path of a file whose existence marks first-boot setup as finished. |
| ssh_user? | string | User for the marker check. |
| ssh_private_key? | string | Private key for the marker check, loaded into a temporary ssh-agent over stdin. |
| timeout_seconds? | number | Give up after this many seconds. |
| poll_interval_seconds? | number | Seconds between polls. |
| Argument | Type | Description |
|---|---|---|
| id? | number | Server ID; defaults to the recorded server and must match it when both exist. |
| confirm_hostname | string | Must equal the server's hostname; guards against deleting the wrong server. |
Resources
| Argument | Type | Description |
|---|---|---|
| id | number | Project ID. |
| Argument | Type | Description |
|---|---|---|
| id? | number | Project ID; defaults to the recorded project and must match it when both exist. |
| confirm_name | string | Must equal the project's name. |
Resources
| Argument | Type | Description |
|---|---|---|
| id? | number | SSH key ID; defaults to the recorded key and must match it when both exist. |
| confirm_label | string | Must equal the key's label. |
Resources
| Argument | Type | Description |
|---|---|---|
| type? | enum | Only plans of this type. |
| region? | string | Only consider stock in this region. |
| min_ram_gb? | number | Minimum RAM in GB. |
| max_hourly_price? | number | Maximum hourly price, in the listed currency. |
| in_stock_only? | boolean | Drop plans with no stock (in the region, if given). |
Resources
Order a server or adopt an existing one, then wait until SSH answers
Delete a model's recorded server after checking its hostname and project match
First release (beta). Servers, projects, SSH keys and plan stock for Cherry Servers; create adopts instead of re-ordering; readiness judged by SSH. Live-tested: list calls, create, wait_ready, adopt on re-run. Not yet live-tested: delete.
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License1/2partial
no SPDX license declared
- Verified public repository2/2earned
Spawns a subprocess with Deno.Command().
- models/_lib/ssh_probe.ts:95 — no reason given