spacedeck.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. "use strict";
  2. const db = require('./models/db.js');
  3. require("log-timestamp");
  4. const config = require('config');
  5. const redis = require('./helpers/redis');
  6. const websockets = require('./helpers/websockets');
  7. const http = require('http');
  8. const path = require('path');
  9. const _ = require('underscore');
  10. const favicon = require('serve-favicon');
  11. const logger = require('morgan');
  12. const cookieParser = require('cookie-parser');
  13. const bodyParser = require('body-parser');
  14. const swig = require('swig');
  15. const i18n = require('i18n-2');
  16. const helmet = require('helmet');
  17. const express = require('express');
  18. const app = express();
  19. const serveStatic = require('serve-static');
  20. const isProduction = app.get('env') === 'production';
  21. console.log("Booting Spacedeck Open… (environment: " + app.get('env') + ")");
  22. app.use(logger(isProduction ? 'combined' : 'dev'));
  23. i18n.expressBind(app, {
  24. locales: ["en", "de", "fr"],
  25. defaultLocale: "en",
  26. cookieName: "spacedeck_locale",
  27. devMode: (app.get('env') == 'development')
  28. });
  29. swig.setDefaults({
  30. varControls: ["[[", "]]"] // otherwise it's not compatible with vue.js
  31. });
  32. swig.setFilter('cdn', function(input, idx) {
  33. return input;
  34. });
  35. app.engine('html', swig.renderFile);
  36. app.set('view engine', 'html');
  37. if (isProduction) {
  38. app.set('views', path.join(__dirname, 'build', 'views'));
  39. app.use(favicon(path.join(__dirname, 'build', 'assets', 'images', 'favicon.png')));
  40. app.use(express.static(path.join(__dirname, 'build', 'assets')));
  41. } else {
  42. app.set('views', path.join(__dirname, 'views'));
  43. app.use(favicon(path.join(__dirname, 'public', 'images', 'favicon.png')));
  44. app.use(express.static(path.join(__dirname, 'public')));
  45. }
  46. app.use(bodyParser.json({
  47. limit: '50mb'
  48. }));
  49. app.use(bodyParser.urlencoded({
  50. extended: false,
  51. limit: '50mb'
  52. }));
  53. app.use(cookieParser());
  54. app.use(helmet.frameguard())
  55. app.use(helmet.xssFilter())
  56. app.use(helmet.hsts({
  57. maxAge: 7776000000,
  58. includeSubdomains: true
  59. }))
  60. app.disable('x-powered-by');
  61. app.use(helmet.noSniff())
  62. //app.use(require("./middlewares/error_helpers"));
  63. app.use(require("./middlewares/session"));
  64. //app.use(require("./middlewares/cors"));
  65. app.use(require("./middlewares/i18n"));
  66. app.use("/api", require("./middlewares/api_helpers"));
  67. app.use('/api/spaces/:id', require("./middlewares/space_helpers"));
  68. app.use('/api/spaces/:id/artifacts/:artifact_id', require("./middlewares/artifact_helpers"));
  69. app.use('/api/users', require('./routes/api/users'));
  70. app.use('/api/memberships', require('./routes/api/memberships'));
  71. const spaceRouter = require('./routes/api/spaces');
  72. app.use('/api/spaces', spaceRouter);
  73. spaceRouter.use('/:id/artifacts', require('./routes/api/space_artifacts'));
  74. spaceRouter.use('/:id/memberships', require('./routes/api/space_memberships'));
  75. spaceRouter.use('/:id/messages', require('./routes/api/space_messages'));
  76. spaceRouter.use('/:id/digest', require('./routes/api/space_digest'));
  77. spaceRouter.use('/:id', require('./routes/api/space_exports'));
  78. app.use('/api/sessions', require('./routes/api/sessions'));
  79. //app.use('/api/webgrabber', require('./routes/api/webgrabber'));
  80. app.use('/', require('./routes/root'));
  81. if (config.get('storage_local_path')) {
  82. app.use('/storage', serveStatic(config.get('storage_local_path')+"/"+config.get('storage_bucket'), {
  83. maxAge: 24*3600
  84. }));
  85. }
  86. // catch 404 and forward to error handler
  87. //app.use(require('./middlewares/404'));
  88. if (app.get('env') == 'development') {
  89. app.set('view cache', false);
  90. swig.setDefaults({cache: false});
  91. } else {
  92. app.use(require('./middlewares/500'));
  93. }
  94. module.exports = app;
  95. // CONNECT TO DATABASE
  96. db.init();
  97. // START WEBSERVER
  98. const port = 9666;
  99. const server = http.Server(app).listen(port, () => {
  100. if ("send" in process) {
  101. process.send('online');
  102. }
  103. }).on('listening', () => {
  104. const host = server.address().address;
  105. const port = server.address().port;
  106. console.log('Spacedeck Open listening at http://%s:%s', host, port);
  107. }).on('error', (error) => {
  108. if (error.syscall !== 'listen') {
  109. throw error;
  110. }
  111. const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;
  112. switch (error.code) {
  113. case 'EACCES':
  114. console.error(bind + ' requires elevated privileges');
  115. process.exit(1);
  116. break;
  117. case 'EADDRINUSE':
  118. console.error(bind + ' is already in use');
  119. process.exit(1);
  120. break;
  121. default:
  122. throw error;
  123. }
  124. });
  125. websockets.startWebsockets(server);
  126. redis.connectRedis();
  127. /*process.on('message', (message) => {
  128. console.log("Process message:", message);
  129. if (message === 'shutdown') {
  130. console.log("Exiting Spacedeck.");
  131. process.exit(0);
  132. }
  133. });*/