settings.defaults.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. const Path = require('path')
  2. module.exports = {
  3. compileSizeLimit: process.env.COMPILE_SIZE_LIMIT || '7mb',
  4. processLifespanLimitMs:
  5. parseInt(process.env.PROCESS_LIFE_SPAN_LIMIT_MS) || 60 * 60 * 24 * 1000 * 2,
  6. catchErrors: process.env.CATCH_ERRORS === 'true',
  7. path: {
  8. compilesDir: Path.resolve(__dirname, '../compiles'),
  9. outputDir: Path.resolve(__dirname, '../output'),
  10. clsiCacheDir: Path.resolve(__dirname, '../cache'),
  11. synctexBaseDir(projectId) {
  12. return Path.join(this.compilesDir, projectId)
  13. },
  14. },
  15. internal: {
  16. clsi: {
  17. port: 3013,
  18. host: process.env.LISTEN_ADDRESS || 'localhost',
  19. },
  20. load_balancer_agent: {
  21. report_load: true,
  22. load_port: 3048,
  23. local_port: 3049,
  24. },
  25. },
  26. apis: {
  27. clsi: {
  28. url: `http://${process.env.CLSI_HOST || 'localhost'}:3013`,
  29. },
  30. clsiPerf: {
  31. host: `${process.env.CLSI_PERF_HOST || 'localhost'}:${
  32. process.env.CLSI_PERF_PORT || '3043'
  33. }`,
  34. },
  35. },
  36. smokeTest: process.env.SMOKE_TEST || false,
  37. project_cache_length_ms: 1000 * 60 * 60 * 24,
  38. parallelFileDownloads: process.env.FILESTORE_PARALLEL_FILE_DOWNLOADS || 1,
  39. parallelSqlQueryLimit: process.env.FILESTORE_PARALLEL_SQL_QUERY_LIMIT || 1,
  40. filestoreDomainOveride: process.env.FILESTORE_DOMAIN_OVERRIDE,
  41. texliveImageNameOveride: process.env.TEX_LIVE_IMAGE_NAME_OVERRIDE,
  42. texliveOpenoutAny: process.env.TEXLIVE_OPENOUT_ANY,
  43. texliveMaxPrintLine: process.env.TEXLIVE_MAX_PRINT_LINE,
  44. sentry: {
  45. dsn: process.env.SENTRY_DSN,
  46. },
  47. enablePdfCaching: process.env.ENABLE_PDF_CACHING === 'true',
  48. enablePdfCachingDark: process.env.ENABLE_PDF_CACHING_DARK === 'true',
  49. pdfCachingMinChunkSize:
  50. parseInt(process.env.PDF_CACHING_MIN_CHUNK_SIZE, 10) || 1024,
  51. pdfCachingMaxProcessingTime:
  52. parseInt(process.env.PDF_CACHING_MAX_PROCESSING_TIME, 10) || 10 * 1000,
  53. pdfCachingEnableWorkerPool:
  54. process.env.PDF_CACHING_ENABLE_WORKER_POOL === 'true',
  55. pdfCachingWorkerPoolSize:
  56. parseInt(process.env.PDF_CACHING_WORKER_POOL_SIZE, 10) || 4,
  57. pdfCachingWorkerPoolBackLogLimit:
  58. parseInt(process.env.PDF_CACHING_WORKER_POOL_BACK_LOG_LIMIT, 10) || 40,
  59. }
  60. if (process.env.ALLOWED_COMPILE_GROUPS) {
  61. try {
  62. module.exports.allowedCompileGroups =
  63. process.env.ALLOWED_COMPILE_GROUPS.split(' ')
  64. } catch (error) {
  65. console.error(error, 'could not apply allowed compile group setting')
  66. process.exit(1)
  67. }
  68. }
  69. if (process.env.DOCKER_RUNNER) {
  70. let seccompProfilePath
  71. module.exports.clsi = {
  72. dockerRunner: process.env.DOCKER_RUNNER === 'true',
  73. docker: {
  74. runtime: process.env.DOCKER_RUNTIME,
  75. image:
  76. process.env.TEXLIVE_IMAGE || 'quay.io/sharelatex/texlive-full:2017.1',
  77. env: {
  78. HOME: '/tmp',
  79. CLSI: 1,
  80. },
  81. socketPath: '/var/run/docker.sock',
  82. user: process.env.TEXLIVE_IMAGE_USER || 'tex',
  83. },
  84. optimiseInDocker: true,
  85. expireProjectAfterIdleMs: 24 * 60 * 60 * 1000,
  86. checkProjectsIntervalMs: 10 * 60 * 1000,
  87. }
  88. try {
  89. // Override individual docker settings using path-based keys, e.g.:
  90. // compileGroupDockerConfigs = {
  91. // priority: { 'HostConfig.CpuShares': 100 }
  92. // beta: { 'dotted.path.here', 'value'}
  93. // }
  94. const compileGroupConfig = JSON.parse(
  95. process.env.COMPILE_GROUP_DOCKER_CONFIGS || '{}'
  96. )
  97. // Automatically clean up wordcount and synctex containers
  98. const defaultCompileGroupConfig = {
  99. wordcount: { 'HostConfig.AutoRemove': true },
  100. synctex: { 'HostConfig.AutoRemove': true },
  101. }
  102. module.exports.clsi.docker.compileGroupConfig = Object.assign(
  103. defaultCompileGroupConfig,
  104. compileGroupConfig
  105. )
  106. } catch (error) {
  107. console.error(error, 'could not apply compile group docker configs')
  108. process.exit(1)
  109. }
  110. try {
  111. seccompProfilePath = Path.resolve(__dirname, '../seccomp/clsi-profile.json')
  112. module.exports.clsi.docker.seccomp_profile = JSON.stringify(
  113. JSON.parse(require('fs').readFileSync(seccompProfilePath))
  114. )
  115. } catch (error) {
  116. console.error(
  117. error,
  118. `could not load seccomp profile from ${seccompProfilePath}`
  119. )
  120. process.exit(1)
  121. }
  122. if (process.env.APPARMOR_PROFILE) {
  123. try {
  124. module.exports.clsi.docker.apparmor_profile = process.env.APPARMOR_PROFILE
  125. } catch (error) {
  126. console.error(error, 'could not apply apparmor profile setting')
  127. process.exit(1)
  128. }
  129. }
  130. if (process.env.ALLOWED_IMAGES) {
  131. try {
  132. module.exports.clsi.docker.allowedImages =
  133. process.env.ALLOWED_IMAGES.split(' ')
  134. } catch (error) {
  135. console.error(error, 'could not apply allowed images setting')
  136. process.exit(1)
  137. }
  138. }
  139. module.exports.path.synctexBaseDir = () => '/compile'
  140. module.exports.path.sandboxedCompilesHostDir = process.env.COMPILES_HOST_DIR
  141. module.exports.path.synctexBinHostPath = process.env.SYNCTEX_BIN_HOST_PATH
  142. }