Docs Guides
Monitoring
sitesolide setup installs a monitor that checks the server every minute. Until you connect a heartbeat and a webhook, it writes to the server's journal only.
What it checks
Link to the section What it checks| Check | Alerts when |
|---|---|
| Caddy | Not running, or restarted by systemd on its own. |
| Every served site | No valid HTTPS answer, or a status of 500 or above. |
| Project services | A unit failed, stopped or crashing in a loop, or a scheduled run failed. |
| Certificates | One expires within 14 days. |
| Disk and memory | A disk 90% full, or less than 10% of memory available. |
| Backups | The last run failed, or is over 26 hours old. |
A failure is reported after two failed passes in a row, or three in five: within two to three minutes. You get one message when it goes down, one when it recovers, and the dashboard lists it under Issues.
Create a heartbeat check
Link to the section Create a heartbeat checkThe heartbeat is a dead man's switch: the monitor pings an outside service every minute, and that service alerts you when the pings stop. It is what notices the server itself dying.
- Sign up at healthchecks.io. The free tier is enough, and your email is already an alert channel.
- Add a check with a period of 1 minute and a grace of 5 minutes.
- Copy its ping URL,
https://hc-ping.com/<uuid>. Keep it secret: whoever holds it can hide an outage.
Set the addresses
Link to the section Set the addressesCreate the root-owned alerting file on the server, once:
ssh <user@host> 'sudo install -m 600 -o root -g root /dev/null /etc/sitesolide/dashboard-monitor.env'
Then fill it from the dashboard:
- Open the dashboard site, then Secrets, and unlock.
- In
dashboard-monitor.env, setHEARTBEAT_URLto the ping URL. The monitor reads it at its next pass, with nothing to restart. - For chat messages too, set
ALERT_WEBHOOK_URL: a Slack, Discord or Google Chat webhook, orhttps://ntfy.sh/<topic>with a topic nobody would guess.
Both addresses must be https. The message format follows the address; ALERT_WEBHOOK_FORMAT (slack, discord, googlechat, text or json) sets it for any other.
Note
Only a platform failure, such as Caddy, a full disk or the dashboard, sends the heartbeat to <url>/fail. One project down still pings success, and lists the failure in the ping's body.
Check it worked
Link to the section Check it workedssh <user@host> 'sudo journalctl -u sitesolide-monitor -n 20 -o cat | grep "checks," | tail -n 1'
41 checks, 0 down, 0 failing; heartbeat ok, webhook idle
Look for heartbeat ok, and for the check to turn green on healthchecks.io within two minutes. Without a webhook, the line ends with webhook unconfigured.
What an alert looks like
Link to the section What an alert looks likesitesolide monitor, example.com: 1 down
DOWN https://shop.example.com/ answered 502 (since 2026-10-04 14:02 UTC)
When the site answers again, a second message says RECOVERED.
Next steps
Link to the section Next steps- Backups: the snapshots the backup check watches.
- Your server: reboot and look after the server the monitor watches.