mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-29 07:33:36 -05:00
b456ea726d
* wip generate directory for hash content * cleanup, remove console logging * add content caching module * Return PDF stream ranges with compile response * Return the PDF file size in the compile response * PDF range endpoint * [misc] WIP: pdf caching: preserve the m-time on static content files * [misc] WIP: pdf caching: improve browser caching, emit caching headers * [misc] WIP: pdf caching: do not emit very small chunks <1kB * [misc] keep up with moving output files into a separate directory * [OutputCacheManager] add global feature flag for enabling pdf caching * [misc] add contentId into the URL for protecting PDF stream contents * [misc] support PDF stream caching for anonymous users * [misc] add per-request feature flag for enabling PDF stream caching * [misc] enable pdf caching in CI and emit metrics at the end of run * [misc] expose compile stats and timings to the frontend * [misc] log an error in case saving output files fails * [misc] add metrics for pdf bandwidth and pdf caching performance * [misc] add a dark mode to the pdf caching for computing ranges only * [misc] move pdf caching metrics into ContentCacheMetrics * [misc] add a config option for the min chunk size of pdf ranges Co-authored-by: Brian Gough <brian.gough@overleaf.com> Co-authored-by: Eric Mc Sween <eric.mcsween@overleaf.com>
156 lines
4.4 KiB
JavaScript
156 lines
4.4 KiB
JavaScript
const Path = require('path')
|
|
|
|
module.exports = {
|
|
// Options are passed to Sequelize.
|
|
// See http://sequelizejs.com/documentation#usage-options for details
|
|
mysql: {
|
|
clsi: {
|
|
database: 'clsi',
|
|
username: 'clsi',
|
|
dialect: 'sqlite',
|
|
storage:
|
|
process.env.SQLITE_PATH || Path.resolve(__dirname, '../db/db.sqlite'),
|
|
pool: {
|
|
max: 1,
|
|
min: 1
|
|
},
|
|
retry: {
|
|
max: 10
|
|
}
|
|
}
|
|
},
|
|
|
|
compileSizeLimit: process.env.COMPILE_SIZE_LIMIT || '7mb',
|
|
|
|
processLifespanLimitMs:
|
|
parseInt(process.env.PROCESS_LIFE_SPAN_LIMIT_MS) || 60 * 60 * 24 * 1000 * 2,
|
|
|
|
catchErrors: process.env.CATCH_ERRORS === 'true',
|
|
|
|
path: {
|
|
compilesDir: Path.resolve(__dirname, '../compiles'),
|
|
outputDir: Path.resolve(__dirname, '../output'),
|
|
clsiCacheDir: Path.resolve(__dirname, '../cache'),
|
|
synctexBaseDir(projectId) {
|
|
return Path.join(this.compilesDir, projectId)
|
|
}
|
|
},
|
|
|
|
internal: {
|
|
clsi: {
|
|
port: 3013,
|
|
host: process.env.LISTEN_ADDRESS || 'localhost'
|
|
},
|
|
|
|
load_balancer_agent: {
|
|
report_load: true,
|
|
load_port: 3048,
|
|
local_port: 3049
|
|
}
|
|
},
|
|
apis: {
|
|
clsi: {
|
|
url: `http://${process.env.CLSI_HOST || 'localhost'}:3013`
|
|
}
|
|
},
|
|
|
|
smokeTest: process.env.SMOKE_TEST || false,
|
|
project_cache_length_ms: 1000 * 60 * 60 * 24,
|
|
parallelFileDownloads: process.env.FILESTORE_PARALLEL_FILE_DOWNLOADS || 1,
|
|
parallelSqlQueryLimit: process.env.FILESTORE_PARALLEL_SQL_QUERY_LIMIT || 1,
|
|
filestoreDomainOveride: process.env.FILESTORE_DOMAIN_OVERRIDE,
|
|
texliveImageNameOveride: process.env.TEX_LIVE_IMAGE_NAME_OVERRIDE,
|
|
texliveOpenoutAny: process.env.TEXLIVE_OPENOUT_ANY,
|
|
sentry: {
|
|
dsn: process.env.SENTRY_DSN
|
|
},
|
|
|
|
enablePdfCaching: process.env.ENABLE_PDF_CACHING === 'true',
|
|
enablePdfCachingDark: process.env.ENABLE_PDF_CACHING_DARK === 'true',
|
|
pdfCachingMinChunkSize:
|
|
parseInt(process.env.PDF_CACHING_MIN_CHUNK_SIZE, 10) || 1024
|
|
}
|
|
|
|
if (process.env.ALLOWED_COMPILE_GROUPS) {
|
|
try {
|
|
module.exports.allowedCompileGroups = process.env.ALLOWED_COMPILE_GROUPS.split(
|
|
' '
|
|
)
|
|
} catch (error) {
|
|
console.error(error, 'could not apply allowed compile group setting')
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
if (process.env.DOCKER_RUNNER) {
|
|
let seccompProfilePath
|
|
module.exports.clsi = {
|
|
dockerRunner: process.env.DOCKER_RUNNER === 'true',
|
|
docker: {
|
|
runtime: process.env.DOCKER_RUNTIME,
|
|
image:
|
|
process.env.TEXLIVE_IMAGE || 'quay.io/sharelatex/texlive-full:2017.1',
|
|
env: {
|
|
HOME: '/tmp'
|
|
},
|
|
socketPath: '/var/run/docker.sock',
|
|
user: process.env.TEXLIVE_IMAGE_USER || 'tex'
|
|
},
|
|
optimiseInDocker: true,
|
|
expireProjectAfterIdleMs: 24 * 60 * 60 * 1000,
|
|
checkProjectsIntervalMs: 10 * 60 * 1000
|
|
}
|
|
|
|
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 || '{}'
|
|
)
|
|
// Automatically clean up wordcount and synctex containers
|
|
const defaultCompileGroupConfig = {
|
|
wordcount: { 'HostConfig.AutoRemove': true },
|
|
synctex: { 'HostConfig.AutoRemove': true }
|
|
}
|
|
module.exports.clsi.docker.compileGroupConfig = Object.assign(
|
|
defaultCompileGroupConfig,
|
|
compileGroupConfig
|
|
)
|
|
} catch (error) {
|
|
console.error(error, 'could not apply compile group docker configs')
|
|
process.exit(1)
|
|
}
|
|
|
|
try {
|
|
seccompProfilePath = Path.resolve(__dirname, '../seccomp/clsi-profile.json')
|
|
module.exports.clsi.docker.seccomp_profile = JSON.stringify(
|
|
JSON.parse(require('fs').readFileSync(seccompProfilePath))
|
|
)
|
|
} catch (error) {
|
|
console.error(
|
|
error,
|
|
`could not load seccomp profile from ${seccompProfilePath}`
|
|
)
|
|
process.exit(1)
|
|
}
|
|
|
|
if (process.env.ALLOWED_IMAGES) {
|
|
try {
|
|
module.exports.clsi.docker.allowedImages = process.env.ALLOWED_IMAGES.split(
|
|
' '
|
|
)
|
|
} catch (error) {
|
|
console.error(error, 'could not apply allowed images setting')
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
module.exports.path.synctexBaseDir = () => '/compile'
|
|
|
|
module.exports.path.sandboxedCompilesHostDir = process.env.COMPILES_HOST_DIR
|
|
|
|
module.exports.path.synctexBinHostPath = process.env.SYNCTEX_BIN_HOST_PATH
|
|
}
|