Skip to content

Keeping an eye on it

Three endpoints, one metrics scrape, and a handful of alerts. This page is short on purpose: there is not much to watch, and watching the wrong things is worse than watching nothing.

These deliberately need no tenant and no database, so they still answer when the instance is unhealthy. That is the whole point of them.

EndpointAnswers
/api/healthLiveness plus build information. Is the process up
/api/health/readyReadiness. Is it able to serve, including the database
/api/health/versionVersion, channel, commit and build time
Terminal window
curl -s https://helpdesk.yourschool.org/api/health/version
{ "version": "0.1.0", "channel": "stable", "commit": "9f2c1ab44e01", "builtAt": "2026-08-01T09:14:22Z" }

Point your uptime checker at /api/health/ready. Point your load balancer at the same. /api/health is for “is the process alive”, which is a different question and a less useful one.

Prometheus metrics are exposed for scraping, including plugboard_build_info, which carries the version as a label. That last one is worth graphing: it makes a fleet-wide “who is on what version” answerable at a glance, and it makes a failed update visible as a version that did not change.

InstallWhere
systemdjournalctl -u plugboard -f
Dockerdocker compose -f docker-compose.prod.yml logs -f api
Bundle on Windows or macOSlogs/ inside the install directory

Errors can also be sent to your own collector. Set SENTRY_DSN to a self-hosted Sentry or GlitchTip. There is no default destination, and nothing is sent anywhere unless you set it.

In rough order of how much it will matter at 8:40 on a Monday.

AlertConditionWhy
Instance down/api/health/ready fails twice in a rowEverything else is downstream of this
Certificate expiringUnder 14 daysThe most common self-inflicted outage
Disk above 85 percentOn the volume holding the database and backupsA full disk stops PostgreSQL and stops backups, in that order
Backup failedThe backup.failed eventYou find out now, not during a restore
Version unchanged after an updateplugboard_build_info still shows the old versionA tag that resolved to the old image
Database connections near the limitDepends on your max_connectionsUsually a sign something is holding transactions open

Plugboard has its own service monitor for the things around it: the intranet, the print server, the Wi-Fi controller, a connector agent’s heartbeat. That is for the services your users depend on.

Do not use it to monitor Plugboard itself. A monitor that lives inside the thing it is watching cannot tell you the thing is down.

  • External uptime check on /api/health/ready, from outside the school network if the desk is reachable from outside.
  • Plugboard’s own monitors for everything else you run, with the ones your community cares about marked public so they land on the status page.
  • Email alerts going to a monitored mailbox, not a personal one. The monitor.down and backup.failed messages are the two that matter.
TaskFrequency
Confirm a backup completed and verify oneWeekly, automated
Restore a backup somewhere and sign inAnnually, by hand
Review the audit log for accounts that should be goneTermly
Check for a new release and read its changelogMonthly
Review connectors still in demo modeAfter any onboarding
Confirm certificate renewal actually happenedWhenever it renews

Plugboard is not demanding, and the numbers that grow are predictable.

  • The audit log is the largest table on any mature install. Retention is configurable; see audit and retention.
  • Submissions and tickets grow linearly with the desk’s workload and are small.
  • Realtime connections cost one open HTTP connection per signed-in console tab. A desk with twelve technicians is not a load problem.

If the database is slow, check that endpoint protection is not scanning every write to the data directory. That is the usual answer on Windows.