CLI for Proxmox VE
Project description
proxctl
A command-line interface for Proxmox VE -- manage VMs, containers, nodes, storage, and more from your terminal. Includes declarative infrastructure management with apply and export.
Install
# From crates.io
cargo install proxctl
# From PyPI (pre-built binaries, no Rust toolchain needed)
pip install proxctl
# From GitHub Releases (Linux, macOS, Windows)
curl -fsSL https://github.com/rvben/proxctl/releases/latest/download/proxctl-$(uname -m)-unknown-linux-gnu.tar.gz | tar xz
Quick Start
# Interactive setup (creates API token automatically)
proxctl config init
# Check connectivity
proxctl health
# List VMs
proxctl vm list
# Start a VM
proxctl vm start 100
# Show VM configuration
proxctl vm config 100
# List snapshots
proxctl vm snapshot list 100
# Raw API access
proxctl api get /nodes
Declarative Infrastructure (IaC)
Manage Proxmox resources declaratively with YAML manifests, similar to kubectl apply.
Export existing resources
# Export a single VM
proxctl export vm 101 > haos.yaml
# Export all containers
proxctl export container --all > containers.yaml
# Export cluster firewall rules
proxctl export firewall cluster > firewall.yaml
Apply desired state
# infra/web.yaml
kind: vm
name: web-01
vmid: 100
config:
memory: 4096
cores: 2
onboot: true
---
kind: firewall-rule
scope: cluster
config:
action: ACCEPT
type: in
proto: tcp
dport: "443"
comment: "Allow HTTPS"
# Preview changes
proxctl apply -f infra/ --dry-run
# Apply changes
proxctl apply -f infra/
# Round-trip: export, then verify nothing drifted
proxctl export vm --all > current.yaml
proxctl apply -f current.yaml --dry-run # should show "noop" for all
Key behaviors
- Idempotent -- running apply twice produces "up to date" on the second run
- Patch semantics -- only specified config keys are changed, others left untouched
- Name or VMID -- resources can be identified by name (auto-resolves VMID) or pinned by ID
- Multi-document -- multiple resources in one file with
---separators, or a directory of files - Optional power state -- add
state: runningorstate: stoppedto manage power, or omit to leave it alone - Safe -- shows a diff before applying, destructive changes prompt for confirmation
Features
- 145+ commands covering VMs, containers, nodes, storage, backups, cluster, firewall, access control, pools, and Ceph
- Declarative IaC --
applyandexportfor infrastructure-as-code workflows - Auto-detection -- resolves which node a VM lives on automatically
- Agent-friendly --
--jsonoutput,schemacommand for introspection, structured exit codes - Async task handling -- waits for operations to complete with progress spinner
- Safe -- destructive operations require
--yesconfirmation - Raw API escape hatch --
proxctl api get/post/put/deletefor any endpoint - Hidden aliases --
qmforvm,ctforcontainer - Idempotent -- starting an already-running VM succeeds without error
Configuration
Config file
~/.config/proxctl/config.toml
[default]
host = "https://192.168.1.1:8006"
token = "root@pam!proxctl=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
insecure = true
[production]
host = "https://pve.example.com:8006"
token = "admin@pam!proxctl=yyyyyyyy-..."
Environment variables
| Variable | Description |
|---|---|
PROXMOX_HOST |
Proxmox host (e.g. pve.example.com:8006) |
PROXMOX_TOKEN |
API token (user@realm!tokenid=secret) |
PROXMOX_PROFILE |
Config profile name (default: default) |
PROXMOX_NODE |
Default node name |
Precedence
CLI flags > environment variables > config file
Usage Examples
Human output (TTY)
$ proxctl vm list
VMID NAME STATUS NODE CPUS MEMORY
100 k8s-control-1 running pve1 4 8.00 GiB
101 k8s-worker-1 running pve1 8 16.00 GiB
200 dev-sandbox stopped pve2 2 4.00 GiB
JSON output (piped or --json)
$ proxctl vm list --json | jq '.[].name'
"k8s-control-1"
"k8s-worker-1"
"dev-sandbox"
JSON output is automatic when stdout is not a TTY, so piping to jq, grep, or scripts works without flags.
Agent Integration
The schema command outputs a JSON description of all 145+ commands with their arguments, types, defaults, and behavioral metadata:
proxctl schema | jq '.commands | length'
145
This enables AI agents and automation tools to discover available operations, required parameters, and which commands are mutating or destructive -- without parsing help text.
Comparison
| Feature | proxctl | pvesh (built-in) | proxmoxer (Python) |
|---|---|---|---|
| Declarative IaC (apply/export) | Yes | No | No |
| Typed CLI with completions | Yes | No | N/A |
| Cross-platform binaries | Yes | No (PVE only) | pip install |
| VMID auto-resolution | Yes | No | Manual |
| JSON + human output | Auto-detect | JSON only | N/A |
| Agent schema introspection | Yes | No | No |
| Idempotent lifecycle ops | Yes | No | Manual |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file proxctl-0.2.7.tar.gz.
File metadata
- Download URL: proxctl-0.2.7.tar.gz
- Upload date:
- Size: 101.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b813a061daf83f486db1df90b3be8ea24fe1def2258c06c54f3570c5e14bd7f
|
|
| MD5 |
eb896eef7098bfc1ba3d4464ba8a2438
|
|
| BLAKE2b-256 |
11e78c177972cff4e4492f2fc4e61d62c1135f7027e156de796b00a6d5cbf939
|
File details
Details for the file proxctl-0.2.7-py3-none-win_amd64.whl.
File metadata
- Download URL: proxctl-0.2.7-py3-none-win_amd64.whl
- Upload date:
- Size: 3.9 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6cbb5bc7598cd402b5687678c39e99be3c0db533ae00a18fc4885e4be2380906
|
|
| MD5 |
5389841af10ce83d1a7b350cec87f092
|
|
| BLAKE2b-256 |
4e580cf0c26afb6f4dc0a190ffff2b63eb5223d52e586fc02f36e2b67dda4a1a
|
File details
Details for the file proxctl-0.2.7-py3-none-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: proxctl-0.2.7-py3-none-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: Python 3, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13325ad7f10365635cbc05f428c6127f6ba32c67c3f93c3fc0aab30816c348dc
|
|
| MD5 |
b87736bd1e430072cf3d01b57314a6e1
|
|
| BLAKE2b-256 |
7f4855f4f32f08c71de4fade7ec6cc8a943289c3d8033b2f0cb1ce95f562cbb2
|
File details
Details for the file proxctl-0.2.7-py3-none-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: proxctl-0.2.7-py3-none-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 3.7 MB
- Tags: Python 3, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ea2a2c6f3d204cf17aa0869ddf134c667b3d2097b3ef2c5686b7d0139e0599b
|
|
| MD5 |
e3b34981a4416a0d7b204dd796066cec
|
|
| BLAKE2b-256 |
3643d10ac7e4b3eaa742a59bc16b3f682943f6ce383c057c6fa4ff82c3171366
|
File details
Details for the file proxctl-0.2.7-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: proxctl-0.2.7-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.6 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
881190a6026c0ff37b4efb815f82e9d081f468abd44d5f907ecb671e699fb4c7
|
|
| MD5 |
52e1a01b33a44e4859c26800f4976b81
|
|
| BLAKE2b-256 |
761ac4905a5a7766a3ba3e7b52de45b3ae72a06349c394f2d71acdc39d8b3a2b
|
File details
Details for the file proxctl-0.2.7-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: proxctl-0.2.7-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.8 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7ac600873afa6e09384158795d871621e95349d7c021bbbf14429f6575ee0f9
|
|
| MD5 |
b4843b053392b65d0fa01cd1658accc6
|
|
| BLAKE2b-256 |
6b6c7a51457748ecb2b490696f2be5ba9177207efec25de9c2fc7571fcfd9488
|