Skip to content

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.

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.

Plesk. Create an API key on the Plesk server, bound to the IP address of your NexoVirt panel:

Terminal window
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:

  1. 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.
  2. Create an access key of the admin user. NexoVirt takes it as ACCESS_KEY:SECRET_KEY (the two parts joined with a colon).
  3. 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-password and v-delete-user. HestiaCP’s built-in billing group is not enough.
/usr/local/hestia/data/api/nexovirt
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 NexoVirt

HestiaCP 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.

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:8443 or https://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).

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 system is 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.

In NexoVirtOn the remote panel
Order paidCustomer 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.
ResumedSubscription or server active again.
Plan changePlesk: 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 DeleteSubscription, 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.

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.

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.

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 = true

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.

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.

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.

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:

SectionColumns
SubscriptionsDomain, Server, Plan / package, Status, Disk, Panel user, NexoVirt customer
ServersServer, 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 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 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.

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.

The REST API additions (all global tokens only, host-scoped tokens get 403):

  • GET /api/v1/services/{id} has a module object (name, state, action, error, remote reference; no ids or keys).
  • POST /api/v1/services/{id}/retry runs the waiting or failed remote action now.
  • GET /api/v1/module-servers lists the connections (id, name, module, flavour, last check; no keys).
  • suspend and resume on a module service also run the remote action. activate and fail answer 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.