v6ctl
The official CLI for the v6Node API. Deploy and manage VPS nodes, SSH keys, and webhooks — interactively with Rich tables, or scripted with --json.
pipx install v6ctl
v6ctl config set token v6_...
v6ctl nodes list
Contributors: this package is published to PyPI.
README.mdbecomes the public project description and the wheel shipsv6ctl.pyin full, so code comments and--helptext are public too../release.sh verifyscans the built artifacts for internal host names, site codes, CPU models and algorithms, and refuses to publish if it finds any.
Install
pipx install v6ctl # recommended — isolated, upgradable
pip install v6ctl # works too
No pipx? brew install pipx (macOS), sudo apt install pipx (Debian/Ubuntu),
or python3 -m pip install --user pipx && python3 -m pipx ensurepath.
Configure
Get a token from the v6Node dashboard, then:
v6ctl config set token v6_...
Stored at ~/.config/v6ctl/config.json with mode 0600. Or set V6_TOKEN in
your environment.
Recipes
Deploy a node in one line
v6ctl nodes create -r frankfurt-2 -p 8gb -k laptop -t debian-13
Add --wait to block until the deploy has finished and the node is running. It exits non-zero if the
deploy failed or did not finish within --timeout seconds (default 600).
rebuild, start, stop, shutdown and reboot take the same flags; the
power commands wait until the node is in the target state, which counts as done
if it already was.
delete does not: the API cannot observe when the VM is gone, so subscribe to
the node.deleted webhook instead. reboot --wait needs a node that has been
running for at least a minute, since it confirms the reboot by uptime starting
over; otherwise it refuses before sending anything.
Or run v6ctl nodes create on a TTY and answer the prompts. Each of
--region, --plan, --key, --template takes an ID, slug, or name —
whichever you remember.
Add a dedicated IPv4 at deploy
v6ctl nodes create -r frankfurt-2 -p 8gb -k laptop -t debian-13 \
--address dedicated_ipv4
Pin a specific image build with --flavor <id>.
Manage addresses after deploy
v6ctl nodes addresses <pay-id> # existing list shorthand
v6ctl nodes addresses add <pay-id> dedicated_ipv4 # asks first; --yes skips
v6ctl nodes addresses add <pay-id> public_ipv6
v6ctl nodes addresses add <pay-id> routed_ipv6
v6ctl nodes addresses delete <pay-id> <address-id>
dedicated_ipv4 is billable, so add asks before allocating it. Pass --yes
to skip the question; without a terminal (scripts, CI, --json) --yes is
required. Routed IPv6 allocation is asynchronous and has no --wait: the API
lists the prefix before its route is in place, so watch the address.created /
address.allocation_failed webhook events instead. Shared IPv4 is
not offered. If an add or delete returns HYPERVISOR_ERROR, list the addresses
before doing anything else—the allocation or release may already be committed.
Group nodes into projects
Projects are created in the panel. The CLI lists them and moves nodes between
them; --project takes an ID or the project name.
v6ctl projects
v6ctl nodes list --project production
v6ctl nodes update <pay-id> --project production
v6ctl nodes update <pay-id> --no-project
Inspect a node, including every IP
v6ctl nodes show <pay-id>
v6ctl nodes list -A # show all IPs (default truncates to 2)
Manage SSH keys
v6ctl keys list
v6ctl keys create -d "laptop" -k "ssh-ed25519 AAAA..."
Subscribe a webhook to deploy events
v6ctl webhooks create -u https://example.com/hook -e node.deployed
Browse the catalog
v6ctl plans # plans + pricing
v6ctl regions # available regions
v6ctl templates # OS templates and flavors
Script it
v6ctl --json nodes list | jq '.items[].pay_id'
v6ctl --json plans | jq '.[] | select(.memory_mb >= 4096)'
Every command supports --json and exits non-zero on failure. In
non-interactive mode (pipe, CI, or --json), prompts are disabled and
missing required flags are an error — so CI fails fast instead of hanging.
v6ctl --help and v6ctl <command> --help are the source of truth for
every flag.
Configuration precedence
| Source | Priority |
|---|---|
--flag on the command line |
1 (highest) |
Env vars (V6_TOKEN, V6_API_URL) |
2 |
Config file ~/.config/v6ctl/config.json (mode 0600) |
3 |
| Built-in defaults | 4 (lowest) |
v6ctl config show # resolved config, token redacted
v6ctl config path
v6ctl config set api_url https://cloud.v6node.com/api/v1
v6ctl config unset token
Requirements
Python 3.10 or newer.
License
MIT — see LICENSE.
Metadata
Release files for v6ctl 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| v6ctl-0.7.0.tar.gz | 32.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| v6ctl-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 55.9 kB
Release files / v6ctl-0.7.0.tar.gz
| Download URL | v6ctl-0.7.0.tar.gz |
|---|---|
| Size | 32.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
68757d67f4bbccb11e8e200d243065920f89ab068d8303d52f3ace9434f04a53
|
|
BLAKE2b-256 checksum How to use checksums |
aedc428167a5e0b33fe4c0a334a82473a53c5c50bd871f6b7936b7b31097c518
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / v6ctl-0.7.0-py3-none-any.whl
| Download URL | v6ctl-0.7.0-py3-none-any.whl |
|---|---|
| Size | 23.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ddcb84baa39d64e19d9a2a3eca122da85252a79b7203095bf9375e0a5f321664
|
|
BLAKE2b-256 checksum How to use checksums |
90ed2ef51bc95d4ae5e5f6de68e232623216107f90c2b54afc1f9e747858454e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|