settings.defaults.js 5.2 KB

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