Spaces:
Running
Running
| const express = require("express"); | |
| const axios = require("axios"); | |
| const fs = require("fs"); | |
| const path = require("path"); | |
| const app = express(); | |
| const PORT = process.env.PORT || 7860; | |
| const startTime = Date.now(); | |
| // Load uptime targets | |
| const configPath = path.join(__dirname, "up.json"); | |
| const config = JSON.parse(fs.readFileSync(configPath, "utf8")); | |
| let stats = {}; | |
| // Init stats | |
| config.targets.forEach(t => { | |
| stats[t.name] = { | |
| url: t.url, | |
| success: 0, | |
| fail: 0, | |
| lastPing: null, | |
| lastStatus: "pending" | |
| }; | |
| }); | |
| // Serve static HTML | |
| app.use(express.static(path.join(__dirname, "public"))); | |
| // π UPTIME PINGER | |
| async function pingTargets() { | |
| for (const target of config.targets) { | |
| try { | |
| await axios.get(target.url, { timeout: 8000 }); | |
| stats[target.name].success++; | |
| stats[target.name].lastStatus = "online"; | |
| } catch (err) { | |
| stats[target.name].fail++; | |
| stats[target.name].lastStatus = "offline"; | |
| } | |
| stats[target.name].lastPing = new Date().toLocaleString(); | |
| } | |
| } | |
| // Run pinger | |
| setInterval(pingTargets, config.interval_seconds * 1000); | |
| pingTargets(); | |
| // π§ STATUS API | |
| app.get("/status", (req, res) => { | |
| const uptimeSeconds = Math.floor((Date.now() - startTime) / 1000); | |
| res.json({ | |
| status: "running", | |
| uptimeSeconds, | |
| serverTime: new Date().toLocaleString(), | |
| targets: stats | |
| }); | |
| }); | |
| // Root | |
| app.get("/", (req, res) => { | |
| res.sendFile(path.join(__dirname, "public", "index.html")); | |
| }); | |
| // Start server | |
| app.listen(PORT, () => { | |
| console.log(`π Uptime Monitor running on http://localhost:${PORT}`); | |
| }); |