# Self-Hosted Healthchecks Healthchecks is open-source, and is licensed under the BSD 3-clause license. As an alternative to using the hosted service at [https://healthchecks.io](https://healthchecks.io), you have the option to host a Healthchecks instance yourself. The building blocks are: * Python 3.6+ * Django 3 * PostgreSQL or MySQL ## Setting Up for Development You can set up a development environment in a Python [virtual environment](https://docs.python.org/3/tutorial/venv.html) on your local system to develop a new feature, write a new integration or test a bugfix. The following instructions assume you are using a Debian-based OS. * Install dependencies: $ sudo apt-get update $ sudo apt-get install -y gcc python3-dev python3-venv * Prepare directory for project code and virtualenv. Feel free to use a different location: $ mkdir -p ~/webapps $ cd ~/webapps * Prepare virtual environment (with virtualenv you get pip, we'll use it soon to install requirements): $ python3 -m venv 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 wheel $ pip install -r healthchecks/requirements.txt * Create database tables and a superuser account: $ cd ~/webapps/healthchecks $ ./manage.py migrate $ ./manage.py createsuperuser With the default configuration, Healthchecks stores data in a SQLite file `hc.sqlite` in the project directory (`~/webapps/healthchecks/`). * Run tests: $ ./manage.py test * Run development server: $ ./manage.py runserver * From another shell, run the `sendalerts` management command, responsible for sending out notifications: $ ./manage.py sendalerts At this point, the site should now be running at `http://localhost:8000`. ## Accessing Administration Panel Healthchecks comes with Django's administration panel where you can manually view and modify user accounts, projects, checks, integrations etc. To access it, if you haven't already, create a superuser account: $ ./manage.py createsuperuser Then, log into the site using the superuser credentials. Once logged in, click on the "Account" dropdown in top navigation, and select "Site Administration". ## Sending Emails Healthchecks needs SMTP credentials to be able to send emails: login links, monitoring notifications, monthly reports. Specify SMTP credentials using the `EMAIL_HOST`, `EMAIL_PORT`, `EMAIL_HOST_USER`, `EMAIL_HOST_PASSWORD`, and `EMAIL_USE_TLS` environment variables. Example: ```ini EMAIL_HOST=my-smtp-server-here.com EMAIL_PORT=587 EMAIL_HOST_USER=my-username EMAIL_HOST_PASSWORD=mypassword EMAIL_USE_TLS = True ``` You can read more about handling outbound email in the Django documentation, [Sending Email](https://docs.djangoproject.com/en/3.1/topics/email/) section. ## Receiving Emails Healthchecks comes with a `smtpd` management command, which starts up a SMTP listener service. With the command running, you can ping your checks by sending email messages. Start the SMTP listener on port 2525: $ ./manage.py smtpd --port 2525 Send a test email: $ curl --url 'smtp://127.0.0.1:2525' \ --mail-from 'foo@example.org' \ --mail-rcpt '11111111-1111-1111-1111-111111111111@my-hc.example.org' \ -F '=' ## Sending Status Notifications The `sendalerts` management command continuously polls the database for any checks changing state, and sends out notifications as needed. When `sendalerts` is not running, the Healthchecks instance will not send out any alerts. Within an activated virtualenv, run the `sendalerts` command like so: $ ./manage.py sendalerts In a production setup, make sure the `sendalerts` command can survive server restarts. ## 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, old records of outgoing email messages and old records of received pings. There are separate Django management commands for each task: Remove old records from the `api_ping` table. For each check, keep 100 most recent pings: $ ./manage.py prunepings Remove old records of sent notifications. For each check, remove notifications that are older than the oldest stored ping for the corresponding check. $ ./manage.py prunenotifications Remove inactive user accounts: ```bash $ ./manage.py pruneusers ``` Remove old records from the `api_tokenbucket` table. The TokenBucket model is used for rate-limiting login attempts and similar operations. Any records older than one day can be safely removed. $ ./manage.py prunetokenbucket Remove old records from the `api_flip` table. The Flip objects are used to track status changes of checks, and to calculate downtime statistics month by month. Flip objects from more than 3 months ago are not used and can be safely removed. $ ./manage.py pruneflips When you first try these commands on your data, it is a good idea to test them on a copy of your database, and not on the live system. In a production setup, you will want to run these commands regularly, as well as have regular, automatic database backups set up. ## Next Steps Get the [source code](https://github.com/healthchecks/healthchecks). See [Configuration](../self_hosted_configuration/) for a list of configuration options.