Running headless
The engine has no user interface and needs no Qt. Configure your hubs and
rules in the desktop app, then hand the resulting data/ folder to a server.
Set the target OS before you type paths
This is the step that catches people out. Watch paths have to be valid on the
machine that runs the engine, not the one that configured it. Configure on
Windows and deploy on Linux, and D:\Releases\Movies means nothing on the
server.
In the desktop app, open Settings and set Target runtime OS to Linux first, then enter each rule's watch path as it will be on the server or inside the container.
Then check it where it will run:
python herald_cli.py --check
That validates the configuration and reports every watch path that does not
resolve. --list prints the configured hubs and which of them are enabled.
Running without arguments starts every enabled hub, and Ctrl-C stops it.
Docker
The image is ghcr.io/luadch-ng/herald:latest. It needs two mounts: the
configuration you created in the desktop app, and the release trees to watch.
Read-only is enough for the latter.
docker run -d --name herald \
-v /path/to/herald-data:/app/data \
-v /path/to/releases:/releases:ro \
ghcr.io/luadch-ng/herald:latest
The container runs as uid 1000, so the mounted data directory has to be writable by it:
mkdir -p herald-data && sudo chown -R 1000:1000 herald-data
Watch paths in the rules must match the mount points inside the container, so
a rule watching /releases/Movies needs the host directory mounted at
/releases. The repository ships a docker-compose.yml with both mounts laid
out.
systemd
For a plain install without Docker, Herald ships an example unit at
deploy/herald.service. Put Herald in /opt/herald, including the data/
folder from the desktop app, and give it a virtual environment with the core
dependencies only:
python3 -m venv /opt/herald/.venv
/opt/herald/.venv/bin/pip install -r /opt/herald/requirements-core.txt
/opt/herald/.venv/bin/python /opt/herald/herald_cli.py --check
Then install and start it:
sudo cp /opt/herald/deploy/herald.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now herald
journalctl -u herald -f
The unit sends SIGTERM on stop, which Herald handles as a clean shutdown and disconnects from every hub rather than dropping the connections.