Install the Compute Node agent on Linux
Chapter 3 · about 7 minutes to read
This is chapter 3 of Stage 2. Linux is where Zyra's headless story shines — most production fleets are Linux servers, and the agent supports a fully unattended install with the enrollment key embedded. Desktop Linux users with a GUI get the same Electron experience as Windows and macOS.
Time: about 10 minutes (GUI) or about 3 minutes (headless, scriptable). Prerequisites: Ubuntu 22.04+/Debian 12+/Fedora 39+/Rocky 9+ (or any modern distro with glibc 2.31+), root or sudo, an enrollment key.
Step 1 — Pick a package format
Zyra ships three Linux packages, all generated by electron-builder per desktop/package.json:
| Format | Best for | Install command |
|---|---|---|
.deb | Debian, Ubuntu, Mint, Pop!_OS | sudo apt install ./zyra-agent_1.9.0_amd64.deb |
.rpm | Fedora, RHEL, Rocky, AlmaLinux, openSUSE | sudo dnf install ./zyra-agent-1.9.0.x86_64.rpm |
.AppImage | Any distro; portable single file | chmod +x ./zyra-agent-1.9.0.AppImage && ./zyra-agent-1.9.0.AppImage |
For headless servers, skip the GUI packages and use the zyra-install.sh script described in Step 4.
Step 2 — Install runtime dependencies
The Electron-based agent statically bundles its Node runtime, but it still needs a few system libraries that nearly every desktop distro already has and many minimal server installs do not:
# Debian / Ubuntu
sudo apt install -y libnss3 libatk-bridge2.0-0 libgtk-3-0 libxss1 \
libasound2 libdrm2 libgbm1 libxcomposite1 libxdamage1
# Fedora / Rocky
sudo dnf install -y nss atk at-spi2-atk gtk3 libXScrnSaver \
alsa-lib libdrm libgbm libXcomposite libXdamage
If you want to run Docker-based Virtual Servers on the same machine (the common pattern), also install Docker Engine. The agent talks to Docker via /var/run/docker.sock; the user running the agent must be in the docker group.
Step 3 — Generate an enrollment key
Same flow as the other platforms: Settings → Compute Nodes → Enrollment keys → Create key. Copy the token. For Linux fleets you'll often want uses_remaining capped at the number of machines you're rolling out to — the key auto-decrements per enrollment.
Step 4 — Install (GUI path)
Download the matching package from app.getzyra.io/devices/add (Linux tab) and run the install command from Step 1. The agent appears in your application launcher as Zyra Agent. Launch it, pick Pair with enrollment key, paste the key, validate. The Compute Node appears in the dashboard.
Step 5 — Install (headless server path)
This is the path most IT teams will use. On the server:
curl -fsSL "https://app.getzyra.io/api/v1/devices/agent/download?os=Linux&key=$ENROLLMENT_KEY" \
| sudo bash
Behind the scenes the script:
- Downloads the agent binary into
~/.zyra/zyra-agent. - Writes
~/.zyra/config.iniwithserver=andenrollment_key=lines. - Starts the agent with
nohup ... > ~/.zyra/agent.log 2>&1 &. - On first run the agent reads
config.ini, auto-enrolls against/api/v1/devices/enroll, and persists the resulting device ID.
This is the actual logic in backend/app/routers/devices/agent_download/installers/linux.py — no daemon registration today.
Optional — register as a systemd service
To survive reboots cleanly, drop a unit file at /etc/systemd/system/zyra-agent.service:
[Unit]
Description=Zyra Compute Node Agent
After=network-online.target docker.service
Wants=network-online.target
[Service]
Type=simple
User=zyra
ExecStart=/home/zyra/.zyra/zyra-agent --config /home/zyra/.zyra/config.ini
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Then sudo systemctl daemon-reload && sudo systemctl enable --now zyra-agent. (There is no first-party systemd-unit installer today; this unit file is a recommended pattern, not a shipped artifact.)
Step 6 — Confirm pairing
sudo systemctl status zyra-agent (or ps aux | grep zyra-agent if you skipped systemd) should show the process running. Then check the dashboard: the new Compute Node appears within 60 seconds with the hostname-derived name.
What just happened
The agent runs as your service user, holds an organization-scoped device ID, and heartbeats every 30 seconds. On headless servers, it's running entirely without a display server — no DISPLAY, no X11, no Wayland.
Troubleshooting
- AppImage refuses to run with "FUSE not installed". Install
libfuse2(Ubuntu/Debian) orfuse-libs(Fedora). AppImages need FUSE. - SELinux blocks the agent. Set the binary's context:
chcon -t bin_t ~/.zyra/zyra-agent. For permanent fixes, write a small SELinux policy module. - AppArmor denies Docker socket access. Add the agent's profile to
/etc/apparmor.d/local/allowing/var/run/docker.sock rw,. - "libgbm.so.1 not found" on minimal Ubuntu Server. Re-run Step 2's
apt installlist — minimal Server omits the desktop libraries the Electron runtime needs. config.inilost across reboots. Make sure the install location is under the service user's home, not/tmp.
Last reviewed: 2026-05-21