No description
Fleet operations analytics (fuel · utilisation · distance · driver behaviour),
sibling to FleetNow. Self-contained src/index.html (inline CSS/JS + Chart.js CDN)
reusing FleetNow's warm-dark ops palette + header shell for a familiar look.
Reads dashboard_api /analytics/* (fleet-summary, utilisation, driver-behaviour,
fuel, filters). Panels: KPI strip, distance/idle daily-trend chart, per-vehicle
table, driver leaderboard, fuel (data-gated).
Served by Caddy on :80 (Traefik terminates TLS). Per-env API base injected at
runtime via Caddy `templates` -> /env.js ({{env "API_BASE"}}); falls back to the
staging API. Dockerfile runs `caddy validate` at build.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
||
|---|---|---|
| src | ||
| .dockerignore | ||
| .gitignore | ||
| Caddyfile | ||
| Dockerfile | ||
| README.md | ||
FleetOps
Fleet operations analytics for the Tracksolid fleet — fuel, utilisation, distance and driver behaviour. Sibling to FleetNow (live tracking); reuses the same warm-dark ops palette so the two feel like one product.
This is a self-contained single-page app (src/index.html, inline CSS/JS + Chart.js from CDN)
served by Caddy. It reads the FleetOps analytics API (the dashboard_api /analytics/*
endpoints).
Architecture
fleetops.fivetitude.com (staging) ─┐
fleetops.rahamafresh.com (prod) ─┼─► this SPA (Caddy :80, behind Traefik/Coolify)
└─► API_BASE → dashboard_api /analytics/*
- Web server: Caddy. Traefik (via Coolify) terminates TLS, so Caddy is a plain
:80file server. SeeCaddyfile. - Per-environment API base: Caddy's
templatesdirective renders{{env "API_BASE"}}into/env.jsat request time, so the same image serves staging and prod — just set theAPI_BASEenv var on each Coolify app:- staging →
https://fleetapi.fivetitude.com - prod →
https://fleetapi.rahamafresh.com - if unset,
index.htmlfalls back to the staging API.
- staging →
Endpoints consumed
| Endpoint | Panel |
|---|---|
GET /analytics/filters |
cost-centre / city dropdowns |
GET /analytics/fleet-summary |
KPI strip + per-vehicle table |
GET /analytics/utilisation |
distance & idle daily-trend chart |
GET /analytics/driver-behaviour |
driver leaderboard |
GET /analytics/fuel |
fuel panel (data-gated) |
The SPA's origin must be in the API's DASHBOARD_CORS_ORIGINS (staging API already allows
fleetops.fivetitude.com).
Deploy
Coolify app (Dockerfile → Caddy), one per environment, bound to a branch:
| Env | Domain | Branch | API_BASE |
|---|---|---|---|
| staging | fleetops.fivetitude.com |
staging |
https://fleetapi.fivetitude.com |
| prod | fleetops.rahamafresh.com |
main |
https://fleetapi.rahamafresh.com |
Promotion: feature → staging (auto-deploys staging via Forgejo webhook) → main
(auto-deploys prod).
Local
docker build -t fleetops . && docker run --rm -p 8080:80 -e API_BASE=https://fleetapi.fivetitude.com fleetops
# open http://localhost:8080 (live data needs the localhost origin in the API CORS allowlist)