healthchecks/README.md

224 lines
7.1 KiB
Markdown

# healthchecks
[![Build Status](https://travis-ci.org/healthchecks/healthchecks.svg?branch=master)](https://travis-ci.org/healthchecks/healthchecks)
[![Coverage Status](https://coveralls.io/repos/healthchecks/healthchecks/badge.svg?branch=master&service=github)](https://coveralls.io/github/healthchecks/healthchecks?branch=master)
![Screenshot of Welcome page](/stuff/screenshots/welcome.png?raw=true "Welcome Page")
![Screenshot of My Checks page](/stuff/screenshots/my_checks.png?raw=true "My Checks Page")
![Screenshot of Period/Grace dialog](/stuff/screenshots/period_grace.png?raw=true "Period/Grace Dialog")
![Screenshot of Channels page](/stuff/screenshots/channels.png?raw=true "Channels Page")
healthchecks is a watchdog for your cron jobs. It's a web server that listens for pings from your cron jobs, plus a web interface.
It is live here: [http://healthchecks.io/](http://healthchecks.io/)
The building blocks are:
* Python 2 or Python 3
* Django 1.9
* PostgreSQL or MySQL
## Setting Up for Development
These are instructions for setting up HealthChecks Django app
in development environment.
* prepare directory for project code and virtualenv:
$ mkdir -p ~/webapps
$ cd ~/webapps
* prepare virtual environment
(with virtualenv you get pip, we'll use it soon to install requirements):
$ virtualenv --python=python3 hc-venv
$ source hc-venv/bin/activate
* check out project code:
$ git clone https://github.com/healthchecks/healthchecks.git
* install requirements (Django, ...) into virtualenv:
$ pip install -r healthchecks/requirements.txt
* healthchecks is configured to use a SQLite database by default. To use
PostgreSQL or MySQL database, create and edit `hc/local_settings.py` file.
There is a template you can copy and edit as needed:
$ cd ~/webapps/healthchecks
$ cp hc/local_settings.py.example hc/local_settings.py
* create database tables and the superuser account:
$ cd ~/webapps/healthchecks
$ ./manage.py migrate
$ ./manage.py createsuperuser
* run development server:
$ ./manage.py runserver
The site should now be running at `http://localhost:8080`
To log into Django administration site as a super user,
visit `http://localhost:8080/admin`
## Configuration
Site configuration is kept in `hc/settings.py`. Additional configuration
is loaded from `hc/local_settings.py` file, if it exists. You
can create this file (should be right next to `settings.py` in the filesystem)
and override settings as needed.
Some useful settings keys to override are:
`SITE_ROOT` is used to build fully qualified URLs for pings, and for use in
emails and notifications. Example:
SITE_ROOT = "https://my-monitoring-project.com"
`SITE_NAME` has the default value of "healthchecks.io" and is used throughout
the templates. Replace it with your own name to personalize your installation.
Example:
SITE_NAME = "My Monitoring Project"
## Database Configuration
Database configuration is stored in `hc/settings.py` and can be overriden
in `hc/local_settings.py`. The default database engine is SQLite. To use
PostgreSQL, create `hc/local_settings.py` if it does not exist, and put the
following in it, changing it as neccessary:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your-database-name-here',
'USER': 'your-database-user-here',
'PASSWORD': 'your-database-password-here',
'TEST': {'CHARSET': 'UTF8'}
}
}
For MySQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'your-database-name-here',
'USER': 'your-database-user-here',
'PASSWORD': 'your-database-password-here',
'TEST': {'CHARSET': 'UTF8'}
}
}
You can also use `hc/local_settings.py` to read database
configuration from environment variables like so:
import os
DATABASES = {
'default': {
'ENGINE': os.env['DB_ENGINE'],
'NAME': os.env['DB_NAME'],
'USER': os.env['DB_USER'],
'PASSWORD': os.env['DB_PASSWORD'],
'TEST': {'CHARSET': 'UTF8'}
}
}
## Sending Emails
healthchecks must be able to send email messages, so it can send out login
links and alerts to users. Put your SMTP server configuration in
`hc/local_settings.py` like so:
EMAIL_HOST = "your-smtp-server-here.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = "username"
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = True
For more information, have a look at Django documentation,
[Sending Email](https://docs.djangoproject.com/en/1.10/topics/email/) section.
## Sending Status Notifications
healtchecks comes with a `sendalerts` management command, which continuously
polls database for any checks changing state, and sends out notifications as
needed. Within an activated virtualenv, you can manually run
the `sendalerts` command like so:
$ ./manage.py sendalerts
In a production setup, you will want to run this command from a process
manager like [supervisor](http://supervisord.org/) or systemd.
## Database Cleanup
With time and use the healthchecks database will grow in size. You may
decide to prune old data: inactive user accounts, old checks not assigned
to users, records of outgoing email messages and records of received pings.
There are separate Django management commands for each task:
* Remove old records from `api_ping` table. For each check, keep 100 most
recent pings:
````
$ ./manage.py prunepings
````
* Remove checks older than 2 hours that are not assigned to users. Such
checks are by-products of random visitors and robots loading the welcome
page and never setting up an account:
```
$ ./manage.py prunechecks
```
* Remove records of sent email messages older than 7 days.
````
$ ./manage.py pruneemails
````
* Remove old records of sent notifications. For each check, remove
notifications that are older than the oldest stored ping for same check.
````
$ ./manage.py prunenotifications
````
* Remove user accounts that match either of these conditions:
* Account was created more than 6 months ago, and user has never logged in.
These can happen when user enters invalid email address when signing up.
* Last login was more than 6 months ago, and the account has no checks.
Assume the user doesn't intend to use the account any more and would
probably *want* it removed.
```
$ ./manage.py pruneusers
```
When you first try these commands on your data, it is a good idea to
test them on a copy of your database, not on the live database right away.
In a production setup, you should also have regular, automated database
backups set up.
## Integrations
### Pushover
To enable Pushover integration, you will need to:
* register a new application on https://pushover.net/apps/build
* enable subscriptions in your application and make sure to enable the URL
subscription type
* add the application token and subscription URL to `hc/local_settings.py`, as
`PUSHOVER_API_TOKEN` and `PUSHOVER_SUBSCRIPTION_URL`