Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
246 lines
7.2 KiB
Markdown
246 lines
7.2 KiB
Markdown
# Monitoring & Uptime Alerts — WorkRoot Website
|
|
|
|
> Production monitoring setup for workroot.in
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
| Layer | Tool | Coverage |
|
|
|-------|------|----------|
|
|
| **Active checks** | GitHub Actions (every 5 min) | Uptime, response time, pages, SSL |
|
|
| **External uptime** | UptimeRobot (free tier) | HTTP 200, keyword, SSL cert |
|
|
| **Health endpoint** | `/api/health.json` | Server status, memory, uptime |
|
|
| **Metrics endpoint** | `/api/metrics.json` | Request counts, response times, error rate |
|
|
|
|
---
|
|
|
|
## Files Created / Modified
|
|
|
|
| File | Purpose |
|
|
|------|---------|
|
|
| `src/pages/api/health.json.ts` | **Enhanced** — now includes uptime, memory usage, version |
|
|
| `src/pages/api/metrics.json.ts` | **New** — request metrics, response time percentiles, error rate |
|
|
| `.github/workflows/uptime-monitor.yml` | **New** — runs every 5 min via GitHub Actions cron |
|
|
| `scripts/setup-uptimerobot.sh` | **New** — automates UptimeRobot monitor creation |
|
|
|
|
---
|
|
|
|
## Health Endpoint
|
|
|
|
**URL:** `https://workroot.in/api/health.json`
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"status": "ok",
|
|
"timestamp": "2026-03-21T10:00:00.000Z",
|
|
"uptime": 86400,
|
|
"version": "1.0.0",
|
|
"mode": "ssr",
|
|
"adapter": "node-standalone",
|
|
"domain": "workroot.in",
|
|
"memory": {
|
|
"heapUsedMB": 45,
|
|
"heapTotalMB": 64,
|
|
"rssMB": 82
|
|
},
|
|
"checks": {
|
|
"server": "ok"
|
|
}
|
|
}
|
|
```
|
|
|
|
Used by: CI/CD pipeline, uptime monitors, load balancers.
|
|
|
|
---
|
|
|
|
## Metrics Endpoint
|
|
|
|
**URL:** `https://workroot.in/api/metrics.json`
|
|
|
|
**Authentication:** Optional. Set `METRICS_TOKEN` env var to require `Authorization: Bearer <token>`.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"timestamp": "2026-03-21T10:00:00.000Z",
|
|
"uptime": { "seconds": 86400, "human": "1d 0h 0m 0s" },
|
|
"requests": { "total": 1250, "errors": 3, "errorRate": "0.24%" },
|
|
"responseTime": { "avgMs": 145, "p50Ms": 120, "p95Ms": 380, "p99Ms": 750, "samples": 100 },
|
|
"memory": { "heapUsedMB": 45, "heapTotalMB": 64, "externalMB": 2, "rssMB": 82 },
|
|
"process": { "pid": 1234, "nodeVersion": "v20.0.0", "platform": "linux" }
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## GitHub Actions Uptime Monitor
|
|
|
|
**File:** `.github/workflows/uptime-monitor.yml`
|
|
|
|
**Schedule:** Every 5 minutes (`*/5 * * * *`)
|
|
|
|
### What It Checks
|
|
|
|
| Check | Threshold | Alert |
|
|
|-------|-----------|-------|
|
|
| Health endpoint HTTP 200 | Must be 200 | Failure → alert job runs |
|
|
| Health status field | Must be `"ok"` | Failure → alert job runs |
|
|
| Response time | < 3000ms | Slow → alert job runs |
|
|
| Critical pages (/, /services, /portfolio, /contact, /about) | HTTP 200 | Failure → job fails |
|
|
| Sitemap + robots.txt | HTTP 200 | Failure → job fails |
|
|
| SSL certificate | > 14 days remaining | Failure → alert job runs |
|
|
|
|
### Alert Channels
|
|
|
|
Currently configured in the workflow as commented examples. To enable:
|
|
|
|
#### Slack Alerts
|
|
1. Create a Slack Incoming Webhook
|
|
2. Add secret: `SLACK_WEBHOOK_URL` in GitHub → Settings → Secrets → Actions
|
|
3. Uncomment the Slack notification block in `.github/workflows/uptime-monitor.yml`
|
|
|
|
#### Generic Webhook (email, PagerDuty, etc.)
|
|
1. Add secret: `ALERT_WEBHOOK_URL`
|
|
2. Uncomment the webhook notification block in `.github/workflows/uptime-monitor.yml`
|
|
|
|
### Viewing Results
|
|
|
|
- GitHub → Actions → "Uptime Monitor" tab shows every run
|
|
- Failed runs = site is down or degraded
|
|
- Each run summary shows response times and SSL days remaining
|
|
|
|
---
|
|
|
|
## UptimeRobot Setup (External Monitoring)
|
|
|
|
UptimeRobot provides monitoring from external IPs, independent of GitHub Actions.
|
|
|
|
### Quick Setup
|
|
|
|
```bash
|
|
# Set your API key (from UptimeRobot dashboard → My Settings → API Settings)
|
|
export UPTIMEROBOT_API_KEY="ur_xxxxxxxxxxxxxxxx"
|
|
|
|
# Optional: set alert email
|
|
export ALERT_EMAIL="alerts@workroot.in"
|
|
|
|
# Run setup script
|
|
bash scripts/setup-uptimerobot.sh
|
|
```
|
|
|
|
### Manual Setup (Free Tier)
|
|
|
|
1. Sign up at **https://uptimerobot.com** (free)
|
|
2. Create monitors:
|
|
|
|
| Monitor Name | URL | Type | Interval |
|
|
|-------------|-----|------|----------|
|
|
| WorkRoot Health | `https://workroot.in/api/health.json` | HTTP(s) | 5 min |
|
|
| WorkRoot Homepage | `https://workroot.in/` | HTTP(s) | 5 min |
|
|
| WorkRoot Health Keyword | `https://workroot.in/api/health.json` | Keyword | 5 min |
|
|
| WorkRoot Services | `https://workroot.in/services` | HTTP(s) | 5 min |
|
|
| WorkRoot Contact | `https://workroot.in/contact` | HTTP(s) | 5 min |
|
|
|
|
3. For keyword monitor: keyword = `"status":"ok"`, type = "Exists"
|
|
4. Enable **SSL monitoring** on each HTTPS monitor:
|
|
- Edit monitor → Advanced → SSL monitoring: ON
|
|
- Alert threshold: 14 days before expiry
|
|
5. Set **response time alert**: Edit → Alert when response time > 3000ms
|
|
6. Configure **alert contacts**: Alert Contacts → Add Email/Slack/Webhook
|
|
|
|
### Status Page
|
|
|
|
Create a public status page:
|
|
- UptimeRobot Dashboard → Status Pages → Create New
|
|
- Add all monitors
|
|
- Set URL: `status.workroot.in` (add CNAME DNS record)
|
|
|
|
---
|
|
|
|
## Alert Thresholds Reference
|
|
|
|
| Metric | Warning | Critical |
|
|
|--------|---------|----------|
|
|
| Response time | > 2000ms | > 3000ms |
|
|
| SSL expiry | < 30 days | < 14 days |
|
|
| Memory (heap) | > 80% | > 95% |
|
|
| Error rate | > 1% | > 5% |
|
|
| Downtime | 1 failed check | 2+ consecutive |
|
|
|
|
---
|
|
|
|
## Incident Response Runbook
|
|
|
|
### Site Down (HTTP non-200 or timeout)
|
|
|
|
```
|
|
1. Check GitHub Actions → Uptime Monitor for recent failures
|
|
2. Check UptimeRobot → Incidents for start time and location
|
|
3. SSH to server: ssh deploy@<VPS_HOST>
|
|
4. pm2 status # Is process running?
|
|
5. pm2 logs workroot-website --lines 50 # Check for crash errors
|
|
6. curl http://localhost:10000/api/health.json # Direct check
|
|
7. If crashed: pm2 restart workroot-website
|
|
8. If persistent: trigger rollback (see CI/CD pipeline docs)
|
|
```
|
|
|
|
### Slow Response (> 3s)
|
|
|
|
```
|
|
1. Check /api/metrics.json for memory and error rate
|
|
2. pm2 monit # Real-time CPU/memory
|
|
3. Check for memory leak: heapUsedMB trending up?
|
|
4. Check Nginx logs: sudo tail -f /var/log/nginx/access.log
|
|
5. If memory issue: pm2 restart workroot-website (graceful)
|
|
6. Consider scaling: increase PM2 cluster instances
|
|
```
|
|
|
|
### SSL Certificate Expiring
|
|
|
|
```
|
|
1. SSH to VPS
|
|
2. Check cert: echo | openssl s_client -connect workroot.in:443 2>/dev/null | openssl x509 -noout -dates
|
|
3. Renew with Certbot: sudo certbot renew --nginx
|
|
4. Verify renewal: sudo certbot certificates
|
|
5. Reload Nginx: sudo nginx -s reload
|
|
```
|
|
|
|
### High Error Rate
|
|
|
|
```
|
|
1. Check /api/metrics.json → requests.errorRate
|
|
2. pm2 logs workroot-website --err --lines 100
|
|
3. Check Sentry dashboard for exception details
|
|
4. Identify error pattern (specific endpoint? all routes?)
|
|
5. Deploy hotfix or rollback if regression
|
|
```
|
|
|
|
---
|
|
|
|
## Environment Variables for Monitoring
|
|
|
|
Add to `.env` (production) or hosting platform secrets:
|
|
|
|
```env
|
|
# Optional: protect the /api/metrics.json endpoint
|
|
METRICS_TOKEN=your-secure-random-token-here
|
|
```
|
|
|
|
---
|
|
|
|
## Dashboard Quick Links
|
|
|
|
| Resource | URL |
|
|
|----------|-----|
|
|
| Health endpoint | https://workroot.in/api/health.json |
|
|
| Metrics endpoint | https://workroot.in/api/metrics.json |
|
|
| GitHub Actions | https://github.com/<org>/<repo>/actions/workflows/uptime-monitor.yml |
|
|
| UptimeRobot | https://uptimerobot.com/dashboard |
|
|
| UptimeRobot Status Page | https://status.workroot.in *(after setup)* |
|
|
|
|
---
|
|
|
|
*Created by: devops-engineer agent | Date: 2026-03-21*
|