One-liner
Скопируйте блок под сервер. Он поставит Go, если его нет, затем установит CLI через go install.
# Linux x86_64 / ARM64
command -v go >/dev/null || {
GO_VERSION="$(curl -fsSL 'https://go.dev/VERSION?m=text' | head -n 1)"
case "$(uname -m)" in
x86_64|amd64) GO_ARCH="amd64" ;;
aarch64|arm64) GO_ARCH="arm64" ;;
*) echo "Unsupported architecture: $(uname -m)"; exit 1 ;;
esac
curl -fsSLO "https://go.dev/dl/${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
export PATH="/usr/local/go/bin:$PATH"
}
go install github.com/nerve-ink/nerve-cli/cmd/nerve@latest
export PATH="$PATH:$(go env GOPATH)/bin"
export NERVE_DSN="nerve://TOKEN:[email protected]"
echo "smoke failed on api-prod" | nerve send --severity alert
С exit status
if ./smoke.sh; then
echo "smoke passed: api-prod" | nerve send
else
echo "smoke failed: api-prod" | nerve send --severity critical
fi
Почему не сырой curl webhook
Сырой webhook обычно отправляет plaintext на сервер. Nerve CLI шифрует payload локально sender key, а backend получает уже ciphertext.
Передать последние строки ошибки
Для реального runbook-а одной фразы “упало” мало. Сохраните вывод команды и отправьте короткий хвост.
LOG="/tmp/deploy.log"
if ! ./deploy.sh >"$LOG" 2>&1; then
{
echo "deploy failed on $(hostname)"
tail -20 "$LOG"
} | nerve send --severity critical
fi
JSON через jq
Если источник уже отдает JSON, не отправляйте весь payload. Вытащите только поля, которые нужны на телефоне.
curl -s https://api.example.com/status \
| jq -r '"status=\(.status) service=\(.service) message=\(.message)"' \
| nerve send --severity alert
Проверка установки
Если команда не находится из cron, добавьте $(go env GOPATH)/bin в PATH или используйте полный путь до бинарника nerve.