Set up Proxmox VE discovery
Connect a Proxmox VE cluster so Scanopy discovers its nodes and the VMs and LXC containers on each, with their addresses and the node they run on.
A Proxmox VE cluster keeps a list of every node and every guest it runs. Scanopy reads that list through the Proxmox VE API and records each node and guest as a host, with each guest linked to the node that runs it.
Beta
The Proxmox VE integration is in beta. Data collection may be incomplete and the credential fields may change in a future release. Please report anything that looks wrong.
Before you start
Proxmox VE credentials are created under Assets > Credentials and can be pointed at Daemon hostRemote hosts.
Creating a credential, assigning it, and overriding it on an individual host work the same way for every integration — see Creating a credential, Where a credential applies, and Auto-assignment. This guide covers only what is specific to Proxmox VE.
Any node's API answers for the whole cluster, so the credential goes on one Proxmox VE node, or on the daemon host when the daemon runs on a node. Assigning it to more than one node does no harm. Each node reports the same cluster, and the results land on the same hosts.
What gets discovered
On each scan, the daemon reads the cluster's node and guest lists:
| From the cluster | Becomes |
|---|---|
| Each node | A host named after the node, with a Proxmox VE service |
| Each QEMU VM and LXC container | A host, linked to the Proxmox VE service of the node it runs on |
| VM addresses from the QEMU guest agent | The VM host's IP addresses, with each NIC's MAC |
LXC container interfaces, or the static ip= in its config | The container host's IP addresses, with each NIC's MAC |
| The guest name set in Proxmox VE | The host's name, shown as authored by Proxmox VE. See Host Naming |
| Interfaces the guest agent reports beyond the VM's configured NICs, each with its own MAC and a LAN address (macvlan links, virtual IPs) | A host per interface, tagged Network identity and linked to a Network Identities service on the guest. See Network Identities |
Guests appear grouped under their node in the Workloads perspective.
Templates are skipped. Every other guest is recorded, with whatever addresses the API reports for it:
| Guest | Address source |
|---|---|
Running VM with qemu-guest-agent installed and the QEMU Guest Agent option on | The guest agent |
| Running LXC container | The container's interfaces |
VM with a cloud-init static address, or LXC container with a static ip= | The guest's config |
| Stopped VM, or a VM without the guest agent and with DHCP | None. The guest is recorded by its NIC's MAC |
The guest host records only addresses on the guest's own NICs. Container bridges such as docker0, tunnels such as WireGuard, and loopback are left out. An interface with its own MAC and a LAN address becomes a network identity host instead. A guest recorded by its MAC alone gains its address when a network scan finds it, and stays one host.
Prerequisites
- Proxmox VE 8.x or 9.x
- A daemon running version 0.17.21 or later
- TCP port 8006 open from the daemon host to the node the credential is assigned to
- A dedicated Proxmox VE user and API token with read access to the cluster (see below)
- The daemon accepts the node's certificate (see below)
Create the user and token
Run these as root on any node:
pveum user add scanopy@pve --comment "Scanopy discovery"
pveum role add ScanopyGuestAgent --privs "VM.GuestAgent.Audit"
pveum acl modify / --users scanopy@pve --roles PVEAuditor
pveum acl modify / --users scanopy@pve --roles ScanopyGuestAgent
pveum user token add scanopy@pve discovery --privsep 0On Proxmox VE 8.x, create the role with --privs "VM.Monitor" instead. VM.GuestAgent.Audit exists only on 9.x.
The last command prints the token secret once. Copy it before closing the terminal.
To do the same in the web interface, go to Datacenter → Permissions. Add the user under Users, the role under Roles, the token under API Tokens, and both role assignments on / under Permissions.
With privilege separation on (--privsep 1, or Privilege Separation checked in the web interface), the token holds its own permissions. Grant both ACLs to the token instead of the user:
pveum acl modify / --tokens 'scanopy@pve!discovery' --roles PVEAuditor
pveum acl modify / --tokens 'scanopy@pve!discovery' --roles ScanopyGuestAgent| Privilege | Comes from | Used for |
|---|---|---|
Sys.Audit | PVEAuditor on / | Node addresses from /cluster/status |
VM.Audit | PVEAuditor on / | Guest configs and the cluster resource list |
VM.GuestAgent.Audit (9.x) or VM.Monitor (8.x) | The custom role | VM addresses from the guest agent |
Certificates
Each node serves a self-signed certificate issued by the cluster's own CA. The daemon accepts it in either of two ways:
| Option | Setting |
|---|---|
| Accept any certificate | Accept Invalid Scan Certificates (SCANOPY_ACCEPT_INVALID_SCAN_CERTS), on by default |
| Keep verification on and trust the cluster CA | Copy /etc/pve/pve-root-ca.pem from a node to the daemon host and point SCANOPY_TRUSTED_CA_BUNDLE at it |
Choosing a credential type
Proxmox VE has one credential type.
| Credential type | How it connects | Can be targeted at | Requires daemon |
|---|---|---|---|
| Proxmox VE API TokenBeta | Connects to a node's API over HTTPS with an API token. | Daemon hostRemote hosts | 0.17.21 or later |
Proxmox VE API Token
The daemon connects to the node's API over HTTPS and sends the token with each request. Tokens hold no session, and they expire only if you set an expiry when creating them.
| Field | Required | Default | Description |
|---|---|---|---|
| Connection | |||
| API Port | Optional | 8006 | The port the Proxmox VE web interface and API listen on. 8006 unless a reverse proxy sits in front of it. |
| Authentication | |||
| Token ID | Required | None | The full token ID, user@realm!tokenname (Datacenter → Permissions → API Tokens). Give the token the PVEAuditor role on / and, for VM addresses from the guest agent, VM.GuestAgent.Audit on Proxmox VE 9 or VM.Monitor on 8. Assign the credential to one node: its API answers for the whole cluster. |
| Token SecretSecret | Required | None | The secret shown once when the token is created, a UUID. |
Token ID is the full ID in the form user@realm!tokenname, such as scanopy@pve!discovery. Token Secret is the UUID Proxmox VE shows once at creation. It takes the value with Enter value, or a path to a file holding it with File on daemon host.
Verifying it works
- Run a discovery from Discover > Scan > Scheduled
- Open the scan session. The credential appears in the session's credential summary
- Check Assets > Hosts for a host per node, each with a Proxmox VE service
- Check Assets > Hosts for the running VMs and containers, named as in Proxmox VE
- Open the Workloads perspective and confirm the guests appear under their node
Troubleshooting
The token is rejected
The node returns 401 when the token ID or secret is wrong, or the token has expired. Check the Token ID includes both the user and the token name (scanopy@pve!discovery, not scanopy@pve). Check the token's expiry under Datacenter → Permissions → API Tokens. A lost secret cannot be shown again. Remove the token and create a new one.
Guests appear without a link to their node
The scan reports a partial result for Proxmox VE nodes. The token lacks Sys.Audit, so the daemon cannot read node addresses from /cluster/status, and guests on a multi-node cluster are recorded without their node. Grant PVEAuditor on / to the user, or to the token when privilege separation is on.
VMs have no addresses
A running VM's address comes from the QEMU guest agent, or from a cloud-init static address. Without either, the VM is recorded by its MAC until a network scan finds its address. For the agent, check each of these:
qemu-guest-agentis installed and running inside the VM- The VM's Options → QEMU Guest Agent is on, and the VM was restarted after turning it on
- The token has
VM.GuestAgent.Auditon Proxmox VE 9.x, orVM.Monitoron 8.x
Certificate errors
The node's self-signed certificate fails verification. Turn on Accept Invalid Scan Certificates for the daemon, or add /etc/pve/pve-root-ca.pem to its SCANOPY_TRUSTED_CA_BUNDLE. See Certificates.
Other nodes are missing, or their guests are not linked
The daemon records the node it queries at the address it scanned. It records every other node at the cluster address /cluster/status reports. When that address sits on a dedicated corosync network outside any subnet Scanopy knows, the node is not recorded, its guests lose their link to it, and the scan reports a partial result for Proxmox VE nodes. Assign the credential to each node, so each one is recorded at its scanned address, or make the corosync network reachable from the daemon.
For diagnosing credential loading and file read errors from daemon logs, see Credential troubleshooting.
Set up Podman discovery
How Scanopy discovers Podman containers and pods through the local socket with a Podman Socket credential, or through a remote Podman API proxy.
Set up UniFi discovery
Connect a UniFi Network Application controller so Scanopy can discover the switches, access points and gateways it manages, along with their ports and LLDP neighbors.