From 867870f80f57dbe61e475bb1abd36de4a1af2bb6 Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Fri, 28 Jan 2022 00:39:58 +0200 Subject: [PATCH] feat(n8n): Add n8n (#1797) * feat(n8n): Add n8n * start tests * add questions for ci * root * whoops * rofs * add configmap, and update part of UI * add configmap, update part of UI * update executions * comment out security until is done * spaces * not there * test * try without numbers? * again * include * clean * test clean * test * test again * add sec config * add logs config * exec * endpoints * credentials * deployment * security * finish * update image --- charts/incubator/n8n/Chart.yaml | 36 + charts/incubator/n8n/questions.yaml | 700 ++++++++++++++++++ charts/incubator/n8n/templates/_configmap.tpl | 166 +++++ charts/incubator/n8n/templates/common.yaml | 9 + charts/incubator/n8n/values.yaml | 126 ++++ docs/_static/img/appicons/n8n-icon.png | Bin 0 -> 3078 bytes docs/apps/app-requests.md | 2 +- docs/manual/default-ports.md | 1 + 8 files changed, 1039 insertions(+), 1 deletion(-) create mode 100644 charts/incubator/n8n/Chart.yaml create mode 100644 charts/incubator/n8n/questions.yaml create mode 100644 charts/incubator/n8n/templates/_configmap.tpl create mode 100644 charts/incubator/n8n/templates/common.yaml create mode 100644 charts/incubator/n8n/values.yaml create mode 100644 docs/_static/img/appicons/n8n-icon.png diff --git a/charts/incubator/n8n/Chart.yaml b/charts/incubator/n8n/Chart.yaml new file mode 100644 index 00000000000..9e85e6623fc --- /dev/null +++ b/charts/incubator/n8n/Chart.yaml @@ -0,0 +1,36 @@ +apiVersion: v2 +appVersion: "0.160.0" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.14.2 +- condition: postgresql.enabled + name: postgresql + repository: https://truecharts.org/ + version: 6.0.58 +- condition: redis.enabled + name: redis + repository: https://truecharts.org + version: 1.0.63 +description: n8n is an extendable workflow automation tool. +home: https://github.com/truecharts/apps/tree/master/charts/stable/n8n +icon: https://truecharts.org/_static/img/appicons/n8n-icon.png +keywords: +- workflows +- automation +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: n8n +sources: +- https://docs.n8n.io/ +- https://github.com/n8n-io/n8n +- https://hub.docker.com/r/n8nio/n8n +version: 0.0.1 +annotations: + truecharts.org/catagories: | + - media + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/n8n/questions.yaml b/charts/incubator/n8n/questions.yaml new file mode 100644 index 00000000000..3f2fb7c9c35 --- /dev/null +++ b/charts/incubator/n8n/questions.yaml @@ -0,0 +1,700 @@ +# Include{groups} +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" +questions: + - variable: portal + group: "Container Image" + label: "Configure Portal Button" + schema: + type: dict + hidden: true + attrs: + - variable: enabled + label: "Enable" + description: "enable the portal button" + schema: + hidden: true + editable: false + type: boolean + default: true +# Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + additional_attrs: true + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + additional_attrs: true + type: dict + attrs: +# Include{fixedEnv} + - variable: deployment + group: "Container Configuration" + label: "Deployment" + schema: + additional_attrs: true + type: dict + attrs: + - variable: N8N_HOST + label: "Host" + description: "Host name where n8n can be reached." + schema: + type: string + required: true + default: "" + - variable: N8N_CONFIG_FILES + label: "Config Files (Leave empty for default)" + description: "Use to provide the path to any JSON configuration file(s)" + schema: + type: string + default: "" + - variable: N8N_DISABLE_UI + label: "Disable UI" + description: "Whether the UI should be disabled" + schema: + type: boolean + default: false + - variable: N8N_ENCRYPTION_KEY + label: "Encryption Key (Leave empty for default)" + description: "Provide a custom key used to encrypt credentials in the n8n database. By default a random key is generated on first launch" + schema: + type: string + default: "" + - variable: N8N_PERSONALIZATION_ENABLED + label: "Enable Personalization" + description: "Whether to ask users personalisation questions and then customise n8n accordingly" + schema: + type: boolean + default: true + - variable: N8N_VERSION_NOTIFICATIONS_ENABLED + label: "Enable Version Notifications" + description: "When enabled, notifications of new versions and security updates are provided" + schema: + type: boolean + default: true + - variable: N8N_DIAGNOSTICS_ENABLED + label: "Enable Diagnostics" + description: "Whether to share selected, anonymous telemetry with n8n" + schema: + type: boolean + default: false + - variable: workflows + group: "Container Configuration" + label: "Workflows" + schema: + additional_attrs: true + type: dict + attrs: + - variable: WORKFLOWS_DEFAULT_NAME + label: "Workflows Default Name (Leave empty for default)" + description: "The default name used for new workflows" + schema: + type: string + default: "" + - variable: executions + group: "Container Configuration" + label: "Executions" + schema: + additional_attrs: true + type: dict + attrs: + - variable: EXECUTIONS_PROCESS + label: "Execution Process" + description: "Whether processes are executed in their own process or the main process" + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "main" + description: "Main" + - value: "own" + description: "Own" + - variable: EXECUTIONS_MODE + label: "Execution Mode" + description: "Whether processes should run directly or via queue" + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "regular" + description: "Regular" + - value: "queue" + description: "Queue" + - variable: EXECUTIONS_TIMEOUT + label: "Execution Timeout (Leave empty for default)" + description: "The max run time (in seconds) before stopping a workflow execution" + schema: + type: int + - variable: EXECUTIONS_TIMEOUT_MAX + label: "Max Execution Timeout (Leave empty for default)" + description: "The max execution time (in seconds) that can be set for a workflow individually" + schema: + type: int + - variable: EXECUTIONS_DATA_SAVE_ON_ERROR + label: "Execution Data Save on Error" + description: "Whether execution data is saved on error" + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "all" + description: "All" + - value: "none" + description: "None" + - variable: EXECUTIONS_DATA_SAVE_ON_SUCCESS + label: "Execution Data Save on Success" + description: "Whether execution data is saved on success" + schema: + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "all" + description: "All" + - value: "none" + description: "None" + - variable: EXECUTIONS_DATA_SAVE_ON_PROGRESS + label: "Execution Data Save on Progress" + description: "Whether to save progress for each node executed" + schema: + type: boolean + default: false + - variable: EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS + label: "Execution Data Save on Manual Executions" + description: "Whether to save data of executions when started manually" + schema: + type: boolean + default: false + - variable: EXECUTIONS_DATA_PRUNE + label: "Execution Data Prune" + description: "Whether to delete data of past executions on a rolling basis" + schema: + type: boolean + default: false + - variable: EXECUTIONS_DATA_MAX_AGE + label: "Execution Data Max Age (Leave empty for default)" + description: "The execution age (in hours) before it is deleted" + schema: + type: int + - variable: EXECUTIONS_DATA_PRUNE_TIMEOUT + label: "Data Prune Timeout (Leave empty for default)" + description: "The timeout (in seconds) after execution data has been pruned" + schema: + type: int + - variable: security + group: "Container Configuration" + label: "Security" + schema: + additional_attrs: true + type: dict + attrs: + - variable: N8N_AUTH_EXCLUDE_ENDPOINTS + label: "Additional Endpoints to Exclude Auth Checks (Leave empty for default)" + description: 'Additional endpoints to exclude auth checks. Multiple endpoints can be provided separated by a colon (":"). The endpoints should not start with a forward slash ("/")' + schema: + type: string + default: "" + - variable: N8N_BASIC_AUTH_ACTIVE + label: "Enable Basic Auth" + description: "Whether basic auth should be activated for editor and REST-API access" + schema: + type: boolean + default: false + - variable: N8N_BASIC_AUTH_USER + label: "Basic Auth User (Leave empty for default)" + description: "The name of the n8n user for basic authentication" + schema: + type: string + default: "" + - variable: N8N_BASIC_AUTH_PASSWORD + label: "Basic Auth Password (Leave empty for default)" + description: "The password of the n8n user for basic authentication" + schema: + type: string + default: "" + - variable: N8N_BASIC_AUTH_HASH + label: "Enable Basic Auth Hash" + description: "Whether the basic authentication password is hashed" + schema: + type: boolean + default: false + - variable: N8N_JWT_AUTH_ACTIVE + label: "Enable JWT Auth" + description: "Whether JWT authentication should be activated for editor and REST-API access" + schema: + type: boolean + default: false + - variable: N8N_JWT_AUTH_HEADER + label: "JWT Auth Header (Leave empty for default)" + description: "The request header containing a signed JWT" + schema: + type: string + default: "" + - variable: N8N_JWT_AUTH_HEADER_VALUE_PREFIX + label: "JWT Auth Header Prefix to strip (Leave empty for default)" + description: "Optional. The request header value prefix to strip" + schema: + type: string + default: "" + - variable: N8N_JWKS_URI + label: "JWT Set URI (Leave empty for default)" + description: "The URI to fetch JWK Set for JWT authentication" + schema: + type: string + default: "" + - variable: N8N_JWT_ISSUER + label: "JWT Issuer (Leave empty for default)" + description: "Optional. The expected JWT issuer" + schema: + type: string + default: "" + - variable: N8N_JWT_NAMESPACE + label: "JWT Namespace (Leave empty for default)" + description: "Optional. The expected JWT namespace" + schema: + type: string + default: "" + - variable: N8N_JWT_ALLOWED_TENANT + label: "JWT Allowed Tenant (Leave empty for default)" + description: "Optional. The allowed JWT tenant" + schema: + type: string + default: "" + - variable: N8N_JWT_ALLOWED_TENANT_KEY + label: "JWT Allowed Tenant Key (Leave empty for default)" + description: "Optional. The JWT tenant key name to inspect within the JWT namespace" + schema: + type: string + default: "" + - variable: endpoints + group: "Container Configuration" + label: "Endpoints" + schema: + additional_attrs: true + type: dict + attrs: + - variable: WEBHOOK_URL + label: "Webhook URL" + description: "Used to manually provide the Webhook URL when running n8n behind a reverse proxy" + schema: + type: string + default: "" + - variable: N8N_PAYLOAD_SIZE_MAX + label: "Max Payload Size (Leave empty for default)" + description: "The maximum payload size in MB" + schema: + type: int + - variable: N8N_METRICS + label: "Enable Metrics endpoint" + description: "Whether to enable the metrics endpoint" + schema: + type: boolean + default: false + - variable: N8N_METRICS_PREFIX + label: "Metrics Prefix (Leave empty for default)" + description: "Optional prefix to be used for metrics names" + schema: + type: string + default: "" + - variable: N8N_ENDPOINT_REST + label: "Rest Endpoint Path (Leave empty for default)" + description: "The path used for REST endpoint" + schema: + type: string + default: "" + - variable: N8N_ENDPOINT_WEBHOOK + label: "Webhook Endpoint Path (Leave empty for default)" + description: "The path used for webhook endpoint" + schema: + type: string + default: "" + - variable: N8N_ENDPOINT_WEBHOOK_TEST + label: "Test-Webhook Endpoint Path (Leave empty for default)" + description: "The path used for test-webhook endpoin" + schema: + type: string + default: "" + - variable: N8N_ENDPOINT_WEBHOOK_WAIT + label: "Waiting-Webhook Endpoint Path (Leave empty for default)" + description: "The path used for waiting-webhook endpoint" + schema: + type: string + default: "" + - variable: N8N_DISABLE_PRODUCTION_MAIN_PROCESS + label: "Disable Production Webhooks" + description: "Disable production webhooks from main process. This helps ensures no HTTP traffic load to main process when using webhook-specific processes" + schema: + type: boolean + default: false + - variable: N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN + label: "Deregister External Webhooks" + description: "Deregister webhooks on external services only when workflows are deactivated" + schema: + type: boolean + default: false + - variable: credentials + group: "Container Configuration" + label: "Credentials" + schema: + additional_attrs: true + type: dict + attrs: + - variable: CREDENTIALS_OVERWRITE_DATA + label: "Credentianls Overwrites" + description: "Overwrites for credentials" + schema: + type: string + default: "default" + - variable: CREDENTIALS_OVERWRITE_ENDPOINT + label: "Credentials Overwrite Endpoint" + description: "The API endpoint to fetch credentials" + schema: + type: string + default: "" + - variable: CREDENTIALS_DEFAULT_NAME + label: "Credentials Default Name (Leave empty for default)" + description: "The default name for credentials" + schema: + type: string + default: "" + - variable: logs + group: "Container Configuration" + label: "Logs" + schema: + additional_attrs: true + type: dict + attrs: + - variable: N8N_LOG_LEVEL + label: "Log Level" + description: "Log output level" + schema: + type: string + default: "default" + enum: + - value: "" + description: "Default" + - value: "info" + description: "Info" + - value: "warn" + description: "Warn" + - value: "error" + description: "Error" + - value: "verbose" + description: "Verbose" + - value: "debug" + description: "Debug" + - variable: N8N_LOG_OUTPUT + label: "Log Output" + description: "Where to output logs" + schema: + type: string + default: "default" + enum: + - value: "" + description: "Default" + - value: "console" + description: "Console" + - value: "file" + description: "File" + - value: "console,file" + description: "Console and File" + - variable: N8N_LOG_FILE_COUNT_MAX + label: "Max Log File Count (Leave empty for default)" + description: "Max number of log files to keep" + schema: + type: int + - variable: N8N_LOG_FILE_SIZE_MAX + label: "Max Log File Size (Leave empty for default)" + description: "Max size of each log file in MB" + schema: + type: int + +# Include{containerConfig} + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + additional_attrs: true + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + additional_attrs: true + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 5678 + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 5678 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + additional_attrs: true + type: dict + attrs: + - variable: data + label: "App Data Storage" + description: "Stores the Application Data." + schema: + additional_attrs: true + type: dict + attrs: + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} + +# Include{persistenceList} + + - variable: ingress + label: "" + group: "Ingress" + schema: + additional_attrs: true + type: dict + attrs: + - variable: main + label: "Main Ingress" + schema: + additional_attrs: true + type: dict + attrs: +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + +# Include{ingressList} + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: false +# Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + additional_attrs: true + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 0 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/n8n/templates/_configmap.tpl b/charts/incubator/n8n/templates/_configmap.tpl new file mode 100644 index 00000000000..6f942ee57e8 --- /dev/null +++ b/charts/incubator/n8n/templates/_configmap.tpl @@ -0,0 +1,166 @@ +{{/* Define the configmap */}} +{{- define "n8n.configmap" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: n8n-config +data: + {{/* Workflows */}} + {{- if .Values.workflows.WORKFLOWS_DEFAULT_NAME }} + WORKFLOWS_DEFAULT_NAME: {{ .Values.workflows.WORKFLOWS_DEFAULT_NAME | quote }} + {{- end }} + {{/* Security */}} + {{- if .Values.security.N8N_AUTH_EXCLUDE_ENDPOINTS }} + N8N_AUTH_EXCLUDE_ENDPOINTS: {{ .Values.security.N8N_AUTH_EXCLUDE_ENDPOINTS | quote }} + {{- end }} + {{- if .Values.security.N8N_BASIC_AUTH_ACTIVE }} + N8N_BASIC_AUTH_ACTIVE: {{ .Values.security.N8N_BASIC_AUTH_ACTIVE }} + {{- end }} + {{- if .Values.security.N8N_BASIC_AUTH_USER }} + N8N_BASIC_AUTH_USER: {{ .Values.security.N8N_BASIC_AUTH_USER | quote }} + {{- end }} + {{- if .Values.security.N8N_BASIC_AUTH_PASSWORD }} + N8N_BASIC_AUTH_PASSWORD: {{ .Values.security.N8N_BASIC_AUTH_PASSWORD | quote }} + {{- end }} + {{- if .Values.security.N8N_BASIC_AUTH_HASH }} + N8N_BASIC_AUTH_HASH: {{ .Values.security.N8N_BASIC_AUTH_HASH }} + {{- end }} + {{- if .Values.security.N8N_JWT_AUTH_ACTIVE }} + N8N_JWT_AUTH_ACTIVE: {{ .Values.security.N8N_JWT_AUTH_ACTIVE }} + {{- end }} + {{- if .Values.security.N8N_JWT_AUTH_HEADER }} + N8N_JWT_AUTH_HEADER: {{ .Values.security.N8N_JWT_AUTH_HEADER | quote }} + {{- end }} + {{- if .Values.security.N8N_JWT_AUTH_HEADER_VALUE_PREFIX }} + N8N_JWT_AUTH_HEADER_VALUE_PREFIX: {{ .Values.security.N8N_JWT_AUTH_HEADER_VALUE_PREFIX | quote }} + {{- end }} + {{- if .Values.security.N8N_JWKS_URI }} + N8N_JWKS_URI: {{ .Values.security.N8N_JWKS_URI | quote }} + {{- end }} + {{- if .Values.security.N8N_JWT_ISSUER }} + N8N_JWT_ISSUER: {{ .Values.security.N8N_JWT_ISSUER | quote }} + {{- end }} + {{- if .Values.security.N8N_JWT_NAMESPACE }} + N8N_JWT_NAMESPACE: {{ .Values.security.N8N_JWT_NAMESPACE | quote }} + {{- end }} + {{- if .Values.security.N8N_JWT_ALLOWED_TENANT }} + N8N_JWT_ALLOWED_TENANT: {{ .Values.security.N8N_JWT_ALLOWED_TENANT | quote }} + {{- end }} + {{- if .Values.security.N8N_JWT_ALLOWED_TENANT_KEY }} + N8N_JWT_ALLOWED_TENANT_KEY: {{ .Values.security.N8N_JWT_ALLOWED_TENANT_KEY | quote }} + {{- end }} + {{/* Logs */}} + {{- if .Values.logs.N8N_LOG_LEVEL }} + N8N_LOG_LEVEL: {{ .Values.logs.N8N_LOG_LEVEL | quote }} + {{- end }} + {{- if .Values.logs.N8N_LOG_OUTPUT }} + N8N_LOG_OUTPUT: {{ .Values.logs.N8N_LOG_OUTPUT | quote }} + {{- end }} + {{- if .Values.logs.N8N_LOG_FILE_COUNT_MAX }} + N8N_LOG_FILE_COUNT_MAX: {{ .Values.logs.N8N_LOG_FILE_COUNT_MAX }} + {{- end }} + {{- if .Values.logs.N8N_LOG_FILE_SIZE_MAX }} + N8N_LOG_FILE_SIZE_MAX: {{ .Values.logs.N8N_LOG_FILE_SIZE_MAX }} + {{- end }} + {{- if .Values.logs.N8N_LOG_FILE_LOCATION }} + N8N_LOG_FILE_LOCATION: {{ .Values.logs.N8N_LOG_FILE_LOCATION | quote }} + {{- end }} + {{/* Executions */}} + {{- if .Values.executions.EXECUTIONS_PROCESS }} + EXECUTIONS_PROCESS: {{ .Values.executions.EXECUTIONS_PROCESS | quote }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_MODE }} + EXECUTIONS_MODE: {{ .Values.executions.EXECUTIONS_MODE | quote }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_TIMEOUT }} + EXECUTIONS_TIMEOUT: {{ .Values.executions.EXECUTIONS_TIMEOUT }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_TIMEOUT_MAX }} + EXECUTIONS_TIMEOUT_MAX: {{ .Values.executions.EXECUTIONS_TIMEOUT_MAX }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_SAVE_ON_ERROR }} + EXECUTIONS_DATA_SAVE_ON_ERROR: {{ .Values.executions.EXECUTIONS_DATA_SAVE_ON_ERROR | quote }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_SAVE_ON_SUCCESS }} + EXECUTIONS_DATA_SAVE_ON_SUCCESS: {{ .Values.executions.EXECUTIONS_DATA_SAVE_ON_SUCCESS | quote }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_SAVE_ON_PROGRESS }} + EXECUTIONS_DATA_SAVE_ON_PROGRESS: {{ .Values.executions.EXECUTIONS_DATA_SAVE_ON_PROGRESS }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS }} + EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS: {{ .Values.executions.EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_PRUNE }} + EXECUTIONS_DATA_PRUNE: {{ .Values.executions.EXECUTIONS_DATA_PRUNE }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_MAX_AGE }} + EXECUTIONS_DATA_MAX_AGE: {{ .Values.executions.EXECUTIONS_DATA_MAX_AGE }} + {{- end }} + {{- if .Values.executions.EXECUTIONS_DATA_PRUNE_TIMEOUT }} + EXECUTIONS_DATA_PRUNE_TIMEOUT: {{ .Values.executions.EXECUTIONS_DATA_PRUNE_TIMEOUT }} + {{- end }} + {{/* Endpoints */}} + {{- if .Values.endpoints.WEBHOOK_URL }} + WEBHOOK_URL: {{ .Values.endpoints.WEBHOOK_URL | quote }} + {{- end }} + {{- if .Values.endpoints.N8N_PAYLOAD_SIZE_MAX }} + N8N_PAYLOAD_SIZE_MAX: {{ .Values.endpoints.N8N_PAYLOAD_SIZE_MAX }} + {{- end }} + {{- if .Values.endpoints.N8N_METRICS }} + N8N_METRICS: {{ .Values.endpoints.N8N_METRICS }} + {{- end }} + {{- if .Values.endpoints.N8N_METRICS_PREFIX }} + N8N_METRICS_PREFIX: {{ .Values.endpoints.N8N_METRICS_PREFIX | quote }} + {{- end }} + {{- if .Values.endpoints.N8N_ENDPOINT_REST }} + N8N_ENDPOINT_REST: {{ .Values.endpoints.N8N_ENDPOINT_REST | quote }} + {{- end }} + {{- if .Values.endpoints.N8N_ENDPOINT_WEBHOOK }} + N8N_ENDPOINT_WEBHOOK: {{ .Values.endpoints.N8N_ENDPOINT_WEBHOOK | quote }} + {{- end }} + {{- if .Values.endpoints.N8N_ENDPOINT_WEBHOOK_TEST }} + N8N_ENDPOINT_WEBHOOK_TEST: {{ .Values.endpoints.N8N_ENDPOINT_WEBHOOK_TEST | quote }} + {{- end }} + {{- if .Values.endpoints.N8N_ENDPOINT_WEBHOOK_WAIT }} + N8N_ENDPOINT_WEBHOOK_WAIT: {{ .Values.endpoints.N8N_ENDPOINT_WEBHOOK_WAIT | quote }} + {{- end }} + {{- if .Values.endpoints.N8N_DISABLE_PRODUCTION_MAIN_PROCESS }} + N8N_DISABLE_PRODUCTION_MAIN_PROCESS: {{ .Values.endpoints.N8N_DISABLE_PRODUCTION_MAIN_PROCESS }} + {{- end }} + {{- if .Values.endpoints.N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN }} + N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN: {{ .Values.endpoints.N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN }} + {{- end }} + {{/* Credentials */}} + {{- if .Values.credentials.CREDENTIALS_OVERWRITE_DATA }} + CREDENTIALS_OVERWRITE_DATA: {{ .Values.credentials.CREDENTIALS_OVERWRITE_DATA | quote }} + {{- end }} + {{- if .Values.credentials.CREDENTIALS_OVERWRITE_ENDPOINT }} + CREDENTIALS_OVERWRITE_ENDPOINT: {{ .Values.credentials.CREDENTIALS_OVERWRITE_ENDPOINT | quote }} + {{- end }} + {{- if .Values.credentials.CREDENTIALS_DEFAULT_NAME }} + CREDENTIALS_DEFAULT_NAME: {{ .Values.credentials.CREDENTIALS_DEFAULT_NAME | quote }} + {{- end }} + {{/* Deployment */}} + {{- if .Values.deployment.N8N_HOST }} + N8N_HOST: {{ .Values.deployment.N8N_HOST | quote }} + {{- end }} + {{- if .Values.deployment.N8N_CONFIG_FILES }} + N8N_CONFIG_FILES: {{ .Values.deployment.N8N_CONFIG_FILES | quote }} + {{- end }} + {{- if .Values.deployment.N8N_DISABLE_UI }} + N8N_DISABLE_UI: {{ .Values.deployment.N8N_DISABLE_UI }} + {{- end }} + {{- if .Values.deployment.N8N_ENCRYPTION_KEY }} + N8N_ENCRYPTION_KEY: {{ .Values.deployment.N8N_ENCRYPTION_KEY | quote }} + {{- end }} + {{- if .Values.deployment.N8N_PERSONALIZATION_ENABLED }} + N8N_PERSONALIZATION_ENABLED: {{ .Values.deployment.N8N_PERSONALIZATION_ENABLED }} + {{- end }} + {{- if .Values.deployment.N8N_VERSION_NOTIFICATIONS_ENABLED }} + N8N_VERSION_NOTIFICATIONS_ENABLED: {{ .Values.deployment.N8N_VERSION_NOTIFICATIONS_ENABLED }} + {{- end }} + {{- if .Values.deployment.N8N_DIAGNOSTICS_ENABLED }} + N8N_DIAGNOSTICS_ENABLED: {{ .Values.deployment.N8N_DIAGNOSTICS_ENABLED }} + {{- end }} +{{- end -}} diff --git a/charts/incubator/n8n/templates/common.yaml b/charts/incubator/n8n/templates/common.yaml new file mode 100644 index 00000000000..991ed17320e --- /dev/null +++ b/charts/incubator/n8n/templates/common.yaml @@ -0,0 +1,9 @@ +{{/* Make sure all variables are set properly */}} +{{- include "common.setup" . }} + +{{/* Render configmap for n8n */}} +{{- include "n8n.configmap" . }} + + +{{/* Render the templates */}} +{{ include "common.postSetup" . }} diff --git a/charts/incubator/n8n/values.yaml b/charts/incubator/n8n/values.yaml new file mode 100644 index 00000000000..12997d2886e --- /dev/null +++ b/charts/incubator/n8n/values.yaml @@ -0,0 +1,126 @@ +image: + repository: tccr.io/truecharts/n8n + tag: v0.160.0@sha256:2141ab9bb8e8a820fa07a20ae9bdd1a7c5f2102926238ab7f3aa4a3c9e175ebe + pullPolicy: IfNotPresent + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 + +env: + TZ: UTC + GENERIC_TIMEZONE: "{{ .Values.env.TZ }}" + DB_TYPE: "postgresdb" + DB_POSTGRESDB_USER: "{{ .Values.postgresql.postgresqlUsername }}" + DB_POSTGRESDB_DATABASE: "{{ .Values.postgresql.postgresqlDatabase }}" + DB_POSTGRESDB_PORT: 5432 + QUEUE_BULL_REDIS_PORT: 6379 + N8N_USER_FOLDER: "/data" + +credentials: {} + # CREDENTIALS_OVERWRITE_DATA: "" + # CREDENTIALS_OVERWRITE_ENDPOINT: "" + # CREDENTIALS_DEFAULT_NAME: "My credentials" +deployment: + N8N_HOST: "localhost" + # N8N_CONFIG_FILES: "" + # N8N_ENCRYPTION_KEY: "" + # N8N_DIAGNOSTICS_ENABLED: true + # N8N_DISABLE_UI: false + # N8N_PERSONALIZATION_ENABLED: true + # N8N_VERSION_NOTIFICATIONS_ENABLED: true +endpoints: {} + # WEBHOOK_URL: "" + # N8N_PAYLOAD_SIZE_MAX: 16 + # N8N_METRICS: false + # N8N_METRICS_PREFIX: "n8n_" + # N8N_ENDPOINT_REST: "rest" + # N8N_ENDPOINT_WEBHOOK: "webhook" + # N8N_ENDPOINT_WEBHOOK_TEST: "webhook-test" + # N8N_ENDPOINT_WEBHOOK_WAIT: "webhook-waiting" + # N8N_DISABLE_PRODUCTION_MAIN_PROCESS: false + # N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN: false +executions: {} + # EXECUTIONS_PROCESS: "own" + # EXECUTIONS_MODE: "regular" + # EXECUTIONS_TIMEOUT: "-1" + # EXECUTIONS_TIMEOUT_MAX: 3600 + # EXECUTIONS_DATA_SAVE_ON_ERROR: "all" + # EXECUTIONS_DATA_SAVE_ON_SUCCESS: "all" + # EXECUTIONS_DATA_SAVE_ON_PROGRESS: false + # EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS: false + # EXECUTIONS_DATA_PRUNE: false + # EXECUTIONS_DATA_MAX_AGE: 336 + # EXECUTIONS_DATA_PRUNE_TIMEOUT: 3600 +logs: + # N8N_LOG_LEVEL: "info" + # N8N_LOG_OUTPUT: "console" + # N8N_LOG_FILE_COUNT_MAX: 100 + # N8N_LOG_FILE_SIZE_MAX: 16 + N8N_LOG_FILE_LOCATION: "/data/logs" +security: {} + # N8N_AUTH_EXCLUDE_ENDPOINTS: "" + # N8N_BASIC_AUTH_ACTIVE: false + # N8N_BASIC_AUTH_USER: "" + # N8N_BASIC_AUTH_PASSWORD: "" + # N8N_BASIC_AUTH_HASH: false + # N8N_JWT_AUTH_ACTIVE: false + # N8N_JWT_AUTH_HEADER: "" + # N8N_JWT_AUTH_HEADER_VALUE_PREFIX: "" + # N8N_JWKS_URI: "" + # N8N_JWT_ISSUER: "" + # N8N_JWT_NAMESPACE: "" + # N8N_JWT_ALLOWED_TENANT: "" + # N8N_JWT_ALLOWED_TENANT_KEY: "" +workflows: {} + # WORKFLOWS_DEFAULT_NAME: "My workflow" + +envFrom: + - configMapRef: + name: n8n-config + +envValueFrom: + DB_POSTGRESDB_HOST: + secretKeyRef: + name: dbcreds + key: plainhost + DB_POSTGRESDB_PASSWORD: + secretKeyRef: + name: dbcreds + key: postgresql-password + QUEUE_BULL_REDIS_HOST: + secretKeyRef: + name: rediscreds + key: plainhost + QUEUE_BULL_REDIS_PASSWORD: + secretKeyRef: + name: rediscreds + key: redis-password + +service: + main: + ports: + main: + port: 5678 + targetPort: 5678 + +persistence: + data: + enabled: true + mountPath: "/data" + +# Enabled redis +redis: + enabled: true + existingSecret: "rediscreds" + +# Enabled postgres +postgresql: + enabled: true + existingSecret: "dbcreds" + postgresqlUsername: n8n + postgresqlDatabase: n8n diff --git a/docs/_static/img/appicons/n8n-icon.png b/docs/_static/img/appicons/n8n-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dad93e5a916f7af5a3648108cab859fcec4909 GIT binary patch literal 3078 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/docs/apps/app-requests.md b/docs/apps/app-requests.md index 0f7b71b5060..231b286886a 100644 --- a/docs/apps/app-requests.md +++ b/docs/apps/app-requests.md @@ -19,7 +19,6 @@ _This list is to track `App Requests` from one place._ - [ ] Deemix #628 - [ ] Trackarr #602 - [ ] Locast2Plex #473 -- [ ] n8n #27 - [ ] InfluxDB #5 - [ ] External-Auth-Server #28 - [ ] Borg Backup #782 @@ -514,3 +513,4 @@ _These Apps have specific requirements or need specific customisation and care_ - [x] DMS (Document Manage System) #810 - [x] scrutiny ( Needs customised solution for direct disk access ) - [x] Trilium Notes #1261 +- [x] n8n #27 diff --git a/docs/manual/default-ports.md b/docs/manual/default-ports.md index 5cb610fa782..627ebf6b856 100644 --- a/docs/manual/default-ports.md +++ b/docs/manual/default-ports.md @@ -79,6 +79,7 @@ These defaults can of course be changed, but as we guarantee "sane, working defa | nzbhydra | main | main | 5076 | TCP | | | lazylibrarian | main | main | 5299 | TCP | | | syslog-ng | syslog-udp | syslog-udp | 5514 | UDP | | +| n8n | main | main | 5678 | TCP | | | esphome | main | main | 6052 | TCP | | | novnc | main | main | 6080 | TCP | | | domoticz | comm1 | comm1 | 6144 | TCP | |