# go-uptime-alert This program checks to see if each URL in a given set of URLs responds with a 200 OK HTTP status, and if they do it send a ping to a healthchecks.io API. I run this as a cronjob or systemd timer every 15 minutes, and I have the grace time and period of the Healthchecks check set to 15 minutes. ## Installation Requires Go >= 1.20 ``` shell go install git.sr.ht/~hyperreal/go-uptime-alert@latest ``` ## Usage It requires a JSON configuration file located at `~/.config/go-uptime-alert.json`. The configuration file is of the following format: ``` json { "service_urls_uuids": [ { "site_url": "https://hyperreal.coffee", "hc_ping_url": "" }, { "site_url": "https://fedi.hyperreal.coffee", "hc_ping_url": "" } ] } ``` ### systemd `~/.config/systemd/user/go-uptime-alert.service` ``` ini [Unit] Description=go-uptime-alert service [Service] Type=oneshot ExecStart=/home/user/go/bin/go-uptime-alert ``` `~/.config/systemd/user/go-uptime-alert.timer` ``` ini [Unit] Description=go-uptime-alert timer [Timer] OnBootSec=15min OnUnitActiveSec=15min [Install] WantedBy=timers.target ``` Enable linger for the user and enable the timer: ``` shell sudo loginctl enable-linger user systemctl --user enable --now go-uptime-alert.timer ``` ### cron/periodic Place the following at `/etc/periodic/15min/go-uptime-alert`: ``` shell #!/bin/sh LOGFILE="/var/log/go-uptime-alert.log" sudo -u user /home/user/go/bin/go-uptime-alert >> "${LOGFILE}" 2>&1 ``` ## TODO - Send output to a static HTML file and format appropriately for web server. - Send output to a .md file for use in Hugo or other static site generators. ## Or just use Bash and curl ``` shell #!/usr/bin/env bash # associative array to store mappings between site URLS and ping URLs. declare -A sites_hc_urls sites_hc_urls["https://hyperreal.coffee"]="https://healthchecks.io/ping/blahblah" sites_hc_urls["https://anonoverflow.hyperreal.coffee"]="https://healthchecks.io/ping/blahblahblah" ... for key in "${!sites_hc_urls[@]}"; do if curl -sSL -q "$key" >/dev/null 2>&1; then if curl -m 10 --retry 5 "${sites_hc_urls[$key]}" >/dev/null 2>&1; then echo "$key: OK" else echo "Error sending ping to ${sites_hc_urls[$key]}" fi else echo "$key: DOWN" fi done ```