zzantares/proxmoxve
A Laravel/PHP client for the Proxmox VE API that lets you manage nodes, virtual machines, LXC containers, storage, and cluster resources directly from your application using a clean, fluent, object-oriented interface. Includes support for VM lifecycle operations, snapshots, and task monitoring.
What it is: zzantares/proxmoxve is a community, MIT-licensed PHP client that wraps the Proxmox VE REST API (/api2/json). It is framework-agnostic with a thin Laravel service provider/facade carried from its Laravel 5-era origins. ~177 stars, last tagged release Feb 2023, PHP 5.5+ lineage.
Architecture fit: Treat this as commodity plumbing, not a platform component. If Proxmox is the substrate for a provisioning/orchestration product, this library only gets you HTTP transport plus endpoint sugar — VMID allocation, idempotency, task state machines, IPAM, cloud-init injection, and reconciliation remain ours to build. That is acceptable: it is a 200–400 LOC dependency replacing maybe 2–3 weeks of hand-rolled Guzzle work. It is not acceptable as the boundary of our domain model, because its response objects are arrays/stdClass and will leak into business logic if unguarded.
Integration feasibility: High. Composer install, no daemon, no schema, no queue worker, no extra infrastructure. The real cost is governance, not engineering.
Technical risk (ranked):
PVEAPITicket/PVEACSREFPrevention), which requires a stored password and a 2FA-exempt realm. API-token support must be verified before we commit; if absent, we patch the fork. This is the single largest security decision in the evaluation.illuminate/* constraints may conflict with a current Laravel skeleton; may need --ignore-platform-reqs-style workarounds or a fork.Key questions:
Stack fit: PHP 8.1+, Laravel 10/11, Guzzle 7. Register as a container singleton with a published config file (host, port, token_id, secret, realm, verify_tls). Secrets via environment/Vault, never committed; use a dedicated API token bound to a service role scoped to a resource pool (PVEVMAdmin + PVEVMAllocate + Datastore.AllocateSpace as needed) — never root@pam.
Adapter, not direct usage. Define an internal ProxmoxGateway interface (listNodes, listGuests, cloneVm, start/stop, taskStatus). Implement it once with this package. Application and domain code depend only on the interface. This caps the blast radius if we later swap to raw Guzzle, a maintained fork, or the Python proxmoxer sidecar. Ban ZzAntares\ProxmoxVE\* imports outside the adapter namespace and enforce with a static-analysis rule.
Migration path (incremental, reversible):
Sequencing rules: never call the package from a web request handler for long operations; always dispatch to a queue job that submits the task and returns the UPID, then poll with exponential backoff. Persist UPIDs so a worker restart doesn't orphan state. Version pin to an exact tag and commit hash, and mirror the repository internally.
Compatibility: maintain an explicit matrix (package version × PVE 7.4 / 8.x × PHP × Laravel) and a lab cluster that runs the highest PVE version we support. Treat PVE minor upgrades as a change-management event.
Maintenance: Assume we own it. Budget roughly 1 developer-day per quarter for fork upkeep, dependency bumps, and PVE API drift, plus a defined owner. Vendor the source into a private mirror with a patch branch; do not rely on upstream responsiveness. Track upstream issues for security-relevant reports.
Support: No vendor, no SLA, community issues only. The escalation path terminates with our own engineers, so the runbook must cover Proxmox-side operations — this is an infrastructure-knowledge dependency, not a library-support dependency.
Scaling: All operations are synchronous HTTP against pvedaemon, with long-running actions surfaced as async tasks. Two constraints dominate:
Failure modes to design for:
pvedaemon restart or node offline returning 5xx/595 with no useful body → classify as transient with bounded retries and jitter; fail the job cleanly, don't retry indefinitely.Observability: Log every API call with method, endpoint, duration, HTTP status, and correlation ID; emit task UPIDs into traces; alert on auth failure rate, task failure rate, and task duration p95.
Ramp-up: A competent PHP/Laravel developer is productive against the adapter in 1–2 days — the API is small. Operational fluency is the longer curve: VMID allocation, pools and role inheritance, storage content types, templates vs. clones, and cloud-init semantics take 1–2 weeks. On-call rotation needs a written Proxmox runbook, not the package README. Plan for one team member to become the designated Proxmox owner; the package itself does not carry that knowledge.
How can I help you explore Laravel packages today?