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.
Install
Section titled “Install”Run this as root on a clean server:
curl -fsSL https://release.nexovirt.com/install | bashWithout 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:
curl -fsSL https://release.nexovirt.com/install | NEXOVIRT_LICENSE=<key> bashThe installer asks a few questions (press Enter to accept a default):
| Prompt | Default |
|---|---|
| Install directory | /var/www/nexovirt |
| System user to own files | nexovirt |
| Admin email (TLS and notices) | admin@localhost |
| Admin username | admin |
| Admin password | none, 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.
Unattended install
Section titled “Unattended install”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.
curl -fsSL https://release.nexovirt.com/install \ | NEXOVIRT_UNATTENDED=1 SEED_ADMIN_USER=admin SEED_ADMIN_PASS='<a strong password>' bashTo install an exact release instead of the newest one, add NEXOVIRT_VERSION=<version> (for example NEXOVIRT_VERSION=1.3.2).
What the installer does
Section titled “What the installer does”- 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.
- 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.
- Writes
.env(readable only by the system user), generates the encryption key, runs the database migrations and creates the admin account. - Stores and validates the license, and loads the OS template catalog so a fresh install starts with ready-to-use templates.
- 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).
- Installs the root-owned helpers
nexovirt-updateandnexovirt-domainin/usr/local/sbin. The panel’s system user may run onlynexovirt-update auto|manualas root; root never executes code from the app-owned install directory. - Prints a summary with the URL, admin user, install directory and (for a local database) the generated database password.
First access (IP only)
Section titled “First access (IP only)”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>/Configure a domain and TLS
Section titled “Configure a domain and TLS”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:
sudo /usr/local/lib/nexovirt/deploy/install.sh --set-hostname panel.example.comThe 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.
Updating
Section titled “Updating”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.
Reinstall flags
Section titled “Reinstall flags”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:
--reinstallforces the full install over an existing one.--forceinstalls into a non-empty directory or a database that already has tables (existing data is kept and migrated).
Uninstall
Section titled “Uninstall”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:
sudo /usr/local/lib/nexovirt/deploy/uninstall.sh --dry-run # show what would be removedsudo /usr/local/lib/nexovirt/deploy/uninstall.sh # remove itIt 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:
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.