Self-host Healthchecks
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.
Key facts
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:
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.