settings.defaults.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const http = require('node:http')
  2. const https = require('node:https')
  3. const stream = require('node:stream')
  4. // TODO(24011): remove this after node 22 update
  5. stream.setDefaultHighWaterMark(false, 64 * 1024)
  6. http.globalAgent.maxSockets = 300
  7. http.globalAgent.keepAlive = false
  8. https.globalAgent.keepAlive = false
  9. const Settings = {
  10. internal: {
  11. docstore: {
  12. port: 3016,
  13. host: process.env.LISTEN_ADDRESS || '127.0.0.1',
  14. },
  15. },
  16. mongo: {
  17. options: {
  18. monitorCommands: true,
  19. },
  20. },
  21. docstore: {
  22. archiveOnSoftDelete: process.env.ARCHIVE_ON_SOFT_DELETE === 'true',
  23. keepSoftDeletedDocsArchived:
  24. process.env.KEEP_SOFT_DELETED_DOCS_ARCHIVED === 'true',
  25. backend: process.env.BACKEND,
  26. healthCheck: {
  27. project_id: process.env.HEALTH_CHECK_PROJECT_ID,
  28. },
  29. bucket: process.env.BUCKET_NAME || process.env.AWS_BUCKET || 'bucket',
  30. gcs: {
  31. unlockBeforeDelete: process.env.GCS_UNLOCK_BEFORE_DELETE === 'true',
  32. deletedBucketSuffix: process.env.GCS_DELETED_BUCKET_SUFFIX,
  33. deleteConcurrency: parseInt(process.env.GCS_DELETE_CONCURRENCY) || 50,
  34. },
  35. },
  36. max_deleted_docs: parseInt(process.env.MAX_DELETED_DOCS, 10) || 2000,
  37. max_doc_length: parseInt(process.env.MAX_DOC_LENGTH) || 2 * 1024 * 1024, // 2mb
  38. maxJsonRequestSize:
  39. parseInt(process.env.MAX_JSON_REQUEST_SIZE) || 6 * 1024 * 1024, // 6 MB
  40. unArchiveBatchSize: parseInt(process.env.UN_ARCHIVE_BATCH_SIZE, 10) || 50,
  41. parallelArchiveJobs: parseInt(process.env.PARALLEL_ARCHIVE_JOBS, 10) || 5,
  42. archivingLockDurationMs:
  43. parseInt(process.env.ARCHIVING_LOCK_DURATION_MS, 10) || 60000,
  44. }
  45. if (process.env.MONGO_CONNECTION_STRING) {
  46. Settings.mongo.url = process.env.MONGO_CONNECTION_STRING
  47. } else if (process.env.MONGO_HOST) {
  48. Settings.mongo.url = `mongodb://${process.env.MONGO_HOST}/sharelatex`
  49. } else {
  50. Settings.mongo.url = 'mongodb://127.0.0.1/sharelatex'
  51. }
  52. if (
  53. process.env.AWS_ACCESS_KEY_ID &&
  54. process.env.AWS_SECRET_ACCESS_KEY &&
  55. process.env.AWS_BUCKET
  56. ) {
  57. Settings.docstore.s3 = {
  58. key: process.env.AWS_ACCESS_KEY_ID,
  59. secret: process.env.AWS_SECRET_ACCESS_KEY,
  60. bucket: process.env.AWS_BUCKET,
  61. endpoint: process.env.AWS_S3_ENDPOINT,
  62. pathStyle: process.env.AWS_S3_PATH_STYLE,
  63. partSize: parseInt(process.env.AWS_S3_PARTSIZE) || 100 * 1024 * 1024,
  64. }
  65. }
  66. if (process.env.GCS_API_ENDPOINT) {
  67. Settings.docstore.gcs.endpoint = {
  68. apiEndpoint: process.env.GCS_API_ENDPOINT,
  69. projectId: process.env.GCS_PROJECT_ID,
  70. }
  71. }
  72. if (process.env.FALLBACK_BACKEND) {
  73. Settings.docstore.fallback = {
  74. backend: process.env.FALLBACK_BACKEND,
  75. // mapping of bucket names on the fallback, to bucket names on the primary.
  76. // e.g. { myS3UserFilesBucketName: 'myGoogleUserFilesBucketName' }
  77. buckets: JSON.parse(process.env.FALLBACK_BUCKET_MAPPING || '{}'),
  78. copyOnMiss: process.env.COPY_ON_MISS === 'true',
  79. }
  80. }
  81. module.exports = Settings