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
7.2 KiB
7.2 KiB
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:
{
"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:
{
"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
- Create a Slack Incoming Webhook
- Add secret:
SLACK_WEBHOOK_URLin GitHub → Settings → Secrets → Actions - Uncomment the Slack notification block in
.github/workflows/uptime-monitor.yml
Generic Webhook (email, PagerDuty, etc.)
- Add secret:
ALERT_WEBHOOK_URL - 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
# 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)
- Sign up at https://uptimerobot.com (free)
- 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 |
- For keyword monitor: keyword =
"status":"ok", type = "Exists" - Enable SSL monitoring on each HTTPS monitor:
- Edit monitor → Advanced → SSL monitoring: ON
- Alert threshold: 14 days before expiry
- Set response time alert: Edit → Alert when response time > 3000ms
- 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:
# 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///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