Complete guide

Running LexiVirt, from zero

Everything in one page: what each piece is, what connects to what, how to install it, how to build your first virtual machine, what all the terminology means — and where the limits are.

On this page

  1. What LexiVirt is
  2. The pieces and how they connect
  3. What you need
  4. Installing
  5. First sign-in and securing it
  6. ISOs — install images
  7. Your first virtual machine
  8. Using the VM console
  9. Adding more compute nodes
  10. Networking explained
  11. VLANs, bridges and what LexiVirt does not do
  12. Users, roles and access
  13. Ports, firewall and secrets
  14. Updates, backups, troubleshooting
  15. Glossary — every term explained
  16. Legal notice
1
What LexiVirt is
And what it is not

LexiVirt turns ordinary Linux servers into a place to run virtual machines. A virtual machine (VM) is a complete computer — its own CPU, memory, disk and operating system — that exists as software on top of a real machine. One physical server can run many of them, isolated from each other.

You get a web dashboard where you create a VM, give it CPU, memory and disk, boot it from an operating-system installer, and open its screen in your browser. If you have used VirtualBox on a laptop, it is the same idea built for servers: the machines run on hardware you own, several servers are managed from one browser tab, and there is no licence fee and nothing phoning home.

What it is not: it is not a cloud account, and there is no LexiVirt server holding your data. Everything runs on machines you own, and it keeps working with the internet unplugged.

Virtualization must be enabled in the BIOS. Look for Intel VT-x, AMD-V or "SVM Mode". Without it VMs are emulated in software and are unusably slow. The installer tells you which you have.
2
The pieces and how they connect
Three components, two network hops

There are only three moving parts. Understanding which is which makes everything else obvious.

YOU │ │ HTTPS, port 9443 ▼ ┌──────────────────────────────┐ │ MANAGEMENT CONSOLE │ the web dashboard │ nginx :9443 → app :9070 │ users · nodes · audit log │ runs no VMs itself │ one per deployment └──────────────┬───────────────┘ │ │ HTTP, port 9071 │ header: x-agent-token = cluster secret ▼ ┌──────────────────────────────┐ │ NODE AGENT │ one per compute node │ small API on :9071 │ └──────────────┬───────────────┘ │ libvirt / QEMU / KVM ▼ ┌──────────────┐ ┌──────────────┐ │ VM │ │ VM │ ← real virtual machines │ disk.qcow2 │ │ disk.qcow2 │ /var/lib/lexivirt/vms └──────────────┘ └──────────────┘ Screen (VNC) travels the same way, wrapped in a WebSocket: browser ──WS──▶ console ──TCP 5900+──▶ the VM's virtual screen

Management console

The web interface you log into. It stores your user accounts, the list of compute nodes and the audit log in a small database. It does not run virtual machines — it only gives orders. The app itself listens on 127.0.0.1:9070 and is published to the network by nginx on port 9443 over HTTPS.

Compute node

A physical server that actually runs the VMs. Each one runs the agent: a small API on port 9071 that the console commands. The agent drives KVM through libvirt, creates the disk images, defines the machines and starts them.

The cluster secret

One shared credential between the console and every agent, generated when you install the management server. The console sends it on every request to a node; an agent rejects anything else. It is stored at /etc/lexivirt/agent.secret (readable by root only) on each machine.

Treat the cluster secret like a root password. Anyone who holds it and can reach port 9071 on a node can create, delete and take over every virtual machine on it.
On a single server all three live on the same box. The installer's "Everything" option sets that up, and keeps VM screens on the loopback interface so nothing extra is exposed.
3
What you need
Before you start
ItemRequirement
Operating systemDebian 11+, Ubuntu 20.04+, RHEL / CentOS Stream / AlmaLinux / Rocky 8+
Accessroot, or a user with sudo
CPUx86-64 with VT-x or AMD-V enabled in the BIOS (compute nodes only)
Memory2 GB for the console alone. On a compute node: the host's own needs plus the sum of every VM's RAM.
Disk20 GB for LexiVirt itself, plus room for ISOs (~1–6 GB) and every VM's disk image
NetworkNodes and the console must be able to reach each other on ports 9071 and 5900–5999
Sizing rule of thumb. You may hand out more vCPUs than you physically have (that is called overcommit and is normal). Do not overcommit memory — if the VMs together ask for more RAM than the host has, the kernel starts killing processes.
4
Installing
One command, run with sudo

