Plesk, HestiaCP and Pterodactyl provisioning modules
A provisioning module connects a service product to a remote panel. When a customer orders, NexoVirt creates the account on that panel through its API, suspends and resumes it with the service, switches the plan when the customer changes plan, and deletes it after the grace days. The customer sees a small status card in the portal and an Open in Plesk, Open in HestiaCP or Open in Pterodactyl button. Everything else is done in the remote panel.
Supported panels: Plesk (Obsidian and later), HestiaCP, Pterodactyl and Pelican (Pelican is detected when you test the connection). The modules are part of the shop feature.
Where to find it
Section titled “Where to find it”Two sections appear in the sidebar below Guests, once a connection of that kind exists:
- Web hosting (Plesk and HestiaCP): Servers (the connections) and Subscriptions (everything the servers hold).
- Game servers (Pterodactyl and Pelican): Panels (the connections) and Servers (everything the panels hold).
Before the first connection the sections are not shown. Add the first one under Settings > Web hosting & game servers: the tile Plesk servers opens Web hosting > Servers (pick Plesk or HestiaCP in the dialog) and Game panels opens Game servers > Panels. The old Shop > Integrations addresses redirect to the new pages.
The Integrations dashboard card (see below) shows all connections at a glance.
Before you start
Section titled “Before you start”Plesk. Create an API key on the Plesk server, bound to the IP address of your NexoVirt panel:
plesk bin secret_key --create -ip-address <panel IP>Plesk must be reachable from the panel on port 8443 with HTTPS. For one-click sign-in with two-factor enabled on Plesk, see “Plesk one-click sign-in” below.
HestiaCP. On the Hestia server:
- Turn on the API in the server settings (admin API is enough) and add the IP address of your NexoVirt panel to the allowed
API addresses (
API_ALLOWED_IP), unless it is set to allow all. - Create an access key of the
adminuser. NexoVirt takes it asACCESS_KEY:SECRET_KEY(the two parts joined with a colon). - Permissions: an admin key with an empty permission list has full access and is the simplest choice. For least
privilege, create your own API group and give the key only these 12 commands:
v-list-sys-info,v-list-user-packages,v-list-users,v-list-user,v-add-user,v-list-web-domains,v-add-web-domain,v-suspend-user,v-unsuspend-user,v-change-user-package,v-change-user-passwordandv-delete-user. HestiaCP’s built-inbillinggroup is not enough.
ROLE='admin'COMMANDS='v-list-sys-info,v-list-user-packages,v-list-users,v-list-user,v-add-user,v-list-web-domains,v-add-web-domain,v-suspend-user,v-unsuspend-user,v-change-user-package,v-change-user-password,v-delete-user'# then:v-add-access-key admin nexovirt NexoVirtHestiaCP listens on port 8083 with a self-signed certificate by default: the connection check lets you trust it.
Pterodactyl / Pelican. Under Admin > Application API create an application key with these permissions:
- Read and write: Users, Servers.
- Read: Nodes, Allocations, Locations, Nests (eggs).
Optionally create a client key of an admin account. It is only used to show live state and usage on the customer’s service page.
1. Add a server or panel
Section titled “1. Add a server or panel”Open Web hosting > Servers or Game servers > Panels and click Add server or Add panel. The dialog has three steps.
Connection. Fill in:
- Panel (Web hosting only): Plesk or HestiaCP.
- Address: https only, for example
https://plesk.example.com:8443orhttps://hestia.example.com:8083. Customers see this host when they open their service. - API key: write-only, never shown again. For HestiaCP enter
ACCESS_KEY:SECRET_KEY. - Pterodactyl only: Client key of an admin (optional), with Remove the client key when editing.
- Pinned certificate (SHA-256 fingerprint): leave empty. The check shows the fingerprint of a self-signed certificate and lets you trust it.
Check. Click Check connection. Nothing is saved yet. The dialog lists the steps live: Panel reachable, Certificate, API key accepted, the version (Plesk version detected, HestiaCP version detected or Panel type detected) and what was read (Service plans read, Packages read or Eggs read). A failing step shows its reason and the steps after it are skipped; fix the data with Back and use Check again.
If the certificate is not publicly trusted, the dialog shows the fingerprint the panel presented. Compare it with
openssl x509 -noout -fingerprint -sha256 -in <cert> on the panel, then click Trust this certificate. That pins it: only a
server with exactly this certificate ever gets the API key.
Done. Give the connection a Name (and for Plesk, optionally Skip two-factor on one-click sign-in), then Add web hosting server or Add panel. A new connection opens its server page.
Editing uses the same dialog. Leave the key empty to keep the stored one. Stored keys are only reused for the same address (scheme, host and port): when you change the address, enter the keys again, otherwise the check refuses with “The address changed. Enter the API key again.” The list shows Works, Error or Unreachable, the version and how many products use the connection. Delete is refused while products use it. Services already set up stay on the remote panel when you delete a connection. Saving, checking and deleting need a fresh sign-in proof (step-up).
2. Set up the product
Section titled “2. Set up the product”Create a product with Type: Service (service products), then open the Provisioning tab. Under Set up by pick the connection (default: “Nobody here: manual or your own system”). The connection of a product with running services cannot be changed.
- Plesk: Plesk service plan (picked from the list of the last connection check). The customer types the domain on the order page (the field Domain, checked as a hostname before the order). A plan change of the service switches the subscription to the new product’s plan.
- HestiaCP: HestiaCP package (suggested from the last check). The customer types the domain on the order page. Every
service gets its own Hestia user with this package. The package named
systemis never offered. - Pterodactyl / Pelican: Egg (game), Locations (Pelican: Node tags), Port range, Dedicated IP, and the Limits (memory, swap, disk, CPU, I/O, threads, databases, allocations, backups). Use one product per game. The egg of a running server is never changed, because that would wipe its data.
Billing periods, prices, add-ons and manual approval work as for any service product. With manual provisioning, Accept in Shop > Orders queues the creation on the remote panel.
Resellers can sell these products too, with the connections you manage. Their product form lists your connections.
What happens when
Section titled “What happens when”| In NexoVirt | On the remote panel |
|---|---|
| Order paid | Customer account found or created, then the subscription (Plesk), Hestia user with the domain (HestiaCP) or server (Pterodactyl). Existing objects are looked up first, so a retry never creates a second one. |
| Suspended (unpaid, cancelled, admin) | Subscription, Hestia user or server suspended. |
| Resumed | Subscription or server active again. |
| Plan change | Plesk: subscription switched to the new service plan. HestiaCP: user switched to the new package. Pterodactyl: new limits (the egg stays). |
| Deleted after the grace days, Cancel now, admin Delete | Subscription, Hestia user or server deleted. A Plesk customer is deleted only when nothing else belongs to it. |
On Pterodactyl the service becomes active once the server finished installing (at most 30 minutes of waiting). The customer gets no password from NexoVirt: the panel mails them its own “set your password” link.
Retries and alerts
Section titled “Retries and alerts”Actions run in the background (php spark services:sync, every minute from cron; re-run deploy/install-cron.sh after an
update). A failed action is retried after 1, 5, 15 and 60 minutes, then every 6 hours. After about 25 hours of failing,
the manual alert service_module_failed appears in the inbox and is emailed to the alert recipients. The customer only
sees “Setup is taking longer than usual. We are on it.”
In Shop > Services open the service. The Remote card shows the last action, the remote object and the next try, with Retry now, Mark as handled (clears the failure without calling the remote panel, for when you fixed it by hand) and Open remote. Cancel now ends the service at once without a refund: it is suspended and the remote account is deleted after the grace days.
What the customer sees
Section titled “What the customer sees”The portal service page has a card with the status, plan and the main fact: the domain (Plesk, HestiaCP) or the address with copy button and game (Pterodactyl). With a client key it also shows state, CPU, memory and disk. While the service is being set up it says “Being set up”. Keys, remote ids, node names and error details are never shown.
Plesk one-click sign-in
Section titled “Plesk one-click sign-in”Open in Plesk signs the customer in without a password. NexoVirt asks Plesk for a single-use session bound to the customer’s IP address and redirects there. Each click creates a new session and the route is rate limited.
If Plesk uses two-factor authentication, the session would still ask for it. Turn on Skip two-factor on one-click
sign-in on the connection and add this to Plesk’s panel.ini:
[ext-mfa]allowSkipRSession = trueHestiaCP
Section titled “HestiaCP”HestiaCP has no one-click sign-in. The card in the portal shows the Domain and the Username (with copy button), a Panel password field with Set password, and the button Open in HestiaCP, which is a plain link to the panel. The customer sets their own password there (10 to 128 characters, no spaces). NexoVirt sends it to HestiaCP and never stores it. If the domain is refused while the user is created, the still empty Hestia user is deleted again.
Pterodactyl and Pelican
Section titled “Pterodactyl and Pelican”Open in Pterodactyl is a plain link to the server page. The customer signs in with their own panel account; the page tells them to use the email address of their account and the panel’s password reset if they forgot it. Stock Pterodactyl has no API for one-click sign-in.
Server pages
Section titled “Server pages”Click Manage on a connection (Web hosting > Servers or Game servers > Panels) to open its server page.
- Overview: status (Online or Offline, with the time of the last check). Plesk shows version, license, updates, CPU, memory, disks, uptime and customers / domains. HestiaCP shows version, hostname, load, uptime, Users / domains and Disk used by users (Hestia has no disk or memory figures of its own, so the disk figure is the sum of its users’ totals). Pterodactyl and Pelican show servers / users and each node’s memory and disk. Refresh checks again. Open Plesk as admin (step-up), Open HestiaCP or Open Pterodactyl admin opens the panel. The figures are refreshed every 5 minutes (every minute while the panel is down).
- Create webspace or Create game server: see Create from the panel.
- Subscriptions (Web hosting) or Servers (Game servers): everything the panel holds, with owner, plan or package, status, disk and whether it is linked to NexoVirt (filters linked and unlinked). On HestiaCP every user is one row; the domain of at most the first 100 users is looked up, later rows show no domain.
Lists and detail pages
Section titled “Lists and detail pages”Web hosting > Subscriptions and Game servers > Servers list everything on all connections, read every 5 minutes, with a search, a status filter (Active, Suspended), a customer filter (Assigned, Not assigned) and, with more than one connection, a server or panel filter. Columns:
| Section | Columns |
|---|---|
| Subscriptions | Domain, Server, Plan / package, Status, Disk, Panel user, NexoVirt customer |
| Servers | Server, Panel, Egg, Address, Limits, Status, Panel user, NexoVirt customer |
Click a row for its detail page. It shows a Subscription or Server card (server, plan or package, owner, created), a Usage card (Plesk and HestiaCP) or Limits card (game servers) and a NexoVirt card with the customer, the service and the last remote action. Buttons by type: Open in Plesk, Open in HestiaCP or Open in Pterodactyl (admin view), and Back to subscriptions or Back to servers.
For an item that is not assigned, the page offers Assign, Suspend or Resume, and Change plan (Plesk, HestiaCP) or Change build limits (game servers: memory, swap, disk, CPU, block IO weight, CPU threads, databases, ports, backups, out-of-memory killer; changed on the panel at once, ports are never lowered). Change plan lists the plans or packages from the last check. These only change status, plan or limits and never delete anything. All of them need step-up.
For an item that is assigned (linked to a service), these actions move to the service: the page shows Manage service instead, and suspend, resume and plan changes go through the service in Shop > Services, so NexoVirt and the remote panel stay in step.
Assign an existing subscription or server
Section titled “Assign an existing subscription or server”Assign on an unlinked row links it to a customer and a product with a Next renewal date. It shows in the customer’s portal and renews, suspends and changes plan through the connection from then on. Assigning charges nothing now (the product price starts at the next renewal) and changes nothing on the remote panel. A reseller’s customer needs a product of that reseller. If the object belongs to an administrator or reseller account on the panel, one-click sign-in stays off.
Create from the panel
Section titled “Create from the panel”Create webspace (Web hosting) or Create game server (Game servers) on a server page, or on the Subscriptions or Servers list, makes a new object for a customer without a shop order. Pick Customer, Product and, for web hosting, the Domain, then:
- Paid until: the date the service is paid for. Nothing is charged now: no booking is made at creation.
- Renew from the customer’s balance: on (default), the service renews at the product’s price from the balance. Off: it is suspended at the paid date like an unpaid one. For a service that never costs anything, use a product with the price 0.
The service is created on the remote panel at once, goes through the same steps as an order, and the customer gets the normal activation mail. Archived products cannot be picked, and a domain already in use on that server is refused.
Dashboard card and alerts
Section titled “Dashboard card and alerts”The dashboard widget Integrations (Web hosting & game servers in the widget list, on the Operations and Shop dashboards) lists every connection with its name, kind, Online or Unreachable badge, disk bar, number of subscriptions or servers, how many are not assigned to a customer and failed remote actions. It is hidden while no connection exists.
Two manual alerts appear in the alert inbox, with email, and resolve on their own: module_server_down when the panel has been unreachable for 10 minutes and module_server_disk when a Plesk disk is more than 90 % full.
REST API
Section titled “REST API”The REST API additions (all global tokens only, host-scoped tokens get 403):
GET /api/v1/services/{id}has amoduleobject (name, state, action, error, remote reference; no ids or keys).POST /api/v1/services/{id}/retryruns the waiting or failed remote action now.GET /api/v1/module-serverslists the connections (id, name, module, flavour, last check; no keys).suspendandresumeon a module service also run the remote action.activateandfailanswer 409 “This service is provisioned automatically.” unless the remote action failed.
NexoVirt is developed and designed by Nucez Software, your partner for custom software and web design.