{ "$schema": "http://json-schema.org/draft/2020-12/schema", "$id": "embedfs://config.schema.json", "title": "cc-backend configuration file schema", "type": "object", "properties": { "addr": { "description": "Address where the http (or https) server will listen on (for example: 'localhost:80').", "type": "string" }, "user": { "description": "Drop root permissions once .env was read and the port was taken. Only applicable if using privileged port.", "type": "string" }, "group": { "description": "Drop root permissions once .env was read and the port was taken. Only applicable if using privileged port.", "type": "string" }, "disable-authentication": { "description": "Disable authentication (for everything: API, Web-UI, ...).", "type": "boolean" }, "embed-static-files": { "description": "If all files in `web/frontend/public` should be served from within the binary itself (they are embedded) or not.", "type": "boolean" }, "static-files": { "description": "Folder where static assets can be found, if embed-static-files is false.", "type": "string" }, "db-driver": { "description": "sqlite3 or mysql (mysql will work for mariadb as well).", "type": "string", "enum": [ "sqlite3", "mysql" ] }, "db": { "description": "For sqlite3 a filename, for mysql a DSN in this format: https://github.com/go-sql-driver/mysql#dsn-data-source-name (Without query parameters!).", "type": "string" }, "job-archive": { "description": "Configuration keys for job-archive", "type": "object", "properties": { "kind": { "description": "Backend type for job-archive", "type": "string", "enum": [ "file", "s3" ] }, "path": { "description": "Path to job archive for file backend", "type": "string" }, "compression": { "description": "Setup automatic compression for jobs older than number of days", "type": "integer" }, "retention": { "description": "Configuration keys for retention", "type": "object", "properties": { "policy": { "description": "Retention policy", "type": "string", "enum": [ "none", "delete", "move" ] }, "includeDB": { "description": "Also remove jobs from database", "type": "boolean" }, "age": { "description": "Act on jobs with startTime older than age (in days)", "type": "integer" }, "location": { "description": "The target directory for retention. Only applicable for retention move.", "type": "string" } }, "required": [ "policy" ] } }, "required": [ "kind" ] }, "disable-archive": { "description": "Keep all metric data in the metric data repositories, do not write to the job-archive.", "type": "boolean" }, "validate": { "description": "Validate all input json documents against json schema.", "type": "boolean" }, "session-max-age": { "description": "Specifies for how long a session shall be valid as a string parsable by time.ParseDuration(). If 0 or empty, the session/token does not expire!", "type": "string" }, "https-cert-file": { "description": "Filepath to SSL certificate. If also https-key-file is set use HTTPS using those certificates.", "type": "string" }, "https-key-file": { "description": "Filepath to SSL key file. If also https-cert-file is set use HTTPS using those certificates.", "type": "string" }, "redirect-http-to": { "description": "If not the empty string and addr does not end in :80, redirect every request incoming at port 80 to that url.", "type": "string" }, "stop-jobs-exceeding-walltime": { "description": "If not zero, automatically mark jobs as stopped running X seconds longer than their walltime. Only applies if walltime is set for job.", "type": "integer" }, "short-running-jobs-duration": { "description": "Do not show running jobs shorter than X seconds.", "type": "integer" }, "jwts": { "description": "For JWT token authentication.", "type": "object", "properties": { "max-age": { "description": "Configure how long a token is valid. As string parsable by time.ParseDuration()", "type": "string" }, "cookieName": { "description": "Cookie that should be checked for a JWT token.", "type": "string" }, "validateUser": { "description": "Deny login for users not in database (but defined in JWT). Overwrite roles in JWT with database roles.", "type": "boolean" }, "trustedIssuer": { "description": "Issuer that should be accepted when validating external JWTs ", "type": "string" }, "syncUserOnLogin": { "description": "Add non-existent user to DB at login attempt with values provided in JWT.", "type": "boolean" } }, "required": [ "max-age" ] }, "ldap": { "description": "For LDAP Authentication and user synchronisation.", "type": "object", "properties": { "url": { "description": "URL of LDAP directory server.", "type": "string" }, "user_base": { "description": "Base DN of user tree root.", "type": "string" }, "search_dn": { "description": "DN for authenticating LDAP admin account with general read rights.", "type": "string" }, "user_bind": { "description": "Expression used to authenticate users via LDAP bind. Must contain uid={username}.", "type": "string" }, "user_filter": { "description": "Filter to extract users for syncing.", "type": "string" }, "sync_interval": { "description": "Interval used for syncing local user table with LDAP directory. Parsed using time.ParseDuration.", "type": "string" }, "sync_del_old_users": { "description": "Delete obsolete users in database.", "type": "boolean" }, "syncUserOnLogin": { "description": "Add non-existent user to DB at login attempt if user exists in Ldap directory", "type": "boolean" } }, "required": [ "url", "user_base", "search_dn", "user_bind", "user_filter" ] }, "clusters": { "description": "Configuration for the clusters to be displayed.", "type": "array", "items": { "type": "object", "properties": { "name": { "description": "The name of the cluster.", "type": "string" }, "metricDataRepository": { "description": "Type of the metric data repository for this cluster", "type": "object", "properties": { "kind": { "type": "string", "enum": [ "influxdb", "prometheus", "cc-metric-store", "test" ] }, "url": { "type": "string" }, "token": { "type": "string" } }, "required": [ "kind", "url" ] }, "filterRanges": { "description": "This option controls the slider ranges for the UI controls of numNodes, duration, and startTime.", "type": "object", "properties": { "numNodes": { "description": "UI slider range for number of nodes", "type": "object", "properties": { "from": { "type": "integer" }, "to": { "type": "integer" } }, "required": [ "from", "to" ] }, "duration": { "description": "UI slider range for duration", "type": "object", "properties": { "from": { "type": "integer" }, "to": { "type": "integer" } }, "required": [ "from", "to" ] }, "startTime": { "description": "UI slider range for start time", "type": "object", "properties": { "from": { "type": "string", "format": "date-time" }, "to": { "type": "null" } }, "required": [ "from", "to" ] } }, "required": [ "numNodes", "duration", "startTime" ] } }, "required": [ "name", "metricDataRepository", "filterRanges" ], "minItems": 1 } }, "ui-defaults": { "description": "Default configuration for web UI", "type": "object", "properties": { "plot_general_colorBackground": { "description": "Color plot background according to job average threshold limits", "type": "boolean" }, "plot_general_lineWidth": { "description": "Initial linewidth", "type": "integer" }, "plot_list_jobsPerPage": { "description": "Jobs shown per page in job lists", "type": "integer" }, "plot_view_plotsPerRow": { "description": "Number of plots per row in single job view", "type": "integer" }, "plot_view_showPolarplot": { "description": "Option to toggle polar plot in single job view", "type": "boolean" }, "plot_view_showRoofline": { "description": "Option to toggle roofline plot in single job view", "type": "boolean" }, "plot_view_showStatTable": { "description": "Option to toggle the node statistic table in single job view", "type": "boolean" }, "system_view_selectedMetric": { "description": "Initial metric shown in system view", "type": "string" }, "analysis_view_histogramMetrics": { "description": "Metrics to show as job count histograms in analysis view", "type": "array", "items": { "type": "string", "minItems": 1 } }, "analysis_view_scatterPlotMetrics": { "description": "Initial scatter plto configuration in analysis view", "type": "array", "items": { "type": "array", "items": { "type": "string", "minItems": 2, "maxItems": 2 }, "minItems": 1 } }, "job_view_nodestats_selectedMetrics": { "description": "Initial metrics shown in node statistics table of single job view", "type": "array", "items": { "type": "string", "minItems": 1 } }, "job_view_polarPlotMetrics": { "description": "Metrics shown in polar plot of single job view", "type": "array", "items": { "type": "string", "minItems": 1 } }, "job_view_selectedMetrics": { "description": "", "type": "array", "items": { "type": "string", "minItems": 1 } }, "plot_general_colorscheme": { "description": "Initial color scheme", "type": "array", "items": { "type": "string", "minItems": 1 } }, "plot_list_selectedMetrics": { "description": "Initial metric plots shown in jobs lists", "type": "array", "items": { "type": "string", "minItems": 1 } } }, "required": [ "plot_general_colorBackground", "plot_general_lineWidth", "plot_list_jobsPerPage", "plot_view_plotsPerRow", "plot_view_showPolarplot", "plot_view_showRoofline", "plot_view_showStatTable", "system_view_selectedMetric", "analysis_view_histogramMetrics", "analysis_view_scatterPlotMetrics", "job_view_nodestats_selectedMetrics", "job_view_polarPlotMetrics", "job_view_selectedMetrics", "plot_general_colorscheme", "plot_list_selectedMetrics" ] } }, "required": [ "jwts", "clusters" ] }