Files
asimonson1125.github.io/STATUS_MONITOR_README.md

3.9 KiB
Raw Permalink Blame History

Service Status Monitor

Overview

Server-side monitoring system that checks the availability of asimonson.com services every 2 hours and provides uptime statistics.

Architecture

Backend Components

1. monitor.py - Service Monitoring Module

  • Purpose: Performs automated health checks on all services
  • Check Interval: Every 2 hours (7200 seconds)
  • Services Monitored:
    • asimonson.com
    • files.asimonson.com
    • git.asimonson.com
    • pass.asimonson.com
    • ssh.asimonson.com

Features:

  • Tracks response times and HTTP status codes
  • Calculates uptime percentages for multiple time periods (24h, 7d, 30d, all-time)
  • Persists data to PostgreSQL (service_checks table) via DATABASE_URL env var
  • Gracefully degrades when no database is configured (local dev)
  • Runs in a background thread

2. app.py - Flask Integration

  • New API Endpoint: /api/status
    • Returns current status for all services
    • Includes uptime statistics
    • Provides last check and next check times
  • Auto-start: Monitoring begins when the Flask app starts

Frontend Components

1. templates/status.html - Status Page Template

  • Displays real-time service status
  • Shows uptime percentages (24h, 7d, 30d, all-time)
  • Displays response times and status codes
  • Shows total number of checks performed
  • Manual refresh button
  • Auto-refreshes every 5 minutes

2. static/js/status.js - Frontend Logic

  • Fetches status data from /api/status API
  • Updates UI with service status and uptime
  • Handles error states gracefully
  • Auto-refresh every 5 minutes

3. static/css/App.css - Styling

  • Color-coded status indicators:
    • Green: Operational
    • Yellow: Degraded/Timeout
    • Red: Offline
  • Responsive grid layout
  • Dark theme matching existing site design

Data Storage

Check history is stored in a PostgreSQL service_checks table. The connection is configured via the DATABASE_URL environment variable (e.g. postgresql://user:pass@host:5432/dbname).

CREATE TABLE service_checks (
    id SERIAL PRIMARY KEY,
    service_id VARCHAR(50) NOT NULL,
    timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    status VARCHAR(20) NOT NULL,
    response_time INTEGER,
    status_code INTEGER,
    error TEXT
);

The table and index are created automatically on startup. If DATABASE_URL is not set, the monitor runs without persistence (useful for local development).

Status Types

  • online: HTTP status 2xx-4xx, service responding
  • degraded: HTTP status 5xx or slow response
  • timeout: Request exceeded timeout limit (10 seconds)
  • offline: Unable to reach service
  • unknown: No checks performed yet

Uptime Calculation

Uptime percentage = (number of online checks / total checks) × 100

Calculated for:

  • Last 24 hours
  • Last 7 days
  • Last 30 days
  • All-time (since monitoring began)

Usage

Starting the Server

cd src
python3 app.py

The monitoring will start automatically and perform an initial check immediately, then every 2 hours thereafter.

Accessing the Status Page

Navigate to: https://asimonson.com/status

API Access

Direct API access: https://asimonson.com/api/status

Returns JSON with current status and uptime statistics for all services.

Configuration

To modify monitoring behavior, edit src/monitor.py:

# Change check interval (in seconds)
CHECK_INTERVAL = 7200  # 2 hours

# Modify service list
SERVICES = [
    {
        'id': 'main',
        'name': 'asimonson.com',
        'url': 'https://asimonson.com',
        'timeout': 10  # seconds
    },
    # Add more services here
]

Notes

  • First deployment will show limited uptime data until enough checks accumulate
  • Historical data is preserved across server restarts (stored in PostgreSQL)
  • Page auto-refreshes every 5 minutes to show latest server data
  • Manual refresh button available for immediate updates
  • All checks performed server-side (no client-side CORS issues)