The installer must run as root, so run it with sudo. It installs every dependency, generates its own credentials and TLS certificate, opens the firewall ports it needs, offers to download operating-system install images, and prints a full walkthrough when it finishes.

One server (start here)

Console and hypervisor on the same machine:

# everything on this one server
curl -sSL https://lexi-cloud.com/i/YOUR-KEY | sudo bash -s -- all
Where YOUR-KEY comes from. A free account at lexi-cloud.com shows your own install command on its download page. Installing asks nothing about the account — the key only identifies the link you copied it from, and adding compute nodes later needs no key at all.

Separate console and compute nodes

On the machine that will host the dashboard:

curl -sSL https://lexi-cloud.com/i/YOUR-KEY | sudo bash -s -- manager

It prints the cluster secret and its own address at the end. Then, on every server that should run VMs:

curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- \
     agent <cluster-secret> https://<console-ip>:9443
Tighter firewall on a node. Prefix the command with LEXIVIRT_MANAGER_IP=<console-ip> and the node will only accept agent traffic from that one address.

Run it without any questions

# choose the OS images up front, skip every prompt
LEXIVIRT_ISOS="debian alpine" \
  curl -sSL https://lexi-cloud.com/i/YOUR-KEY | sudo bash -s -- all

# other options: "none", "all", or any of: debian alpine ubuntu alma
Piping a script from the internet into sudo bash means trusting it completely. If you would rather read it first: curl -sSL https://lexi-cloud.com/i/YOUR-KEY -o install.sh, read it, then sudo bash install.sh all.
5
First sign-in, and securing it
Do this before anything else

Your sign-in details

URLhttps://<your-server>:9443
Usernameadmin — always this, on every install
Passwordlexi — the default every install starts with. Change it at this first sign-in.
lexi is a published default, not a secret. It is the same on every install and it is written on this page, so a console reachable from the internet with that password still set is an open control panel for your whole cluster. Change it at your first sign-in, before you open port 9443 to anything you do not control.

Choosing a different password at install time

Pass it to the installer and the account is created with that instead — nothing is printed and nothing needs changing afterwards:

curl -sSL https://lexi-cloud.com/i/YOUR-KEY \
  | sudo LEXIVIRT_ADMIN_PASSWORD='your-password-here' bash -s -- manager

If lexi is not accepted

Then this console is not a fresh install and its admin password is something else. These two commands cover where it can be:

# The password this console was actually installed with
sudo grep LEXIVIRT_ADMIN_PASSWORD /etc/systemd/system/lexivirt-console.service

# Upgraded from 1.0.x, where the old shared LexiVirt@2026 was rotated away
# Format is:  username <TAB> new-password
sudo cat /root/lexivirt/data/rotated_passwords.txt
Why /root? The console service runs as root, so its data directory is /root/lexivirt/data/. If you run the console under your own account instead, look in ~/lexivirt/data/. Both files are mode 0600, readable only by root.

Open https://<your-server>:9443 and sign in as admin.

The browser will warn about the certificate. That is expected — the installer generated a self-signed one because the server has no public domain name. The connection is still encrypted; the browser simply cannot vouch for who is on the other end. Click Advanced → Proceed. If you do have a domain pointing at this server, replace the certificate in /etc/lexivirt/ssl/ and run systemctl reload nginx.

Straight away

  1. Change the admin password — Settings → Change Password. Minimum 10 characters.
  2. Do not expose port 9443 to the open internet. Put it behind a VPN, or restrict it to your own address range in the firewall. It is a control panel for your entire infrastructure.
  3. Create a separate account for yourself under Users, with the operator role, and keep admin for administration only.
Six failed sign-in attempts from one address lock that account out for five minutes. Every sign-in, success or failure, is written to the audit log.
6
ISOs — install images
You need one before you can build a VM

