Skip to content

Install NexoVirt on Ubuntu or Debian

Install NexoVirt on a fresh Ubuntu 22.04 or 24.04 server (Debian 12 or 13 best-effort) with a single command. No license key is needed to get started.

Run this as root on a clean server:

install
curl -fsSL https://release.nexovirt.com/install | bash

Without NEXOVIRT_LICENSE, the installer first requests a free, unclaimed Community Edition license, so there is no account to create and no key to copy. To use an existing key (a paid plan, or a key from a previous install) instead, pass it inline:

install
curl -fsSL https://release.nexovirt.com/install | NEXOVIRT_LICENSE=<key> bash

The installer asks a few questions (press Enter to accept a default):

PromptDefault
Install directory/var/www/nexovirt
System user to own filesnexovirt
Admin email (TLS and notices)admin@localhost
Admin usernameadmin
Admin passwordnone, required
Install a local MariaDB server?Yes. Answer No to enter the host, port, name, user and password of an existing MySQL/MariaDB database.

The full log is written to /var/log/nexovirt-install.log.

For automation, set NEXOVIRT_UNATTENDED=1. No prompt is shown: every value comes from the environment or its default, and SEED_ADMIN_PASS is required.

install
curl -fsSL https://release.nexovirt.com/install \
| NEXOVIRT_UNATTENDED=1 SEED_ADMIN_USER=admin SEED_ADMIN_PASS='<a strong password>' bash

To install an exact release instead of the newest one, add NEXOVIRT_VERSION=<version> (for example NEXOVIRT_VERSION=1.3.2).

  1. Checks the OS and installs nginx, PHP (8.3 preferred, 8.2 or newer), the required PHP extensions, Composer, certbot and, unless you chose an external database, MariaDB.
  2. Creates the system user, downloads the release and verifies its SHA-256 checksum and Ed25519 signature before anything is extracted. A release that fails verification is never installed.
  3. Writes .env (readable only by the system user), generates the encryption key, runs the database migrations and creates the admin account.
  4. Stores and validates the license, and loads the OS template catalog so a fresh install starts with ready-to-use templates.
  5. Sets up the nginx site and PHP-FPM pool, the console proxy, metrics and inventory services, and the cron jobs for every other worker (provisioning, migration, alerting, mail, backups, updates, license check).
  6. Installs the root-owned helpers nexovirt-update and nexovirt-domain in /usr/local/sbin. The panel’s system user may run only nexovirt-update auto|manual as root; root never executes code from the app-owned install directory.
  7. Prints a summary with the URL, admin user, install directory and (for a local database) the generated database password.

The first install is IP-only over HTTP: there is no domain or certificate yet. Open the panel at the server’s address and sign in with the admin username and password you entered during the install:

http://<your-server-ip>/

When you are ready to put NexoVirt behind a hostname, open Settings > Domain, enter the FQDN and pick a TLS mode:

  • Let’s Encrypt: a free certificate is issued automatically (needs a Let’s Encrypt email).
  • Behind Cloudflare / a proxy: a self-signed origin certificate; set Cloudflare SSL to “Full”.
  • None: plain HTTP.

A root cron job applies the nginx configuration and certificate within about a minute; the page shows the apply status. Allow IP access keeps the IP working next to the hostname.

The same can be done from the shell:

Terminal window
sudo /usr/local/lib/nexovirt/deploy/install.sh --set-hostname panel.example.com

The TLS mode is detected automatically (Let’s Encrypt, or proxy when the name points at a proxy); set NEXOVIRT_SSL_MODE=le|proxy|none to choose it.

Update from the panel under System > Updates, or let it apply fix releases automatically. Every update is verified, runs in a maintenance window and is rolled back on failure. See Updates.

Running the installer again on a complete install performs an update instead of a fresh install. For the rare cases where you need the install path:

  • --reinstall forces the full install over an existing one.
  • --force installs into a non-empty directory or a database that already has tables (existing data is kept and migrated).

Remove the agent from each node first (Nodes, then Remove agent on the connection, or delete the connection), so the agent service and the managed image storage are cleaned up on the Proxmox nodes. If the VPN is enabled on a node, disable it there before deleting the connection.

Then run the uninstaller on the management server:

Terminal window
sudo /usr/local/lib/nexovirt/deploy/uninstall.sh --dry-run # show what would be removed
sudo /usr/local/lib/nexovirt/deploy/uninstall.sh # remove it

It removes the install directory, the panel’s cron jobs, nginx site, certificate, systemd services, system user and the database. Add --keep-db to keep the database, --yes to skip the confirmation and --dir <path> for a non-default install directory. System packages are never removed, and your Proxmox nodes and guests are left untouched.

The root-owned update and domain helpers stay in place. Remove them by hand afterwards:

Terminal window
sudo crontab -l | sed '/^# >>> nexovirt domain/,/^# <<< nexovirt domain/d' | sudo crontab -
sudo rm -rf /usr/local/sbin/nexovirt-update /usr/local/sbin/nexovirt-domain \
/usr/local/lib/nexovirt /etc/nexovirt /etc/sudoers.d/nexovirt-update /var/backups/nexovirt

/var/backups/nexovirt holds the backups taken before each update; keep it if you may want to restore.