Skip to content

Install on Linux

import { Aside } from ‘@astrojs/starlight/components’;

The Linux sink runs as a systemd service and starts automatically on boot. It uses a single pre-built binary — no Python runtime or virtual environment needed. It supports self-updating: new versions are applied automatically when signalled by the Hub.


  • Linux with systemd (Ubuntu 20.04+, Debian 11+, RHEL 8+, or equivalent)
  • curl installed — the installer auto-installs it on Debian/Ubuntu; other distros must install curl manually
  • Network connectivity to the Hub host and port (outbound TCP — no inbound rules needed)
  • Network connectivity to the controller URL (for downloading the binary and updates)
  • sudo privileges
  • A configured Sink Type with its Client ID and Client Secret (see Sink Types & Configuration)

The installer script handles everything: creating the service user, downloading the binary, writing the systemd unit, and starting the service.

Terminal window
curl -fsSL https://<controller-url>/api/install-linux-service.sh | \
sudo bash -s -- --controller-url https://<controller-url> --client-secret <your-client-secret>

Replace <controller-url> with your Nexomatic controller hostname and <your-client-secret> with the secret from your Sink Type.


Download the installer script from your controller or from your organisation’s release server:

Terminal window
curl -O https://<controller-url>/api/install-linux-service.sh
chmod +x install-linux-service.sh

Alternatively, your administrator may provide a zip bundle containing the binary and installer together.

At minimum you need --controller-url and --client-secret. All other flags have sensible defaults.

Terminal window
sudo ./install-linux-service.sh \
--controller-url https://controller.example.com \
--client-secret <your-client-secret>

The installer will:

  1. Check dependencies (curl, systemd)
  2. Create the nexomatic system user and group
  3. Create /opt/nexomatic-sink/ with data and logs directories
  4. Download the nexomatic-sink binary from the controller’s downloads API
  5. Create the systemd unit file at /etc/systemd/system/nexomatic-sink.service
  6. Set permissions and enable the service
  7. Optionally start the service immediately

Check the service is running:

Terminal window
systemctl status nexomatic-sink

Within a few seconds the sink should appear as ONLINE on the Sinks screen in Nexomatic.


FlagDefaultDescription
--controller-url(required)Controller URL; used to fetch the binary and for the running service
--server-urlSame as --controller-urlOverride the controller URL used by the running service
--client-secret(required)Client secret from your Sink Type
--client-idREMOTE:LINUXClient ID — must match the Sink Type name
--hub-hostlocalhostHub gRPC hostname
--hub-port50051Hub gRPC port
--hub-tlstrueUse TLS for the gRPC connection (default for external LoadBalancers)
--no-hub-tlsDisable TLS (only for local/plaintext debugging)
--auth-methodclient_credentialsAuthentication method: client_credentials, entra_id, google, github, or none
--max-processes4Maximum concurrent task processes
--tenant-uuid(none)Pin the sink to a single tenant (omit for multi-tenant)
--tenant-secret(none)Node registration secret (required if tenant enforces node auth)
--update-base-url(none)Base URL for self-update packages (e.g. https://releases.example.com/nexomatic-sink)
--node-version(auto-detected)Version string written to the VERSION file
--node-type-uuid(seeded UUID)NodeType UUID

These are written to the systemd unit file by the installer. If you need to change them later, edit /etc/systemd/system/nexomatic-sink.service and run sudo systemctl daemon-reload && sudo systemctl restart nexomatic-sink.

VariableRequiredDescription
SERVER_URLYesController API URL
HUB_HOSTYesHub gRPC hostname or IP
HUB_PORTYesHub gRPC port (default 50051)
HUB_TLSYestrue to use TLS, empty for plaintext
CLIENT_IDYesSink Type identifier (e.g. REMOTE:LINUX)
CLIENT_SECRETYesClient secret for the Sink Type
CLIENT_TYPEYesSame as CLIENT_ID
AUTH_METHODYesclient_credentials, entra_id, google, github, or none
MAX_PROCESSESNoMaximum concurrent tasks (default 4)
LOOP_INTERVALNoPolling interval in seconds (default 10)
LOG_RETENTION_DAYSNoDays to retain local logs (default 7)
ROOT_FOLDERYesInstallation root (/opt/nexomatic-sink)
TENANT_UUIDNoPin the sink to a single tenant
TENANT_SECRETNoTenant registration secret
NODE_TYPE_UUIDYesNodeType UUID for identity
NODE_VERSIONNoInstalled version string
UPDATE_BASE_URLNoBase URL for self-update downloads

The installer downloads the sink binary from the controller’s Downloads API:

  1. The installer calls GET /api/v1/downloads/latest/linux/nexomatic-sink-linux-x86_64/url
  2. The controller returns a presigned URL (time-limited download link)
  3. The installer downloads the binary from the presigned URL
  4. The binary is placed at /opt/nexomatic-sink/nexomatic-sink and made executable

If you have a bundled zip (binary + installer), the installer uses the local binary instead of downloading.


When --update-base-url is configured, the sink checks for newer versions at startup and when signalled by the Hub. The update process:

  1. Finish any in-progress tasks
  2. Download the new package zip from the update base URL
  3. Extract it over the existing installation
  4. Call sys.exit(0) — systemd’s Restart=always restarts the service with the new code

No manual action is required. The service will be briefly offline during the update.


Terminal window
# View status and recent logs
systemctl status nexomatic-sink
# Follow live logs
journalctl -u nexomatic-sink -f
# Stop / start / restart
sudo systemctl stop nexomatic-sink
sudo systemctl start nexomatic-sink
sudo systemctl restart nexomatic-sink

Terminal window
sudo systemctl stop nexomatic-sink
sudo systemctl disable nexomatic-sink
sudo rm /etc/systemd/system/nexomatic-sink.service
sudo systemctl daemon-reload
sudo rm -rf /opt/nexomatic-sink
sudo userdel nexomatic

To keep logs and data files, back up /opt/nexomatic-sink/nexomatic_data/ before removing.


SymptomLikely causeFix
Service fails to startBinary not executable or missingCheck /opt/nexomatic-sink/nexomatic-sink exists and has execute permissions
OFFLINE in UICannot reach HubTest connectivity: nc -zv <hub-host> 50051
Immediately restartsBad credentialsCheck journalctl -u nexomatic-sink -n 50 for auth errors
Tasks not appearingSink Type mismatchConfirm CLIENT_ID matches the Sink Type name in Nexomatic
TLS errorsWrong TLS settingIf connecting to a plaintext port, use --no-hub-tls