Server.coffee 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. RedisStore = require('connect-redis')(express)
  13. sessionStore = new RedisStore(client:rclient)
  14. cookieParser = express.cookieParser(Settings.security.sessionSecret)
  15. oneDayInMilliseconds = 86400000
  16. ReferalConnect = require('../Features/Referal/ReferalConnect')
  17. RedirectManager = require("./RedirectManager")
  18. OldAssetProxy = require("./OldAssetProxy")
  19. translations = require("translations-sharelatex").setup(Settings.i18n)
  20. Modules = require "./Modules"
  21. metrics.mongodb.monitor(Path.resolve(__dirname + "/../../../node_modules/mongojs/node_modules/mongodb"), logger)
  22. metrics.mongodb.monitor(Path.resolve(__dirname + "/../../../node_modules/mongoose/node_modules/mongodb"), logger)
  23. Settings.editorIsOpen ||= true
  24. if Settings.cacheStaticAssets
  25. staticCacheAge = (oneDayInMilliseconds * 365)
  26. else
  27. staticCacheAge = 0
  28. app = express()
  29. csrf = express.csrf()
  30. ignoreCsrfRoutes = []
  31. app.ignoreCsrf = (method, route) ->
  32. ignoreCsrfRoutes.push new express.Route(method, route)
  33. app.configure () ->
  34. if Settings.behindProxy
  35. app.enable('trust proxy')
  36. app.use express.static(__dirname + '/../../../public', {maxAge: staticCacheAge })
  37. app.set 'views', __dirname + '/../../views'
  38. app.set 'view engine', 'jade'
  39. Modules.loadViewIncludes app
  40. app.use express.bodyParser(uploadDir: Settings.path.uploadFolder)
  41. app.use translations.expressMiddlewear
  42. app.use translations.setLangBasedOnDomainMiddlewear
  43. app.use cookieParser
  44. app.use express.session
  45. proxy: Settings.behindProxy
  46. cookie:
  47. domain: Settings.cookieDomain
  48. maxAge: Settings.cookieSessionLength
  49. secure: Settings.secureCookie
  50. store: sessionStore
  51. key: Settings.cookieName
  52. # Measure expiry from last request, not last login
  53. app.use (req, res, next) ->
  54. req.session.touch()
  55. next()
  56. app.use (req, res, next) ->
  57. for route in ignoreCsrfRoutes
  58. if route.method == req.method?.toLowerCase() and route.match(req.path)
  59. return next()
  60. csrf(req, res, next)
  61. app.use ReferalConnect.use
  62. app.use express.methodOverride()
  63. expressLocals(app)
  64. app.configure 'production', ->
  65. logger.info "Production Enviroment"
  66. app.enable('view cache')
  67. app.use metrics.http.monitor(logger)
  68. app.use RedirectManager
  69. app.use OldAssetProxy
  70. app.use (req, res, next)->
  71. metrics.inc "http-request"
  72. crawlerLogger.log(req)
  73. next()
  74. app.use (req, res, next) ->
  75. if !Settings.editorIsOpen
  76. res.status(503)
  77. res.render("general/closed", {title:"maintenance"})
  78. else
  79. next()
  80. app.get "/status", (req, res)->
  81. res.send("web sharelatex is alive")
  82. req.session.destroy()
  83. profiler = require "v8-profiler"
  84. app.get "/profile", (req, res) ->
  85. time = parseInt(req.query.time || "1000")
  86. profiler.startProfiling("test")
  87. setTimeout () ->
  88. profile = profiler.stopProfiling("test")
  89. res.json(profile)
  90. , time
  91. logger.info ("creating HTTP server").yellow
  92. server = require('http').createServer(app)
  93. router = new Router(app)
  94. module.exports =
  95. app: app
  96. server: server