ProxmoxVEx is a self-hosted web application. This guide covers the supported platforms, system requirements, and every install method — pick your host OS below and the instructions will follow it.
The install instructions below update to match the OS you pick here.
Supported host operating systems
ProxmoxVEx runs on Linux only (x86_64 and aarch64). Windows and macOS are not supported as hosts — several Python dependencies ship Linux-only wheels.
| Host OS | Install method | Notes |
|---|---|---|
| Debian 12 (bookworm) / 13 (trixie) | install.sh, .deb package, Docker |
Best-supported target; the .deb repo tracks trixie. |
| Ubuntu 22.04 / 24.04 LTS | install.sh, Docker |
The installer handles all system packages automatically. |
| RHEL 9 / Rocky 9 / Alma 9 / Fedora | install.sh, Docker |
Uses dnf; enables EPEL for sshpass when needed. |
| Arch Linux | install.sh, Docker |
Uses pacman; initializes the PostgreSQL cluster for you. |
| Proxmox VE host (Debian-based) | install.sh, .deb |
Works, but a dedicated VM or LXC is recommended. |
| Any Linux with Docker / Podman | Docker image, Docker Compose | Fastest path; no Python toolchain needed. |
Managed clusters (the systems ProxmoxVEx connects to): Proxmox VE 8.0+ or 9.0+, VMware ESXi/vCenter, and XCP-ng.
System requirements
Hardware
| Minimum | Recommended | |
|---|---|---|
| CPU | 1 vCPU (x86_64 or aarch64) | 2+ vCPU |
| Memory | 2 GB | 4 GB |
| Disk | 5 GB free | 20 GB SSD |
The minimum covers a small evaluation — a few VMs and the IDS/IPS disabled. Scale CPU and memory with the number of managed clusters; the anomaly-detection stack (scikit-learn, pandas, scapy) makes ProxmoxVEx heavier than a typical Flask app. These figures assume PostgreSQL runs on the same host — a remote database lowers the local requirement.
Software
| Requirement | Version | Why |
|---|---|---|
| Python | 3.10–3.13 (3.12 recommended) | Backend runtime; the Docker image ships 3.12. |
| PostgreSQL | 13+ | Required — the only supported database backend. |
openssh-client, sshpass |
any | Node-level SSH operations and password-auth fallback. |
sudo, curl, wget, openssl, ca-certificates |
any | Installer, updates, and TLS handling. |
The one-command installer and Docker image install/bundle all of these — this table is for the manual release-archive path.
Firewall and network ports
Inbound — on the ProxmoxVEx host
| Port | Protocol | Default bind | Required | Purpose / env override |
|---|---|---|---|---|
| 5000 | TCP | 127.0.0.1 |
Yes | Web UI and REST API (PROXMOXVEX_PORT) |
| 5001 | TCP | 127.0.0.1 |
QEMU console | noVNC WebSocket (PROXMOXVEX_VNC_WS_PORT) |
| 5002 | TCP | 127.0.0.1 |
LXC/SSH terminal | xterm.js WebSocket (PROXMOXVEX_SSH_WS_PORT) |
| 80 | TCP | all interfaces | Optional | HTTP → HTTPS redirect, only when running as root and not behind a proxy (PROXMOXVEX_HTTP_PORT, -1 disables) |
| 1514 | UDP + TCP | 127.0.0.1 |
Optional | Syslog receiver; exposed on all interfaces only with PROXMOXVEX_SYSLOG_BIND_ALL=1, or turned off via Settings → Syslog |
Notes on the defaults:
- The three app ports bind to loopback by default. Set
PROXMOXVEX_BIND_ALL=1(or Settings → Server) to serve the LAN, then restrict 5000–5002 to admin subnets. - Behind a reverse proxy or Cloudflare Tunnel, keep the app on
127.0.0.1and expose only the proxy’s port (443). The frontend routes the console WebSockets through the same public port; a locally-managed tunnel must map the WS paths to 5001/5002. - Setting
PROXMOXVEX_PORTshifts the console ports toPORT+1andPORT+2— adjust rules accordingly.
Outbound — to managed infrastructure
| Destination | Port | Protocol | Purpose |
|---|---|---|---|
| Proxmox VE nodes | 8006 | TCP | API, metrics, VNC console WebSocket |
| Proxmox VE / ESXi / XCP-ng nodes | 22 | TCP | SSH node operations and terminals; also carries the VNC tunnel |
| Proxmox Backup Server | 8007 | TCP | PBS API |
| ESXi / vCenter | 443 | TCP | vSphere API |
| XCP-ng hosts | 443 | TCP | XenAPI (80 when TLS is off) |
| PostgreSQL | 5432 | TCP | Only when the database is remote |
| LDAP / LDAPS directory | 389 / 636 | TCP | Directory authentication |
| OIDC provider | 443 | TCP | Single sign-on |
| SMTP relays, notification endpoints | 25, 465, 587, 443 | TCP | Mail and webhooks (Slack, Teams, Discord, PagerDuty, Apprise…) |
| DNS resolvers | 53 | UDP + TCP | Name resolution |
Example firewall rules
UFW (Debian/Ubuntu):
sudo ufw allow 5000:5002/tcp comment 'ProxmoxVEx UI + consoles'
sudo ufw allow 80/tcp comment 'ProxmoxVEx HTTP redirect' # only when running as root, no proxy
sudo ufw allow 1514 comment 'ProxmoxVEx syslog' # only with PROXMOXVEX_SYSLOG_BIND_ALL
firewalld (RHEL/Rocky/Alma/Fedora):
sudo firewall-cmd --permanent --add-port=5000-5002/tcp
sudo firewall-cmd --permanent --add-service=http # optional redirect
sudo firewall-cmd --permanent --add-port=1514/tcp --add-port=1514/udp # optional syslog
sudo firewall-cmd --reload
Your hypervisor nodes must in turn allow inbound SSH (22) and the API ports above from the ProxmoxVEx host.
Choose an install method
| Method | Best for | Command |
|---|---|---|
| One-command installer | Any supported distro on a fresh server — installs dependencies, PostgreSQL, the release archive, a systemd unit and firewall rules in one shot | apt update && apt install -y curl && curl -fsSL https://proxmoxvex.com/downloads/install.sh | sudo bash |
| Docker Compose | Fastest eval on any host — database bundled | docker compose up -d with docker-compose.yml from Downloads |
| Debian package | Debian 13 (trixie) hosts | sudo apt-get install -y ProxmoxVEx, then systemctl enable --now ProxmoxVEx |
| Release archive | Full control over the deployment — custom topologies, existing PostgreSQL, reverse proxy | Continue below |
The leading apt update && apt install -y curl bootstraps curl on minimal Debian/Ubuntu images that lack it — on RHEL-family use dnf install -y curl, on Arch pacman -Sy --noconfirm curl; if curl is already present you can go straight to curl -fsSL https://proxmoxvex.com/downloads/install.sh | sudo bash. On a terminal the installer opens a guided UI that reports prerequisites, offers any pending OS updates, and installs only what is missing; --no-interactive gives a plain unattended run.
The one-command installer accepts flags for unattended runs — e.g. curl -fsSL …/install.sh | sudo bash -s -- --port=443 --no-interactive (--no-firewall, --loopback-only, --no-offline, --no-tui are also available). To use an existing PostgreSQL instead of a local one, set PROXMOXVEX_DATABASE_URL before running it.
Docker, installer, and package installs can skip straight to first login. The rest of this page is the manual release-archive install.
Install from the release archive
1. Install system dependencies
Only the instructions matching the host OS selected above are shown. The packages cover the Python runtime, the PostgreSQL server, and the SSH helpers ProxmoxVEx uses for node-level operations.
Debian / Ubuntu (and Proxmox VE hosts)
sudo apt-get update
sudo apt-get install -y python3 python3-pip python3-venv \
postgresql postgresql-client \
openssh-client sshpass sudo \
curl wget git openssl ca-certificatesThen create the database and role:
sudo -u postgres psql -c "CREATE USER proxmoxvex WITH PASSWORD 'changeme';"
sudo -u postgres psql -c "CREATE DATABASE proxmoxvex OWNER proxmoxvex;"RHEL 9 / Rocky / Alma / Fedora
sudo dnf install -y epel-release # provides sshpass on RHEL-family
sudo dnf install -y python3 python3-pip \
postgresql-server postgresql \
openssh-clients sshpass sudo \
curl wget git openssl ca-certificates
# First-time PostgreSQL setup on RHEL-family:
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql
sudo -u postgres psql -c "CREATE USER proxmoxvex WITH PASSWORD 'changeme';"
sudo -u postgres psql -c "CREATE DATABASE proxmoxvex OWNER proxmoxvex;"On Fedora, postgresql-setup --initdb is replaced by sudo postgresql-setup --initdb --unit postgresql or simply enabling the service after initdb; package names are otherwise identical.
Arch Linux
sudo pacman -Syu --needed python python-pip \
postgresql \
openssh sshpass sudo \
curl wget git ca-certificates
sudo -u postgres initdb -D /var/lib/postgres/data
sudo systemctl enable --now postgresql
sudo -u postgres psql -c "CREATE USER proxmoxvex WITH PASSWORD 'changeme';"
sudo -u postgres psql -c "CREATE DATABASE proxmoxvex OWNER proxmoxvex;"Docker (any host OS)
No system dependencies beyond Docker itself — the image bundles Python 3.14 and all runtime tools:
curl -fSL -o docker-compose.yml https://proxmoxvex.com/downloads/docker-compose.yml
docker compose up -dThe compose stack includes a health-checked postgres:15-alpine container, so you can skip the database steps below and go straight to first login.
2. Download ProxmoxVEx
Download the latest release archive from the Downloads page and extract it into its own directory — the archive has no top-level folder, and it already contains the prebuilt frontend bundle, so no build step is required:
curl -fSL -o ProxmoxVEx-latest.tar.gz https://proxmoxvex.com/downloads/ProxmoxVEx-latest.tar.gz
mkdir -p ProxmoxVEx
tar -xzf ProxmoxVEx-latest.tar.gz -C ProxmoxVEx
cd ProxmoxVEx
3. Install Python dependencies
Create a virtual environment and install the requirements pinned in requirements.txt:
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
This installs the full stack: Flask 3 + gevent (web/WSGI), psycopg2 (PostgreSQL), paramiko (SSH), pyvmomi (ESXi), XenAPI (XCP-ng), cryptography/argon2-cffi/fido2 (security), ldap3 + PyJWT (SSO), and scapy/scikit-learn/pandas (IDS).
4. Configure and start
Point ProxmoxVEx at PostgreSQL and start the server. The schema is created automatically on first launch — no manual migration step:
export PROXMOXVEX_DATABASE_URL=postgresql://proxmoxvex:changeme@localhost:5432/proxmoxvex
python3 ProxmoxVEx_multi_cluster.py
Alternatively, pip install . provides a proxmoxvex console command equivalent to python3 ProxmoxVEx_multi_cluster.py. Standard PGHOST/PGUSER/PGPASSWORD/PGDATABASE variables are honored if PROXMOXVEX_DATABASE_URL is unset.
If you did not install as root, the app serves HTTPS on port 5000 with a generated self-signed certificate. To serve plain HTTP behind a reverse proxy instead, add PROXMOXVEX_BEHIND_PROXY=true.
5. Run as a systemd service
For anything beyond a quick evaluation, run ProxmoxVEx under systemd so it starts automatically on boot and restarts on failure. (The install.sh installer and the .deb package already create this unit — this section is for manual installs from the release archive.)
Create a dedicated service user and hand it ownership of the install directory (adjust /opt/ProxmoxVEx to wherever you unpacked the release):
sudo useradd --system --no-create-home --shell /bin/false ProxmoxVEx
sudo chown -R ProxmoxVEx:ProxmoxVEx /opt/ProxmoxVEx
Store runtime configuration in a root-only environment file so the database password stays out of the unit:
sudo mkdir -p /etc/ProxmoxVEx
sudo tee /etc/ProxmoxVEx/ProxmoxVEx.env > /dev/null <<'EOF'
PROXMOXVEX_DATABASE_URL=postgresql://proxmoxvex:changeme@localhost:5432/proxmoxvex
# PROXMOXVEX_BEHIND_PROXY=true
# PROXMOXVEX_PORT=5000
EOF
sudo chmod 600 /etc/ProxmoxVEx/ProxmoxVEx.env
Create /etc/systemd/system/ProxmoxVEx.service:
[Unit]
Description=ProxmoxVEx - Proxmox Cluster Management
After=network.target postgresql.service
Wants=network-online.target
[Service]
Type=simple
User=ProxmoxVEx
Group=ProxmoxVEx
WorkingDirectory=/opt/ProxmoxVEx
Environment=PATH=/opt/ProxmoxVEx/.venv/bin:/usr/local/bin:/usr/bin:/bin
EnvironmentFile=-/etc/ProxmoxVEx/ProxmoxVEx.env
ExecStart=/opt/ProxmoxVEx/.venv/bin/python /opt/ProxmoxVEx/ProxmoxVEx_multi_cluster.py
Restart=always
RestartSec=5
# Lets the service bind privileged ports (e.g. 443) without running as root
AmbientCapabilities=CAP_NET_BIND_SERVICE
PrivateTmp=true
StandardOutput=journal
StandardError=journal
SyslogIdentifier=ProxmoxVEx
[Install]
WantedBy=multi-user.target
Reload systemd, then enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable --now ProxmoxVEx
sudo systemctl status ProxmoxVEx
enable --nowstarts the service immediately and marks it to launch on every boot (WantedBy=multi-user.target).Restart=alwayswithRestartSec=5brings the app back automatically after a crash or reboot.After=postgresql.serviceensures the database is up first when PostgreSQL runs on the same host — drop it if you use a remote database.- Follow logs with
sudo journalctl -u ProxmoxVEx -f; the app also writes tologs/inside the install directory.
To change the port or other settings later, edit /etc/ProxmoxVEx/ProxmoxVEx.env and run sudo systemctl restart ProxmoxVEx.
First login
Open https://<server-ip>:5000 (http:// when PROXMOXVEX_BEHIND_PROXY=true). The first visit shows the setup wizard, where you create the administrator account. Two-factor setup (TOTP or WebAuthn/FIDO2) is available immediately after.
Connect a Proxmox VE cluster
After logging in, navigate to Clusters → Add Cluster and provide:
- Cluster name
- Proxmox VE host URL (e.g.
https://pve.example.com:8006) - API user (
root@pamor a dedicated user such asproxmoxvex@pve) - API token or password
ProxmoxVEx will validate the connection and begin streaming live metrics. Repeat for ESXi/vCenter or XCP-ng hosts to manage them side by side.
Next steps
- Browse the feature catalog.
- Review the architecture overview.
- Compare ProxmoxVEx with other platforms on the comparison page.
- Open a support request on the Support page.