Skip to content

Self-host Healthchecks

prices checked · Aug 2026

A cron job and background task monitor: your scheduled jobs ping a URL when they finish, and Healthchecks alerts you when the ping does not arrive on time. It watches jobs from the inside — the dead-man's-switch half of monitoring that endpoint checkers miss entirely.

UptimeRobot / yr$84
Self-hosted / yr~$55
You keep$29/yr
Pocket the difference — spin it up on a cheap VPS in minutes.Start free on Kamatera →

Key facts

CategoryMonitoring
LicenseBSD-3-Clause
StackPython, Django, PostgreSQL
Min RAM1024 MB
Dockeryes
Difficulty
Our recommendation

Pick Healthchecks when the question you need answered is “did my job actually run?” — backups, cron jobs and batch workers, the things that fail by quietly not happening. Your job pings a URL on success and Healthchecks alerts you when that ping is late or never arrives. It is a passive monitor: it never requests your site, so it cannot tell you a web server is broken. Run it alongside Uptime Kuma or Gatus rather than choosing between them, because nothing else in this category covers the dead-man’s-switch half of monitoring properly.

What you need

  • Any VPS with at least 1024 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • About an afternoon — budget time for troubleshooting

Install

Run these commands on your server:

# Healthchecks — the reference compose in the repo (Django app + Postgres)
git clone https://github.com/healthchecks/healthchecks.git
cd healthchecks/docker
cp .env.example .env   # set SECRET_KEY, DB_PASSWORD, ALLOWED_HOSTS, SITE_ROOT
docker compose up -d
docker compose run --rm web /opt/healthchecks/manage.py createsuperuser
# this compose file builds the image from the checkout — drop the build: block
# for image: healthchecks/healthchecks:latest to use the prebuilt one instead
# →  http://SERVER_IP:8000  (no TLS; put a reverse proxy in front)

What you take on

Healthchecks is a Django app with a real database, and it points the opposite way from everything else here:

non-negotiableIt only ever receives pings — it never probes anything. If your site starts serving errors to visitors, Healthchecks stays green all day. It is the complement to an endpoint checker, never a replacement for one.
non-negotiableA real deployment wants Postgres (MySQL or MariaDB also work), and the reference Compose file builds the image from a checkout rather than pulling one. A source install quietly falls back to a SQLite file in the working directory — fine for a trial, not what you want holding your alerting state.
non-negotiableThe alerts are only as good as the notification path you set up, which usually means SMTP. Set SECRET_KEY, ALLOWED_HOSTS and SITE_ROOT correctly and put a reverse proxy in front — it listens on plain HTTP with no TLS of its own, and the per-check ping URLs are effectively secrets.

An alternative to

More in Monitoring

Common questions

What does Healthchecks actually monitor?

Inbound pings, not outbound requests. Each check gets a unique URL that your backup script, cron job or worker curls on success; if the ping is late or never comes, Healthchecks alerts you. It is how you find out that a nightly backup quietly stopped running three weeks ago.

Can Healthchecks replace UptimeRobot?

For cron and heartbeat monitoring, yes — that is exactly what it does, and it does it better than a bolted-on feature. For website uptime, no: it never requests your site, so it will not notice a web server serving errors to visitors. Pair it with Uptime Kuma or Gatus to cover both directions.

Which database does Healthchecks need?

PostgreSQL, MySQL or MariaDB for a real deployment, and the reference compose file starts Postgres for you. A source install will fall back to a SQLite file in the checkout directory, which is fine for trying it out and not what you want in production.

How do I self-host Healthchecks with Docker?

Clone the repo, copy docker/.env.example to docker/.env and fill in SECRET_KEY, the database password, ALLOWED_HOSTS and SITE_ROOT, then bring the stack up and create a superuser through manage.py. It listens on port 8000 and handles no TLS, so a reverse proxy is required for anything reachable from the internet.

Search SelfHost Atlas

Search apps, comparisons, guides, and categories.

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.