2019-07-21 10:47:41 -07:00
import * as convict from 'convict' ;
import * as dotenv from 'dotenv' ;
dotenv . config ( ) ;
const config = convict ( {
database : {
type : {
doc : 'Type of database to use' ,
2021-01-23 11:35:38 -08:00
format : [ 'sqlite' , 'mariadb' , 'mysqldb' , 'postgresdb' ] ,
2019-07-21 10:47:41 -07:00
default : 'sqlite' ,
2020-10-22 06:46:03 -07:00
env : 'DB_TYPE' ,
2019-07-21 10:47:41 -07:00
} ,
2020-03-21 10:32:26 -07:00
tablePrefix : {
doc : 'Prefix for table names' ,
format : '*' ,
default : '' ,
2020-10-22 06:46:03 -07:00
env : 'DB_TABLE_PREFIX' ,
2020-03-21 10:32:26 -07:00
} ,
2019-07-22 11:29:06 -07:00
postgresdb : {
database : {
doc : 'PostgresDB Database' ,
format : String ,
default : 'n8n' ,
2020-10-22 06:46:03 -07:00
env : 'DB_POSTGRESDB_DATABASE' ,
2019-07-22 11:29:06 -07:00
} ,
host : {
doc : 'PostgresDB Host' ,
format : String ,
default : 'localhost' ,
2020-10-22 06:46:03 -07:00
env : 'DB_POSTGRESDB_HOST' ,
2019-07-22 11:29:06 -07:00
} ,
password : {
doc : 'PostgresDB Password' ,
format : String ,
default : '' ,
2020-10-22 06:46:03 -07:00
env : 'DB_POSTGRESDB_PASSWORD' ,
2019-07-22 11:29:06 -07:00
} ,
port : {
doc : 'PostgresDB Port' ,
format : Number ,
default : 5432 ,
2020-10-22 06:46:03 -07:00
env : 'DB_POSTGRESDB_PORT' ,
2019-07-22 11:29:06 -07:00
} ,
user : {
doc : 'PostgresDB User' ,
format : String ,
default : 'root' ,
2020-10-22 06:46:03 -07:00
env : 'DB_POSTGRESDB_USER' ,
2019-07-22 11:29:06 -07:00
} ,
2020-03-17 22:04:53 -07:00
schema : {
doc : 'PostgresDB Schema' ,
format : String ,
default : 'public' ,
2020-10-22 06:46:03 -07:00
env : 'DB_POSTGRESDB_SCHEMA' ,
2020-03-17 22:04:53 -07:00
} ,
2020-06-25 02:39:04 -07:00
ssl : {
ca : {
doc : 'SSL certificate authority' ,
format : String ,
default : '' ,
env : 'DB_POSTGRESDB_SSL_CA' ,
} ,
cert : {
doc : 'SSL certificate' ,
format : String ,
default : '' ,
env : 'DB_POSTGRESDB_SSL_CERT' ,
} ,
key : {
doc : 'SSL key' ,
format : String ,
default : '' ,
env : 'DB_POSTGRESDB_SSL_KEY' ,
} ,
rejectUnauthorized : {
doc : 'If unauthorized SSL connections should be rejected' ,
format : 'Boolean' ,
default : true ,
env : 'DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED' ,
} ,
2020-10-22 06:46:03 -07:00
} ,
2020-06-25 02:39:04 -07:00
2019-07-22 11:29:06 -07:00
} ,
2020-02-10 08:09:06 -08:00
mysqldb : {
database : {
doc : 'MySQL Database' ,
format : String ,
default : 'n8n' ,
2020-10-22 06:46:03 -07:00
env : 'DB_MYSQLDB_DATABASE' ,
2020-02-10 08:09:06 -08:00
} ,
host : {
doc : 'MySQL Host' ,
format : String ,
default : 'localhost' ,
2020-10-22 06:46:03 -07:00
env : 'DB_MYSQLDB_HOST' ,
2020-02-10 08:09:06 -08:00
} ,
password : {
doc : 'MySQL Password' ,
format : String ,
default : '' ,
2020-10-22 06:46:03 -07:00
env : 'DB_MYSQLDB_PASSWORD' ,
2020-02-10 08:09:06 -08:00
} ,
port : {
doc : 'MySQL Port' ,
format : Number ,
2020-02-10 08:18:28 -08:00
default : 3306 ,
2020-10-22 06:46:03 -07:00
env : 'DB_MYSQLDB_PORT' ,
2020-02-10 08:09:06 -08:00
} ,
user : {
doc : 'MySQL User' ,
format : String ,
default : 'root' ,
2020-10-22 06:46:03 -07:00
env : 'DB_MYSQLDB_USER' ,
2020-02-10 08:09:06 -08:00
} ,
2019-07-22 11:29:06 -07:00
} ,
2020-12-31 01:42:16 -08:00
sqlite : {
2021-01-04 00:30:02 -08:00
executeVacuumOnStartup : {
2021-01-07 04:17:49 -08:00
doc : 'Runs VACUUM operation on startup to rebuild the database. Reduces filesize and optimizes indexes. WARNING: This is a long running blocking operation. Will increase start-up time.' ,
2021-01-04 00:30:02 -08:00
format : Boolean ,
default : false ,
2021-01-07 04:17:49 -08:00
env : 'DB_SQLITE_VACUUM_ON_STARTUP' ,
} ,
2020-12-31 01:42:16 -08:00
} ,
2019-07-21 10:47:41 -07:00
} ,
2020-01-25 23:48:38 -08:00
credentials : {
overwrite : {
2020-07-07 10:03:53 -07:00
data : {
// Allows to set default values for credentials which
// get automatically prefilled and the user does not get
// displayed and can not change.
// Format: { CREDENTIAL_NAME: { PARAMTER: VALUE }}
doc : 'Overwrites for credentials' ,
format : '*' ,
default : '{}' ,
2020-10-22 06:46:03 -07:00
env : 'CREDENTIALS_OVERWRITE_DATA' ,
2020-07-07 10:03:53 -07:00
} ,
endpoint : {
doc : 'Fetch credentials from API' ,
format : String ,
default : '' ,
env : 'CREDENTIALS_OVERWRITE_ENDPOINT' ,
} ,
} ,
2020-01-25 23:48:38 -08:00
} ,
2019-07-21 10:47:41 -07:00
executions : {
2020-01-17 17:49:31 -08:00
// By default workflows get always executed in their own process.
// If this option gets set to "main" it will run them in the
// main-process instead.
process : {
doc : 'In what process workflows should be executed' ,
format : [ 'main' , 'own' ] ,
default : 'own' ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_PROCESS' ,
2020-01-17 17:49:31 -08:00
} ,
2021-02-08 23:59:32 -08:00
mode : {
doc : 'If it should run executions directly or via queue' ,
format : [ 'regular' , 'queue' ] ,
default : 'regular' ,
env : 'EXECUTIONS_MODE' ,
} ,
2020-07-29 05:12:54 -07:00
// A Workflow times out and gets canceled after this time (seconds).
// If the workflow is executed in the main process a soft timeout
// is executed (takes effect after the current node finishes).
// If a workflow is running in its own process is a soft timeout
// tried first, before killing the process after waiting for an
// additional fifth of the given timeout duration.
//
// To deactivate timeout set it to -1
//
// Timeout is currently not activated by default which will change
// in a future version.
timeout : {
doc : 'Max run time (seconds) before stopping the workflow execution' ,
format : Number ,
default : - 1 ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_TIMEOUT' ,
2020-07-29 05:12:54 -07:00
} ,
maxTimeout : {
doc : 'Max execution time (seconds) that can be set for a workflow individually' ,
format : Number ,
default : 3600 ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_TIMEOUT_MAX' ,
2020-07-29 05:12:54 -07:00
} ,
2019-07-21 10:47:41 -07:00
// If a workflow executes all the data gets saved by default. This
// could be a problem when a workflow gets executed a lot and processes
2020-07-09 07:52:38 -07:00
// a lot of data. To not exceed the database's capacity it is possible to
// prune the database regularly or to not save the execution at all.
2019-07-21 10:47:41 -07:00
// Depending on if the execution did succeed or error a different
// save behaviour can be set.
saveDataOnError : {
doc : 'What workflow execution data to save on error' ,
format : [ 'all' , 'none' ] ,
default : 'all' ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_DATA_SAVE_ON_ERROR' ,
2019-07-21 10:47:41 -07:00
} ,
saveDataOnSuccess : {
doc : 'What workflow execution data to save on success' ,
format : [ 'all' , 'none' ] ,
default : 'all' ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_DATA_SAVE_ON_SUCCESS' ,
2019-07-21 10:47:41 -07:00
} ,
2021-02-08 23:59:32 -08:00
saveExecutionProgress : {
doc : 'Wether or not to save progress for each node executed' ,
format : 'Boolean' ,
default : false ,
env : 'EXECUTIONS_DATA_SAVE_ON_PROGRESS' ,
} ,
2019-07-21 10:47:41 -07:00
// If the executions of workflows which got started via the editor
// should be saved. By default they will not be saved as this runs
// are normally only for testing and debugging. This setting can
// also be overwritten on a per workflow basis in the workflow settings
// in the editor.
saveDataManualExecutions : {
doc : 'Save data of executions when started manually via editor' ,
2020-07-17 08:08:40 -07:00
format : 'Boolean' ,
2019-07-21 10:47:41 -07:00
default : false ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS' ,
2019-07-21 10:47:41 -07:00
} ,
2020-07-09 07:52:38 -07:00
// To not exceed the database's capacity and keep its size moderate
// the execution data gets pruned regularly (default: 1 hour interval).
// All saved execution data older than the max age will be deleted.
// Pruning is currently not activated by default, which will change in
// a future version.
pruneData : {
doc : 'Delete data of past executions on a rolling basis' ,
2020-07-17 08:08:40 -07:00
format : 'Boolean' ,
2020-07-09 07:52:38 -07:00
default : false ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_DATA_PRUNE' ,
2020-07-09 07:52:38 -07:00
} ,
pruneDataMaxAge : {
doc : 'How old (hours) the execution data has to be to get deleted' ,
2020-07-17 08:08:40 -07:00
format : Number ,
2020-07-09 07:52:38 -07:00
default : 336 ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_DATA_MAX_AGE' ,
2020-07-09 07:52:38 -07:00
} ,
pruneDataTimeout : {
2020-07-12 03:48:32 -07:00
doc : 'Timeout (seconds) after execution data has been pruned' ,
2020-07-17 08:08:40 -07:00
format : Number ,
2020-07-12 03:48:32 -07:00
default : 3600 ,
2020-10-22 06:46:03 -07:00
env : 'EXECUTIONS_DATA_PRUNE_TIMEOUT' ,
2020-07-09 07:52:38 -07:00
} ,
2019-07-21 10:47:41 -07:00
} ,
2021-02-08 23:59:32 -08:00
queue : {
bull : {
prefix : {
doc : 'Prefix for all queue keys' ,
format : String ,
default : '' ,
env : 'QUEUE_BULL_PREFIX' ,
} ,
redis : {
db : {
doc : 'Redis DB' ,
format : Number ,
default : 0 ,
env : 'QUEUE_BULL_REDIS_DB' ,
} ,
host : {
doc : 'Redis Host' ,
format : String ,
default : 'localhost' ,
env : 'QUEUE_BULL_REDIS_HOST' ,
} ,
password : {
doc : 'Redis Password' ,
format : String ,
default : '' ,
env : 'QUEUE_BULL_REDIS_PASSWORD' ,
} ,
port : {
doc : 'Redis Port' ,
format : Number ,
default : 6379 ,
env : 'QUEUE_BULL_REDIS_PORT' ,
} ,
timeoutThreshold : {
doc : 'Redis timeout threshold' ,
format : Number ,
default : 10000 ,
env : 'QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD' ,
} ,
} ,
queueRecoveryInterval : {
doc : 'If > 0 enables an active polling to the queue that can recover for Redis crashes. Given in seconds; 0 is disabled. May increase Redis traffic significantly.' ,
format : Number ,
default : 60 ,
env : 'QUEUE_RECOVERY_INTERVAL' ,
} ,
} ,
} ,
2019-07-21 10:47:41 -07:00
generic : {
// The timezone to use. Is important for nodes like "Cron" which start the
// workflow automatically at a specified time. This setting can also be
// overwritten on a per worfklow basis in the workflow settings in the
// editor.
timezone : {
doc : 'The timezone to use' ,
format : '*' ,
default : 'America/New_York' ,
2020-10-22 06:46:03 -07:00
env : 'GENERIC_TIMEZONE' ,
2019-07-21 10:47:41 -07:00
} ,
} ,
// How n8n can be reached (Editor & REST-API)
2020-07-12 00:28:08 -07:00
path : {
format : String ,
default : '/' ,
arg : 'path' ,
env : 'N8N_PATH' ,
2020-10-22 06:46:03 -07:00
doc : 'Path n8n is deployed to' ,
2020-07-12 00:28:08 -07:00
} ,
2019-07-21 10:47:41 -07:00
host : {
format : String ,
default : 'localhost' ,
arg : 'host' ,
env : 'N8N_HOST' ,
2020-10-22 06:46:03 -07:00
doc : 'Host name n8n can be reached' ,
2019-07-21 10:47:41 -07:00
} ,
port : {
format : Number ,
default : 5678 ,
arg : 'port' ,
env : 'N8N_PORT' ,
2020-10-22 06:46:03 -07:00
doc : 'HTTP port n8n can be reached' ,
2019-07-21 10:47:41 -07:00
} ,
2020-06-04 00:36:10 -07:00
listen_address : {
format : String ,
default : '0.0.0.0' ,
env : 'N8N_LISTEN_ADDRESS' ,
2020-10-22 06:46:03 -07:00
doc : 'IP address n8n should listen on' ,
2020-06-04 00:36:10 -07:00
} ,
2019-07-21 10:47:41 -07:00
protocol : {
format : [ 'http' , 'https' ] ,
default : 'http' ,
env : 'N8N_PROTOCOL' ,
2020-10-22 06:46:03 -07:00
doc : 'HTTP Protocol via which n8n can be reached' ,
2019-07-21 10:47:41 -07:00
} ,
2020-03-27 10:19:30 -07:00
ssl_key : {
format : String ,
2020-03-30 04:29:42 -07:00
default : '' ,
2020-03-27 10:19:30 -07:00
env : 'N8N_SSL_KEY' ,
2020-10-22 06:46:03 -07:00
doc : 'SSL Key for HTTPS Protocol' ,
2020-03-27 10:19:30 -07:00
} ,
ssl_cert : {
format : String ,
2020-03-30 04:29:42 -07:00
default : '' ,
2020-03-27 10:19:30 -07:00
env : 'N8N_SSL_CERT' ,
2020-10-22 06:46:03 -07:00
doc : 'SSL Cert for HTTPS Protocol' ,
2020-03-27 10:19:30 -07:00
} ,
2019-07-21 10:47:41 -07:00
2019-08-04 05:24:48 -07:00
security : {
2020-09-23 05:14:31 -07:00
excludeEndpoints : {
doc : 'Additional endpoints to exclude auth checks. Multiple endpoints can be separated by colon (":")' ,
format : String ,
default : '' ,
2020-10-22 06:46:03 -07:00
env : 'N8N_AUTH_EXCLUDE_ENDPOINTS' ,
2020-09-23 05:14:31 -07:00
} ,
2019-08-04 05:24:48 -07:00
basicAuth : {
active : {
format : 'Boolean' ,
default : false ,
env : 'N8N_BASIC_AUTH_ACTIVE' ,
2020-10-22 06:46:03 -07:00
doc : 'If basic auth should be activated for editor and REST-API' ,
2019-08-04 05:24:48 -07:00
} ,
user : {
format : String ,
default : '' ,
env : 'N8N_BASIC_AUTH_USER' ,
2020-10-22 06:46:03 -07:00
doc : 'The name of the basic auth user' ,
2019-08-04 05:24:48 -07:00
} ,
password : {
format : String ,
default : '' ,
env : 'N8N_BASIC_AUTH_PASSWORD' ,
2020-10-22 06:46:03 -07:00
doc : 'The password of the basic auth user' ,
2019-08-04 05:24:48 -07:00
} ,
2020-09-10 08:49:44 -07:00
hash : {
format : 'Boolean' ,
default : false ,
env : 'N8N_BASIC_AUTH_HASH' ,
2020-10-22 06:46:03 -07:00
doc : 'If password for basic auth is hashed' ,
} ,
2019-10-14 13:37:51 -07:00
} ,
jwtAuth : {
active : {
format : 'Boolean' ,
default : false ,
env : 'N8N_JWT_AUTH_ACTIVE' ,
2020-10-22 06:46:03 -07:00
doc : 'If JWT auth should be activated for editor and REST-API' ,
2019-10-14 13:37:51 -07:00
} ,
jwtHeader : {
format : String ,
default : '' ,
env : 'N8N_JWT_AUTH_HEADER' ,
2020-10-22 06:46:03 -07:00
doc : 'The request header containing a signed JWT' ,
2019-10-14 13:37:51 -07:00
} ,
2020-08-06 08:44:19 -07:00
jwtHeaderValuePrefix : {
format : String ,
default : '' ,
env : 'N8N_JWT_AUTH_HEADER_VALUE_PREFIX' ,
2020-10-22 06:46:03 -07:00
doc : 'The request header value prefix to strip (optional)' ,
2020-08-06 08:44:19 -07:00
} ,
2019-10-14 13:37:51 -07:00
jwksUri : {
format : String ,
default : '' ,
env : 'N8N_JWKS_URI' ,
2020-10-22 06:46:03 -07:00
doc : 'The URI to fetch JWK Set for JWT authentication' ,
2020-08-06 08:44:19 -07:00
} ,
jwtIssuer : {
format : String ,
default : '' ,
env : 'N8N_JWT_ISSUER' ,
2020-10-22 06:46:03 -07:00
doc : 'JWT issuer to expect (optional)' ,
2020-08-06 08:44:19 -07:00
} ,
jwtNamespace : {
format : String ,
default : '' ,
env : 'N8N_JWT_NAMESPACE' ,
2020-10-22 06:46:03 -07:00
doc : 'JWT namespace to expect (optional)' ,
2020-08-06 08:44:19 -07:00
} ,
jwtAllowedTenantKey : {
format : String ,
default : '' ,
env : 'N8N_JWT_ALLOWED_TENANT_KEY' ,
2020-10-22 06:46:03 -07:00
doc : 'JWT tenant key name to inspect within JWT namespace (optional)' ,
2019-10-14 13:37:51 -07:00
} ,
2020-08-06 08:44:19 -07:00
jwtAllowedTenant : {
format : String ,
default : '' ,
env : 'N8N_JWT_ALLOWED_TENANT' ,
2020-10-22 06:46:03 -07:00
doc : 'JWT tenant to allow (optional)' ,
2020-08-06 08:44:19 -07:00
} ,
} ,
2019-08-04 05:24:48 -07:00
} ,
2019-07-21 10:47:41 -07:00
endpoints : {
rest : {
format : String ,
default : 'rest' ,
env : 'N8N_ENDPOINT_REST' ,
2020-10-22 06:46:03 -07:00
doc : 'Path for rest endpoint' ,
2019-07-21 10:47:41 -07:00
} ,
webhook : {
format : String ,
default : 'webhook' ,
env : 'N8N_ENDPOINT_WEBHOOK' ,
2020-10-22 06:46:03 -07:00
doc : 'Path for webhook endpoint' ,
2019-07-21 10:47:41 -07:00
} ,
webhookTest : {
format : String ,
default : 'webhook-test' ,
env : 'N8N_ENDPOINT_WEBHOOK_TEST' ,
2020-10-22 06:46:03 -07:00
doc : 'Path for test-webhook endpoint' ,
2019-07-21 10:47:41 -07:00
} ,
2021-02-09 14:32:40 -08:00
disableProductionWebhooksOnMainProcess : {
format : Boolean ,
default : false ,
env : 'N8N_DISABLE_PRODUCTION_MAIN_PROCESS' ,
doc : 'Disable production webhooks from main process. This helps ensures no http traffic load to main process when using webhook-specific processes.' ,
} ,
skipWebhoooksDeregistrationOnShutdown : {
/ * *
* Longer explanation : n8n deregisters webhooks on shutdown / deactivation
* and registers on startup / activation . If we skip
* deactivation on shutdown , webhooks will remain active on 3 rd party services .
* We don ' t have to worry about startup as it always
* checks if webhooks already exist .
* If users want to upgrade n8n , it is possible to run
* two instances simultaneously without downtime , similar
* to blue / green deployment .
* WARNING : Trigger nodes ( like Cron ) will cause duplication
* of work , so be aware when using .
* /
2021-03-01 12:21:16 -08:00
doc : 'Deregister webhooks on external services only when workflows are deactivated.' ,
2021-02-09 14:32:40 -08:00
format : Boolean ,
default : false ,
2021-03-01 12:21:16 -08:00
env : 'N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN' ,
2021-02-09 14:32:40 -08:00
} ,
2019-07-21 10:47:41 -07:00
} ,
2020-05-03 23:56:01 -07:00
externalHookFiles : {
2020-05-04 16:23:54 -07:00
doc : 'Files containing external hooks. Multiple files can be separated by colon (":")' ,
2020-05-03 23:56:01 -07:00
format : String ,
default : '' ,
2020-10-22 06:46:03 -07:00
env : 'EXTERNAL_HOOK_FILES' ,
2020-05-03 23:56:01 -07:00
} ,
2019-07-21 10:47:41 -07:00
nodes : {
2020-12-01 01:53:43 -08:00
include : {
doc : 'Nodes to load' ,
format : function check ( rawValue ) {
if ( rawValue === '' ) {
return ;
}
try {
const values = JSON . parse ( rawValue ) ;
if ( ! Array . isArray ( values ) ) {
throw new Error ( ) ;
}
for ( const value of values ) {
if ( typeof value !== 'string' ) {
throw new Error ( ) ;
}
}
} catch ( error ) {
throw new TypeError ( ` The Nodes to include is not a valid Array of strings. ` ) ;
}
} ,
default : undefined ,
env : 'NODES_INCLUDE' ,
} ,
2019-07-21 10:47:41 -07:00
exclude : {
doc : 'Nodes not to load' ,
format : function check ( rawValue ) {
try {
const values = JSON . parse ( rawValue ) ;
if ( ! Array . isArray ( values ) ) {
throw new Error ( ) ;
}
for ( const value of values ) {
if ( typeof value !== 'string' ) {
throw new Error ( ) ;
}
}
} catch ( error ) {
throw new TypeError ( ` The Nodes to exclude is not a valid Array of strings. ` ) ;
}
} ,
default : '[]' ,
2020-10-22 06:46:03 -07:00
env : 'NODES_EXCLUDE' ,
2019-07-21 10:47:41 -07:00
} ,
errorTriggerType : {
doc : 'Node Type to use as Error Trigger' ,
format : String ,
default : 'n8n-nodes-base.errorTrigger' ,
2020-10-22 06:46:03 -07:00
env : 'NODES_ERROR_TRIGGER_TYPE' ,
2019-07-21 10:47:41 -07:00
} ,
} ,
} ) ;
2020-03-27 04:30:42 -07:00
// Overwrite default configuration with settings which got defined in
// optional configuration files
if ( process . env . N8N_CONFIG_FILES !== undefined ) {
2020-03-29 03:46:55 -07:00
const configFiles = process . env . N8N_CONFIG_FILES . split ( ',' ) ;
console . log ( ` \ nLoading configuration overwrites from: \ n - ${ configFiles . join ( '\n - ' ) } \ n ` ) ;
2020-03-27 04:30:42 -07:00
2020-03-29 03:46:55 -07:00
config . loadFile ( configFiles ) ;
2020-03-27 04:30:42 -07:00
}
2019-07-21 10:47:41 -07:00
config . validate ( {
allowed : 'strict' ,
} ) ;
export = config ;