Services and units
The units
| Unit | Scope | Command |
|---|---|---|
openmixer-server.service |
systemd user | /usr/bin/openmixer-server --config /etc/openmixer/config.json |
reac-pw.service |
systemd user | /usr/bin/reac-pw, serving every segment declared in ~/.config/reac-pw/reac-pw.env, each configured by its own <iface>.env beside it. Packaged by reac-pw; openmixer writes the conf and drives the unit. |
nginx.service |
system | serves the static surface and proxies the server |
Both openmixer units are installed by the openmixer-server package to
/usr/lib/systemd/user/.
Why user units
The engine is a native PipeWire client. PipeWire runs per user session, so a system-scope service would attach to a different graph and find none of the operator's devices. The same reasoning applies to the transport, which publishes the stagebox as PipeWire nodes in that same graph.
The consequence is lingering: without
loginctl enable-linger, systemd stops both units when the operator's last session ends.
Ordering
openmixer-server.service is ordered After=pipewire.service wireplumber.service and
Wants=pipewire.service.
reac-pw.service is ordered After=pipewire.service network-online.target and
wants both.
Neither waits for the other. The mixer copes with the stagebox arriving late, and the transport copes with the mixer restarting under it.
Everyday commands
systemctl --user status openmixer-server reac-pw
systemctl --user restart openmixer-server
systemctl --user restart reac-pw
systemctl --user stop openmixer-server
journalctl --user -u openmixer-server -f
Restarting the transport is safe with a box connected: the stagebox re-runs its handshake by itself and is normally back within seconds.
Capabilities on the transport
/usr/bin/reac-pw carries file capabilities cap_net_raw,cap_sys_nice=ep, applied by
the reac-pw package's own scriptlet. CAP_NET_RAW is what lets it open the raw socket
on the REAC interface; CAP_SYS_NICE is what lets it hold a real-time scheduling class
for the packet cadence.
reac-pw.service verifies them before it execs, and fails with an explicit
message if they are missing, rather than dying on a silent permission error inside the
capture path.
getcap /usr/bin/reac-pw
NoNewPrivileges= is deliberately not set on that unit: the kernel ignores file
capabilities across execve() when it is on, which would silently strip CAP_NET_RAW.
Do not add it.
Unit overrides
Use drop-ins, never edits to the packaged files (an upgrade replaces those):
systemctl --user edit openmixer-server
Be aware that a file at ~/.config/systemd/user/openmixer-server.service — a whole unit,
not a drop-in — shadows the packaged one and will make upgrades appear to have no
effect. Check with:
systemctl --user list-unit-files | grep -E 'openmixer-server|reac-pw'
Both should resolve from /usr/lib/systemd/user/.