An ISO is a single file containing an operating system's installer — the exact contents of an install DVD. A new VM boots from one the first time, just like putting a disc in a physical machine, and you click through the OS installer as normal.

The installer offers to download a few for you into /var/lib/lexivirt/isos, verifying each against the publisher's own checksum. You can also upload your own from the console: ISOs → Upload. Large files are sliced up by your browser and sent in pieces, so multi-gigabyte desktop images work fine.

An upload is copied to every online node, not just one. LexiVirt picks which node a VM lands on, so the image has to already be wherever it ends up.

What the installer can fetch for you

KeyImageSizeChecksum
ubuntu2204Ubuntu Server 22.04 LTS~2.1 GBverified
ubuntu2404Ubuntu Server 24.04 LTS~3.0 GBverified
debian12Debian 12 netinst~0.7 GBverified
debian13Debian 13 netinst~0.7 GBverified
centos9CentOS Stream 9 boot~0.9 GBverified
alma9AlmaLinux 9 boot~1.1 GBverified
win2022Windows Server 2022 (evaluation)~4.7 GBnone published
win2025Windows Server 2025 (evaluation)~5.6 GBnone published
virtiovirtio-win driver disc~0.8 GBnone published
# pick exactly what you want
LEXIVIRT_ISOS="ubuntu2404 debian12" sudo bash install.sh all

# or a group: all (~19 GB) | linux (~8 GB) | windows | none
LEXIVIRT_ISOS=linux sudo bash install.sh all

Filenames are resolved from each publisher's own directory listing, so a point release never breaks the download. Every Linux image is checked against the publisher's SHA256 and deleted if it does not match. The installer refuses to start a download that would not fit on the disk.

Windows guests

The Windows Server images are 180-day evaluation editions. Running Windows in production requires a licence you have purchased from Microsoft. Microsoft publishes no checksum for these downloads, so unlike every Linux image above they are protected by TLS alone.
You will need the virtio driver disc. Windows has no built-in driver for virtio disks or network cards, so Setup shows an empty disk list and cannot continue. Create the VM with the Windows ISO, attach virtio-win.iso as a second CD-ROM, and use Load driver at the disk-selection screen. Budget 40 GB of disk and 4 GB of RAM as a realistic minimum.
Operating systems come with their own licences. You are responsible for complying with them — particularly for Windows and other commercial systems, which need a licence you have bought.
7
Your first virtual machine
Five minutes
  1. Nodes — check at least one node is online and says KVM enabled. If it says "No KVM", virtualization is off in that server's BIOS or the libvirt Python binding is missing.
  2. ISOs — check an install image is listed.
  3. Virtual Machines → Create VM, and fill in:
FieldWhat to put
NameLetters, digits, dot, dash, underscore — e.g. web-01. This becomes the machine's name on the hypervisor and cannot be changed later.
vCPUHow many processor cores the guest sees. Start with 2.
RAMMegabytes of memory, taken from the host while the VM runs. 2048 is a comfortable start; Alpine is happy with 512.
DiskGigabytes. The file starts small and grows as the guest writes, so 20 GB costs you almost nothing until it is used.
ISOThe operating system to install from.

LexiVirt chooses an online, KVM-capable node for you and starts the machine immediately. There is no node picker — placement is automatic.

  1. Click the screen icon on the VM to open its console, and work through the operating system's installer exactly as you would on real hardware.
  2. When the OS is installed, stop the VM and start it again — it will boot from its own disk.
Changing CPU, RAM or disk later: stop the VM first, then use Edit. Disks can only grow, never shrink — shrinking a disk out from under a filesystem destroys it. After growing the disk in LexiVirt you still have to extend the partition and filesystem inside the guest (growpart then resize2fs, or the equivalent).
Deleting a VM deletes its disk image. There is no undo and no recycle bin.
8
Using the VM console
A screen, keyboard and mouse in your browser

