How to monitor Ollama and get an alert when it goes down

A home Ollama box fails quietly: the service crashes after an update, the GPU drops off the bus, a model gets evicted and the next request takes a minute. Here's how to hear about it in Discord, Slack, Teams or Telegram within minutes, without opening a port.

The short version

  1. Create a monitor (one curl, no sign-up).
  2. Put a small shell script on the Ollama box.
  3. Run it every 5 minutes from cron or a systemd timer.

If the heartbeats stop, or the script reports Ollama as unreachable, you get one alert. When it comes back, you get one more. That's it.

1. Create a monitor

curl -X POST https://pawpulse.dougalpaw.workers.dev/v1/monitors \
  -H 'content-type: application/json' \
  -d '{"name":"home-ollama","grace_seconds":600,
       "webhook_url":"https://discord.com/api/webhooks/…"}'

Use any webhook URL you like: Discord, Slack, Microsoft Teams, Google Chat, a Telegram bot sendMessage URL with ?chat_id=, or any endpoint that accepts JSON (n8n, Home Assistant). The response contains id, ingest_token and manage_token. Save them now; they're shown once.

grace_seconds is how long Paw Pulse waits without a heartbeat before calling it down. With a 5-minute schedule, 600 (two missed beats) avoids false alarms from one slow run.

2. Install the client

sudo curl -o /usr/local/bin/pawpulse.sh https://pawpulse.dougalpaw.workers.dev/pawpulse.sh
sudo chmod +x /usr/local/bin/pawpulse.sh

It's a POSIX sh script that needs only curl; read it first, it's short. Each run it asks your local Ollama for /api/tags and /api/ps, then posts ok/fail, the loaded model names and, if you turn it on, tokens/sec. It never sends your hostname, IP or prompts.

Test it by hand:

PAWPULSE_ID=<id> PAWPULSE_TOKEN=<ingest_token> pawpulse.sh

3. Schedule it

cron (crontab -e):

*/5 * * * * PAWPULSE_ID=<id> PAWPULSE_TOKEN=<ingest_token> /usr/local/bin/pawpulse.sh

systemd timer, if you prefer:

# /etc/systemd/system/pawpulse.service
[Service]
Type=oneshot
Environment=PAWPULSE_ID=<id>
Environment=PAWPULSE_TOKEN=<ingest_token>
ExecStart=/usr/local/bin/pawpulse.sh

# /etc/systemd/system/pawpulse.timer
[Timer]
OnBootSec=2min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload && sudo systemctl enable --now pawpulse.timer

Catch "alive but slow" too

A box that answers but generates at 2 tokens/sec is broken in practice (often it has fallen back from GPU to CPU). Turn on the speed probe and set a threshold:

# in the cron line or systemd unit
MEASURE_TPS=1 MEASURE_MODEL=llama3.2:3b

# on the monitor (manage token)
curl -X PATCH https://pawpulse.dougalpaw.workers.dev/v1/monitors/<id> \
  -H 'authorization: Bearer <manage_token>' -H 'content-type: application/json' \
  -d '{"slow_tps_threshold":10}'

The probe runs one tiny generation per beat, so pick a small model that's normally loaded.

llama.cpp, vLLM, LM Studio and others

Anything with an OpenAI-compatible /v1/models endpoint works. Set LLM_KIND=openai and LLM_BASE_URL, for example http://127.0.0.1:8080 for llama.cpp's server or http://127.0.0.1:8000 for vLLM.

Other ways to do it

Paw Pulse isn't the only option. A fair summary:

FAQ

Do I need an account? No. Monitors are anonymous: a random id plus two tokens. See Privacy.

Can I get alerts without Paw Pulse holding my webhook? Yes: leave webhook_url out and poll /v1/monitors/<id>/status from your own tooling, or embed the status badge.

Can my AI agent set this up? Yes. Point it at https://pawpulse.dougalpaw.workers.dev/mcp; it can create the monitor and give you the exact commands to run.

Set up a monitor →