Add a Proxmox VE importer that reads the /api2/json REST API with a read-only
API token and drops hosts (proxmox), VMs (vm) and LXC containers (lxc) onto the
canvas as typed nodes with run state and hardware specs (vCPU/RAM/disk).
- Backend: proxmox_service (httpx) + proxmox routes (test-connection, import,
import-pending, config). Two-tier dedupe — merge onto an existing scanned node
by IP, else synthetic pve-{host}-{vmid} identity. Update-in-place, never
deletes. Host->guest rendered as a 'virtual' edge via the pending-link flow.
- Security: token is env-only (PROXMOX_TOKEN_*), never written to disk by the
app, never returned by any endpoint; errors are credential-sanitized.
- Auto-sync: optional scheduled re-import into pending (APScheduler job).
- PendingDevice.properties carries specs through approve (+ migration).
- Frontend: ProxmoxImportModal, sidebar entry, pending inventory source filter,
Settings auto-sync section, proxmoxApi client.
- Docs: docs/proxmox-import.md, README + FEATURES sections, .env.example keys.
- Tests: backend service/router/scheduler, frontend modal/client/pending.
ha-relevant: maybe
7.4 KiB
Proxmox VE Import
This feature connects Homelable to your Proxmox VE host, reads the inventory over the Proxmox REST API, and drops your hosts, VMs and LXC containers onto the canvas as typed nodes — with names, run state and hardware specs. It can also sync on a schedule so the canvas keeps up with your cluster, and it merges with devices already discovered by a network scan (a VM whose guest IP was already scanned is updated in place, not duplicated).
🔒 Server-dependent feature — requires the Homelable backend. It is hidden in the no-backend standalone/demo build.
Feature Overview
- API-based discovery — Reads
/api2/jsonfrom Proxmox VE using a read-only API token. - Typed nodes — Devices map to existing Homelable node types:
proxmox— a Proxmox host / cluster member (becomes a parent)vm— a QEMU/KVM virtual machinelxc— an LXC container
- Hierarchy — Each host is linked to its VMs/LXC with a
virtualedge. - Hardware specs — vCPU count, RAM and disk size are imported as node properties (CPU Cores, RAM, Disk), hidden by default — toggle them on from the right panel.
- Guest IPs — QEMU IPs come from the guest agent (when installed); LXC IPs are parsed from the container's static
net0config. - Merge / sync — Re-importing updates existing devices in place and never deletes anything. A guest IP matching a previously scanned node merges onto it.
- Auto-sync — Optional scheduled re-import into the pending inventory.
Prerequisites
- A reachable Proxmox VE host (default API port
8006). - A Proxmox API token with a read-only role (see below).
- (Optional, for QEMU guest IPs) the QEMU guest agent installed in your VMs.
Create an API token
In the Proxmox web UI:
- Datacenter → Permissions → API Tokens → Add.
- Pick a User (e.g.
root@pam, or better a dedicatedhomelable@pveuser). - Give the token an ID (e.g.
homelable). The full token id is thenuser@realm!tokenid— for exampleroot@pam!homelable. - Leave Privilege Separation checked (recommended) and click Add.
- Copy the secret now — Proxmox shows it only once.
Grant the token (or its user) a read-only role:
- Datacenter → Permissions → Add → API Token Permission.
- Path
/, select your token, RolePVEAuditor, enable Propagate.
PVEAuditor is read-only — Homelable never needs write access.
Where the token is stored
The token is a real credential and is treated as one:
- For a one-off import, type the token into the import dialog. It is sent with that request only and is never stored.
- For auto-sync (which runs with no user present), configure the token on the
server via environment variables (below). It is read from
.env, kept in memory, never written to disk by the app, and never returned by any API endpoint. Connection errors are sanitized so the token can't leak in a message.
# backend/.env
PROXMOX_TOKEN_ID=root@pam!homelable
PROXMOX_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
PROXMOX_HOST=192.168.1.10 # optional default for auto-sync
PROXMOX_PORT=8006
PROXMOX_VERIFY_TLS=true # set false only for self-signed certs
Step-by-step Usage
1. Open the Proxmox Import dialog
Click Proxmox Import in the left sidebar (below "Z-Wave Import").
2. Configure the connection
| Field | Default | Description |
|---|---|---|
| Proxmox Host | — | IP or hostname of the Proxmox host |
| Port | 8006 | Proxmox API port |
| Token ID | (optional) | user@realm!tokenid; leave blank to use the server token |
| Token Secret | (optional) | The token secret; leave blank to use the server token |
| Verify TLS | on | Uncheck for self-signed certificates |
3. Test the connection (optional)
Click Test Connection. A green indicator confirms reachability + a valid token; red shows a sanitized error.
4. Choose an import target
- Pending section — Devices are queued in the Device Inventory for review (and tracked as a scan run in Scan History). Approve, hide, or delete each.
- Canvas directly — Devices are fetched and shown grouped in the dialog so you can pick which ones to add immediately.
5. Fetch inventory
Click Import to Pending (or Fetch Inventory in canvas mode). Homelable will:
- Query
/nodesfor hosts - Query
/qemuand/lxcper host - Resolve guest IPs (agent for QEMU,
net0for LXC) best-effort - Return hosts + guests grouped by type
6. Select and add to canvas
(Canvas mode) Devices are grouped by type (Hosts / Virtual Machines / LXC Containers). Use the checkboxes to pick which to add, then Add N to Canvas.
7. Arrange on the canvas
Nodes are placed in a grid; host→guest virtual edges connect them. Use
Auto Layout or drag nodes manually.
Node Type Mapping
Proxmox (/api2/json) |
Homelable type | Notes |
|---|---|---|
/nodes (host) |
proxmox |
Becomes the parent, linked to its guests |
/nodes/{node}/qemu/{vmid} |
vm |
Guest-agent IP when available |
/nodes/{node}/lxc/{vmid} |
lxc |
Static net0 IP when set |
status running/stopped |
node status online/offline | |
maxcpu |
CPU Cores property | hidden by default |
maxmem |
RAM property (GB) | hidden by default |
maxdisk |
Disk property (GB) | hidden by default |
| VMID + host | synthetic identity (pve-{host}-{vmid}) |
stable across re-imports |
Guest hierarchy is rendered as virtual edges (host ↔ VM/LXC).
Auto-sync configuration
- Configure
PROXMOX_TOKEN_ID/PROXMOX_TOKEN_SECRET(and optionallyPROXMOX_HOST) inbackend/.envand restart the backend. - Open Settings — a Proxmox auto-sync section appears once a server token is configured.
- Toggle Auto-sync Proxmox inventory and set the interval (min 300 s).
On each run, Homelable re-imports the inventory into the pending section:
- New VMs/LXC appear as pending for review.
- Existing devices are updated in place (status, specs, IP).
- Nothing is ever deleted — a VM removed from Proxmox is left on your canvas.
Security notes
- Use a dedicated user + token with the read-only
PVEAuditorrole. - The token is never persisted to disk by Homelable and never included in any API response; only a boolean "token configured" flag is exposed.
- Keep
PROXMOX_VERIFY_TLS=truein production; disable only for self-signed labs. - Error messages are sanitized so credentials cannot leak.
Supported Versions
Works with the Proxmox VE 7.x / 8.x REST API (/api2/json). No extra Proxmox
plugins are required.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| "Authentication failed" | Bad token id/secret or missing role | Re-check the token; grant PVEAuditor at / |
| "TLS verification failed" | Self-signed certificate | Uncheck Verify TLS (labs only) |
| "Proxmox host could not be resolved" | DNS/hostname wrong | Use the IP or a resolvable name |
| "No API token provided and none configured" | No token in the form and none in .env |
Enter a token or set the server env vars |
| VMs have no IP | No guest agent (QEMU) / DHCP-only LXC | Install the QEMU guest agent; static IPs are read from net0 |
| Duplicate-looking node | Same guest under a different identity | Re-import merges by IP/VMID; report if it persists |
Screenshots
(Screenshots will be added in a future release)