I set up a super simple status page for the homelab — using a small bash script, NetBox, AWS S3 and CloudFront.

But ended up using a hosted service instead — HetrixTools.

Table of contents

Introduction

I’ve thought about setting up a status page for the homelab any times; I’ve tried Cachet, Statusfy, and Staytus. It’s fun to set up, but not very useful — and in the end I don’t bother updating it…

I wanted to try and set up something super simple — that I don’t have to manually update, and fits into tools I’m already using. This is what I came up with 👇

Here is an awesome list of status pages: ivbeg/awesome-status-pages

Bash script

I stumbled onto tinystatus:

tinystatus generate an html status page via shell script.

Original tinystatus page

It does http, ping, or port checks and generates a single html file with the results. Incidents can simply be added to a text file.

I thought the design was a bit plain, and I wanted a few more features; so I forked it and changed a few things:

  • Layout — cards, background color, and shadows
  • Incidents have type and are HTML formatted
  • Small JavaScript to set status to unknown if page was generated more than 5 mins ago

The script runs every 3 minutes, and the html file is uploaded to AWS S3 and served with CloudFront:

#!/bin/bash

export PIPENV_PIPFILE=/home/hebron/dev/netbox-api/Pipfile
pipenv run python3 ../netbox-api/rack-journal.py > incidents.txt

./tinystatus > index.html

if [ -f "index.html" ]; then
    aws s3 cp index.html s3://homelab-status/
else
    echo "index.html not found"
fi

Crontab definition:

*/3 * * * * cd /home/hebron/dev/tinystatus && ./check.sh

All checks are performed locally, which means that some errors won’t be detected — like a port forward issue with the router. If the homelab looses internet connectivity, it won’t be able to upload a new version of the status page. And a small JavaScript will mark all services as unreachable.

You can run the script on a server outside the local network, like a VPS, to do the checks externally, but I’m not doing that.

Incidents from NetBox journal

Instead of manually maintaining the incidents.txt file — I’m pulling journal entries from the NetBox API. I try to maintain a simple journal when I change or test something on servers or the homelab.

And using the NetBox journal entries as “incidents” for the status page means no additional work 🙂

NetBox homelab journal

This script is executed from the check.sh bash script above:

import pynetbox
import datetime
import markdown

nb = pynetbox.api(
    'http://omicron.lan.uctrl.net:8001',
    token='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
)

entries = nb.extras.journal_entries.filter(assigned_object_type="dcim.rack", assigned_object_id=1)

for entry in entries:
    date = datetime.datetime.fromisoformat(entry.created.replace("Z", "+00:00")).strftime("%Y-%m-%d %H:%M")
    html = markdown.markdown(entry.comments).replace("\n", "")

    print(f'{entry.kind.value}|<p class="timestamp">{date}</p>{html}')

The journal entries from NetBox is markdown formatted, this script turns them into a single line of HTML. Here is an example of a generated incidents.txt file:

danger|<p class="timestamp">2022-03-11 14:20</p><p>Danger test</p><p><strong>Resolved:</strong> I fixed this thing.</p>
warning|<p class="timestamp">2022-03-11 14:20</p><p>Warning test</p>
success|<p class="timestamp">2022-03-11 14:20</p><p>Success test</p>
info|<p class="timestamp">2022-03-11 14:20</p><h2>Info test</h2><p>I'm doing maintenance.</p>

Concluding

I was pretty happy with the results. Disruptions were detected and the status page updated automatically. And since the page was hosted with AWS S3 and CloudFront — it remained available even when the homelab was offline.

The paragraph above is written in past tense — because in the end, I didn’t end up using this status page solution…

While doing VyOS router testing I needed a more feature rich and reliable way of checking service status from outside my network. I signed up with HetrixTools; they have a really generous free plan with uptime and server monitors.

And status pages; white labeled on your own domain 👍

HetrixTools status page

There is no issues functionality, but you can make announcements on the top of the status page. I’m using the HetrixTools API to put services in maintenance mode (suspending notifications) from some backup scripts.

So this post took a bit of a weird turn; I set out to make a simple self-hosted status page — and ended up finding a nice, free, hosted service 🙂

Last commit 2024-04-05, with message: Tag cleanup.