84 أسطر
2.6 KiB
Markdown
84 أسطر
2.6 KiB
Markdown
# API + Health Monitor + Dashboard (for ghaymah.systems)
|
|
|
|
This is your uploaded project (`server.js`, `monitor.sh`, `index.html`,
|
|
`Dockerfile`) with three functional bugs fixed and a couple of production
|
|
hardening tweaks. Nothing about your architecture changed.
|
|
|
|
## What was wrong and what I changed
|
|
|
|
1. **`index.html` was fetching the wrong URL.**
|
|
`const API_URL = "";` then `fetch(API_URL)` calls the *current page*
|
|
(`/`), not `/health` — so it was trying to `JSON.parse()` an HTML page
|
|
and always fell into the `catch` block ("Offline"), even when the API
|
|
was healthy. Fixed to `fetch('/health')`.
|
|
|
|
2. **`server.js` had no route serving `index.html`.**
|
|
The dashboard needs to be reachable somewhere. I added
|
|
`express.static('public')` and moved `index.html` into `public/`, so the
|
|
dashboard is served at `/` and the plain-text welcome message moved to
|
|
`/api` so the two don't collide.
|
|
|
|
3. **`monitor.sh` referenced `$response_time`, which was never set** — the
|
|
response-time column was always empty. Fixed by measuring it directly
|
|
with `curl -w "%{time_total}"`. Also added a fallback JSON parser for
|
|
when `jq` isn't installed, and an optional CSV log file.
|
|
|
|
4. **Dockerfile ran `npm init -y && npm install` on every build**, with no
|
|
lockfile/manifest — slow, non-reproducible, and re-downloads
|
|
dependencies on every rebuild even if nothing changed. Added a real
|
|
`package.json` and split `COPY package.json` from `COPY server.js` so
|
|
Docker caches the `npm install` layer. Also switched
|
|
`node:20-alpine3.16` (an older, unsupported Alpine point release) to
|
|
`node:20-alpine` (current supported tag).
|
|
|
|
## Files
|
|
|
|
```
|
|
.
|
|
├── Dockerfile
|
|
├── package.json
|
|
├── server.js
|
|
├── public/
|
|
│ └── index.html ← dashboard, served at /
|
|
└── monitor.sh ← external checker, run it against the deployed URL
|
|
```
|
|
|
|
## Run locally
|
|
|
|
```bash
|
|
npm install
|
|
npm start
|
|
# open http://localhost:3000 -> dashboard
|
|
# open http://localhost:3000/health -> raw JSON
|
|
```
|
|
|
|
In another terminal, point the monitor at it:
|
|
|
|
```bash
|
|
chmod +x monitor.sh
|
|
./monitor.sh http://localhost:3000 30
|
|
```
|
|
|
|
## Build & run with Docker
|
|
|
|
```bash
|
|
docker build -t api-health-demo .
|
|
docker run -d -p 3000:3000 --name api-health-demo api-health-demo
|
|
```
|
|
|
|
## `/health` response shape
|
|
|
|
```json
|
|
{
|
|
"status": "Online",
|
|
"uptime_seconds": 42,
|
|
"request_count": 17,
|
|
"response_time_ms": 3,
|
|
"timestamp": "2026-07-27T20:10:00.000Z"
|
|
}
|
|
```
|
|
|
|
## Deploy to ghaymah.systems
|
|
|
|
See `DEPLOY_GHAYMAH.md` for the step-by-step (build → push → create
|
|
service → set port 3000 → point `monitor.sh` at the live URL). |