One systemd unit per role, on as many hosts as you have, sharing one log server. This is the shape Choose your deployment points at for systemd split by role. Topologies, section 2.2, is the mechanism.

1. Prerequisites

A Debian, Ubuntu, Fedora or RHEL host per role you run (or several roles per host, each under its own unit), plus one more host for the log server. Root access on each.

2. Install

curl -fsSL https://pkgs.jaque.sh/install.sh | sh

on every host that runs a jaque role. See Install for the apt/dnf repositories by hand. The package installs jaque.service, which these units replace one per role; leave jaque.service itself disabled on these hosts.

3. The log server

Pick one host and run a log server on it before starting any role. The log service in split by role, compose names the exact software and version this guide assumes; install your distribution's equivalent package, listening on 4222 reachable from every other host in this guide.

4. The files

The canonical copy of every unit and env file below is under deploy/systemd/distributed/ in the repository: one jaque-<role>.service per role, modelled on the packaged jaque.service (same user, same hardening, its own StateDirectory), and one env file per role under deploy/systemd/distributed/env/. Copy the unit for each role onto the host that runs it, and its env file to /etc/default/jaque-<role> there; replace log.internal with your log server's address.

# deploy/systemd/distributed/jaque-engine.service
[Unit]
Description=jaque monitoring engine (engine role)
Documentation=https://jaque.sh/docs/
After=network-online.target
Wants=network-online.target

[Service]
User=jaque
Group=jaque
EnvironmentFile=/etc/default/jaque-engine
ExecStart=/usr/bin/jaque
Restart=on-failure
RestartSec=5s
StateDirectory=jaque-engine
StateDirectoryMode=0750
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectControlGroups=yes
RestrictSUIDSGID=yes

[Install]
WantedBy=multi-user.target
# deploy/systemd/distributed/env/jaque-engine.env
JAQUE_TARGET=engine
JAQUE_CONFIG=/etc/jaque/config.cue
JAQUE_LISTEN=127.0.0.1:8080
JAQUE_EVENTLOG=nats://log.internal:4222
JAQUE_COORDINATION=nats://log.internal:4222
JAQUE_QUEUE=nats://log.internal:4222
JAQUE_NOTIFY_DELIVERY=external

The worker, ui, notifier and sink units are the same shape with their own StateDirectory and env file; worker takes no -config and ui listens on 0.0.0.0 since it serves the dashboard. engine runs -notify-delivery external because a notifier unit is also running.

5. Start

On each host, after copying its unit and env file:

systemctl daemon-reload
systemctl enable --now jaque-<role>

6. Verify

jaque version
curl http://<ui-host>:8080/status.json

on the ui host, and curl http://127.0.0.1:8080/metrics | grep jaque_membership_size on the engine host -- with one engine, the value is 1.

7. Add a worker zone

Copy jaque-worker.service and its env file to another host, set JAQUE_ZONES in that copy to the new zone name, and give the hosts in your config that zone. Only a worker serving a zone picks up checks for objects in it; see Topologies, section 3.

8. Where things live

Config at /etc/jaque/config.cue on every host that takes -config (every role but worker). Environment per role at /etc/default/jaque-<role>. State under /var/lib/jaque-<role>, one directory per role. Logs go to each unit's journal: journalctl -u jaque-<role>.

9. Upgrade

apt-get update && apt-get install -y jaque   # Debian/Ubuntu
dnf upgrade -y jaque                          # Fedora/RHEL

on each host, then systemctl restart jaque-<role> there. Roles on different hosts upgrade independently; nothing requires taking the whole deployment down at once.

10. Next steps

CUE in practice adds services and contacts to the shared config. Contacts and policies wires a hard state to a person, delivered by the notifier role. Cluster and coordination is what adding a second engine host buys.

11. Security considerations

worker holds no config and no notification secret; sink and notifier open no dashboard, API or Livestatus listener. See Cluster and coordination, section 7, for what access to the log server amounts to, and Security for the rest.