Install VNCproxy and noVNC
Proxmox KVM module WHMCS
Order now | Download | Community
Preface
The module provides browser-based console access allowing clients to manage KVM virtual machines directly from the WHMCS client area without needing external VNC software. To establish console sessions, the module integrates with:
-
noVNC — An open-source HTML5 VNC client JavaScript library and application that runs in any modern desktop or mobile browser (iOS, Android).
- Project website: https://novnc.com
- GitHub repository: https://github.com/novnc/noVNC
-
vncwebproxy — A lightweight Go daemon developed by PUQ that terminates the client's secure WebSocket connection and relays traffic to the Proxmox VNC port:
- go-vncproxy (MIT License)
- gin (MIT License)
- golang.org/x/net/websocket (BSD License)
How It Works
The vncwebproxy sits between the client's web browser and your Proxmox VE cluster:
- When a client clicks Console in WHMCS, the module requests a one-time VNC ticket and port from the Proxmox API.
- WHMCS generates a signed, one-time console link incorporating the ticket and redirects the client's browser to the
vncwebproxydomain. - The client browser loads noVNC via HTTPS and opens a secure WebSocket connection to
/vncproxy/.... -
vncwebproxyvalidates the authentication ticket and forwards the bidirectional VNC stream to the designated Proxmox node on TCP ports 5900–5999.
[ Client Browser (noVNC) ]
│ HTTPS / WSS (Ports 80 / 443)
▼
[ vncwebproxy ]
│ VNC TCP (Ports 5900–5999)
▼
[ Proxmox VE Node ]
Public PUQcloud Proxy (Testing / Evaluation)
For rapid testing or evaluation, you can use the public PUQcloud demo proxy. For production deployments, we strongly recommend hosting your own proxy to ensure optimal performance, low latency, and full control over security.
| Setting | Value |
|---|---|
| noVNC WEB proxy server | vncproxy.puqcloud.com |
| noVNC WEB proxy key | puqcloud |
| Web ports | 80 / 443 (SSL/TLS) |
| Proxmox target ports | 5900–5999 |
These settings are entered in the WHMCS product settings under Module Settings → Integrations Configuration:
| Setting | Description | Example |
|---|---|---|
| noVNC Proxy Domain | The HTTPS URL of your proxy server | https://vncproxy.yourdomain.com |
| noVNC Proxy Key | The secret authentication key configured on the proxy | your-secret-key |
Method 1: Docker Deployment (Recommended)
PUQ provides an official, all-in-one Docker image on Docker Hub: puqcloud/vncwebproxy
This image bundles:
- The compiled
vncwebproxyGo daemon - noVNC v1.7.0 served statically via an internal high-performance NGINX web server
- Built-in dual health checks (NGINX on port 80 and WebSocket listener on port 8080)
- Unified logging and minimal resource footprint
Prerequisites
- Docker Engine 20.10+ and Docker Compose v2+ installed on your proxy server.
- The proxy server must have outbound network access to your Proxmox VE nodes on TCP ports 5900–5999.
- A public domain name (e.g.,
vncproxy.yourdomain.com) with anA/AAAADNS record pointing to your proxy server.
Deploying with Docker Compose
Create a directory and a docker-compose.yml file:
mkdir -p /opt/vncwebproxy && cd /opt/vncwebproxy
nano docker-compose.yml
Add the following configuration:
version: "3.8"
services:
vncwebproxy:
image: puqcloud/vncwebproxy:latest
container_name: vncwebproxy
restart: unless-stopped
ports:
- "8080:80"
environment:
- TZ=UTC
# Set your unique Proxy Key (must match noVNC Proxy Key in WHMCS)
- PROXY_KEY=my_secure_proxy_key_123
Start the container:
docker compose up -d
Deploying with Docker CLI
Alternatively, run the container directly with docker run:
docker run -d \
--name vncwebproxy \
--restart unless-stopped \
-p 8080:80 \
-e PROXY_KEY=my_secure_proxy_key_123 \
-e TZ=UTC \
puqcloud/vncwebproxy:latest
Environment Variables
| Variable | Description | Default |
|---|---|---|
PROXY_KEY |
The secret authentication key passed from WHMCS | puqcloud |
TZ |
Container timezone (e.g. UTC, Europe/Warsaw, America/New_York) |
UTC |
Reverse Proxy & SSL Configuration
Because modern browsers require HTTPS and WSS (secure WebSockets) for console access, place a reverse proxy with SSL termination in front of the container.
Example: NGINX Reverse Proxy
server {
listen 80;
server_name vncproxy.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name vncproxy.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/vncproxy.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vncproxy.yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Using Nginx Proxy Manager? In the NPM UI, create a Proxy Host pointing to
http://vncwebproxy:80(orhttp://127.0.0.1:8080), enable Websockets Support, select Request a new SSL Certificate, and check Force SSL.
Health Checks
The Docker image includes an automated dual health check:
- Verifies that NGINX is actively serving the noVNC client interface on port 80.
- Verifies that the internal Go proxy daemon is listening for WebSocket connections on port 8080.
Check container health:
docker inspect --format='{{.State.Health.Status}}' vncwebproxy
Updating the Image
To update to the latest release:
docker compose pull
docker compose up -d
Method 2: Manual Standalone Installation (Bare Metal)
If you prefer installing directly on the host without Docker:
Step 1: Prepare Server & Packages (Debian / Ubuntu)
sudo apt update
sudo apt install certbot nginx python3-certbot-nginx zip -y
Step 2: Download noVNC
cd /root/
wget https://github.com/novnc/noVNC/archive/refs/tags/v1.3.0.zip
unzip v1.3.0.zip
cp -R noVNC-1.3.0/* /var/www/html/
rm -rf v1.3.0.zip noVNC-1.3.0/
Step 3: SSL Certificate via Certbot
certbot --nginx -d vncproxy.yourdomain.com
Step 4: NGINX Virtual Host
Edit /etc/nginx/sites-available/default:
server {
root /var/www/html;
index index.html index.htm;
server_name vncproxy.yourdomain.com;
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/vncproxy.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/vncproxy.yourdomain.com/privkey.pem;
location / {
try_files $uri $uri/ =404;
}
location /vncproxy {
proxy_pass http://127.0.0.1:8080/vncproxy;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Reload NGINX:
systemctl restart nginx
Step 5: Download & Run vncwebproxy
apt install screen -y
cd /opt
wget https://download.puqcloud.com/WHMCS/servers/PUQ_WHMCS-Proxmox-KVM/vncproxy/vncwebproxy
chmod +x vncwebproxy
screen -S vncproxy
./vncwebproxy my_secure_proxy_key_123
Detach from screen with Ctrl+A then D.
Configuring WHMCS Product Settings
Once your proxy is running (via Docker or standalone), navigate to: WHMCS Admin Area → System Settings → Products/Services → Products/Services
- Select your Proxmox KVM product and open the Module Settings tab.
- Scroll to the Integrations Configuration section.
- Configure:
-
noVNC Proxy Domain:
https://vncproxy.yourdomain.com -
noVNC Proxy Key:
my_secure_proxy_key_123(matching thePROXY_KEYenvironment variable or CLI argument)
-
noVNC Proxy Domain:
- Click Save Changes.
Client Console Access
When configured, clients see the Console button in their VM management view. Clicking it opens a secure browser window with full keyboard, video, and mouse interaction.
client-area-novnc-connecting.png
Security & Firewall Requirements
- Inbound Ports to Proxy: Allow TCP 80 and 443 from the public internet.
- Outbound Ports from Proxy to Proxmox: Allow TCP 5900–5999 from the proxy server to each Proxmox VE cluster node.
- DNS Resolution: If Proxmox hostnames are used instead of IP addresses in WHMCS, ensure the proxy server can resolve those hostnames.
- One-Time Tickets: Every session uses a short-lived one-time ticket generated by the Proxmox API, ensuring sessions cannot be hijacked or reused.