Server.coffee 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. Path = require "path"
  2. express = require('express')
  3. Settings = require('settings-sharelatex')
  4. logger = require 'logger-sharelatex'
  5. metrics = require('./Metrics')
  6. crawlerLogger = require('./CrawlerLogger')
  7. expressLocals = require('./ExpressLocals')
  8. Router = require('../router')
  9. metrics.inc("startup")
  10. redis = require("redis-sharelatex")
  11. rclient = redis.createClient(Settings.redis.web)
  12. session = require("express-session")
  13. RedisStore = require('connect-redis')(session)
  14. bodyParser = require('body-parser')
  15. multer = require('multer')
  16. methodOverride = require('method-override')
  17. csrf = require('csurf')
  18. csrfProtection = csrf()
  19. cookieParser = require('cookie-parser')
  20. sessionStore = new RedisStore(client:rclient)
  21. Mongoose = require("./Mongoose")
  22. oneDayInMilliseconds = 86400000
  23. ReferalConnect = require('../Features/Referal/ReferalConnect')
  24. RedirectManager = require("./RedirectManager")
  25. OldAssetProxy = require("./OldAssetProxy")
  26. translations = require("translations-sharelatex").setup(Settings.i18n)
  27. Modules = require "./Modules"
  28. metrics.mongodb.monitor(Path.resolve(__dirname + "/../../../node_modules/mongojs/node_modules/mongodb"), logger)
  29. metrics.mongodb.monitor(Path.resolve(__dirname + "/../../../node_modules/mongoose/node_modules/mongodb"), logger)
  30. metrics.event_loop?.monitor(logger)
  31. Settings.editorIsOpen ||= true
  32. if Settings.cacheStaticAssets
  33. staticCacheAge = (oneDayInMilliseconds * 365)
  34. else
  35. staticCacheAge = 0
  36. app = express()
  37. webRouter = express.Router()
  38. apiRouter = express.Router()
  39. if Settings.behindProxy
  40. app.enable('trust proxy')
  41. webRouter.use express.static(__dirname + '/../../../public', {maxAge: staticCacheAge })
  42. app.set 'views', __dirname + '/../../views'
  43. app.set 'view engine', 'jade'
  44. Modules.loadViewIncludes app
  45. app.use bodyParser.urlencoded({ extended: true, limit: "2mb"})
  46. # Make sure we can process the max doc length plus some overhead for JSON encoding
  47. app.use bodyParser.json({limit: Settings.max_doc_length + 16 * 1024}) # 16kb overhead
  48. app.use multer(dest: Settings.path.uploadFolder)
  49. app.use methodOverride()
  50. app.use metrics.http.monitor(logger)
  51. app.use RedirectManager
  52. app.use OldAssetProxy
  53. webRouter.use cookieParser(Settings.security.sessionSecret)
  54. webRouter.use session
  55. resave: false
  56. saveUninitialized:false
  57. secret:Settings.security.sessionSecret
  58. proxy: Settings.behindProxy
  59. cookie:
  60. domain: Settings.cookieDomain
  61. maxAge: Settings.cookieSessionLength
  62. secure: Settings.secureCookie
  63. store: sessionStore
  64. key: Settings.cookieName
  65. webRouter.use csrfProtection
  66. webRouter.use translations.expressMiddlewear
  67. webRouter.use translations.setLangBasedOnDomainMiddlewear
  68. # Measure expiry from last request, not last login
  69. webRouter.use (req, res, next) ->
  70. req.session.touch()
  71. next()
  72. webRouter.use ReferalConnect.use
  73. expressLocals(app, webRouter, apiRouter)
  74. if app.get('env') == 'production'
  75. logger.info "Production Enviroment"
  76. app.enable('view cache')
  77. app.use (req, res, next)->
  78. metrics.inc "http-request"
  79. crawlerLogger.log(req)
  80. next()
  81. app.use (req, res, next) ->
  82. if !Settings.editorIsOpen
  83. res.status(503)
  84. res.render("general/closed", {title:"maintenance"})
  85. else
  86. next()
  87. apiRouter.get "/status", (req, res)->
  88. res.send("web sharelatex is alive")
  89. profiler = require "v8-profiler"
  90. apiRouter.get "/profile", (req, res) ->
  91. time = parseInt(req.query.time || "1000")
  92. profiler.startProfiling("test")
  93. setTimeout () ->
  94. profile = profiler.stopProfiling("test")
  95. res.json(profile)
  96. , time
  97. app.get "/heapdump", (req, res)->
  98. require('heapdump').writeSnapshot '/tmp/' + Date.now() + '.clsi.heapsnapshot', (err, filename)->
  99. res.send filename
  100. logger.info ("creating HTTP server").yellow
  101. server = require('http').createServer(app)
  102. # process api routes first, if nothing matched fall though and use
  103. # web middlewear + routes
  104. app.use(apiRouter)
  105. app.use(webRouter)
  106. router = new Router(webRouter, apiRouter)
  107. module.exports =
  108. app: app
  109. server: server