A cron monitoring tool written in Python & Django

Overview

Healthchecks

Build Status Coverage Status

Screenshot of Welcome page

Screenshot of My Checks page

Screenshot of Period/Grace dialog

Screenshot of Cron dialog

Screenshot of Integrations page

Healthchecks is a cron job monitoring service. It listens for HTTP requests and email messages ("pings") from your cron jobs and scheduled tasks ("checks"). When a ping does not arrive on time, Healthchecks sends out alerts.

Healthchecks comes with a web dashboard, API, 25+ integrations for delivering notifications, monthly email reports, WebAuthn 2FA support, team management features: projects, team members, read-only access.

The building blocks are:

  • Python 3.6+
  • Django 3
  • PostgreSQL or MySQL

Healthchecks is licensed under the BSD 3-clause license.

Healthchecks is available as a hosted service at https://healthchecks.io/.

Setting Up for Development

To set up Healthchecks development environment:

  • Install dependencies (Debian/Ubuntu):

      $ sudo apt-get update
      $ sudo apt-get install -y gcc python3-dev python3-venv libpq-dev
    
  • 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
      $ pip3 install wheel # make sure wheel is installed in the venv
    
  • Check out project code:

      $ git clone https://github.com/healthchecks/healthchecks.git
    
  • Install requirements (Django, ...) into virtualenv:

      $ 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 checkout directory (~/webapps/healthchecks).

    To use PostgreSQL or MySQL, see the section Database Configuration section below.

  • Run tests:

      $ ./manage.py test
    
  • Run development server:

      $ ./manage.py runserver
    

The site should now be running at http://localhost:8000. To access Django administration site, log in as a superuser, then visit http://localhost:8000/admin/

Configuration

Healthchecks reads configuration from environment variables.

Full list of configuration parameters.

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
  • log into the site using superuser credentials
  • in the top navigation, "Account" dropdown, select "Site Administration"

Sending Emails

Healthchecks must be able to send email messages, so it can send out login links and alerts to users. Specify your SMTP credentials using the following environment variables:

EMAIL_HOST = "your-smtp-server-here.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = "smtp-username"
EMAIL_HOST_PASSWORD = "smtp-password"
EMAIL_USE_TLS = True

For more information, have a look at Django documentation, Sending 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 to [email protected] email addresses.

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 '[email protected]' \
    --mail-rcpt '[email protected]' \
    -F '='

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 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 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
      
  • 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, not on the live database right away. In a production setup, you should also have regular, automated database backups set up.

Two-factor Authentication

Healthchecks optionally supports two-factor authentication using the WebAuthn standard. To enable WebAuthn support, set the RP_ID (relying party identifier ) setting to a non-null value. Set its value to your site's domain without scheme and without port. For example, if your site runs on https://my-hc.example.org, set RP_ID to my-hc.example.org.

Note that WebAuthn requires HTTPS, even if running on localhost. To test WebAuthn locally with a self-signed certificate, you can use the runsslserver command from the django-sslserver package.

External Authentication

Healthchecks supports external authentication by means of HTTP headers set by reverse proxies or the WSGI server. This allows you to integrate it into your existing authentication system (e.g., LDAP or OAuth) via an authenticating proxy. When this option is enabled, healtchecks will trust the header's value implicitly, so it is very important to ensure that attackers cannot set the value themselves (and thus impersonate any user). How to do this varies by your chosen proxy, but generally involves configuring it to strip out headers that normalize to the same name as the chosen identity header.

To enable this feature, set the REMOTE_USER_HEADER value to a header you wish to authenticate with. HTTP headers will be prefixed with HTTP_ and have any dashes converted to underscores. Headers without that prefix can be set by the WSGI server itself only, which is more secure.

When REMOTE_USER_HEADER is set, Healthchecks will:

  • assume the header contains user's email address
  • look up and automatically log in the user with a matching email address
  • automatically create an user account if it does not exist
  • disable the default authentication methods (login link to email, password)

Integrations

Slack

To enable the Slack "self-service" integration, you will need to create a "Slack App".

