server.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import express from 'express';
  2. import session from 'express-session';
  3. import memorystore from 'memorystore';
  4. import ejs from 'ejs';
  5. import Docker from 'dockerode';
  6. import { router } from './router/index.js';
  7. import { sequelize } from './database/models.js';
  8. import { currentLoad, mem, networkStats, fsSize } from 'systeminformation';
  9. import { sendCheck } from './controllers/dashboard.js';
  10. export var docker = new Docker();
  11. export { setEvent, cpu, ram, tx, rx, disk }
  12. const app = express();
  13. const MemoryStore = memorystore(session);
  14. const port = process.env.PORT || 8000;
  15. // Session middleware
  16. const sessionMiddleware = session({
  17. store: new MemoryStore({ checkPeriod: 86400000 }), // Prune expired entries every 24h
  18. secret: "keyboard cat",
  19. resave: false,
  20. saveUninitialized: false,
  21. cookie:{
  22. secure:false, // Only set to true if you are using HTTPS.
  23. httpOnly:false, // Only set to true if you are using HTTPS.
  24. maxAge:3600000 * 8 // Session max age in milliseconds. 3600000 = 1 hour.
  25. }
  26. });
  27. // Express middleware
  28. app.set('view engine', 'html');
  29. app.engine('html', ejs.renderFile);
  30. app.use([
  31. express.static('public'),
  32. express.json(),
  33. express.urlencoded({ extended: true }),
  34. sessionMiddleware,
  35. router
  36. ]);
  37. // Initialize server
  38. app.listen(port, async () => {
  39. async function init() {
  40. try { await sequelize.authenticate().then(
  41. () => { console.log('DB Connection: ✔️') }); }
  42. catch { console.log('DB Connection: ❌'); }
  43. try { await sequelize.sync().then( // check out that formatting
  44. () => { console.log('Synced Models: ✔️') }); }
  45. catch { console.log('Synced Models: ❌'); } }
  46. await init().then(() => {
  47. console.log(`Listening on http://localhost:${port}`);
  48. });
  49. });
  50. let [ cpu, ram, tx, rx, disk ] = [0, 0, 0, 0, 0];
  51. let [ event, sse, eventType ] = [false, false, ''];
  52. function setEvent(value, type) {
  53. event = value;
  54. eventType = type;
  55. }
  56. // Server metrics
  57. let serverMetrics = async () => {
  58. currentLoad().then(data => {
  59. cpu = Math.round(data.currentLoad);
  60. });
  61. mem().then(data => {
  62. ram = Math.round((data.active / data.total) * 100);
  63. });
  64. networkStats().then(data => {
  65. tx = data[0].tx_bytes / (1024 * 1024);
  66. rx = data[0].rx_bytes / (1024 * 1024);
  67. });
  68. fsSize().then(data => {
  69. disk = data[0].use;
  70. });
  71. }
  72. setInterval(serverMetrics, 1000);
  73. // Docker events
  74. docker.getEvents((err, stream) => {
  75. if (err) throw err;
  76. stream.on('data', (chunk) => {
  77. event = true;
  78. eventType = 'docker';
  79. });
  80. });
  81. // Check if the container cards need to be updated
  82. setInterval(async () => {
  83. if (event == false) { return; }
  84. sse = await sendCheck();
  85. event = false;
  86. }, 500);
  87. router.get('/sse_event', (req, res) => {
  88. res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', });
  89. let eventCheck = setInterval(async () => {
  90. if (sse == true) {
  91. sse = false;
  92. res.write(`event: ${eventType}\n`);
  93. res.write(`data: there was an event!\n\n`);
  94. }
  95. }, 500);
  96. req.on('close', () => {
  97. clearInterval(eventCheck);
  98. });
  99. });