Files
Clintchiz d402256547
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
First Init
2026-03-21 16:46:46 +05:30

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*