769c63b2a8
- 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.
37 lines
1.1 KiB
TypeScript
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
|