tutorial

Monitoring Speedtest Tracker with Vigilmon: Web UI, API Endpoint, Scheduler Heartbeat & SSL Alerts

How to monitor your self-hosted Speedtest Tracker instance with Vigilmon — web availability checks, API endpoint monitoring, scheduler job heartbeats to confirm periodic tests are running, and SSL certificate alerts.

Speedtest Tracker is the self-hosted solution that runs Ookla or LibreSpeed internet speed tests on a schedule and records the results in a database — giving you a historical record of your ISP's actual performance over time. It's how you prove your ISP is throttling you at 6 PM, document SLA violations, and catch degraded upload speeds before they affect your remote team. But Speedtest Tracker only delivers value if it's actually running its scheduled tests. Vigilmon monitors Speedtest Tracker's web interface, API endpoint, and scheduled job status so you catch failures before weeks of missing data make the trends meaningless.

What You'll Build

  • An HTTP monitor for Speedtest Tracker web UI availability
  • An API endpoint monitor for application liveness
  • A scheduler heartbeat monitor to confirm tests are running on schedule
  • SSL certificate monitoring for your Speedtest Tracker domain

Prerequisites

  • A running Speedtest Tracker instance (e.g., https://speedtest.example.com)
  • HTTPS configured via reverse proxy
  • A free account at vigilmon.online

Step 1: Verify Speedtest Tracker Web UI Availability

Speedtest Tracker serves its dashboard from the root path. A healthy response confirms the Laravel/PHP application is running:

curl -I https://speedtest.example.com
# Expected: HTTP/2 200

The root path returns the web dashboard with your historical speed test charts. A 502 Bad Gateway means the PHP-FPM process or the application container is down.


Step 2: Create a Vigilmon HTTP Monitor for Web Availability

  1. Log in to VigilmonAdd Monitor → HTTP.
  2. URL: https://speedtest.example.com.
  3. Check interval: 60 seconds.
  4. Response timeout: 15 seconds.
  5. Expected status: 200.
  6. Keyword: Speedtest.
  7. Label: Speedtest Tracker Web UI.
  8. Click Save.

Note on timeout: Speedtest Tracker is a PHP/Laravel application. On cold starts or under database load it can take several seconds to respond. A 15-second timeout prevents false positives from slow-but-healthy instances.

This monitor catches:

  • PHP-FPM process crashes
  • Database connection failures that cause Laravel to throw a 500 error
  • Container OOM kills or restarts
  • Reverse proxy misconfigurations that prevent traffic from reaching the application

Step 3: Monitor the API Endpoint for Application Liveness

Speedtest Tracker exposes a JSON API that serves data to its frontend charts. The /api/speedtest endpoint (or /api/speedtests in newer versions) returns a JSON array of recent results:

curl https://speedtest.example.com/api/speedtest
# Expected: HTTP 200 with JSON array

A typical response:

{"data":[{"id":1,"ping":12.4,"download":450.2,"upload":85.1,"created_at":"2026-06-30T10:00:00Z"}]}
  1. Add Monitor → HTTP.
  2. URL: https://speedtest.example.com/api/speedtest.
  3. Check interval: 5 minutes.
  4. Expected status: 200.
  5. Keyword: download.
  6. Label: Speedtest Tracker API.
  7. Click Save.

Why monitor the API separately? Laravel can serve a maintenance page or cached error response with HTTP 200 while the database is down. A JSON response with speed test data confirms the full application stack — web server, PHP, and database — is functional.


Step 4: Set Up a Scheduler Job Heartbeat

This is the most important monitor for Speedtest Tracker. The entire value of the application depends on the Laravel task scheduler running periodic Ookla/LibreSpeed tests. If the scheduler stops — because the cron job inside the container dies, the container restarts and the schedule is lost, or the scheduler process itself fails — your database stops collecting data silently. No error is thrown; the web UI still loads. But the charts flatline.

Vigilmon's heartbeat monitor lets Speedtest Tracker's scheduler "check in" on each run, so you're alerted if it misses a scheduled check-in.

Configure the Heartbeat in Vigilmon

  1. Add Monitor → Heartbeat.
  2. Label: Speedtest Tracker Scheduler.
  3. Expected interval: Match your Speedtest Tracker schedule (e.g., 3600 seconds for hourly tests).
  4. Grace period: 300 seconds (5 minutes).
  5. Click Save — Vigilmon provides a unique heartbeat URL, e.g.: https://vigilmon.online/api/heartbeat/YOUR_UNIQUE_TOKEN

Configure Speedtest Tracker to Ping the Heartbeat

Add the following to your Speedtest Tracker environment configuration (.env or Docker environment):

SPEEDTEST_SCHEDULE="0 * * * *"   # hourly — adjust to match your schedule

In your docker-compose.yml, add a custom scheduler command wrapper or use Speedtest Tracker's WEBHOOK_URL environment variable if your version supports it:

environment:
  WEBHOOK_URL: "https://vigilmon.online/api/heartbeat/YOUR_UNIQUE_TOKEN"

If your version doesn't support WEBHOOK_URL, add the heartbeat ping to the scheduler cron inside the container:

# Inside the Speedtest Tracker container's cron job
/usr/bin/php /app/artisan speedtest:run && curl -fsS --retry 3 https://vigilmon.online/api/heartbeat/YOUR_UNIQUE_TOKEN

If the heartbeat monitor doesn't receive a ping within the expected interval plus grace period, Vigilmon fires an alert. This is the silent failure that no HTTP monitor catches — your UI looks fine, but weeks of data are missing.


Step 5: Monitor SSL Certificates

Speedtest Tracker is typically deployed on a home network or small office server where certificate renewal may not be fully automated. An expired certificate blocks browser access to your speed history exactly when you need to demonstrate ISP performance issues.

  1. Add Monitor → SSL Certificate.
  2. Domain: speedtest.example.com.
  3. Alert when expiry is within: 30 days.
  4. Alert again: 14 days, 7 days, 3 days, 1 day.
  5. Click Save.

Step 6: Configure Alerting

In Vigilmon under Settings → Notifications, configure your alert channels:

| Monitor | Trigger | Action | |---|---|---| | Web UI | Non-200 or keyword missing | Check container status; inspect PHP-FPM logs | | API Endpoint | Non-200 or keyword missing | Check database connection; verify Laravel .env config | | Scheduler Heartbeat | Missed check-in | Check cron inside container; restart scheduler; verify SPEEDTEST_SCHEDULE | | SSL Certificate | < 30 days to expiry | Renew certificate; check ACME auto-renewal |

Alert after: 1 missed heartbeat for scheduler monitoring. A single missed scheduled test is already data loss.


Common Speedtest Tracker Failure Modes and What Vigilmon Catches

| Scenario | Vigilmon monitor | |---|---| | PHP-FPM crash | Web UI and API monitors fire | | Database connection failure | API returns 500; keyword check fails | | Scheduler cron missing after restart | Heartbeat monitor fires after first missed interval | | Ookla test binary fails silently | Heartbeat misses; web UI still loads — silent failure | | Container OOM kill | All monitors fire simultaneously | | SSL certificate expires | SSL monitor alerts at 30 days | | Disk full (results database grows large) | Write failures; API returns errors; keyword check fails | | Network interface down (can't run tests) | Scheduler may still run but tests fail; heartbeat depends on webhook support |


Speedtest Tracker is most valuable as a long-term historical record — but a gap in the data is invisible until you notice the chart ended two weeks ago. Vigilmon watches the web UI, API, scheduler heartbeat, and SSL certificate so you catch failures the moment they happen, not when you're building a case against your ISP.

Start monitoring Speedtest Tracker in under 5 minutes — register free at vigilmon.online.

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →