Labtris
Migration guide

Migrating from EVE-NG

If you have been running EVE-NG for years, most of what you know transfers. Same idea: real virtual machines on a Linux host, wired with kernel networking, driven from a browser.

This page maps the concepts one to one, lists the two or three places the designs actually differ, and links to the importer that turns a .unl file into a Labtris lab.

What EVE-NG got right

Keep using these ideas.

  • The core idea of running real vendor images under KVM on a Linux host with kernel-native bridges and taps.
  • Deterministic, reversible interface naming (vun/vnet + hex-packed IDs) — great debugging story from `ip link` alone.
  • Transient systemd units per node — cgroups, restart policy, reaping for free.
  • Well-populated appliance catalogue and a large public library of importable labs.
Where the friction came from

The reasons to look elsewhere.

  • SourceGuardian-encoded PHP web tier — no way to read what it is doing when something misbehaves.
  • Whole web tier runs as root; one XSS is one root RCE.
  • MySQL with a well-known default password.
  • Polling API (`GET api/poll`) instead of a push channel — 40+ HTTP requests per second per open browser.
  • Impairment is per-tap (fake symmetric); no first-class link objects, so per-direction latency is not really possible.
  • PRO tier is behind a paid licence; features gated by tier changes.
Concept map

What you know, and what it's called here.

Same primitives, mostly. A few things are actually different — those get their own row.

ConceptIn EVE-NGIn Labtris
Lab file`.unl` XMLJSON — geometry split from topology so it diffs cleanly in git
Node templateYAML under `templates/intel/*.yml`JSONB row per template; every field editable from the palette
Interface names`vun<lab-hex><node-hex><idx-hex>` — 15-char `IFNAMSIZ` ceilingBase36 hash + DB registry; no entity ceiling
Impairment`tc` on the tap, symmetric onlyFirst-class link → two directional qdiscs; A→B ≠ B→A
CapturePer-node Docker container + nftables NAT chains + watchdogCapture sidecar writing to a WebSocket pcap stream — no NAT hop
ConsoleHTML5 with a plugin historyGuacamole (VNC/RDP) + xterm.js (serial), force-shared display, same-tab reconnect works
Web tierPHP as root, MySQL default passwordFastAPI as an unprivileged user; every root operation goes through `labtris-netd` over a Unix socket
State channel`GET api/poll`WebSocket for canvas, console, capture, assistant
Multi-hostcluster / satellite protocolRegister a host, VXLAN builds the tunnel; standard tooling on both ends
LicenceCommunity + PRO (paid)Apache-2.0. All features, forever. Support offered separately if you want it.
Bringing your lab across

Importing existing topologies.

Topologies. Import → drop your .unl file. Templates map onto the QEMU catalogue; vendor appliances that Labtris does not yet know about become labelled placeholders with warnings — the lab still opens, so you can substitute images yourself. Canvas positions are preserved.

Images. Copy the qcow2 files from /opt/unetlab/addons/qemu/<template>/ and upload them through the palette or with labtris-image add. Companion BIOS or CD-ROM files (NX-OSv OVMF-sata.fd + cdrom.iso, for example) attach per template.

Templates. RAM, CPUs, NIC model, disk bus, iface scheme — every knob the EVE YAML carried is a field on the template row, editable from the palette. Two schemes (paloalto → mgmt, eth1/1, eth1/2, …; nxos → Mgmt0, E1/1, E1/2, …) match the EVE conventions exactly so interface names in the guest do not change.

Try Labtris in five minutes.

Nothing to sign up for, no telemetry, no lock-in — the whole thing is under Apache-2.0 in one GitHub repo.