Getting started
Verify a release
Every file on downloads.nexpanel.app is signed with the NexPanel release key (Ed25519). The private key is kept offline; the download server only holds public files.
The release key
Public key: https://downloads.nexpanel.app/keys/nexpanel-release.pub
Fingerprint: 471253db7961a1b2554230e7ba8e65f53805d1f88d45328e1b5826274199e6da
The fingerprint is the SHA-256 of the key in DER form:
openssl pkey -pubin -in nexpanel-release.pub -outform DER | sha256sum
Compare it with the fingerprint on this page and on a second source you trust before relying on it.
Check any file
Each file has a signature next to it with .sig added to the name:
curl -fsSO https://downloads.nexpanel.app/control/v1.0.4/nexpanel-controller-1.0.4.tar.gz
curl -fsSO https://downloads.nexpanel.app/control/v1.0.4/nexpanel-controller-1.0.4.tar.gz.sig
openssl pkeyutl -verify -pubin -inkey nexpanel-release.pub -rawin \
-in nexpanel-controller-1.0.4.tar.gz -sigfile nexpanel-controller-1.0.4.tar.gz.sig
Checksums and the manifest
| File | What it is |
|---|---|
manifest/stable.json (+ .sig) |
The current release: version, download URL, SHA-256, size, release notes and requirements for the controller, agent and LVE manager |
checksums/SHA256SUMS-<version> (+ .sig) |
SHA-256 of every file in that release |
agent/v<version>/, control/v<version>/, packages/almalinux/9/ |
Versioned packages — the installer and the panel always use these |
agent/latest/ |
A copy of the newest agent for manual downloads |
To check a download against the signed checksum list:
curl -fsSO https://downloads.nexpanel.app/checksums/SHA256SUMS-1.0.4
curl -fsSO https://downloads.nexpanel.app/checksums/SHA256SUMS-1.0.4.sig
openssl pkeyutl -verify -pubin -inkey nexpanel-release.pub -rawin -in SHA256SUMS-1.0.4 -sigfile SHA256SUMS-1.0.4.sig
grep nexpanel-controller-1.0.4.tar.gz SHA256SUMS-1.0.4
sha256sum nexpanel-controller-1.0.4.tar.gz
What NexPanel checks automatically
- The installer verifies the manifest (or checksum list) and every package before running it.
- The controller shows an update only when the manifest's signature matches the key, and ignores a manifest older than one it has already seen.
- Each agent downloads the package itself and checks its SHA-256 and signature with the key compiled into the agent.
- The controller updater (root) downloads the manifest and the package again and checks both before installing.
Wrong or missing something? Let us know.