Skip to content

Install on Linux

Build-from-source only

There is no .deb, .rpm or container image. You build Nexus on the machine that will run it, and the result is not relocatable — it finds its Python runtime through a path baked in at build time. If you want a packaged, supported install today, use Windows.

Studio and Lens are Windows-only. A Linux install is headless; engineers connect to it from a Windows workstation.

Prerequisites

  • A 64-bit Linux with GCC 13 or later.
  • CMake 3.25+, Ninja, and vcpkg.
  • A free-threaded CPython 3.14t build.
  • Node.js, to build the web bundle.

1. Build

Nexus builds without the Studio toolchain, so a server does not need Qt:

bash
export RAYLUX_PYTHON_HOME=/opt/python3.14t
export VCPKG_ROOT=/opt/vcpkg

cmake -B build -S . \
  -DRAYLUX_NEXUS_ONLY=ON \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_TOOLCHAIN_FILE=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
cmake --build build --parallel

Build the operator runtime too, unless you want a Nexus instance with no screens:

bash
npm ci --prefix web
npm run build --prefix web

The install step looks for the web bundle when it runs, so the order of these two builds does not matter.

2. Install

bash
sudo cmake --install build --prefix /usr/local
PathContents
/usr/local/bin/raylux-nexusNexus
/usr/local/share/raylux/web/the operator runtime
/usr/local/share/raylux/fonts/fonts embedded into report PDFs
/usr/local/lib/systemd/system/raylux-nexus.servicethe service unit
/usr/local/lib/sysusers.d/raylux-nexus.confthe raylux service account

If the web bundle is missing the install warns and continues — a headless Nexus is a legitimate deployment.

3. Create the service account

bash
sudo systemd-sysusers
getent passwd raylux        # confirm it exists

4. Start it

bash
sudo systemctl daemon-reload
sudo systemctl enable --now raylux-nexus
systemctl status raylux-nexus

The unit creates /var/lib/raylux and /var/log/raylux with the right ownership on every start, so there is nothing to chown.

5. Check it

bash
curl http://localhost:8080/health          # {"status":"ok"}
curl http://localhost:8080/health/ready    # {"status":"ready"}

Then continue to First run to create your administrator account.

Opening the firewall

Unlike the Windows installer, nothing opens ports for you.

bash
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --reload

Operating it

bash
journalctl -u raylux-nexus -f      # live log
sudo systemctl restart raylux-nexus
sudo systemctl stop raylux-nexus

Nexus also writes its own rotating log to /var/log/raylux/raylux_nexus.log.

Known limitations

  • Not relocatable. The binary locates libpython3.14t.so through a build-time path. Copying the install to another machine will not work.
  • Readiness is not reported to systemd. The unit is Type=exec, so systemd considers the service started as soon as the process execs, not once it can serve. Gate on /health/ready instead.
  • No configuration migration. Upgrading across a change in the configuration format is currently a manual edit.
  • If you move Nexus to port 443, add AmbientCapabilities=CAP_NET_BIND_SERVICE and the matching CapabilityBoundingSet to the unit. Do not run it as root.