Configuring Checkup for Server Status Checks

Here is a super-fast way to get started with Checkup, which provides “[d]istributed, lock-free, self-hosted health checks and status pages”. Checkup is pretty great, but has poor documentation re: getting started, at least as of November 2018.

If you follow this tutorial you will end up with a status page like the one I set up at <https://status.noisebridge.info/> hosted behind Nginx, with a cronjob running checkup once per hour to update your status page.

Tutorial

Install Go:

curl [https://raw.githubusercontent.com/elimisteve/install-go/master/install-go.sh](https://raw.githubusercontent.com/elimisteve/install-go/master/install-go.sh) | bash
source ~/.bashrc

Install checkup:

go get -u -v github.com/sourcegraph/checkup/cmd/checkup

Here’s an example checkup config file (on my server, at /home/noisebridge/checkup.json):

{
  "checkers": [
    {
      "type": "http",
      "endpoint_name": "HTTP: Unicorn homepage (by <@elimisteve>)",
      "endpoint_url": "[https://noisebridge.info/"](https://noisebridge.info/")
      "must_contain": "noisebridge"
    },
    {
      "type": "tls",
      "endpoint_name": "Unicorn homepage (TLS check) (by <@elimisteve>)",
      "endpoint_url": "noisebridge.info:443"
    },

    {
      "type": "http",
      "endpoint_name": "HTTP: Effective.af instance for Noisebridge (by <@elimisteve>)",
      "endpoint_url": "[https://effective.noisebridge.info/"](https://effective.noisebridge.info/")
      "must_contain": "Unicorn"
    },
    {
      "type": "tls",
      "endpoint_name": "Effective.af instance (TLS check) (by <@elimisteve>)",
      "endpoint_url": "effective.noisebridge.info:443"
    },

    {
      "type": "http",
      "endpoint_name": "HTTP: Wiki (notifying <@Rando>)",
      "endpoint_url": "[https://www.noisebridge.net/wiki/Noisebridge"](https://www.noisebridge.net/wiki/Noisebridge")
      "must_contain": "<title>Noisebridge</title>"
    },
    {
      "type": "tls",
      "endpoint_name": "Wiki (TLS check) (notifying <@Rando>)",
      "endpoint_url": "noisebridge.net:443"
    }
  ],

  "storage": {
    "provider": "fs",
    "dir": "/home/noisebridge/status_checks",
    "url": "[https://status.noisebridge.info/checks"](https://status.noisebridge.info/checks")
  },

  "notifier": {
    "name": "slack",
    "username": "status-bot",
    "channel": "#unicorn",
    "webhook": "[https://hooks.slack.com/services/..."](https://hooks.slack.com/services/...")
  }
}

Clone the checkup GitHub repo so you have the HTML/CSS/JS needed to host the status page:

mkdir ~/repos
cd ~/repos
git clone [https://github.com/sourcegraph/checkup.git](https://github.com/sourcegraph/checkup.git)

Next, in checkup/index.html, replace js/s3.js with js/fs.js.

Now edit checkup/statuspage/js/config.js; here’s mine:

checkup.config = {
    "timeframe": 7 * time.Day,

    // How often, in seconds, to pull new checks and update the page.
    "refresh_interval": 60,

    // Configure read-only access to stored checks. This configuration
    // depends on your storage provider. Any credentials and other values
    // here will be visible to everyone, so use keys with ONLY read access!
    "storage": {
        "url": "[https://status.noisebridge.info/checks"](https://status.noisebridge.info/checks")
    },

    // The text to display along the top bar depending on overall status.
    "status_text": {
        "healthy": "Situation Normal",
        "degraded": "Degraded Service",
        "down": "Service Disruption"
    }
};

Note that the storage URL used here must match the storage URL in your checkup.json file.

Nginx config (/etc/nginx/sites-enabled/status.noisebridge.info) for serving both the status (home)page itself and the .json files that store the results of the individual checks:

server {
    listen 80;
    server_name status.noisebridge.info;
    return 302 [https://status.noisebridge.info$request_uri](https://status.noisebridge.info$request_uri)
}

server {
  server_name status.noisebridge.info;

  access_log /var/www/html/logs/status-access.log;
  error_log /var/www/html/logs/status-error.log;

  location / {
    alias /home/noisebridge/repos/checkup/statuspage/;
    index index.html;
  }

  location /checks/ {
    alias /home/noisebridge/status_checks/;
  }

    #listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/noisebridge.info/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/noisebridge.info/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

You may need to uncomment my

#listen [::]:443 ssl ipv6only=on; # managed by Certbot

line, if you’re not already hosting another HTTPS-enabled site on your same server.

Cronjob to run the checks (at the top of) every hour:

0 * * * * /home/noisebridge/gocode/bin/checkup --store -c /home/noisebridge/checkup.json

Congratulations! Aside from certbot config (which is out of scope for this blog post), you should now have a working checkup-powered status page!