From 15fcaf5607ee3d6e032d6087d92059a167d6fe6b Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Wed, 4 Dec 2024 16:30:28 +0200 Subject: [PATCH] Add task runner documentation (#2671) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Justin Ellingwood Co-authored-by: Iván Ovejero --- .../configuration/task-runner-concept.png | Bin 0 -> 51064 bytes .../task-runner-external-mode.png | Bin 0 -> 31442 bytes .../environment-variables/task-runners.md | 65 +++++++++++++ docs/hosting/configuration/task-runners.md | 88 ++++++++++++++++++ .../securing/hardening-task-runners.md | 14 +++ mkdocs.yml | 15 +-- styles/config/vocabularies/default/accept.txt | 4 + 7 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 docs/_images/hosting/configuration/task-runner-concept.png create mode 100644 docs/_images/hosting/configuration/task-runner-external-mode.png create mode 100644 docs/hosting/configuration/environment-variables/task-runners.md create mode 100644 docs/hosting/configuration/task-runners.md create mode 100644 docs/hosting/securing/hardening-task-runners.md diff --git a/docs/_images/hosting/configuration/task-runner-concept.png b/docs/_images/hosting/configuration/task-runner-concept.png new file mode 100644 index 0000000000000000000000000000000000000000..55207f2deade3c6c7123a6086cdea2bca06208ff GIT binary patch literal 51064 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 literal 0 HcmV?d00001 diff --git a/docs/_images/hosting/configuration/task-runner-external-mode.png b/docs/_images/hosting/configuration/task-runner-external-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63fb1f1b7c6647e817f6eaff5ae1bd1a08dba6 GIT binary patch literal 31442 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

y?Jw(3oKaUkA8vp6<=l6?icP9wYXCmg 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 IRkRHGe}@kaxBvhE literal 0 HcmV?d00001 diff --git a/docs/hosting/configuration/environment-variables/task-runners.md b/docs/hosting/configuration/environment-variables/task-runners.md new file mode 100644 index 000000000..51908c9e1 --- /dev/null +++ b/docs/hosting/configuration/environment-variables/task-runners.md @@ -0,0 +1,65 @@ +--- +#https://www.notion.so/n8n/Frontmatter-432c2b8dff1f43d4b1c8d20075510fe4 +title: Task runner environment variables +description: Environment variables to confgure task runners your self-hosted n8n instance. +contentType: reference +tags: + - environment variables +hide: + - toc + - tags +--- + +# Task runner environment variables + +--8<-- "_snippets/self-hosting/file-based-configuration.md" + +/// note | Experimental feature +Task runners are currently in public beta testing and might contain undiscovered issues. We don't recommend using them with business critical workflows. +/// + +[Task runners](/hosting/configuration/task-runners/) execute code defined by the [Code node](/integrations/builtin/core-nodes/n8n-nodes-base.code/). + +## n8n instance environment variables + +| Variable | Type | Default | Description | +| :------- | :---- | :------- | :---------- | +| `N8N_RUNNERS_ENABLED` | Boolean | `false` | Are task runners enabled. | +| `N8N_RUNNERS_MODE` | Enum string: `internal`, `external` | `internal` | How to launch and run the task runner. `internal` means n8n will launch a task runner as child process. `external` means an external orchestrator will launch the task runner. | +| `N8N_RUNNERS_AUTH_TOKEN` | String | Random string | Shared secret used by a task runner to authenticate to n8n. Required when using `external` mode. | +| `N8N_RUNNERS_SERVER_PORT` | Number | `5679` | Port the task broker listens on for task runner connections. | +| `N8N_RUNNERS_SERVER_LISTEN_ADDRESS` | String | `127.0.0.1` | Address the task broker listens on. | +| `N8N_RUNNERS_MAX_PAYLOAD` | Number | `1 073 741 824` | Maximum payload size in bytes for communication between a task broker and a task runner. | +| `N8N_RUNNERS_MAX_OLD_SPACE_SIZE` | String | | The `--max-old-space-size` option to use for a task runner (in MB). By default, Node.js will set this based on available memory. | +| `N8N_RUNNERS_MAX_CONCURRENCY` | Number | `5` | The number of concurrent tasks a task runner can execute at a time. | +| `N8N_RUNNERS_TASK_TIMEOUT` | Number | `60` | How long (in seconds) a task can take to complete before the task aborts and the runner restarts. Must be greater than 0. | +| `N8N_RUNNERS_HEARTBEAT_INTERVAL` | Number | `30` | How often (in seconds) the runner must send a heartbeat to the broker, else the task aborts and the runner restarts. Must be greater than 0. | + + +## Task runner launcher environment variables + +| Variable | Type | Default | Description | +| :------- | :---- | :------- | :---------- | +| `N8N_RUNNERS_LAUNCHER_LOG_LEVEL` | Enum string: `debug`, `info`, `warn`, `error` | `info` | Which log messages to show. | +| `N8N_RUNNERS_AUTH_TOKEN` | String | - | Shared secret used to authenticate to n8n. | +| `N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT` | Number | `15` | The number of seconds to wait before shutting down an idle runner. | +| `N8N_RUNNERS_TASK_BROKER_URI` | String | `http://127.0.0.1:5679` | The URI of the task broker server (n8n instance). | +| `N8N_RUNNERS_LAUNCHER_HEALTH_CHECK_PORT` | Number | `5680` | Port for the launcher's health check server. | +| `N8N_RUNNERS_MAX_PAYLOAD` | Number | `1 073 741 824` | Maximum payload size in bytes for communication between a task broker and a task runner. | +| `N8N_RUNNERS_MAX_CONCURRENCY` | Number | `5` | The number of concurrent tasks a task runner can execute at a time. | +| `NODE_OPTIONS` | String | - | [Options](https://nodejs.org/api/cli.html#node_optionsoptions) for Node.js. | + + +## Task runner environment variables + +| Variable | Type | Default | Description | +| :------- | :---- | :------- | :---------- | +| `N8N_RUNNERS_GRANT_TOKEN` | String | Random string | Token the runner uses to authenticate with the task broker. This is automatically provided by the launcher. | +| `N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT` | Number | `15` | The number of seconds to wait before shutting down an idle runner. | +| `N8N_RUNNERS_TASK_BROKER_URI` | String | `http://127.0.0.1:5679` | The URI of the task broker server (n8n instance). | +| `N8N_RUNNERS_LAUNCHER_HEALTH_CHECK_PORT` | Number | `5680` | Port for the launcher's health check server. | +| `N8N_RUNNERS_MAX_PAYLOAD` | Number | `1 073 741 824` | Maximum payload size in bytes for communication between a task broker and a task runner. | +| `N8N_RUNNERS_MAX_CONCURRENCY` | Number | `5` | The number of concurrent tasks a task runner can execute at a time. | +| `NODE_FUNCTION_ALLOW_BUILTIN` | String | - | Permit users to import specific built-in modules in the Code node. Use * to allow all. n8n disables importing modules by default. | +| `NODE_FUNCTION_ALLOW_EXTERNAL` | String | - | Permit users to import specific external modules (from `n8n/node_modules`) in the Code node. n8n disables importing modules by default. | +| `GENERIC_TIMEZONE` | * | `America/New_York` | The [same default timezone as configured for the n8n instance](/hosting/configuration/environment-variables/timezone-localization/). | diff --git a/docs/hosting/configuration/task-runners.md b/docs/hosting/configuration/task-runners.md new file mode 100644 index 000000000..d45d09e88 --- /dev/null +++ b/docs/hosting/configuration/task-runners.md @@ -0,0 +1,88 @@ +--- +#https://www.notion.so/n8n/Frontmatter-432c2b8dff1f43d4b1c8d20075510fe4 +title: Task runners +description: How to configure task runners to execute tasks using internal or external runner processes. +contentType: howto +--- + +# Task runners + +Task runners are a generic mechanism to execute tasks in a secure and performant way. They're used to execute user-provided JavaScript code in the [Code node](/integrations/builtin/core-nodes/n8n-nodes-base.code/). + +This document describes how task runners work and how you can configure them. + +/// note | Experimental feature +Task runners are currently in public beta testing and might contain undiscovered issues. We don't recommend using them with business critical workflows. +/// + +## How it works + +The task runner feature consists of three components: a task runner, a task broker, and a task requester. + +![Task runner overview](/_images/hosting/configuration/task-runner-concept.png) + +Task runners connect to the task broker using a websocket connection. A task requester submits a task request to the broker where an available task runner can pick it up for execution. + +The runner executes the task and submits the results to the task requester. The task broker coordinates communication between the runner and the requester. + +The n8n instance (main and worker) acts as the broker. The Code node in this case is the task requester. + +## Task runner modes + +You can use task runners in two different modes: internal and external. + +### Internal mode + +In internal mode, the n8n instance launches the task runner as a child process. The n8n process monitors and manages the life cycle of the task runner. The task runner process shares the same `uid` and `gid` as n8n. + +### External mode + +In external mode, an external orchestrator (for example, Kubernetes) launches the task runner instead of n8n. Typically, this means you would configure the task runner to run as a side-car container next to n8n. + +![Task runner deployed as a side-car container](/_images/hosting/configuration/task-runner-external-mode.png) + +In this mode, the orchestrator monitors and manages the life cycle of the task runner container. The task runner is fully isolated from the n8n instance. + +When using the [Queue mode](/hosting/scaling/queue-mode), each n8n container (main and workers) needs to have its own task runner. + +## Setting up external mode + +Use the following details to configure task runners in external mode + +### Configuring n8n instance in external mode + +You can configure n8n to use external task runners by setting the following environment variables: + +| Environment variables | Description | +|--------------------------------------------------------|------------------------------------------------------------| +| `N8N_RUNNERS_ENABLED=true` | Enables task runners. | +| `N8N_RUNNERS_MODE=external` | Use task runners in external mode. | +| `N8N_RUNNERS_AUTH_TOKEN=` | A shared secret task runners use to connect to the broker. | + +For full list of environment variables see [task runner environment variables](/hosting/configuration/environment-variables/task-runners/). + +### Configuring task runners in external mode + +The task runner comes bundled within the n8n Docker image. The Docker image also includes the task runner launcher. + +The launcher can start the runner on-demand, which means lower memory usage when there's no work needed, but a short delay (few hundred ms) in cold-start. The launcher also monitors the runner and restarts it in case of infinite loops or other issues. + +Run a task runner container from the n8n Docker image by setting the following properties: + +| Configuration | Description | +|-----------------|---------------------------------------------------------| +| `command` | `["/usr/local/bin/task-runner-launcher", "javascript"]` | +| `livenessProbe` | `GET /healthz`, port `5680` | + +Set the following environment variables for the container, adjusted to fit your needs: + +| Environment variables | Description | +| ------ | ----- | +| `N8N_RUNNERS_AUTH_TOKEN=` | The shared secret the task runner uses to connect to the broker. | +| `N8N_RUNNERS_MAX_CONCURRENCY=5` | The number of concurrent tasks the runner can execute. | +| `N8N_RUNNERS_TASK_BROKER_URI=localhost:5679` | The address of the task broker server within the n8n instance. | +| `N8N_RUNNERS_AUTO_SHUTDOWN_TIMEOUT=15` | Number of seconds of inactivity to wait before shutting down the task runner process. The launcher will automatically start the runner again when there are new tasks to execute. Set to `0` to disable automatic shutdown. | +| `NODE_OPTIONS=--max-old-space-size=` | The memory limit for the task runner Node.js process. This should be lower than the limit for container so that the runner runs out of memory before the container. That way, the launcher is able to monitor the runner. | +| `GENERIC_TIMEZONE` | * | `America/New_York` | The [same default timezone as configured for the n8n instance](/hosting/configuration/environment-variables/timezone-localization/). | + +For full list of environment variables see [task runner environment variables](/hosting/configuration/environment-variables/task-runners/). diff --git a/docs/hosting/securing/hardening-task-runners.md b/docs/hosting/securing/hardening-task-runners.md new file mode 100644 index 000000000..8c6be0616 --- /dev/null +++ b/docs/hosting/securing/hardening-task-runners.md @@ -0,0 +1,14 @@ +--- +#https://www.notion.so/n8n/Frontmatter-432c2b8dff1f43d4b1c8d20075510fe4 +title: Hardening task runners +description: "Harden task runners for better isolation for your self-hosted n8n instance." +contentType: howto +--- + +# Hardening task runners + +[Task runners](/hosting/configuration/task-runners/) are responsible for executing code from the [Code node](/integrations/builtin/core-nodes/n8n-nodes-base.code/). While Code node executions are secure, you can follow these recommendations to further harden your task runners. + +## Run task runners as sidecars in external mode + +To increase the isolation between the core n8n process and code in the Code node, run task runners in [external mode](/hosting/configuration/task-runners#setting-up-external-mode). External task runners launch as separate containers, providing a fully isolated environment to execute the JavaScript defined in the Code node. diff --git a/mkdocs.yml b/mkdocs.yml index 943c23643..f8de8b61c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1292,24 +1292,25 @@ nav: - Configuration: - Environment variables: - Environment variables overview : hosting/configuration/environment-variables/index.md + - Binary data: hosting/configuration/environment-variables/binary-data.md - Credentials: hosting/configuration/environment-variables/credentials.md - Database: hosting/configuration/environment-variables/database.md - Deployment: hosting/configuration/environment-variables/deployment.md - - Binary data: hosting/configuration/environment-variables/binary-data.md - - User management and 2FA: hosting/configuration/environment-variables/user-management-smtp-2fa.md - Endpoints: hosting/configuration/environment-variables/endpoints.md - - External hooks: hosting/configuration/environment-variables/external-hooks.md - Executions: hosting/configuration/environment-variables/executions.md - - Logs: hosting/configuration/environment-variables/logs.md - External data storage: hosting/configuration/environment-variables/external-data-storage.md + - External hooks: hosting/configuration/environment-variables/external-hooks.md + - External secrets: hosting/configuration/environment-variables/external-secrets.md + - Logs: hosting/configuration/environment-variables/logs.md + - License: hosting/configuration/environment-variables/licenses.md - Nodes: hosting/configuration/environment-variables/nodes.md - Queue mode: hosting/configuration/environment-variables/queue-mode.md - Security: hosting/configuration/environment-variables/security.md - Source control: hosting/configuration/environment-variables/source-control.md - - External secrets: hosting/configuration/environment-variables/external-secrets.md + - Task runners: hosting/configuration/environment-variables/task-runners.md - Timezone and localization: hosting/configuration/environment-variables/timezone-localization.md + - User management and 2FA: hosting/configuration/environment-variables/user-management-smtp-2fa.md - Workflows: hosting/configuration/environment-variables/workflows.md - - License: hosting/configuration/environment-variables/licenses.md - Configuration methods: hosting/configuration/configuration-methods.md - Configuration examples: - hosting/configuration/configuration-examples/index.md @@ -1325,6 +1326,7 @@ nav: - Configure webhook URLs with reverse proxy: hosting/configuration/configuration-examples/webhook-url.md - Enable Prometheus metrics: hosting/configuration/configuration-examples/prometheus.md - Supported databases and settings: hosting/configuration/supported-databases-settings.md + - Task runners: hosting/configuration/task-runners.md - User management: hosting/configuration/user-management-self-hosted.md - Logging and monitoring: - Logging: hosting/logging-monitoring/logging.md @@ -1347,6 +1349,7 @@ nav: - Disable the API: hosting/securing/disable-public-api.md - Opt out of data collection: hosting/securing/telemetry-opt-out.md - Blocking nodes: hosting/securing/blocking-nodes.md + - Hardening task runners: hosting/securing/hardening-task-runners.md - Starter Kits: - AI Starter Kit: hosting/starter-kits/ai-starter-kit.md - Architecture: diff --git a/styles/config/vocabularies/default/accept.txt b/styles/config/vocabularies/default/accept.txt index 65b3237d0..87283d5b6 100644 --- a/styles/config/vocabularies/default/accept.txt +++ b/styles/config/vocabularies/default/accept.txt @@ -197,6 +197,8 @@ Ortto Oura PDFs Peekalink +Performant +performant PGVector PhantomBuster Pinterest @@ -226,6 +228,8 @@ Rekognition requester Rundeck Salesmate +Sandboxed +sandboxed Sekoia Sendy Serp