| import express from 'express'; |
| import os from 'os'; |
| import { promises as fs } from 'fs'; |
|
|
| const app = express(); |
| const PORT = process.env.PORT || 7860; |
|
|
| app.get('/', (req, res) => { |
| res.send('Hello, This is LumaKit Backend!'); |
| }); |
|
|
| app.all('/stats', async (req, res) => { |
| try { |
| |
| if (req.query.secret !== process.env.SECRET) { |
| return res.status(403).json({ error: 'Forbidden' }); |
| } |
|
|
| |
| const networkInterfaces = os.networkInterfaces(); |
| const ipAddresses = []; |
|
|
| for (const [name, interfaces] of Object.entries(networkInterfaces)) { |
| for (const iface of interfaces) { |
| if (!iface.internal) { |
| ipAddresses.push({ |
| interface: name, |
| address: iface.address, |
| family: iface.family, |
| mac: iface.mac, |
| }); |
| } |
| } |
| } |
|
|
| |
| const totalMemory = os.totalmem(); |
| const freeMemory = os.freemem(); |
| const usedMemory = totalMemory - freeMemory; |
|
|
| |
| const cpus = os.cpus(); |
| const loadAverage = os.loadavg(); |
|
|
| |
| const systemUptime = os.uptime(); |
| const processUptime = process.uptime(); |
|
|
| |
| const platform = os.platform(); |
| const architecture = os.arch(); |
| const release = os.release(); |
| const hostname = os.hostname(); |
|
|
| |
| const nodeVersion = process.version; |
| const bunVersion = process.versions?.bun || 'N/A'; |
|
|
| |
| let containerInfo = null; |
| try { |
| const cgroupData = await fs |
| .readFile('/proc/1/cgroup', 'utf8') |
| .catch(() => null); |
| if (cgroupData && cgroupData.includes('docker')) { |
| containerInfo = { type: 'docker', detected: true }; |
| } else if (cgroupData && cgroupData.includes('kubepods')) { |
| containerInfo = { type: 'kubernetes', detected: true }; |
| } |
| } catch (error) { |
| containerInfo = { type: 'unknown', detected: false }; |
| } |
|
|
| |
| let diskUsage = null; |
| try { |
| const stats = await fs.stat(process.cwd()); |
| diskUsage = { |
| currentDirectory: process.cwd(), |
| accessible: true, |
| }; |
| } catch (error) { |
| diskUsage = { |
| currentDirectory: process.cwd(), |
| accessible: false, |
| error: error.message, |
| }; |
| } |
|
|
| const serverStats = { |
| timestamp: new Date().toISOString(), |
| server: { |
| name: 'LumaKit Backend', |
| version: require('../package.json').version, |
| environment: process.env.NODE_ENV || 'development', |
| port: PORT, |
| pid: process.pid, |
| uptime: { |
| process: Math.floor(processUptime), |
| system: Math.floor(systemUptime), |
| }, |
| }, |
| machine: { |
| hostname: hostname, |
| platform: platform, |
| architecture: architecture, |
| release: release, |
| endianness: os.endianness(), |
| tmpdir: os.tmpdir(), |
| homedir: os.homedir(), |
| }, |
| network: { |
| ipAddresses: ipAddresses, |
| hostname: hostname, |
| }, |
| runtime: { |
| node: nodeVersion, |
| bun: bunVersion, |
| engine: bunVersion !== 'N/A' ? 'bun' : 'node', |
| }, |
| memory: { |
| total: Math.round(totalMemory / 1024 / 1024), |
| free: Math.round(freeMemory / 1024 / 1024), |
| used: Math.round(usedMemory / 1024 / 1024), |
| percentage: Math.round((usedMemory / totalMemory) * 100), |
| unit: 'MB', |
| }, |
| cpu: { |
| count: cpus.length, |
| model: cpus[0]?.model || 'Unknown', |
| speed: cpus[0]?.speed || 0, |
| loadAverage: { |
| '1min': loadAverage[0]?.toFixed(2) || 0, |
| '5min': loadAverage[1]?.toFixed(2) || 0, |
| '15min': loadAverage[2]?.toFixed(2) || 0, |
| }, |
| }, |
| container: containerInfo, |
| disk: diskUsage, |
| environment: { |
| nodeEnv: process.env.NODE_ENV, |
| port: process.env.PORT, |
| pwd: process.env.PWD, |
| user: process.env.USER || process.env.USERNAME, |
| shell: process.env.SHELL, |
| timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, |
| }, |
| }; |
|
|
| res.status(200).json(serverStats); |
| } catch (error) { |
| res.status(500).json({ |
| error: 'Failed to retrieve server stats', |
| message: error.message, |
| timestamp: new Date().toISOString(), |
| }); |
| } |
| }); |
|
|
| app.listen(PORT, '0.0.0.0', () => { |
| console.log(`Server is running on http://0.0.0.0:${PORT}`); |
| }); |
|
|