2024-11-08 05:21:56 -05:00
|
|
|
const Path = require('node:path')
|
|
|
|
const os = require('node:os')
|
2024-08-05 07:14:56 -04:00
|
|
|
|
|
|
|
const isPreEmptible = os.hostname().includes('pre-emp')
|
2014-04-02 16:59:44 -04:00
|
|
|
|
2020-02-19 06:16:17 -05:00
|
|
|
module.exports = {
|
2020-02-19 06:16:18 -05:00
|
|
|
compileSizeLimit: process.env.COMPILE_SIZE_LIMIT || '7mb',
|
2014-04-02 16:59:44 -04:00
|
|
|
|
2020-03-20 09:37:58 -04:00
|
|
|
processLifespanLimitMs:
|
2020-04-23 06:32:33 -04:00
|
|
|
parseInt(process.env.PROCESS_LIFE_SPAN_LIMIT_MS) || 60 * 60 * 24 * 1000 * 2,
|
2020-03-20 09:37:58 -04:00
|
|
|
|
2021-01-26 09:08:29 -05:00
|
|
|
catchErrors: process.env.CATCH_ERRORS === 'true',
|
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
path: {
|
2022-02-07 08:33:38 -05:00
|
|
|
compilesDir:
|
|
|
|
process.env.CLSI_COMPILES_PATH || Path.resolve(__dirname, '../compiles'),
|
|
|
|
outputDir:
|
|
|
|
process.env.CLSI_OUTPUT_PATH || Path.resolve(__dirname, '../output'),
|
|
|
|
clsiCacheDir:
|
|
|
|
process.env.CLSI_CACHE_PATH || Path.resolve(__dirname, '../cache'),
|
2020-06-02 04:51:34 -04:00
|
|
|
synctexBaseDir(projectId) {
|
|
|
|
return Path.join(this.compilesDir, projectId)
|
2021-07-13 07:04:48 -04:00
|
|
|
},
|
2020-02-19 06:16:18 -05:00
|
|
|
},
|
2019-01-08 07:56:16 -05:00
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
internal: {
|
|
|
|
clsi: {
|
|
|
|
port: 3013,
|
2024-04-25 08:56:00 -04:00
|
|
|
host: process.env.LISTEN_ADDRESS || '127.0.0.1',
|
2020-02-19 06:16:18 -05:00
|
|
|
},
|
2017-12-29 03:08:19 -05:00
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
load_balancer_agent: {
|
2024-03-11 09:51:01 -04:00
|
|
|
report_load: process.env.LOAD_BALANCER_AGENT_REPORT_LOAD !== 'false',
|
2020-02-19 06:16:18 -05:00
|
|
|
load_port: 3048,
|
2021-07-13 07:04:48 -04:00
|
|
|
local_port: 3049,
|
|
|
|
},
|
2020-02-19 06:16:18 -05:00
|
|
|
},
|
|
|
|
apis: {
|
|
|
|
clsi: {
|
2022-05-24 04:28:11 -04:00
|
|
|
// Internal requests (used by tests only at the time of writing).
|
2024-04-25 08:56:00 -04:00
|
|
|
url: `http://${process.env.CLSI_HOST || '127.0.0.1'}:3013`,
|
2022-05-24 04:28:11 -04:00
|
|
|
// External url prefix for output files, e.g. for requests via load-balancers.
|
2022-05-25 06:56:10 -04:00
|
|
|
outputUrlPrefix: `${process.env.ZONE ? `/zone/${process.env.ZONE}` : ''}`,
|
2021-07-02 04:17:29 -04:00
|
|
|
},
|
|
|
|
clsiPerf: {
|
2024-04-25 08:56:00 -04:00
|
|
|
host: `${process.env.CLSI_PERF_HOST || '127.0.0.1'}:${
|
2021-07-02 04:17:29 -04:00
|
|
|
process.env.CLSI_PERF_PORT || '3043'
|
2021-07-13 07:04:48 -04:00
|
|
|
}`,
|
|
|
|
},
|
2020-02-19 06:16:18 -05:00
|
|
|
},
|
2018-06-28 11:04:34 -04:00
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
smokeTest: process.env.SMOKE_TEST || false,
|
|
|
|
project_cache_length_ms: 1000 * 60 * 60 * 24,
|
|
|
|
parallelFileDownloads: process.env.FILESTORE_PARALLEL_FILE_DOWNLOADS || 1,
|
|
|
|
filestoreDomainOveride: process.env.FILESTORE_DOMAIN_OVERRIDE,
|
|
|
|
texliveImageNameOveride: process.env.TEX_LIVE_IMAGE_NAME_OVERRIDE,
|
2020-06-04 06:47:22 -04:00
|
|
|
texliveOpenoutAny: process.env.TEXLIVE_OPENOUT_ANY,
|
2021-09-21 04:52:34 -04:00
|
|
|
texliveMaxPrintLine: process.env.TEXLIVE_MAX_PRINT_LINE,
|
2020-02-19 06:16:18 -05:00
|
|
|
sentry: {
|
2021-07-13 07:04:48 -04:00
|
|
|
dsn: process.env.SENTRY_DSN,
|
2021-05-13 09:07:54 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
enablePdfCaching: process.env.ENABLE_PDF_CACHING === 'true',
|
|
|
|
enablePdfCachingDark: process.env.ENABLE_PDF_CACHING_DARK === 'true',
|
|
|
|
pdfCachingMinChunkSize:
|
2021-06-23 09:14:28 -04:00
|
|
|
parseInt(process.env.PDF_CACHING_MIN_CHUNK_SIZE, 10) || 1024,
|
|
|
|
pdfCachingMaxProcessingTime:
|
2021-07-13 07:04:48 -04:00
|
|
|
parseInt(process.env.PDF_CACHING_MAX_PROCESSING_TIME, 10) || 10 * 1000,
|
2021-08-24 05:22:30 -04:00
|
|
|
pdfCachingEnableWorkerPool:
|
|
|
|
process.env.PDF_CACHING_ENABLE_WORKER_POOL === 'true',
|
|
|
|
pdfCachingWorkerPoolSize:
|
|
|
|
parseInt(process.env.PDF_CACHING_WORKER_POOL_SIZE, 10) || 4,
|
|
|
|
pdfCachingWorkerPoolBackLogLimit:
|
|
|
|
parseInt(process.env.PDF_CACHING_WORKER_POOL_BACK_LOG_LIMIT, 10) || 40,
|
2024-08-05 07:14:56 -04:00
|
|
|
compileConcurrencyLimit: isPreEmptible ? 32 : 64,
|
2020-02-19 06:16:18 -05:00
|
|
|
}
|
|
|
|
|
2020-06-11 11:01:44 -04:00
|
|
|
if (process.env.ALLOWED_COMPILE_GROUPS) {
|
|
|
|
try {
|
2021-07-13 07:04:48 -04:00
|
|
|
module.exports.allowedCompileGroups =
|
|
|
|
process.env.ALLOWED_COMPILE_GROUPS.split(' ')
|
2020-06-11 11:01:44 -04:00
|
|
|
} catch (error) {
|
|
|
|
console.error(error, 'could not apply allowed compile group setting')
|
|
|
|
process.exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
if (process.env.DOCKER_RUNNER) {
|
2020-06-02 04:51:34 -04:00
|
|
|
let seccompProfilePath
|
2020-02-19 06:16:18 -05:00
|
|
|
module.exports.clsi = {
|
|
|
|
dockerRunner: process.env.DOCKER_RUNNER === 'true',
|
|
|
|
docker: {
|
2020-04-23 08:56:33 -04:00
|
|
|
runtime: process.env.DOCKER_RUNTIME,
|
2020-02-19 06:16:18 -05:00
|
|
|
image:
|
2020-03-20 09:37:58 -04:00
|
|
|
process.env.TEXLIVE_IMAGE || 'quay.io/sharelatex/texlive-full:2017.1',
|
2020-02-19 06:16:18 -05:00
|
|
|
env: {
|
2021-07-13 07:04:48 -04:00
|
|
|
HOME: '/tmp',
|
2021-11-18 07:10:00 -05:00
|
|
|
CLSI: 1,
|
2020-02-19 06:16:18 -05:00
|
|
|
},
|
|
|
|
socketPath: '/var/run/docker.sock',
|
2021-07-13 07:04:48 -04:00
|
|
|
user: process.env.TEXLIVE_IMAGE_USER || 'tex',
|
2020-02-19 06:16:18 -05:00
|
|
|
},
|
2020-06-09 06:22:28 -04:00
|
|
|
optimiseInDocker: true,
|
2020-02-19 06:16:18 -05:00
|
|
|
expireProjectAfterIdleMs: 24 * 60 * 60 * 1000,
|
2021-07-13 07:04:48 -04:00
|
|
|
checkProjectsIntervalMs: 10 * 60 * 1000,
|
2020-02-19 06:16:18 -05:00
|
|
|
}
|
|
|
|
|
2020-06-11 11:01:44 -04:00
|
|
|
try {
|
|
|
|
// Override individual docker settings using path-based keys, e.g.:
|
|
|
|
// compileGroupDockerConfigs = {
|
|
|
|
// priority: { 'HostConfig.CpuShares': 100 }
|
|
|
|
// beta: { 'dotted.path.here', 'value'}
|
|
|
|
// }
|
|
|
|
const compileGroupConfig = JSON.parse(
|
|
|
|
process.env.COMPILE_GROUP_DOCKER_CONFIGS || '{}'
|
|
|
|
)
|
2020-06-15 10:49:38 -04:00
|
|
|
// Automatically clean up wordcount and synctex containers
|
|
|
|
const defaultCompileGroupConfig = {
|
|
|
|
wordcount: { 'HostConfig.AutoRemove': true },
|
2021-07-13 07:04:48 -04:00
|
|
|
synctex: { 'HostConfig.AutoRemove': true },
|
2020-06-15 10:49:38 -04:00
|
|
|
}
|
|
|
|
module.exports.clsi.docker.compileGroupConfig = Object.assign(
|
|
|
|
defaultCompileGroupConfig,
|
|
|
|
compileGroupConfig
|
|
|
|
)
|
2020-06-11 11:01:44 -04:00
|
|
|
} catch (error) {
|
|
|
|
console.error(error, 'could not apply compile group docker configs')
|
|
|
|
process.exit(1)
|
|
|
|
}
|
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
try {
|
2020-06-02 04:51:34 -04:00
|
|
|
seccompProfilePath = Path.resolve(__dirname, '../seccomp/clsi-profile.json')
|
2020-02-19 06:16:18 -05:00
|
|
|
module.exports.clsi.docker.seccomp_profile = JSON.stringify(
|
2024-11-08 05:21:56 -05:00
|
|
|
JSON.parse(require('node:fs').readFileSync(seccompProfilePath))
|
2020-02-19 06:16:18 -05:00
|
|
|
)
|
|
|
|
} catch (error) {
|
2020-06-10 06:42:07 -04:00
|
|
|
console.error(
|
2020-02-19 06:16:18 -05:00
|
|
|
error,
|
2020-06-10 06:42:07 -04:00
|
|
|
`could not load seccomp profile from ${seccompProfilePath}`
|
2020-02-19 06:16:18 -05:00
|
|
|
)
|
2020-06-10 06:42:07 -04:00
|
|
|
process.exit(1)
|
2020-02-19 06:16:18 -05:00
|
|
|
}
|
2018-06-26 09:44:03 -04:00
|
|
|
|
2021-07-21 09:53:35 -04:00
|
|
|
if (process.env.APPARMOR_PROFILE) {
|
|
|
|
try {
|
|
|
|
module.exports.clsi.docker.apparmor_profile = process.env.APPARMOR_PROFILE
|
|
|
|
} catch (error) {
|
|
|
|
console.error(error, 'could not apply apparmor profile setting')
|
|
|
|
process.exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-30 07:00:18 -04:00
|
|
|
if (process.env.ALLOWED_IMAGES) {
|
|
|
|
try {
|
2021-07-13 07:04:48 -04:00
|
|
|
module.exports.clsi.docker.allowedImages =
|
|
|
|
process.env.ALLOWED_IMAGES.split(' ')
|
2020-06-30 07:00:18 -04:00
|
|
|
} catch (error) {
|
|
|
|
console.error(error, 'could not apply allowed images setting')
|
|
|
|
process.exit(1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-19 06:16:18 -05:00
|
|
|
module.exports.path.synctexBaseDir = () => '/compile'
|
2018-02-13 07:05:10 -05:00
|
|
|
|
2020-03-20 09:37:58 -04:00
|
|
|
module.exports.path.sandboxedCompilesHostDir = process.env.COMPILES_HOST_DIR
|
2020-02-19 06:16:17 -05:00
|
|
|
}
|