To do so:

  • Create a new Slack app on https://api.slack.com/apps/
  • Add at least one scope in the permissions section to be able to deploy the app in your workspace (By example incoming-webhook for the Bot Token Scopes https://api.slack.com/apps/APP_ID/oauth?).
  • Add a redirect url in the format SITE_ROOT/integrations/add_slack_btn/. For example, if your SITE_ROOT is https://my-hc.example.org then the redirect URL would be https://my-hc.example.org/integrations/add_slack_btn/.
  • Look up your Slack app for the Client ID and Client Secret at https://api.slack.com/apps/APP_ID/general? . Put them in SLACK_CLIENT_ID and SLACK_CLIENT_SECRET environment variables.

Discord

To enable Discord integration, you will need to:

  • register a new application on https://discordapp.com/developers/applications/me
  • add a redirect URI to your Discord application. The URI format is SITE_ROOT/integrations/add_discord/. For example, if you are running a development server on localhost:8000 then the redirect URI would be http://localhost:8000/integrations/add_discord/
  • Look up your Discord app's Client ID and Client Secret. Put them in DISCORD_CLIENT_ID and DISCORD_CLIENT_SECRET environment variables.

Pushover

Pushover integration works by creating an application on Pushover.net which is then subscribed to by Healthchecks users. The registration workflow is as follows:

  • On Healthchecks, the user adds a "Pushover" integration to a project
  • Healthchecks redirects user's browser to a Pushover.net subscription page
  • User approves adding the Healthchecks subscription to their Pushover account
  • Pushover.net HTTP redirects back to Healthchecks with a subscription token
  • Healthchecks saves the subscription token and uses it for sending Pushover notifications

To enable the Pushover integration, you will need to:

  • Register a new application on Pushover via https://pushover.net/apps/build.
  • Within the Pushover 'application' configuration, enable subscriptions. Make sure the subscription type is set to "URL". Also make sure the redirect URL is configured to point back to the root of the Healthchecks instance (e.g., http://healthchecks.example.com/).
  • Put the Pushover application API Token and the Pushover subscription URL in PUSHOVER_API_TOKEN and PUSHOVER_SUBSCRIPTION_URL environment variables. The Pushover subscription URL should look similar to https://pushover.net/subscribe/yourAppName-randomAlphaNumericData.

Signal

Healthchecks uses signal-cli to send Signal notifications. Healthcecks interacts with signal-cli over DBus.

To enable the Signal integration:

  • Set up and configure signal-cli to listen on DBus system bus (instructions). Make sure you can send test messages from command line, using the dbus-send example given in the signal-cli instructions.
  • Set the SIGNAL_CLI_ENABLED environment variable to True.

Telegram

  • Create a Telegram bot by talking to the BotFather. Set the bot's name, description, user picture, and add a "/start" command.

  • After creating the bot you will have the bot's name and token. Put them in TELEGRAM_BOT_NAME and TELEGRAM_TOKEN environment variables.

  • Run settelegramwebhook management command. This command tells Telegram where to forward channel messages by invoking Telegram's setWebhook API call:

    $ ./manage.py settelegramwebhook
    Done, Telegram's webhook set to: https://my-monitoring-project.com/integrations/telegram/bot/
    

For this to work, your SITE_ROOT needs to be correct and use "https://" scheme.

Apprise

To enable Apprise integration, you will need to:

  • ensure you have apprise installed in your local environment:
pip install apprise
  • enable the apprise functionality by setting the APPRISE_ENABLED environment variable.

Shell Commands

The "Shell Commands" integration runs user-defined local shell commands when checks go up or down. This integration is disabled by default, and can be enabled by setting the SHELL_ENABLED environment variable to True.

Note: be careful when using "Shell Commands" integration, and only enable it when you fully trust the users of your Healthchecks instance. The commands will be executed by the manage.py sendalerts process, and will run with the same system permissions as the sendalerts process.

Matrix

To enable the Matrix integration you will need to:

  • Register a bot user (for posting notifications) in your preferred homeserver.
  • Use the Login API call to retrieve bot user's access token. You can run it as shown in the documentation, using curl in command shell.
  • Set the MATRIX_ environment variables. Example:
MATRIX_HOMESERVER=https://matrix.org
[email protected]:matrix.org
MATRIX_ACCESS_TOKEN=[a long string of characters returned by the login call]

Running in Production

Here is a non-exhaustive list of pointers and things to check before launching a Healthchecks instance in production.

  • Environment variables, settings.py and local_settings.py.
    • DEBUG. Make sure it is set to False.
    • ALLOWED_HOSTS. Make sure it contains the correct domain name you want to use.
    • Server Errors. When DEBUG=False, Django will not show detailed error pages, and will not print exception tracebacks to standard output. To receive exception tracebacks in email, review and edit the ADMINS and SERVER_EMAIL settings. Another good option for receiving exception tracebacks is to use Sentry.
  • Management commands that need to be run during each deployment.
    • This project uses Django Compressor to combine the CSS and JS files. It is configured for offline compression – run the manage.py compress command whenever files in the /static/ directory change.
    • This project uses Django's staticfiles app. Run the manage.py collectstatic command whenever files in the /static/ directory change. This command collects all the static files inside the static-collected directory. Configure your web server to serve files from this directory under the /static/ prefix.
    • Database migration should be run after each update to make sure the database schemas are up to date. You can do that with ./manage.py migrate.
  • Processes that need to be running constantly.
    • manage.py runserver is intended for development only. Do not use it in production, instead consider using uWSGI or gunicorn.
    • Make sure the manage.py sendalerts command is running and can survive server restarts. On modern linux systems, a good option is to define a systemd service for it.
  • General
    • Make sure the database is secured well and is getting backed up regularly
    • Make sure the TLS certificates are secured well and are getting refreshed regularly
    • Have monitoring in place to be sure the Healthchecks instance itself is operational (is accepting pings, is sending out alerts, is not running out of resources).
Issues
  • Integration with Telegram

    Integration with Telegram

    It would be cool to add integration with a Telegram, as was done with Slack

    opened by dvorobiev 20
  • Adding Content-Type header to Webhook integrations

    Adding Content-Type header to Webhook integrations

    Adding Content-Type header to Webhook integrations to work correctly with services like IFTTT Maker Webhooks which require a specific content type, like application/json.

    If the content-type is not provided, the post data is not parsed by IFTTT, which prevents the ability to use variables like, $NAME and $STATUS

    opened by someposer 18
  • Healthcheck with Started and OK pings goes down if OK hasn't come at one grace period after Started

    Healthcheck with Started and OK pings goes down if OK hasn't come at one grace period after Started

    I have a check with a 1 week period and 6 hour grace time. It's a very long borgmatic check operation. As you can see below, it Started at 5am, and at 11am (6 hours later) the check went down because the grace period had elapsed.

    This doesn't seem like accurate behavior to me. The operation just isn't done, that doesn't mean it's down.

    If I had a check without a Started ping, it would just compare to the OK times, and only if the OK came > 1 period + 1 grace period after the previous OK would it go down.

    Sorry if my description is confusing... I can try to clarify further.

    image

    opened by kaysond 17
  • Cant find the Discord integration

    Cant find the Discord integration

    So ive built the HealthCheck app locally but cant seems to find the Discord integration option? Am i missing something here?

    Thanks!

    opened by TheFonix 16
  • Monitoring execution time of script

    Monitoring execution time of script

    It would be interesting to monitor the execution time of script, for example

    curl https://hchk.io/UUID/start when script starts curl https://hchk.io/UUID/end when script ends

    And a option to alert on a maximum execution time user-defined, in ranges as same in checks

    Kind regards

    opened by ZUNbado 15
  • Problem with telegram

    Problem with telegram

    I up and running healthckecs.io on my website. Everything is fine, you have done a lot of work, product is great, but I have some problems with setting up telegram integration. I have added TELEGRAM_TOKEN, TELEGRAM_BOT_NAME to my settings.py. I have set webhook url with

    [email protected]:/healthchecks$ python3 ./manage.py settelegramwebhook                                                                                
    Done, Telegram's webhook set to: https://healthcheck.servonline.xyz/integrations/telegram/bot/
    

    When I get telegram update from getWebhookInfo i have next error

    {"ok":true,"result":{"url":"https://healthcheck.servonline.xyz/integrations/telegram/bot/","has_custom_certificate":false,"pending_update_count":2,"last_error_date":1515392356,"last_error_message":"Wrong response from the webhook: 400 Bad Request","max_connections":40}}
    

    What I do wrong?

    opened by retraut 14
  • Running in production on a subdomain /app/ possible?

    Running in production on a subdomain /app/ possible?

    Hello,

    I have this fantastic app running in a venv, with mod_wsgi setup on Apache, and I need to run it as a subdomain to my main URL, in my case I mapped it to myURL/hc/ and what I am noticing is that several pages don't direct themselves to /hc/ and rather revert to myURL of my existing site.

    For instance if I click on an individual "check" it takes me to myURL/checks/ee19e9f1-f727-4a8e-96fd-601cc26d85f6/details/ instead of myURL/hc/check/UUID, but not every page is like this, projects for example works as intended myURL/hc/projects/8195d2d5-af87-4552-a3cd-34886363e7b8/checks/

    This is my first shot at turning up a Django app in production and not in debug mode so just wondering what I am missing or if the app is not designed to be used in this way? Please let me know if I can post any other relevant info to troubleshooting. Thank you for taking the time to create such a cool project, looking forward to using it.

    opened by coxoperationsengineer 14
  • Outage

    Outage

    Was there an outage? I've got only "red exclamation marks".

    opened by szepeviktor 14
  • Late vs Started

    Late vs Started

    If I use /start to signal the start of a job my badge shows up as "Late" even though it started well within the allowed time frame.

    At the start of my long-running PS script I am calling this: Invoke-RestMethod https://hc-ping.com/<id>/start

    If it succeeds, I'm calling this: Invoke-RestMethod https://hc-ping.com/<id>

    If it fails, I'm adding /fail.

    Can the badge show "Running"? Am I doing something wrong?

    opened by ScottBeeson 13
  • Implementing a

    Implementing a "warning" status between Success and Fail

    Hello,

    A feature I particularly like about healthchecks is the ability to signal failures ( https://healthchecks.io/docs/signaling_failures/ ). However, sometimes, a script may end without a critical error, but still have significant conditions that are worthy to be monitored.

    I would therefore suggest the creation of a "warning" status, between successes and failures. For example, it would be triggered using an URL like this: https://hc-ping.com/your-uuid-here/warning

    A bonus feature about this (but which requires potentially a design change) is to be able to choose which status codes trigger an success condition, and which ones trigger a warning and a failure. So for example, 0 to 10 would be OK, 11 to 20 would be Warning, and everything else be a failure...

    opened by Ailothaen 1
  • Bypass telegram rate limit using message grouping/queueing

    Bypass telegram rate limit using message grouping/queueing

    Apparently, there is 30 msg/sec limit for a telegram bot. When services depends on each others you can quickly reach this limit and have an inconsistent feedback state in your messaging app.

    Since the minimal check unit is the minute, my proposal is to group check states changes in one message per project that would be sent every 60s if any. It implies to keep a queue of any state changes.

    The other way is to also keep a global telegram queue and slowly dequeue it with a rate of one message every 2 seconds.

    feature 
    opened by ypapouin 1
  • SQLite vacuum is not called after purging

    SQLite vacuum is not called after purging

    When using SQLite as the database, and you execute one of the purging commands, a lot of records are deleted but the disk usage remains the same. I've just purged 1GB of data and had to manually execute vacuum to reclaim the disk space.

    Is there a possibility to add a check, if DB is SQLlite, to execute vacuum after the purge? Happy to make a PR.

    opened by OGKevin 1
  • log entries: keep last n failure entries

    log entries: keep last n failure entries

    Hello,

    when the log entries hit the maximum, old messages are removed.

    Especially with higher frequency intervals, keeping a few of those "failure" events (which may contain important debug information's in the body) would be useful, as opposed to remove log entries solely based on the timestamp. Positive log entries are often only useful for their timestamp.

    It so happens that I could have 100 positives log entries but lacking the last 2 - 3 negative log entries with debug informations in the body, and I'm really interested in the failures.

    I'm not sure how this could be structured clearly without over-complicating the UI, maybe always keep the last 3 negative entries in the log?

    feature 
    opened by lukastribus 2
  • Alerta integration

    Alerta integration

    Please integrate Alerta (see https://alerta.io/)

    new integration 
    opened by jurgenhaas 0
  • Adding an integration to ServiceNow platform using OAuth2

    Adding an integration to ServiceNow platform using OAuth2

    Discussed in https://github.com/healthchecks/healthchecks/discussions/532

    Originally posted by yellowdigital June 16, 2021 Hello, We have a requirement to add in integration to ServiceNow platform. Initially we had this working using the existing "webhook" integration and posting in a well formed JSON body string to the webhook. This was working well but was not using strong authentication, only basic Auth in the header.

    We now need to extend this functionality to allow for an Oauth2 token request phase, then using bearer auth with the returned token, to post the data into the webhook URL. Would anybody be interested in developing an new integration to handle this scenario? We would be prepared to contribute towards the cost of building this and getting it approved into the public repository healthchecks.

    new integration 
    opened by yellowdigital 0
  • Ability to alert when check failed X times

    Ability to alert when check failed X times

    We have a healthcheck that fails about once or twice a month for unrelated reasons. It would be cool if we could configure the healthcheck to require X amount of consecutive failures to send an alert, so we don't get pinged for unrelated reasons.

    feature 
    opened by caleb15 3
  • Request to integrate Squadcast

    Request to integrate Squadcast

    Request to integrate Squadcast

    new integration 
    opened by nirmal1520 0
  • Keep pinging when down

    Keep pinging when down

    Hi. How could be possible to implement a way to keep sending alerts for down checks? I tried change some things in sendlalerts.py but was not able to put this feature. Any tips?

    feature 
    opened by kerenskybr 2
  • custom name instead of automatically generated UUID

    custom name instead of automatically generated UUID

    Could we get a possibility to use a custom name in URL instead of randomly generated UUID?

    So instead of url being something like healthchecks.example.com/ping/543dc814-81a5-11eb-8dcd-0242ac130003 I would like to be able to set it to something like healthchecks.example.com/ping/name-of-my-service

    For example I would then be able to specify the URL in docker-compose like this:

    healthcheck:
          test: ["CMD", "curl", "-f", "https://healthchecks.example.com/ping/name-of-my-service"]
          interval: 60s
          timeout: 10s
    

    and would not have to first create the endpoint in healthchecks and then update the url to docker-compose.

    Is this possible to achieve currently? and if not is this something that is feasible to implement?

    opened by RasHas 5
Releases(v1.22.0)
  • v1.22.0(Aug 6, 2021)

    Improvements

    • Use multicolor channel icons for better appearance in the dark mode
    • Add SITE_LOGO_URL setting (#323)
    • Add admin action to log in as any user
    • Add a "Manager" role (#484)
    • Add support for 2FA using TOTP (#354)
    • Add Whitenoise (#548)

    Bug Fixes

    • Fix dark mode styling issues in Cron Syntax Cheatsheet
    • Fix a 403 when transferring a project to a read-only team member
    • Security: fix allow_redirect function to reject absolute URLs
    Source code(tar.gz)
    Source code(zip)
  • v1.21.0(Jul 2, 2021)

    Improvements

    • Increase "Success / Failure Keywords" field lengths to 200
    • Django 3.2.4
    • Improve the handling of unknown email addresses in the Sign In form
    • Add support for "... is UP" SMS notifications
    • Add an option for weekly reports (in addition to monthly)
    • Implement PagerDuty Simple Install Flow, remove PD Connect
    • Implement dark mode

    Bug Fixes

    • Fix off-by-one-month error in monthly reports, downtime columns (#539)
    Source code(tar.gz)
    Source code(zip)
  • v1.20.0(Apr 22, 2021)

    Improvements

    • Django 3.2
    • Rename VictorOps -> Splunk On-Call
    • Implement email body decoding in the "Ping Details" dialog
    • Add a "Subject" field in the "Ping Details" dialog
    • Improve HTML email display in the "Ping Details" dialog
    • Add a link to check's details page in Slack notifications
    • Replace details_url with cloaked_url in email and chat notifications
    • In the "My Projects" page, show projects with failing checks first

    Bug Fixes

    • Fix downtime summary to handle months when the check didn't exist yet (#472)
    • Relax cron expression validation: accept all expressions that croniter accepts
    • Fix sendalerts to clear Profile.next_nag_date if all checks up
    • Fix the pause action to clear Profile.next_nag_date if all checks up
    • Fix the "Email Reports" screen to clear Profile.next_nag_date if all checks up
    • Fix the month boundary calculation in monthly reports (#497)
    Source code(tar.gz)
    Source code(zip)
  • v1.19.0(Feb 3, 2021)

    Improvements

    • Add tighter parameter checks in hc.front.views.serve_doc
    • Update OpsGenie instructions (#450)
    • Update the email notification template to include more check and last ping details
    • Improve the crontab snippet in the "Check Details" page (#465)
    • Add Signal integration (#428)
    • Change Zulip onboarding, ask for the zuliprc file (#202)
    • Add a section in Docs about running self-hosted instances
    • Add experimental Dockerfile and docker-compose.yml
    • Add rate limiting for Pushover notifications (6 notifications / user / minute)
    • Add support for disabling specific integration types (#471)

    Bug Fixes

    • Fix unwanted HTML escaping in SMS and WhatsApp notifications
    • Fix a crash when adding an integration for an empty Trello account
    • Change icon CSS class prefix to 'ic-' to work around Fanboy's filter list
    Source code(tar.gz)
    Source code(zip)
  • v1.18.0(Dec 9, 2020)

    Improvements

    • Add a tooltip to the 'confirmation link' label (#436)
    • Update API to allow specifying channels by names (#440)
    • When saving a phone number, remove any invisible unicode characers
    • Update the read-only dashboard's CSS for better mobile support (#442)
    • Reduce the number of SQL queries used in the "Get Checks" API call
    • Add support for script's exit status in ping URLs (#429)
    • Improve phone number sanitization: remove spaces and hyphens
    • Change the "Test Integration" behavior for webhooks: don't retry failed requests
    • Add retries to the the email sending logic
    • Require confirmation codes (sent to email) before sensitive actions
    • Implement WebAuthn two-factor authentication
    • Implement badge mode (up/down vs up/late/down) selector (#282)
    • Add Ping.exitstatus field, store client's reported exit status values (#455)
    • Implement header-based authentication (#457)
    • Add a "Lost password?" link with instructions in the Sign In page

    Bug Fixes

    • Fix db field overflow when copying a check with a long name
    Source code(tar.gz)
    Source code(zip)
  • v1.17.0(Oct 14, 2020)

    Improvements

    • Django 3.1
    • Handle status callbacks from Twilio, show delivery failures in Integrations
    • Removing unused /api/v1/notifications/{uuid}/bounce endpoint
    • Less verbose output in the senddeletionnotices command
    • Host a read-only dashboard (from github.com/healthchecks/dashboard/)
    • LINE Notify integration (#412)
    • Read-only team members
    • API support for setting the allowed HTTP methods for making ping requests

    Bug Fixes

    • Handle excessively long email addresses in the signup form
    • Handle excessively long email addresses in the team member invite form
    • Don't allow duplicate team memberships
    • When copying a check, copy all fields from the "Filtering Rules" dialog (#417)
    • Fix missing Resume button (#421)
    • When decoding inbound emails, decode encoded headers (#420)
    • Escape markdown in MS Teams notifications (#426)
    • Set the "title" and "summary" fields in MS Teams notifications (#435)
    Source code(tar.gz)
    Source code(zip)
  • v1.16.0(Aug 4, 2020)

    Improvements

    • Paused ping handling can be controlled via API (#376)
    • Add "Get a list of checks's logged pings" API call (#371)
    • The /api/v1/checks/ endpoint now accepts either UUID or unique_key (#370)
    • Added /api/v1/checks/uuid/flips/ endpoint (#349)
    • In the cron expression dialog, show a human-friendly version of the expression
    • Indicate a started check with a progress spinner under status icon (#338)
    • Added "Docs > Reliability Tips" page
    • Spike.sh integration (#402)
    • Updated Discord integration to use discord.com instead of discordapp.com
    • Add "Failure Keyword" filtering for inbound emails (#396)
    • Add support for multiple, comma-separated keywords (#396)
    • New integration: phone calls (#403)

    Bug Fixes

    • Removing Pager Team integration, project appears to be discontinued
    • Sending a test notification updates Channel.last_error (#391)
    • Handle HTTP 429 responses from Matrix server when joining a Matrix room
    Source code(tar.gz)
    Source code(zip)
  • v1.15.0(Jun 4, 2020)

    Improvements

    • Rate limiting for Telegram notifications (10 notifications per chat per minute)
    • Use Slack V2 OAuth flow
    • Users can edit their existing webhook integrations (#176)
    • Add a "Transfer Ownership" feature in Project Settings
    • In checks list, the pause button asks for confirmation (#356)
    • Added /api/v1/metrics/ endpoint, useful for monitoring the service itself
    • Added "When paused, ignore pings" option in the Filtering Rules dialog (#369)

    Bug Fixes

    • "Get a single check" API call now supports read-only API keys (#346)
    • Don't escape HTML in the subject line of notification emails
    • Don't let users clone checks if the account is at check limit
    Source code(tar.gz)
    Source code(zip)
  • v1.14.0(Mar 23, 2020)

    Improvements

    • Improved UI to invite users from account's other projects (#258)
    • Experimental Prometheus metrics endpoint (#300)
    • Don't store user's current project in DB, put it explicitly in page URLs (#336)
    • API reference in Markdown
    • Use Selectize.js for entering tags (#324)
    • Zulip integration (#202)
    • OpsGenie integration returns more detailed error messages
    • Telegram integration returns more detailed error messages
    • Added the "Get a single check" API call (#337)
    • Display project name in Slack notifications (#342)

    Bug Fixes

    • The "render_docs" command checks if markdown and pygments is installed (#329)
    • The team size limit is applied to the n. of distinct users across all projects (#332)
    • API: don't let SuspiciousOperation bubble up when validating channel ids
    • API security: check channel ownership when setting check's channels
    • API: update check's "alert_after" field when changing schedule
    • API: validate channel identifiers before creating/updating a check (#335)
    • Fix redirect after login when adding Telegram integration
    Source code(tar.gz)
    Source code(zip)
  • v1.13.0(Feb 13, 2020)

    Improvements

    • Show a red "!" in project's top navigation if any integration is not working
    • createsuperuser management command requires an unique email address (#318)
    • For superusers, show "Site Administration" in top navigation, note in README (#317)
    • Make Ping.body size limit configurable (#301)
    • Show sub-second durations with higher precision, 2 digits after decimal point (#321)
    • Replace the gear icon with three horizontal dots icon (#322)
    • Add a Pause button in the checks list (#312)
    • Documentation in Markdown
    • Added an example of capturing and submitting log output (#315)
    • The sendalerts commands measures dwell time and reports it over statsd protocol
    • Django 3.0.3
    • Show a warning in top navigation if the project has no integrations (#327)

    Bug Fixes

    • Increase the allowable length of Matrix room alias to 100 (#320)
    • Make sure Check.last_ping and Ping.created timestamps match exactly
    • Don't trigger "down" notifications when changing schedule interactively in web UI
    • Fix sendalerts crash loop when encountering a bad cron schedule
    • Stricter cron validation, reject schedules like "At midnight of February 31"
    • In hc.front.views.ping_details, if a ping does not exist, return a friendly message
    Source code(tar.gz)
    Source code(zip)
  • v1.12.0(Jan 2, 2020)

    Improvements

    • Django 3.0
    • "Filtering Rules" dialog, an option to require HTTP POST (#297)
    • Show Healthchecks version in Django admin header (#306)
    • Added JSON endpoint for Shields.io (#304)
    • senddeletionnotices command skips profiles with recent last_active_date
    • The "Update Check" API call can update check's description (#311)

    Bug Fixes

    • Don't set CSRF cookie on first visit. Signup is exempt from CSRF protection
    • Fix List-Unsubscribe email header value: add angle brackets
    • Unsubscribe links serve a form, and require HTTP POST to actually unsubscribe
    • For webhook integration, validate each header line separately
    • Fix "Send Test Notification" for webhooks that only fire on checks going up
    • Don't allow adding webhook integrations with both URLs blank
    • Don't allow adding email integrations with both "up" and "down" unchecked
    Source code(tar.gz)
    Source code(zip)
  • v1.11.0(Nov 22, 2019)

    Improvements

    • In monthly reports, no downtime stats for the current month (month has just started)
    • Add Microsoft Teams integration (#135)
    • Add Profile.last_active_date field for more accurate inactive user detection
    • Add "Shell Commands" integration (#302)
    • PagerDuty integration works with or without PD_VENDOR_KEY (#303)

    Bug Fixes

    • On mobile, "My Checks" page, always show the gear (Details) button (#286)
    • Make log events fit better on mobile screens
    Source code(tar.gz)
    Source code(zip)
  • v1.10.0(Oct 21, 2019)

    Improvements

    • Add the "Last Duration" field in the "My Checks" page (#257)
    • Add "last_duration" attribute to the Check API resource (#257)
    • Upgrade to psycopg2 2.8.3
    • Add Go usage example
    • Send monthly reports on 1st of every month, not randomly during the month
    • Signup form sets the "auto-login" cookie to avoid an extra click during first login
    • Autofocus the email field in the signup form, and submit on enter key
    • Add support for OpsGenie EU region (#294)
    • Update OpsGenie logo and setup illustrations
    • Add a "Create a Copy" function for cloning checks (#288)
    • Send email notification when monthly SMS sending limit is reached (#292)

    Bug Fixes

    • Prevent double-clicking the submit button in signup form
    • Upgrade to Django 2.2.6 – fixes sqlite migrations (#284)
    Source code(tar.gz)
    Source code(zip)
  • v1.9.0(Sep 3, 2019)

    Improvements

    • Show the number of downtimes and total downtime minutes in monthly reports (#104)
    • Show the number of downtimes and total downtime minutes in "Check Details" page
    • Add the pruneflips management command
    • Add Mattermost integration (#276)
    • Three choices in timezone switcher (UTC / check's timezone / browser's timezone) (#278)
    • After adding a new check redirect to the "Check Details" page

    Bug Fixes

    • Fix javascript code to construct correct URLs when running from a subdirectory (#273)
    • Don't show the "Sign Up" link in the login page if registration is closed (#280)
    Source code(tar.gz)
    Source code(zip)
  • v1.8.0(Jul 8, 2019)

    Improvements

    • Add the prunetokenbucket management command
    • Show check counts in JSON "badges" (#251)
    • Webhooks support HTTP PUT (#249)
    • Webhooks can use different req. bodies and headers for "up" and "down" events. (#249)
    • Show check's code instead of full URL on 992px - 1200px wide screens. (#253)
    • Add WhatsApp integration (uses Twilio same as the SMS integration)
    • Webhooks support the $TAGS placeholder
    • Don't include ping URLs in API responses when the read-only key is used

    Bug Fixes

    • Fix badges for tags containing special characters (#240, #237)
    • Fix the "Integrations" page for when the user has no active project
    • Prevent email clients from opening the one-time login links (#255)
    • Fix prunepings and prunepingsslow, they got broken when adding Projects (#264)
    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(May 2, 2019)

    Improvements

    • Add the EMAIL_USE_VERIFICATION configuration setting (#232)
    • Show "Badges" and "Settings" in top navigation (#234)
    • Upgrade to Django 2.2
    • Can configure the email integration to only report the "down" events (#231)
    • Add "Test!" function in the Integrations page (#207)
    • Rate limiting for the log in attempts
    • Password strength meter and length check in the "Set Password" form
    • Show the Description section even if the description is missing. (#246)
    • Include the description in email alerts. (#247)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Apr 1, 2019)

    Improvements

    • Add the "desc" field (check's description) to API responses
    • Add maxlength attribute to HTML input=text elements
    • Improved logic for displaying job execution times in log (#219)
    • Add Matrix integration
    • Add Pager Team integration
    • Add a management command for sending inactive account notifications

    Bug Fixes

    • Fix refreshing of the checks page filtered by tags (#221)
    • Escape asterisks in Slack messages (#223)
    • Fix a "invalid time format" in front.views.status_single on Windows hosts
    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Feb 4, 2019)

    Improvements

    • Database schema: add uniqueness constraint to Check.code
    • Database schema: add Ping.kind field. Remove "start" and "fail" fields.
    • Add "Email Settings..." dialog and "Subject Must Contain" setting
    • Database schema: add the Project model
    • Move project-specific settings to a new "Project Settings" page
    • Add a "Transfer to Another Project..." dialog
    • Add the "My Projects" page
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Dec 25, 2018)

    Improvements

    • Set Pushover alert priorities for "down" and "up" events separately
    • Additional python usage examples
    • Allow simultaneous access to checks from different teams
    • Add CORS support to API endpoints
    • Flip model, for tracking status changes of the Check objects
    • Add /ping/<code>/start API endpoint
    • When using the /start endpoint, show elapsed times in ping log

    Bug Fixes

    • Fix after-login redirects (the "?next=" query parameter)
    • Update Check.status field when user edits timeout & grace settings
    • Use timezone-aware datetimes with croniter, avoid ambiguities around DST
    • Validate and reject cron schedules with six components
    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Nov 21, 2018)

    Improvements

    • Load settings from environment variables
    • Add "List-Unsubscribe" header to alert and report emails
    • Don't send monthly reports to inactive accounts (no pings in 6 months)
    • Add search box in the "My Checks" page
    • Add read-only API key support
    • Remove Profile.bill_to field (obsolete)
    • Show a warning when running with DEBUG=True
    • Add "channels" attribute to the Check API resource
    • Can specify channel codes when updating a check via API
    • Add a workaround for email agents automatically opening "Unsubscribe" links
    • Add Channel.name field, users can now name integrations
    • Add "Get a List of Existing Integrations" API call

    Bug Fixes

    • During DST transition, handle ambiguous dates as pre-transition
    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Oct 20, 2018)

    Improvements

    • Content updates in the "Welcome" page.
    • Added "Docs > Third-Party Resources" page.
    • Improved layout and styling in "Login" page.
    • Separate "Sign Up" and "Log In" forms.
    • "My Checks" page: support filtering checks by query string parameters.
    • Added Trello integration

    Bug Fixes

    • Timezones were missing in the "Change Schedule" dialog, fixed.
    • Fix hamburger menu button in "Login" page.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Aug 20, 2018)

    Improvements

    • A new "Check Details" page.
    • Updated django-compressor, psycopg2, pytz, requests package versions.
    • C# usage example.
    • Checks have a "Description" field.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.4(May 1, 2017)

    It was possible to save a check with an empty timezone or empty "schedule" field. This was causing issues later, when trying to parse "" as a valid timezone. Fixed.

    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Apr 24, 2017)

The free and open-source Download Manager written in pure Python

The free and open-source Download Manager written in pure Python Status | Quick Start | Advanced Installation | Usage | Docker Images | Troubleshootin

pyLoad 2.3k Sep 21, 2021
Self Hosted TV show Episode tracker and recommender built using django, bootstrap4.

Episodes TV show Episode tracker built using django and bootstrap4. Episodes allows you to keep track of your favourite tv shows either continuing or

Chetan Gupta 169 Sep 9, 2021
Build pipelines for automation, deployment, testing...

Pipelines Pipelines is a simple tool with a web UI to manage running tasks. It supports running tasks manually through a Web UI or automatically via w

Wiredcraft 107 Aug 11, 2021
The GitOps Kubernetes operator

Flux On Flux v2 In an announcement in August 2019, the expectation was set that the Flux project would integrate the GitOps Engine, then being factore

Flux project 6.6k Sep 18, 2021
RSS generator website

PolitePol.com RSS feed generator website with user friendly interface This is source code of RSS feed generator website with user friendly interface.

Alexandr Nesterenko 254 Sep 23, 2021
StackStorm is a platform for integration and automation across services and tools, taking actions in response to events.

StackStorm is a platform for integration and automation across services and tools, taking actions in response to events.

StackStorm 4.5k Sep 21, 2021
The free Zapier/IFTTT alternative for developers to automate your workflows based on Github actions

Actionsflow If you like Actionsflow, please vote for us on Product Hunt The free IFTTT/Zapier alternative for developers to automate their workflows b

Actionsflow 2.1k Sep 19, 2021
Create agents that monitor and act on your behalf. Your agents are standing by!

What is Huginn? Huginn is a system for building agents that perform automated tasks for you online. They can read the web, watch for events, and take

Huginn 32.3k Sep 17, 2021
PatrOwl - Open Source, Smart and Scalable Security Operations Orchestration Platform

PatrOwl PatrOwl is a scalable, free and open-source solution for orchestrating Security Operations. PatrowlManager is the Front-end application for ma

Patrowl 415 Sep 19, 2021
Web application for automatically downloading TV & Movies

nefarious nefarious is a web application that automatically downloads Movies and TV Shows. It aims to combine features of Sonarr and Radarr. It uses J

null 472 Sep 24, 2021
A tool for automating the installation of the Microsoft Windows operating system on various device platforms.

Glazier Support Python Tests Go Tests Contributing Open Issues License Gla·zier /ˈɡlāZHər/ noun: a person who installs windows. Glazier is a tool deve

Google 1.1k Sep 22, 2021
Turn complex requirements to workflows without leaving the comfort of your technology stack.

Turn complex requirements to workflows without leaving the comfort of your technology stack Getting Started • Documentation About ActiveWorkflow works

Automatic Mode Labs 489 Sep 15, 2021
Free and open fair-code licensed node based Workflow Automation Tool. Easily automate tasks across different services.

n8n - Workflow Automation Tool n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source

n8n - Workflow Automation 17.6k Sep 14, 2021
🧠 Leon is your open-source personal assistant.

Leon Your open-source personal assistant. Website :: Documentation :: Roadmap :: Contributing :: Story ?? Introduction Leon is an open-source personal

Leon AI 7.8k Sep 24, 2021
Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.

Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic. Exclusiv

pyMedusa 1.3k Sep 12, 2021
beets based mitm of your torrent client and music player

beets.io based man-in-the-middle of your torrent client and music player workflow notifiers betanin uses apprise for notifications. so anything suppor

Senan Kelly 117 Sep 16, 2021
beets based mitm of your torrent client and music player

beets.io based man-in-the-middle of your torrent client and music player workflow notifiers betanin uses apprise for notifications. so anything suppor

Senan Kelly 118 Sep 23, 2021
Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.

Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic. Exclusiv

pyMedusa 1.3k Sep 16, 2021
A make-like build utility for Ruby.

RAKE – Ruby Make¶ ↑ home github.com/ruby/rake bugs github.com/ruby/rake/issues docs ruby.github.io/rake Description¶ ↑ Rake is a Make-like program imp

The Ruby Programming Language 2k Sep 24, 2021