The screen icon opens the machine's actual video output in a browser tab, with keyboard and mouse attached — the equivalent of standing in front of it with a monitor plugged in. It works before any operating system is installed, which is exactly why you need it for the initial install, and it keeps working when the guest's own networking is broken.

  • Ctrl+Alt+Del — sends the key combination to the guest, not to your own machine.
  • Clipboard — pastes text into the guest (useful because typing into a console is otherwise character by character).
  • Fullscreen — for graphical installers.
Under the hood: each VM's screen is a VNC server with its own randomly generated password. Your browser never talks to it directly — the console proxies the connection over an authenticated WebSocket, and hands your browser the password only after checking your session. On a single-server install the VNC ports are bound to loopback and are not reachable from the network at all.
9
Adding more compute nodes
Growing the pool

Each extra server adds its CPU cores, memory and disk to the pool. New VMs are placed automatically across whichever nodes are online and KVM-capable.

  1. Get the cluster secret from the console machine:
    sudo cat /etc/lexivirt/agent.secret
  2. On the new server:
    LEXIVIRT_MANAGER_IP=<console-ip> \
    curl -sSL https://lexi-cloud.com/install.sh | sudo bash -s -- \
         agent <cluster-secret> https://<console-ip>:9443
  3. In the console: Nodes → Add Node. Enter a name, the new server's IP, port 9071, and leave the secret blank — the cluster secret is already configured.

If the node does not come up

It saysWhat it means
UnreachablePort 9071 is blocked between the console and the node, or the agent is not running. Check with systemctl status lexivirt-agent on the node and nc -zv <node-ip> 9071 from the console.
Wrong agent secretThe node's secret does not match the console's. Compare sudo cat /etc/lexivirt/agent.secret on both machines, or set an override for that one node with Edit Node.
No KVMVirtualization is disabled in the BIOS, or the libvirt Python binding could not be installed. The node can still store ISOs but cannot run VMs.
10
Networking explained
What your VMs get, and how to reach them

Every VM gets one virtual network card, attached to the node's built-in NAT network. In practice that means:

