The PUQ Proxmox KVM module for WHMCS provides automated provisioning, management, and billing of KVM virtual machines on Proxmox VE clusters. The module consists of two parts: the Server Module that handles VM provisioning and the client/admin interface, and the Addon Module that manages IP address pools, DNS zones, cron tasks, and provides a centralized management dashboard.
The module allows your customers to provision and manage KVM machines on your Proxmox server or Proxmox cluster. It exposes virtually all functions of Proxmox directly from the WHMCS panel without forcing the user (or admin) to log in to Proxmox itself. This greatly simplifies customer account management, improves customer satisfaction and reduces the number of support requests.
The module is intended for advanced users — installation and correct configuration require knowledge and experience in server and network administration. Although the documentation is detailed and allows the module to be installed by an intermediate user, we strongly suggest following the order defined in the installation chapter.
Changed in v3.0. Starting from v3.0 the module ships its own dedicated addon module (
puq_proxmox_kvm) — the separate PUQ Customization addon required for v1.3–v2.x is no longer needed. On first activation the new addon automatically migrates IP pools, DNS zones and VM records from the oldpuq_customizationtables.
New in v3.3. Full WHMCS Configurable Options coverage — 18 distinct options with clean plain-English names cover every per-service customisation (CPU, RAM, every disk size / bandwidth / IOPS, network bandwidth, IP counts, OS, backups, snapshots). Every option has a sensible default in Module Settings so products work out of the box. Disk downgrades are blocked by a three-layer safety net; selecting
Additional Disk = 0cleanly removes the extra disk.
New in v4.0. Dual-mode snapshot system (scheduled automatic snapshots with automated FIFO rotation or lifetime cleanup), streamlined client area interface matching backups, modernized usage charts, ionCube 15 support, and comprehensive multi-language translations across 25 languages.
If you don't feel comfortable performing the installation yourself, PUQcloud offers an installation service in two variants — module installation and configuration and full implementation. See https://puqcloud.com/whmcs-module-proxmox-kvm.php for details.
puqProxmoxKVM
modules/servers/puqProxmoxKVM/
Addon Module
puq_proxmox_kvm
modules/addons/puq_proxmox_kvm/
The Addon Module is required for the server module to function. It manages:
Be the first to review PUQ Proxmox KVM provisioning module.
The best place to start if you need help with a specific product is to contact the developer. All WHMCS Marketplace developers have both a website and support URL listed.
Major release: Dual-mode snapshot architecture, unified client UX matching backups, modernized usage charts, ionCube 15 support, and comprehensive multi-language synchronization.
scheduleSnapshot cron task running every 5 minutes to execute scheduled snapshots labeled Scheduler: YYYY-MM-DD.vm_snapshot_schedule, vm_snapshot_last).Snapshot schedule mode dynamically locks and disables Snapshot lifetime, preventing conflicting cleanup policies.charts.tpl): Completely refactored with dedicated cards for CPU & RAM, Disk I/O, and Network, integrated kvmAjax client, full localization, and responsive auto-scaling on window resize.
Configurable Options release: full coverage with plain-English names, Module Settings defaults for every resource, disk shrink protection.
CPU Cores, RAM, System Disk, Additional Disk, System Disk Read/Write Bandwidth, System Disk Read/Write IOPS, Additional Disk Read/Write Bandwidth, Additional Disk Read/Write IOPS, Network Bandwidth, IPv4 Addresses, IPv6 Addresses, Backups, Snapshots, Operating System.B|..., S|..., CPU|..., RAM|..., ipv4|..., ipv6|..., OS|...) still work. When both forms exist on the same product, the plain name wins.A product now works without any Configurable Options at all — every resource has a default in Module Settings, overridden only when a matching option is assigned to the service. New default fields: Backups and Snapshots count in VM Configuration; IPv4 count and IPv6 count in Network.
Proxmox cannot shrink disks. v3.3 blocks downgrades at three layers:
(downgrade not allowed), warning banner above the form, client-side submit guard.skip — shrink not allowed by Proxmox, VM is not stopped, snapshots are not removed.Selecting 0 for Additional Disk now detaches the disk and purges the file from storage. Upgrade form labels the sub-option (removes the existing disk — data will be lost) and requires a JavaScript confirm() before submit. To disallow this for clients, omit the 0|... sub-option from the Additional Disk dropdown.
The Start VM step at the end of a change-package now polls for up to 60 seconds in the same cron pass. Slower-starting VMs (cloud-init, large memory) no longer force a one-minute wait for the next cron tick.
A DNS, lifecycle and admin-UX release. Key goal: long-running operations (provisioning many DNS records, tearing down a service with large backups) must never time out the WHMCS request. Both Set DNS records and Terminate now run asynchronously in cron with live progress streamed to the cron output. Under the hood — full null-safety hardening across both modules for PHP 8.1/8.2 stability.
Native support for the PowerDNS Authoritative Server REST API as a third DNS provider (alongside Cloudflare and HestiaCP). Works out of the box with standard PowerDNS installations — configure server URL and api_key, the module takes care of the rest. Fully integrated with forward and reverse zones, automatic ensureTrailingDot / FQDN normalization, and PowerDNS-strict content formatting for PTR / CNAME / NS records.
The Set DNS records admin button used to call the Proxmox and DNS APIs synchronously — on a service with many reverse-DNS records it would exceed the PHP execution limit and fail with a blank error page. The button now queues the job by setting the VM status to set_dns_records and returns success instantly. The cron task picks it up on the next tick, runs DeleteDNSRecords + SetDNSRecords, and writes a full step-by-step log to the VM record.
Same treatment for service termination. When an admin clicks Terminate, the module sends a fire-and-forget "stop" request to Proxmox, sets vm_status = 'terminate', returns 'success' — and WHMCS marks the service Terminated immediately. The actual heavy work (graceful stop with polling, backups removal, DNS deletion, VM DELETE API call, DB cleanup) is done by cron.
Benefits:
The terminate flow previously used a fixed 15-second stop window which was insufficient for VMs with large memory footprints or QEMU guest-agent filesystem freeze. It now issues a single stop request and polls the remote status every 5 seconds for up to 120 seconds (graceful), then a 60-second force-stop window. Live progress is emitted every 15 seconds so admins see what's happening.
error_terminate status + Reset / Delete Record actionsWhen termination fails (for example, the Proxmox API DELETE call returns an error), the VM no longer silently falls back to remove. It's now marked error_terminate:
The Reset VM Status modal has been expanded with terminate (retry) and remove (force-mark) options, plus an embedded reference table explaining when to use each status. A new Delete Record button (trash icon) appears for rows in error_terminate / remove status — it removes the row from puqProxmoxKVM_vm_info only, with an explicit confirmation dialog warning that Proxmox state is not touched.
The standalone cron (php cron.php) now streams every individual step in real time with timestamps. During a deploy you can watch DNS records being created zone by zone, IP by IP, instead of waiting 60 seconds and seeing only the summary. During a terminate you see stop request sent, periodic still running, waited Xs / 120s heartbeats, each DNS deletion, the final VM deleted. Output is flushed after every line — nothing is buffered.
The DNS Zones page now shows three provider types (Cloudflare, HestiaCP, PowerDNS) with a single unified CRUD interface. Secret fields (API tokens, admin passwords, API keys) are no longer returned to the browser — the edit form shows (unchanged — enter new to replace) placeholders, and the save flow preserves the stored value if the field is left empty.
When configuring an IP Pool, the required reverse-DNS zone name for the prefix is now computed automatically and shown as a hint both in the add/edit modal and as a second line in the Addresses column of the pool list. For example, a 2001:db8::/120 pool shows:
2001:db8::2 - 2001:db8::50
rDNS zone: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa
Admins no longer have to compute nibble reversals by hand — copy the value straight into the DNS Zones form. Both IPv4 (/8, /16, /24) and IPv6 (any nibble-aligned prefix) are supported; non-aligned prefixes show a "classless delegation required" hint.
A collection of DNS bugs fixed in one pass:
str_replace(':', '') which produced a garbage PTR for any compressed IPv6 address (e.g. 2001:db8::1 became 1.8.b.d.1.0.0.2.ip6.arpa instead of the correct 32-nibble form). Now uses inet_pton + bin2hex, correct for every IPv6 form./, regardless of how the admin types it.example.com.) now match correctly against record names.dns1 or only dns2 now correctly sets the VM's DNS server; previously only the dns1+dns2 combination worked reliably.DNS API failures (zone missing, provider down, auth error) never block deploy, change-package, or terminate. Each zone and each record is wrapped in individual try-catch and logged as a non-blocking event. The operation proceeds with the rest. A summary (forward_ok/err, rev_ok/err, per-zone messages) is written to the VM log and, when errors occurred, to the WHMCS module log as well.
localStorage and restore it on the next visit. Default is now "All" on first visit (used to be "Active").last_error_action / last_error_message are present in the last action log.$params['...'], $_GET['...'], and explode()[n] reads now use ?? default or bounds checks. Prevents TypeError: cannot access offset on null warnings on PHP 8.1/8.2 when Proxmox API responses or DB rows omit optional fields.isOk() helper, commented-out stubs (~40 lines total).json_decode results against non-JSON / empty responses.cleanupFirewall now distinguishes benign "IPSet does not exist" from real API errors (auth, 500) and logs the latter.
A stability and admin UX release on top of v3.0. Focused on making product configuration self-explanatory and hardening the cron against bad data.
The custom Module Settings UI no longer fails silently when something is wrong with the product's Server Group. Instead of a generic "No server found" message, the page now shows a contextual banner with an exact fix-it hint and highlights the affected fields (Node, OS Template, Storages):
Setup → Products/Services → Servers → Edit group.Fixed a regression where one service with a missing IP-pool entry or server address field could crash the entire processVirtualMachines cron run on PHP 8.0+. All assignments from server_address_list and IP pool data (netmask, gateway, DNS, bridge, VLAN) are now null-safe, so the cron continues processing the rest of the queue even if a single service has stale or incomplete network configuration.
GetStatistics() now resolves the VM's current Proxmox node before collecting RRD data and safely skips services whose remote node is not yet known (for example, services still in the deployment queue). Prevents spurious errors in the statistics cron.
Version 3.0 introduces a redesigned architecture, a dedicated addon module, and a broad range of new features.
Version 3.0 includes its own dedicated addon module, reducing reliance on the previous addon structure.
The VM deployment process now uses a step-by-step workflow.
Deploy flow:
Allocate IP -> DNS and clone -> Migrate to target node -> Set CPU and RAM -> Resize system disk -> Configure disk I/O -> Create additional disk -> Resize additional disk -> Configure additional disk I/O -> Configure network -> Configure firewall -> Configure cloud-init -> Start VM -> Verify running status and send email
Version 3.0 adds improved migration handling for cross-node deployment.
Package upgrades and downgrades now use the same step-based workflow.
Additional improvements:
Version 3.0 adds expanded firewall support for deployment and client self-service.
The cron system supports two operating modes.
All client area pages have been updated with a redesigned interface.
Warning:
Before updating, you must create a Proxmox API token and enter its details in the server settings.
Username: root@pam!your-token-id
Password: your token value
Module is coded ionCube v13
Supported php version:
Changelog:
Resell VPS & Cloud Dedicated Products from Liquid Web
Automate the sale of VPS servers & give your clients the ability to completely manage their VPS server inside of WHMCS, using the industry leading SolusVM control panel.