settings.defaults.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /* eslint-disable camelcase */
  2. const http = require('node:http')
  3. const https = require('node:https')
  4. const stream = require('node:stream')
  5. // TODO(24011): remove this after node 22 update
  6. stream.setDefaultHighWaterMark(false, 64 * 1024)
  7. http.globalAgent.keepAlive = false
  8. https.globalAgent.keepAlive = false
  9. const settings = {
  10. redis: {
  11. pubsub: {
  12. host:
  13. process.env.PUBSUB_REDIS_HOST || process.env.REDIS_HOST || '127.0.0.1',
  14. port: process.env.PUBSUB_REDIS_PORT || process.env.REDIS_PORT || '6379',
  15. password:
  16. process.env.PUBSUB_REDIS_PASSWORD || process.env.REDIS_PASSWORD || '',
  17. maxRetriesPerRequest: parseInt(
  18. process.env.PUBSUB_REDIS_MAX_RETRIES_PER_REQUEST ||
  19. process.env.REDIS_MAX_RETRIES_PER_REQUEST ||
  20. '20'
  21. ),
  22. },
  23. realtime: {
  24. host:
  25. process.env.REAL_TIME_REDIS_HOST ||
  26. process.env.REDIS_HOST ||
  27. '127.0.0.1',
  28. port:
  29. process.env.REAL_TIME_REDIS_PORT || process.env.REDIS_PORT || '6379',
  30. password:
  31. process.env.REAL_TIME_REDIS_PASSWORD ||
  32. process.env.REDIS_PASSWORD ||
  33. '',
  34. key_schema: {
  35. clientsInProject({ project_id }) {
  36. return `clients_in_project:{${project_id}}`
  37. },
  38. connectedUser({ project_id, client_id }) {
  39. return `connected_user:{${project_id}}:${client_id}`
  40. },
  41. projectNotEmptySince({ projectId }) {
  42. return `projectNotEmptySince:{${projectId}}`
  43. },
  44. },
  45. maxRetriesPerRequest: parseInt(
  46. process.env.REAL_TIME_REDIS_MAX_RETRIES_PER_REQUEST ||
  47. process.env.REDIS_MAX_RETRIES_PER_REQUEST ||
  48. '20'
  49. ),
  50. },
  51. documentupdater: {
  52. host:
  53. process.env.DOC_UPDATER_REDIS_HOST ||
  54. process.env.REDIS_HOST ||
  55. '127.0.0.1',
  56. port:
  57. process.env.DOC_UPDATER_REDIS_PORT || process.env.REDIS_PORT || '6379',
  58. password:
  59. process.env.DOC_UPDATER_REDIS_PASSWORD ||
  60. process.env.REDIS_PASSWORD ||
  61. '',
  62. key_schema: {
  63. pendingUpdates({ doc_id }) {
  64. return `PendingUpdates:{${doc_id}}`
  65. },
  66. },
  67. maxRetriesPerRequest: parseInt(
  68. process.env.DOC_UPDATER_REDIS_MAX_RETRIES_PER_REQUEST ||
  69. process.env.REDIS_MAX_RETRIES_PER_REQUEST ||
  70. '20'
  71. ),
  72. },
  73. websessions: {
  74. host:
  75. process.env.SESSIONS_REDIS_HOST ||
  76. process.env.REDIS_HOST ||
  77. '127.0.0.1',
  78. port: process.env.SESSIONS_REDIS_PORT || process.env.REDIS_PORT || '6379',
  79. password:
  80. process.env.SESSIONS_REDIS_PASSWORD || process.env.REDIS_PASSWORD || '',
  81. maxRetriesPerRequest: parseInt(
  82. process.env.SESSIONS_REDIS_MAX_RETRIES_PER_REQUEST ||
  83. process.env.REDIS_MAX_RETRIES_PER_REQUEST ||
  84. '20'
  85. ),
  86. },
  87. },
  88. internal: {
  89. realTime: {
  90. port: 3026,
  91. host: process.env.LISTEN_ADDRESS || '127.0.0.1',
  92. },
  93. },
  94. apis: {
  95. web: {
  96. url: `http://${
  97. process.env.WEB_API_HOST || process.env.WEB_HOST || '127.0.0.1'
  98. }:${process.env.WEB_API_PORT || process.env.WEB_PORT || 3000}`,
  99. user: process.env.WEB_API_USER || 'overleaf',
  100. pass: process.env.WEB_API_PASSWORD || 'password',
  101. },
  102. documentupdater: {
  103. url: `http://${
  104. process.env.DOCUMENT_UPDATER_HOST ||
  105. process.env.DOCUPDATER_HOST ||
  106. '127.0.0.1'
  107. }:3003`,
  108. },
  109. },
  110. security: {
  111. sessionSecret: process.env.SESSION_SECRET,
  112. sessionSecretUpcoming: process.env.SESSION_SECRET_UPCOMING,
  113. sessionSecretFallback: process.env.SESSION_SECRET_FALLBACK,
  114. },
  115. cookieName: process.env.COOKIE_NAME || 'overleaf.sid',
  116. // Expose the hostname in the `debug.getHostname` rpc
  117. exposeHostname: process.env.EXPOSE_HOSTNAME === 'true',
  118. max_doc_length: 2 * 1024 * 1024, // 2mb
  119. // should be set to the same same as dispatcherCount in document updater
  120. pendingUpdateListShardCount: parseInt(
  121. process.env.PENDING_UPDATE_LIST_SHARD_COUNT || 10,
  122. 10
  123. ),
  124. // combine
  125. // max_doc_length (2mb see above) * 2 (delete + insert)
  126. // max_ranges_size (3mb see MAX_RANGES_SIZE in document-updater)
  127. // overhead for JSON serialization
  128. maxUpdateSize:
  129. parseInt(process.env.MAX_UPDATE_SIZE) || 7 * 1024 * 1024 + 64 * 1024,
  130. shutdownDrainTimeWindow: process.env.SHUTDOWN_DRAIN_TIME_WINDOW || 9,
  131. // The shutdown procedure asks clients to reconnect gracefully.
  132. // 3rd-party/buggy clients may not act upon receiving the message and keep
  133. // stale connections alive. We forcefully disconnect them after X ms:
  134. gracefulReconnectTimeoutMs:
  135. parseInt(process.env.GRACEFUL_RECONNECT_TIMEOUT_MS, 10) ||
  136. // The frontend allows actively editing users to keep the connection open
  137. // for up-to ConnectionManager.MAX_RECONNECT_GRACEFULLY_INTERVAL=45s
  138. // Permit an extra delay to account for slow/flaky connections.
  139. (45 + 30) * 1000,
  140. continualPubsubTraffic: process.env.CONTINUAL_PUBSUB_TRAFFIC || false,
  141. checkEventOrder: process.env.CHECK_EVENT_ORDER || false,
  142. publishOnIndividualChannels:
  143. process.env.PUBLISH_ON_INDIVIDUAL_CHANNELS || false,
  144. statusCheckInterval: parseInt(process.env.STATUS_CHECK_INTERVAL || '0'),
  145. // The deployment colour for this app (if any). Used for blue green deploys.
  146. deploymentColour: process.env.DEPLOYMENT_COLOUR,
  147. // Load balancer health checks will return 200 only when this file contains
  148. // the deployment colour for this app.
  149. deploymentFile: process.env.DEPLOYMENT_FILE,
  150. errors: {
  151. catchUncaughtErrors: true,
  152. shutdownOnUncaughtError: true,
  153. },
  154. behindProxy: process.env.BEHIND_PROXY === 'true',
  155. trustedProxyIps: process.env.TRUSTED_PROXY_IPS,
  156. keepAliveTimeoutMs: parseInt(process.env.KEEPALIVE_TIMEOUT_MS ?? '5000', 10),
  157. allowedCorsOrigins: process.env.REAL_TIME_ALLOWED_CORS_ORIGINS,
  158. }
  159. // console.log settings.redis
  160. module.exports = settings