nordabiz/database/migrations/082_uptime_monitoring.sql
Maciej Pienczyn 9540f7f2e0
Some checks are pending
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
feat: add uptime monitoring dashboard with UptimeRobot integration
External monitoring via UptimeRobot (free tier) with internal health
logger to differentiate ISP outages from server issues. Includes:
- 4 new DB models (UptimeMonitor, UptimeCheck, UptimeIncident, InternalHealthLog)
- Migration 082 with tables, indexes, and permissions
- Internal health logger script (cron */5 min)
- UptimeRobot sync script (cron hourly) with automatic cause correlation
- Admin dashboard /admin/uptime with uptime %, response time charts,
  incident log with editable notes/causes, pattern analysis, monthly report
- SLA comparison table (99.9%/99.5%/99%)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 07:53:05 +01:00

68 lines
2.5 KiB
SQL

-- Migration 082: Uptime Monitoring
-- Tabele do monitorowania dostępności portalu z zewnątrz (UptimeRobot)
-- oraz wewnętrznego stanu serwera (health logger)
-- Konfiguracja monitorów UptimeRobot
CREATE TABLE IF NOT EXISTS uptime_monitors (
id SERIAL PRIMARY KEY,
uptimerobot_id INTEGER UNIQUE NOT NULL,
name VARCHAR(200) NOT NULL,
url VARCHAR(500) NOT NULL,
check_interval_sec INTEGER DEFAULT 300,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW()
);
-- Wyniki sprawdzeń z UptimeRobot
CREATE TABLE IF NOT EXISTS uptime_checks (
id SERIAL PRIMARY KEY,
monitor_id INTEGER NOT NULL REFERENCES uptime_monitors(id) ON DELETE CASCADE,
checked_at TIMESTAMP NOT NULL,
status VARCHAR(20) NOT NULL,
response_time_ms INTEGER,
status_code INTEGER
);
CREATE INDEX IF NOT EXISTS idx_uptime_checks_monitor_id ON uptime_checks(monitor_id);
CREATE INDEX IF NOT EXISTS idx_uptime_checks_checked_at ON uptime_checks(checked_at);
-- Incydenty (okresy niedostępności)
CREATE TABLE IF NOT EXISTS uptime_incidents (
id SERIAL PRIMARY KEY,
monitor_id INTEGER NOT NULL REFERENCES uptime_monitors(id) ON DELETE CASCADE,
started_at TIMESTAMP NOT NULL,
ended_at TIMESTAMP,
duration_seconds INTEGER,
cause VARCHAR(20) DEFAULT 'unknown',
notes TEXT,
auto_resolved BOOLEAN DEFAULT FALSE
);
CREATE INDEX IF NOT EXISTS idx_uptime_incidents_monitor_id ON uptime_incidents(monitor_id);
CREATE INDEX IF NOT EXISTS idx_uptime_incidents_started_at ON uptime_incidents(started_at);
-- Wewnętrzny health log (stan serwera co 5 min)
CREATE TABLE IF NOT EXISTS internal_health_logs (
id SERIAL PRIMARY KEY,
checked_at TIMESTAMP NOT NULL DEFAULT NOW(),
app_ok BOOLEAN NOT NULL,
db_ok BOOLEAN NOT NULL,
cpu_percent NUMERIC(5,2),
ram_percent NUMERIC(5,2),
disk_percent NUMERIC(5,2),
gunicorn_workers INTEGER
);
CREATE INDEX IF NOT EXISTS idx_internal_health_logs_checked_at ON internal_health_logs(checked_at);
-- Uprawnienia dla app usera
GRANT ALL ON TABLE uptime_monitors TO nordabiz_app;
GRANT ALL ON TABLE uptime_checks TO nordabiz_app;
GRANT ALL ON TABLE uptime_incidents TO nordabiz_app;
GRANT ALL ON TABLE internal_health_logs TO nordabiz_app;
GRANT USAGE, SELECT ON SEQUENCE uptime_monitors_id_seq TO nordabiz_app;
GRANT USAGE, SELECT ON SEQUENCE uptime_checks_id_seq TO nordabiz_app;
GRANT USAGE, SELECT ON SEQUENCE uptime_incidents_id_seq TO nordabiz_app;
GRANT USAGE, SELECT ON SEQUENCE internal_health_logs_id_seq TO nordabiz_app;