| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Proxbox is a NetBox plugin that synchronizes Proxmox infrastructure data into NetBox. It keeps your DCIM up-to-date with real Proxmox clusters, nodes, virtual machines, containers, backups, and Firecracker micro-VM inventory used by the NMS Cloud runtime.
Proxbox discovers and syncs the following from Proxmox into NetBox:
Note: All metrics (CPU, memory, uptime, etc.) are captured as point-in-time snapshots at sync time, not continuous monitoring.
Sync runs on-demand from the NetBox UI or scheduled automatically via NetBox's job system.
Proxbox can be extended with standalone companion plugins. Install only the plugins you need; netbox-proxbox remains the base plugin and must be enabled before any companion plugin. The infrastructure inventory plugins declare netbox-proxbox>=0.0.18 as a dependency, while netbox-packer and netbox-rpc follow the same operational conventions for the Proxbox plugin family. netbox-rpc is an operational companion: when it is installed, netbox-proxbox can run audited SSH procedures against Proxmox hosts (for example installing the proxbox-api cloud-image-build SSH key on a node, or collecting systemd service status for an endpoint) through the netbox-rpc engine instead of handling SSH itself. The integration is a soft dependency — see netbox_proxbox/integrations/rpc.py.
| Package | NetBox plugin | What it adds |
|---|---|---|
| netbox-pdm | netbox_pdm | Inventories Proxmox Datacenter Manager endpoints and the PVE/PBS remotes managed by PDM. It links PDM remotes back to Proxbox Proxmox endpoints and, when installed, netbox-pbs backup servers. |
| netbox-pbs | netbox_pbs | Inventories Proxmox Backup Server infrastructure, including PBS servers, datastores, backup snapshots, and scheduled job history. |
| netbox-ceph | netbox_ceph | Adds read-only Ceph cluster inventory for Proxmox-managed Ceph: clusters, daemons, OSDs, pools, filesystems, CRUSH rules, flags, and health checks. |
| netbox-packer | netbox_packer | Tracks HashiCorp Packer image definitions and build execution records for Proxmox VM templates and image-factory workflows. |
| netbox-rpc | netbox_rpc | Audited SSH/RPC procedure engine. netbox-proxbox optionally uses it to install SSH keys on Proxmox hosts and to collect Proxmox endpoint systemd service status via netbox_proxbox.integrations.rpc. |
For a standard NetBox virtualenv install, activate the NetBox environment and install the packages you want:
source /opt/netbox/venv/bin/activate
pip install netbox-pbs netbox-pdm netbox-ceph netbox-packerEnable the selected plugins in netbox/netbox/configuration.py. Keep netbox_proxbox first. If you enable netbox_pdm, enable netbox_pbs before it because PDM can link to PBS server records.
PLUGINS = [
"netbox_proxbox",
"netbox_pbs",
"netbox_pdm",
"netbox_ceph",
"netbox_packer",
]Run migrations for the selected plugins, preserving the same order:
cd /opt/netbox/netbox
python3 manage.py migrate netbox_proxbox
python3 manage.py migrate netbox_pbs
python3 manage.py migrate netbox_pdm
python3 manage.py migrate netbox_ceph
python3 manage.py migrate netbox_packer
python3 manage.py collectstatic --no-input
sudo systemctl restart netbox netbox-rqFor netbox-docker, add the selected packages to plugin_requirements.txt, enable the matching plugin module names in configuration/plugins.py, rebuild, and run migrations:
netbox-pbs
netbox-pdm
netbox-ceph
netbox-packerdocker compose build
docker compose up -d
docker compose exec netbox /opt/netbox/netbox/manage.py migrateFull companion-plugin details live under docs/companion-plugins/.
Endpoint records are inventory/configuration objects even when disabled. For ProxmoxEndpoint, NetBoxEndpoint, FastAPIEndpoint, PBSEndpoint, PDMEndpoint, and companion endpoint objects that expose an enabled field, enabled=False is a hard operational gate: netbox-proxbox keeps the row visible in UI/API output, but status checks, backend registration, OpenAPI fetches, sync scopes, keepalive probes, and startup/signal pushes must return before any proxbox-api or remote-service connection attempt.
The Proxmox Endpoints list shows the Enabled column by default. Operators can select multiple rows and use Enable Selected or Disable Selected to toggle the local ProxmoxEndpoint.enabled flag in bulk; those list actions do not call proxbox-api or Proxmox.
Disabled Proxmox endpoints render as a gray Disabled status badge on the list, detail page, and dashboard card. These UI surfaces do not attach live status polling metadata for disabled rows, so the browser does not repaint an administratively disabled endpoint as a red error.
Service monitoring is opt-in per ProxmoxEndpoint. An endpoint is eligible only when allow_writes=True, access_methods="api_ssh", and the endpoint has a complete registered SSH credential. Collection is agentless from the Proxbox plugin perspective: netbox-proxbox creates a netbox-rpc RPCExecution for the read-only procedure os.linux.proxmox.show_systemctl_services with params {proxmox_endpoint_id, units} and assigned object set to the endpoint. The RPC backend uses the endpoint's own SSH credential; netbox-proxbox does not open SSH sockets or run shell commands itself.
Execution is asynchronous. Phase 1 queues the RPC job and records a pending ProxmoxServiceCollection. Phase 2 runs from the periodic service-monitoring tick and from the endpoint Services tab render path: completed executions are projected into raw ProxmoxServiceSample rows, latest ProxmoxServiceStatus rows, and endpoint heartbeat fields. A reachable=false RPC result is recorded as an unreachable node outcome, not as a projection error.
ProxmoxEndpoint.allowed_tenants controls which Proxmox endpoint rows are eligible for tenant-scoped NMS Cloud callers. An empty allow-list means the endpoint stays in the default/global pool. A non-empty allow-list pins that endpoint to the listed tenants.
The paired nms-backend contract is intentionally asymmetric: if a tenant has no explicit endpoint grants, it may still see global/default endpoints; once that tenant matches any explicitly granted endpoint, the backend hides the global pool and returns only the explicit matches. Use this to pin a tenant such as Confitec to a single cluster without changing the default pool for other tenants.
Current pairing: netbox-proxbox 0.0.23.post1 <-> proxbox-api (guest-VM-interface writer build / next release) <-> proxmox-sdk 0.0.12 <-> netbox-sdk 0.0.10.
Paired with backend: guest-VM-interface writer build / next release.
Full notes: Release Notes - v0.0.23.post1.
Current pairing: netbox-proxbox 0.0.23 <-> proxbox-api (guest-VM-interface writer build / next release) <-> proxmox-sdk 0.0.12 <-> netbox-sdk 0.0.10.
Paired with backend: guest-VM-interface writer build / next release.
Full notes: Release Notes - v0.0.23.
Current pairing: netbox-proxbox 0.0.22 <-> proxbox-api 0.0.19.post5 <-> proxmox-sdk 0.0.12 <-> netbox-sdk 0.0.10.
Paired with backend proxbox-api 0.0.19.post5.
Full notes: Release Notes - v0.0.22.
Paired with backend proxbox-api 0.0.18.post5.
Full notes: Release Notes - v0.0.21.
Paired with backend proxbox-api 0.0.17.post1.
Full notes: Release Notes - v0.0.20.post3.
Paired with backend proxbox-api 0.0.17.post1.
Full notes: Release Notes - v0.0.20.post2.
Paired with backend proxbox-api 0.0.17.post1.
Full notes: Release Notes - v0.0.20.post1.
Paired with backend proxbox-api 0.0.17.
Full notes: Release Notes - v0.0.20.
Paired with backend proxbox-api 0.0.16.
Full notes: Release Notes — v0.0.19.
Paired with backend proxbox-api 0.0.14.
Full notes: Release Notes — v0.0.18.
| NetBox | netbox-proxbox | proxbox-api | netbox-sdk | proxmox-sdk |
|---|---|---|---|---|
| >=4.5.8 | v0.0.23.post1 | guest-VM-interface writer build / next release | v0.0.10 | v0.0.12 |
| >=4.5.8 | v0.0.23 | guest-VM-interface writer build / next release | v0.0.10 | v0.0.12 |
| >=4.5.8 | v0.0.22 | v0.0.19.post5 | v0.0.10 | v0.0.12 |
| >=4.5.8 | v0.0.21 | v0.0.18.post5 | v0.0.10 | v0.0.12 |
| >=4.5.8 | v0.0.20.post3 | v0.0.17.post1 | v0.0.9.post1 | v0.0.11.post1 |
| >=4.5.8 | v0.0.20.post2 | v0.0.17.post1 | v0.0.9.post1 | v0.0.11.post1 |
| >=4.5.8 | v0.0.20.post1 | v0.0.17.post1 | v0.0.9.post1 | v0.0.11.post1 |
| >=4.5.8 | v0.0.20 | v0.0.17 | v0.0.8.post1 | v0.0.11 |
| >=4.5.8 | v0.0.19 | v0.0.16 | v0.0.8.post1 | v0.0.9 |
| >=4.5.8 | v0.0.18.post1 | v0.0.14 | v0.0.8.post1 | v0.0.3.post1 |
| >=4.5.8 | v0.0.18 | v0.0.14 | v0.0.8.post1 | v0.0.3.post1 |
| >=4.5.8 | v0.0.17 | v0.0.13 | v0.0.8.post1 | v0.0.3.post1 |
See COMPATIBILITY.md for the full version compatibility table.
Choose the installation path that matches your NetBox deployment:
Install the plugin into your NetBox virtual environment (host/venv deployment):
cd /opt/netbox/netbox
git clone https://github.com/emersonfelipesp/netbox-proxbox.git
source /opt/netbox/venv/bin/activate
pip install -e ./netbox-proxboxEnable the plugin in netbox/netbox/configuration.py:
PLUGINS = ["netbox_proxbox"]Run migrations and collect static files:
python3 manage.py migrate netbox_proxbox
python3 manage.py collectstatic --no-input
sudo systemctl restart netboxInstall the Proxbox API backend:
mkdir -p /opt/proxbox-api
cd /opt/proxbox-api
python3 -m venv venv
source venv/bin/activate
pip install proxbox-api
uvicorn proxbox_api.main:app --host 0.0.0.0 --port 8800Or use Docker (the published image runs nginx on port 8000 inside the container, in front of uvicorn):
docker run -d --name proxbox-api -p 8800:8000 emersonfelipesp/proxbox-api:latestHTTPS with mkcert (optional): the backend also publishes emersonfelipesp/proxbox-api:latest-mkcert (and :<version>-mkcert). nginx terminates TLS there (mkcert certs) on PORT (default 8000); add more certificate names or IPs with MKCERT_EXTRA_NAMES (comma- or space-separated). Example:
docker run -d --name proxbox-api-tls \
-p 8800:8000 \
-e MKCERT_EXTRA_NAMES='proxbox.backend.local' \
emersonfelipesp/proxbox-api:latest-mkcertPoint your NetBox ProxBox API endpoint at https://<host>:8800 (or your mapped port). Trust the mkcert root on clients if needed; see the proxbox-api README for build flags, CAROOT, and details.
Configure endpoints in NetBox:
Run your first sync:
Click Full Update on the Proxbox home page. Progress appears in real-time.
If your NetBox runs with netbox-community/netbox-docker, install the plugin through the Docker plugin files in your NetBox Docker project:
Add plugin requirements to plugin_requirements.txt (PyPI or Git):
netbox-proxbox
# or
# netbox-proxbox @ git+https://github.com/emersonfelipesp/netbox-proxbox.gitEnable the plugin in configuration/plugins.py:
PLUGINS = ["netbox_proxbox"]Rebuild and restart NetBox:
docker compose build
docker compose up -dRun migrations in the NetBox container:
docker compose exec netbox /opt/netbox/netbox/manage.py migrateFor complete Docker installation instructions, validation checks, and Git/source install examples, see docs/installation/3-installing-plugin-docker.md.
Proxbox sync jobs run on NetBox's default RQ queue. A standard NetBox installation already ships a netbox-rq systemd service that runs:
manage.py rqworker high default low
Check whether it is running before doing anything else:
sudo systemctl status netbox-rqIf it is active (running), you have nothing extra to configure — Proxbox jobs will be picked up automatically.
If the service is inactive or missing, enable it:
sudo systemctl enable --now netbox-rqThe unit file is provided by NetBox at contrib/netbox-rq.service in the NetBox repository. If you need to create it manually, copy it from there and run:
sudo systemctl daemon-reload
sudo systemctl enable --now netbox-rqUpgrading from an older Proxbox release? Jobs used to be enqueued on the netbox_proxbox.sync queue. The stock netbox-rq service does not listen to that queue, so old-style jobs will not run. New jobs always use default and are picked up without any changes.
Disabled ProxmoxEndpoint rows are hard-excluded from operational reads and sync jobs. The scheduler, CLI sync command, dashboard cards, keepalive checks, HA/storage/firewall/SDN/datacenter live reads, backend endpoint preflight, and stale scheduled job parameters all filter to enabled=True before contacting proxbox-api or Proxmox. To pause a production endpoint, set Enabled to false; the row remains visible in the API and UI but no connection attempt is made for that endpoint.
Track job status under Proxbox > Sync Jobs or Operations > Background Jobs.
Proxbox sync jobs default to a 7200-second (2-hour) RQ wall-clock limit (PROXBOX_SYNC_JOB_TIMEOUT). NetBox's default RQ_DEFAULT_TIMEOUT is only 300 s, which would kill long syncs. No configuration is needed unless your syncs routinely take longer than two hours; if they do, override the constant in netbox_proxbox/jobs.py.
| Symptom | Likely cause | Fix |
|---|---|---|
| Job stays pending | No RQ worker running, or worker not listening to default queue | Start/restart manage.py rqworker |
| Job stays running for a long time | Proxbox API is still syncing or stream is slow | Check the job Log tab; wait or inspect the backend |
| Job errored: JobTimeoutException | RQ wall-clock limit exceeded | Increase PROXBOX_SYNC_JOB_TIMEOUT in netbox_proxbox/jobs.py |
| Disabled endpoint still appears in /api/plugins/proxbox/endpoints/proxmox/ | Expected API behavior; disabled rows remain inventory records | Leave it disabled to prevent all connection attempts. Re-enable only when the endpoint should participate in cards, checks, and sync jobs again. |
| VM IP addresses stay empty after upgrade | The separate proxbox-api backend is too old, is on the v0.0.13/v0.0.14 agent-flag warning window, existing VMs still lack proxmox_vm_id, or the Proxmox role lacks guest-agent privileges | Check the FastAPI card warning on the Proxbox home page. Run proxbox-api >= 0.0.13 at minimum; if the warning references PR #156, install a backend build containing that fix or the next fixed backend release. Then run Full Update so existing VMs get proxmox_vm_id before the IP-address stage runs. For PVE 9, also confirm VM.GuestAgent.Audit. |
| HTTP 401 Authentication failed! against Proxmox VE 9.x | A stale stored token is overriding fresh password credentials, or the role is missing PVE 9 permissions | On the Proxmox endpoint edit page, tick "Clear stored API token on save" (and/or "Clear stored password on save") to wipe the unused secret. The form rejects rows that end up with neither a password nor a complete (token name, token value) pair. Confirm the role on Proxmox grants Datastore.Audit, Sys.Audit, VM.Audit, and on PVE 9 also VM.GuestAgent.Audit. The plugin now surfaces the upstream PVE 9 error message in the UI instead of "Unknown error.", which makes "no such realm" / "expired token" / "missing privilege" failures self-diagnosing. |
The Proxmox endpoint edit form preserves the stored password and token value when you submit blank masked fields — that is intentional for partial edits. When you genuinely want to switch auth modes (for example, password → token or vice versa, or rotate a leaked secret), tick the matching "Clear stored …" checkbox so the unused credential is wiped on save. Clearing the token always clears both token name and token value together so the row never persists in a half-token state.
Full documentation is available at emersonfelipesp.github.io/netbox-proxbox.
Key pages:
Before any destruction-adjacent operation, read AGENTS.md §"LLM Agent Safety Guardrails".
Proxbox protects VM destruction behind a five-lock chain. LLM agents MUST NOT:
The DeletionRequest REST endpoint (/api/plugins/proxbox/deletion-requests/) is read-only — enforced by netbox_proxbox/api/views.py::DeletionRequestViewSet.http_method_names = ["get", "head", "options"]. Pinned by tests/test_static_guardrails.py.
See DEVELOP.md for development setup and contribution guidelines.
If Proxbox has been useful for you, consider supporting the project on GitHub Sponsors:
| Back | FazBrowse Home | New Git URL |