Files
ealmeida 769c63b2a8 feat(monitoring): add Beszel fleet integration to Monitor page
- New api/services/beszel.ts: Zod-validated Beszel API client with
  PocketBase auth, system fetching, and MySQL upsert
- New api/routes/beszel.ts: GET /api/beszel (read) + POST /api/beszel/collect (trigger)
- Updated api/server.ts: register route, add to 5min scheduler
- Updated src/pages/Monitor.tsx: Fleet section showing all 17 systems
  with CPU/RAM/disk bars, status dots, container count, and link to
  Beszel dashboard

Architecture: Beszel hub → API → tbl_eal_monitoring (category='fleet')
→ Monitor.tsx grid. Collected every 5min alongside existing metrics.
2026-06-23 20:09:12 +01:00

37 lines
1.1 KiB
TypeScript

/**
* Beszel Fleet API Route
* GET /api/beszel — fleet data from MySQL
* POST /api/beszel/collect — trigger fresh collection
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
*/
import { Router } from 'express'
import { getFleetData, collectBeszelFleet } from '../services/beszel.js'
const router = Router()
// GET /api/beszel — fleet data
router.get('/', async (_req, res) => {
try {
const data = await getFleetData()
res.json(data)
} catch (err: unknown) {
const message = err instanceof Error ? err.message : 'Unknown error'
console.error('[BESZEL API] GET failed:', message)
res.status(500).json({ error: message })
}
})
// POST /api/beszel/collect — trigger collection
router.post('/collect', async (_req, res) => {
try {
const data = await collectBeszelFleet()
res.json({ ok: true, collected: data.total, up: data.up, down: data.down })
} catch (err: unknown) {
const message = err instanceof Error ? err.message : 'Unknown error'
console.error('[BESZEL API] Collect failed:', message)
res.status(500).json({ error: message })
}
})
export default router