the internet / your LAN ▲ │ NAT (the node's own IP is used for outbound traffic) │ ┌────────┴──────────┐ │ virbr0 │ a virtual switch inside the node │ 192.168.122.1 │ with its own DHCP server └───┬───────────┬───┘ │ │ ┌───┴───┐ ┌───┴───┐ │ VM A │ │ VM B │ .122.45 .122.87 └───────┘ └───────┘ (assigned automatically)
  • VMs get an address automatically, in 192.168.122.0/24.
  • VMs can reach the internet and your LAN.
  • VMs on the same node can reach each other.
  • Nothing outside can start a connection in to a VM. This is a real security property, not a limitation to work around casually.
  • VMs on different nodes cannot reach each other directly — each node has its own separate 192.168.122.0/24.

Finding a VM's address

The console shows it once the guest has requested one. From the node itself:

sudo virsh net-dhcp-leases default

Publishing a service running in a VM

To let the outside world reach, say, a web server inside a VM, forward a port on the node:

# node's port 8080 → VM 192.168.122.42, port 80
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 \
     -j DNAT --to-destination 192.168.122.42:80
sudo iptables -A FORWARD -p tcp -d 192.168.122.42 --dport 80 -j ACCEPT

# iptables rules do not survive a reboot on their own:
sudo apt install iptables-persistent   # Debian/Ubuntu
sudo netfilter-persistent save
Give the VM a fixed address before you do this, otherwise DHCP may hand it a different one after a reboot and the rule will point at nothing. Set a static address inside the guest, or reserve one in libvirt with virsh net-edit default.
11
VLANs, bridges, and what LexiVirt does not do
Plain answers to the networking terms

What a VLAN actually is

A VLAN (Virtual LAN, standard IEEE 802.1Q) splits one physical network into several separate logical networks. It works by adding a small tag — a number from 1 to 4094 — to each Ethernet frame. Switches keep tagged traffic apart: two machines plugged into the same switch but assigned different VLAN tags simply cannot see each other, as if they were on different cables entirely.

The vocabulary you will meet on a switch:

  • Access port — carries exactly one VLAN, untagged. The device plugged in knows nothing about VLANs; the switch adds and strips the tag. This is what an ordinary PC port is.
  • Trunk port — carries many VLANs at once, tagged. This is how you connect a switch to another switch, or to a server that needs to be on several networks over one cable.
  • Native / untagged VLAN — on a trunk, the one VLAN whose frames travel without a tag.
  • VLAN ID / PVID — the number itself. 1 is usually the default; 4095 is reserved.

Datacentres use VLANs to keep, say, storage traffic, management traffic and customer traffic apart while sharing the same physical wiring, and to stop a compromised machine in one segment from seeing another.

LexiVirt does not tag VLANs for you. There is no field where you type a VLAN id and something happens — an earlier version had exactly that, and it did nothing at all with the number, which is why it was removed. What LexiVirt can do is attach guests to a host bridge you have already put on a VLAN. Build br-vlan100 on the node as shown below, then create a bridged network in the console pointing at it, and every VM on that network sits on VLAN 100. The tagging is done by the host and the switch; LexiVirt attaches guests to the result.

If you genuinely need bridged or VLAN-tagged guests

This is a host networking task on the node, configured with your distribution's normal tools. Once a bridge exists on the host, libvirt can attach machines to it directly.

A plain bridge puts VMs straight onto your physical LAN, so they get addresses from your normal DHCP server and are reachable like any other machine — no NAT, no port forwarding:

# Debian/Ubuntu, /etc/netplan/01-bridge.yaml
network:
  version: 2
  ethernets:
    eno1: {dhcp4: no}
  bridges:
    br0:
      interfaces: [eno1]
      dhcp4: yes

A VLAN-tagged bridge puts VMs onto one specific VLAN — here, VLAN 100:

network:
  version: 2
  ethernets:
    eno1: {dhcp4: no}
  vlans:
    eno1.100:
      id: 100
      link: eno1
  bridges:
    br-vlan100:
      interfaces: [eno1.100]
      dhcp4: no

Then, in the console, go to Networks → Create Network, choose Bridged and give it br-vlan100. Pick that network when you create a VM and the guest lands on VLAN 100. No hand-editing of XML, and a resize will not undo it — the console preserves a VM's network when it redefines the domain.

The switch has to agree. The port feeding that server must be configured as a trunk carrying VLAN 100, or nothing passes. Also build the bridge on every node: VM placement is random, and the console will grey out a network that does not exist everywhere rather than let you create a VM that cannot start.
12
Users, roles and access
Who can do what
RoleCan do
adminEverything: manage users, add and remove nodes, delete ISOs and volumes, apply updates.
operatorCreate, start, stop, resize and delete VMs; upload ISOs; open consoles. Cannot manage users or nodes.
viewerRead-only. Can see machines, nodes and logs; cannot change anything.
  • Passwords must be at least 10 characters, for every account and however it is set.
  • The built-in admin account cannot be deleted or demoted, so you can never lock yourself out.
  • Deactivating an account stops it signing in immediately.
  • Every meaningful action — sign-ins, VM creation and deletion, node changes, ISO uploads — is recorded in Audit Logs with the user, the time and the source address.
13
Ports, firewall and secrets
Exactly what is open, and why
PortMachinePurposeWho should reach it
9443/tcpconsoleThe dashboard, over HTTPSYour administrators only — VPN or an allow-list
80/tcpconsoleRedirects to 9443Same
9070/tcpconsoleThe app itself, bound to loopbackNobody — it is not exposed
9071/tcpnodeAgent APIThe console only
5900–5999/tcpnodeVM screens (VNC)The console only — closed entirely on a single-server install

The installer opens these with ufw or firewalld, whichever is active. Pass LEXIVIRT_MANAGER_IP when installing a node and the rules are restricted to that one console address.

Where the secrets live

FileContains
/etc/lexivirt/agent.secretThe cluster secret, mode 0600
/etc/systemd/system/lexivirt-console.serviceThe cluster secret and the initial admin password, mode 0600
/opt/lexivirt/data/console_secret.keyThe key that signs session tokens. Delete it and everyone is signed out.
The cluster secret is never transmitted. Requests to a node are signed: the console sends a timestamp and an HMAC-SHA256 over the method, path and body, proving it knows the secret without sending it. A signature is valid for one request only — reusing it, changing the body, or pointing it at a different path all fail, and anything more than five minutes old is refused. Before this, the secret itself rode in a header on every request in the clear.
The traffic itself is still unencrypted. Signing protects the credential, not confidentiality: an observer can still read VM names, statistics and the contents of an ISO upload. Port 9071 should be reachable only from the console — pass LEXIVIRT_MANAGER_IP when installing a node, or restrict it in your firewall. Once every console is on 1.2.3 or later, set LEXIVIRT_AGENT_REQUIRE_HMAC=1 in the agent's systemd unit so the old plaintext-token scheme stops being accepted at all.
Rotating the cluster secret: generate a new one with openssl rand -hex 24, write it into /etc/lexivirt/agent.secret and the LEXIVIRT_AGENT_SECRET= line of the systemd unit on the console and every node, then restart lexivirt-console and lexivirt-agent. Nodes will show "Wrong agent secret" until all of them match again.
14
Updates, backups, troubleshooting
Keeping it alive

Updates

The dashboard shows a badge when a newer version is published. Settings → Apply Update downloads it over verified TLS, checks its checksum before running anything, applies it and restarts the service. Your database, VMs and ISOs are left untouched. If the restart fails you are told so explicitly, along with the command to finish it by hand.

Back these up — they cannot be regenerated

/opt/lexivirt/data/Accounts, nodes, audit log, signing key
/etc/lexivirt/Cluster secret and TLS certificate
/var/lib/lexivirt/vms/Every virtual machine's disk image (on each node)
Copying a running VM's disk image gives you a corrupt copy, in the same way as pulling the power on a real machine. Stop the VM first, or take a snapshot with virsh snapshot-create-as.

Everyday commands

# on the console machine
systemctl status lexivirt-console
journalctl -u lexivirt-console -f
systemctl restart lexivirt-console

# on a compute node
systemctl status lexivirt-agent
journalctl -u lexivirt-agent -f
virsh list --all                 # what the hypervisor itself sees
virsh net-dhcp-leases default    # which VM got which address

Common problems

SymptomCause and fix
Dashboard shows 502nginx is up but the app is not. journalctl -u lexivirt-console -n 50.
Node offlinePort 9071 blocked, or the agent is stopped. See the node table above.
Console window says "Connection lost"The VM is not running, or ports 5900–5999 are blocked between console and node.
VM will not startUsually not enough free memory on the node. free -h there.
Agent refuses to startIt will not run without a real secret of at least 16 characters. Check /etc/lexivirt/agent.secret and the systemd unit.
"No KVM" on a nodeVirtualization off in the BIOS, or /opt/lexivirt-agent/bin/python3 -c "import libvirt" fails.
15
Glossary
Every term used in LexiVirt, in plain language
Virtual machine (VM), guest
A complete computer that exists as software: its own CPU, memory, disk and operating system, running on top of a real machine. "Guest" is the same thing, named from the host's point of view.
Host, compute node
The real, physical server that a VM runs on. In LexiVirt a host with the agent installed is called a node.
Hypervisor
The software layer that lets one machine run several VMs, handing each a slice of the real hardware. LexiVirt uses KVM.
KVM (Kernel-based Virtual Machine)
Virtualization built into the Linux kernel. It requires CPU support (Intel VT-x or AMD-V), which is why it must be enabled in the BIOS. With it, guest code runs at very close to native speed.
QEMU
The program that emulates all the parts of a computer that are not the CPU — disks, network cards, screen, keyboard. QEMU plus KVM is the pairing that actually runs each VM.
libvirt
The standard management layer above QEMU/KVM. It stores each machine's definition as an XML document and provides the interface for starting, stopping and editing it. The virsh command is its command-line client.
Domain
libvirt's word for a virtual machine. If a tool talks about a "domain", it means a VM.
Agent
LexiVirt's small service on each compute node. It receives instructions from the console and carries them out through libvirt. It has no interface of its own.
Management console
The web dashboard. Holds accounts, the node list and the audit log; runs no VMs itself.
Cluster secret
The shared credential between the console and every agent. Sent as the x-agent-token header on every request to a node; without it a node refuses everything.
vCPU
A virtual processor core presented to a guest. Several vCPUs share the host's real cores; handing out more vCPUs in total than the host physically has is called overcommit and is normal practice.
RAM / memory
Memory assigned to a VM. Unlike CPU it is genuinely reserved while the machine runs, so the VMs on a host must not add up to more than the host has.
qcow2
QEMU's disk-image format. A VM's whole disk is one .qcow2 file on the node. It is thin-provisioned: a 100 GB disk containing 3 GB of data occupies about 3 GB. It also supports snapshots.
Thin provisioning
Allocating space on paper and consuming it only as it is really used. Convenient, but it lets you promise more disk than you own — watch the node's free space.
ISO
A single file containing an operating system's installer, byte for byte the contents of an install DVD. A new VM boots from one to get its OS installed.
Snapshot
A point-in-time copy of a VM's disk you can roll back to. Useful before a risky change. It is not a backup — it lives on the same disk as the original, so it dies with it.
VNC
The protocol that carries a machine's screen, keyboard and mouse over the network. Each VM in LexiVirt has its own VNC server with a randomly generated password; the console proxies it into your browser.
noVNC
The JavaScript VNC client that renders that screen inside a browser tab, so nothing has to be installed locally.
WebSocket
A network connection that stays open in both directions inside an ordinary HTTPS session. It is what lets the VM console and the live dashboard charts stream continuously through the same port as the rest of the site.
NAT (Network Address Translation)
Letting many machines share one address by rewriting outgoing traffic to look as if it came from the host. The default for LexiVirt guests: they can reach out, nothing can start a connection in.
Bridge (virbr0, br0)
A virtual network switch inside the host. virbr0 is libvirt's NAT bridge; a bridge you make yourself over a physical card puts guests directly onto your real LAN.
VLAN (802.1Q)
A tag numbered 1–4094 added to Ethernet frames that splits one physical network into several isolated logical ones. Machines with different tags cannot see each other even on the same wire. LexiVirt does not tag VLANs itself, but it can attach guests to a VLAN-tagged host bridge through a bridged network — see section 11.
Trunk / access port
Switch terminology. An access port carries one VLAN untagged; a trunk carries several, tagged, over one cable.
CIDR (e.g. 192.168.122.0/24)
A way to write a range of addresses. The number after the slash is how many leading bits are fixed: /24 fixes the first three numbers, leaving 254 usable addresses.
Gateway
The address traffic is sent to when its destination is outside the local network. For LexiVirt guests it is 192.168.122.1, the node itself.
DHCP
The service that hands a machine an address automatically when it joins a network. libvirt runs one for the NAT network, which is why new VMs get an address without being told one.
Port forwarding (DNAT)
A firewall rule that sends traffic arriving on a port of the host onward to a specific VM, so a service inside a NATed VM can be reached from outside.
MAC address
The hardware address of a network card, virtual ones included. libvirt generates one per VM; it is how DHCP recognises the same machine each time.
systemd unit / service
How Linux starts and supervises background programs. lexivirt-console and lexivirt-agent are units; systemctl controls them and journalctl shows their logs.
nginx, reverse proxy
The web server sitting in front of the console. It terminates HTTPS on port 9443 and forwards plain HTTP to the app on loopback, which is why the app itself is never exposed.
TLS / SSL, self-signed certificate
The encryption behind HTTPS. A certificate normally proves who you are connecting to; a self-signed one encrypts the traffic but nobody vouches for it, which is why the browser warns.
Session token (JWT)
The signed proof of who you are, issued at sign-in and stored in a cookie your browser cannot read from JavaScript. It expires after 24 hours.
Audit log
The record of who did what and when — sign-ins, VM creation and deletion, node changes, uploads.
Overcommit
Assigning more of a resource than physically exists. Safe and routine with vCPUs; dangerous with memory.

Ready to build it?

One command, one server, about five minutes.

Get started free