Install

Two minutes to a running lookout.

Build the binary, run the installer, paste one webhook. Pince takes it from there.

  • Linux x86_64 · aarch64
  • systemd (or a log file)
  • Rust 1.75+ to build
  • root to install
Pince, the crab topman, waving from his crow's nest

Step 1

Build and install

Gabier is not on crates.io yet, so both routes start from the repository. Either way, install.sh finishes the job.

build on the server
$ git clone https://github.com/Flottille/gabier
$ cd gabier
$ cargo build --release
$ sudo ./install.sh

Needs a Rust toolchain on the box.

static build elsewhere
$ docker run --rm -v "$PWD:/app" -w /app rust:1-slim sh -c \
    "rustup target add x86_64-unknown-linux-musl && \
     cargo build --release --target x86_64-unknown-linux-musl"
$ scp target/x86_64-unknown-linux-musl/release/gabier vps:/tmp/
$ ssh vps 'cd gabier && sudo ./install.sh /tmp/gabier'

Fully static. No Rust on the server.

What the installer puts where

/usr/local/bin/gabier
The binary.
/etc/gabier/config.toml
Your config, mode 0640, owned by root:gabier. Never overwritten on reinstall.
/etc/gabier/env
Optional. Webhook secrets, read by the unit. Create it yourself with mode 600.
/etc/systemd/system/gabier.service
The hardened unit, enabled at boot.
user gabier
A system account with no shell and no home.

Step 2

Create a webhook and paste it

Discord: channel settings → Integrations → Webhooks → New webhook. Copy the URL.

Slack: api.slack.com/apps → your app → Incoming Webhooks → Add New Webhook to Workspace. Copy the URL.

One of the two sections is enough; both is fine, and then each notification goes to both.

shell
$ sudo nano /etc/gabier/config.toml   # paste webhook_url

# or keep the secret out of the config entirely:
$ echo 'GABIER_DISCORD_WEBHOOK=https://discord.com/api/webhooks/...' \
    | sudo tee /etc/gabier/env >/dev/null
$ sudo chmod 600 /etc/gabier/env
shell
$ sudo -u gabier gabier check --config /etc/gabier/config.toml
config    /etc/gabier/config.toml
serveur   vps-prod-1
source    journald (ssh, sshd)
évènements accepted=true failed=true invalid_user=true closed=false
anti-spam 1 échec(s) par IP, puis résumé toutes les 300s
discord   https://discord.com/api/webhooks/123/abcd…
          joignable

Tout est prêt.
$ sudo -u gabier gabier test --config /etc/gabier/config.toml
$ sudo systemctl start gabier
$ sudo journalctl -u gabier -f

Step 3

Verify, then start

check validates the config and actually reaches every webhook, with the token masked and nothing posted to your channel. test then posts one real message.

Now log in over SSH from another machine. Your channel should light up within a second.

Distribution notes

The default units = ["ssh", "sshd"] follows both, and journalctl ignores the one that does not exist — so on every systemd distribution there is nothing to change.

Which sshd unit and log file to use on each distribution
Distribution sshd unit Log file (if not journald) Note
Debian / Ubuntu ssh /var/log/auth.log Default config works as is.
Fedora / RHEL / Alma / Rocky sshd /var/log/secure Default config works as is.
Arch sshd journald only Default config works as is.
Alpine (OpenRC) — /var/log/messages Use kind = "file" and write your own OpenRC script; install.sh needs systemd.
Ubuntu 24.04 with socket activation ssh — sshd still logs under ssh; nothing to change.

Upgrade

shell
$ git pull && cargo build --release
$ sudo ./install.sh            # keeps your existing config.toml
$ sudo systemctl restart gabier

Re-running the installer is the upgrade path: it replaces the binary and the unit, and leaves your config alone.

Uninstall

shell
$ sudo systemctl disable --now gabier
$ sudo rm /etc/systemd/system/gabier.service \
    /usr/local/bin/gabier
$ sudo rm -r /etc/gabier       # holds your webhook
$ sudo userdel gabier

Nothing else is written anywhere. Pince leaves no footprints.

Something did not work?

The docs have a troubleshooting section, and issues are welcome.