syco.me Homelab Dashboard
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import { Router } from 'express'
|
||||
import axios from 'axios'
|
||||
import https from 'https'
|
||||
|
||||
const router = Router()
|
||||
const agent = new https.Agent({ rejectUnauthorized: false })
|
||||
|
||||
router.get('/status', async (_req, res) => {
|
||||
try {
|
||||
const host = process.env.PROXMOX_HOST
|
||||
const token = process.env.PROXMOX_TOKEN
|
||||
if (!host || !token) {
|
||||
res.status(503).json({ error: 'PROXMOX_HOST / PROXMOX_TOKEN not configured' })
|
||||
return
|
||||
}
|
||||
|
||||
const headers = { Authorization: token }
|
||||
|
||||
const nodesRes = await axios.get(`${host}/api2/json/nodes`, { headers, httpsAgent: agent })
|
||||
const node: string = nodesRes.data.data[0].node
|
||||
|
||||
const [statusRes, lxcRes, qemuRes, storageRes] = await Promise.all([
|
||||
axios.get(`${host}/api2/json/nodes/${node}/status`, { headers, httpsAgent: agent }),
|
||||
axios.get(`${host}/api2/json/nodes/${node}/lxc`, { headers, httpsAgent: agent }),
|
||||
axios.get(`${host}/api2/json/nodes/${node}/qemu`, { headers, httpsAgent: agent }),
|
||||
axios.get(`${host}/api2/json/nodes/${node}/storage`, { headers, httpsAgent: agent }),
|
||||
])
|
||||
|
||||
const s = statusRes.data.data
|
||||
|
||||
type StorageEntry = { storage: string; type: string; active: number; enabled: number; used: number; total: number }
|
||||
const storages = (storageRes.data.data as StorageEntry[])
|
||||
.filter(st => st.active && st.enabled && st.total > 0 && st.storage !== 'nas')
|
||||
.map(st => ({ name: st.storage, type: st.type, used: st.used, total: st.total }))
|
||||
|
||||
res.json({
|
||||
node,
|
||||
uptime: s.uptime,
|
||||
cpu: s.cpu,
|
||||
memory: { used: s.memory.used, total: s.memory.total },
|
||||
storages,
|
||||
lxcCount: (lxcRes.data.data as { status: string }[]).filter(c => c.status === 'running').length,
|
||||
vmCount: (qemuRes.data.data as { status: string }[]).filter(v => v.status === 'running').length,
|
||||
})
|
||||
} catch (err: unknown) {
|
||||
const msg = err instanceof Error ? err.message : 'Unknown error'
|
||||
res.status(500).json({ error: msg })
|
||||
}
|
||||
})
|
||||
|
||||
export default router
|
||||
Reference in New Issue
Block a user