From c41e1257f721636702b00fa2768388b6b75e6408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ovejero?= Date: Mon, 28 Jul 2025 10:55:16 +0200 Subject: [PATCH] refactor(core): Port config for frontend hooks, Redis and AI features (#17728) --- packages/@n8n/config/src/configs/ai.config.ts | 8 ++++++++ .../@n8n/config/src/configs/redis.config.ts | 8 ++++++++ packages/@n8n/config/src/index.ts | 12 +++++++++++ packages/@n8n/config/test/config.test.ts | 7 +++++++ packages/cli/src/commands/start.ts | 2 +- packages/cli/src/config/schema.ts | 20 +------------------ .../cli/src/scaling/multi-main-setup.ee.ts | 3 +-- .../cli/src/services/cache/cache.service.ts | 2 +- 8 files changed, 39 insertions(+), 23 deletions(-) create mode 100644 packages/@n8n/config/src/configs/ai.config.ts create mode 100644 packages/@n8n/config/src/configs/redis.config.ts diff --git a/packages/@n8n/config/src/configs/ai.config.ts b/packages/@n8n/config/src/configs/ai.config.ts new file mode 100644 index 0000000000..e158c4e09b --- /dev/null +++ b/packages/@n8n/config/src/configs/ai.config.ts @@ -0,0 +1,8 @@ +import { Config, Env } from '../decorators'; + +@Config +export class AiConfig { + /** Whether AI features are enabled. */ + @Env('N8N_AI_ENABLED') + enabled: boolean = false; +} diff --git a/packages/@n8n/config/src/configs/redis.config.ts b/packages/@n8n/config/src/configs/redis.config.ts new file mode 100644 index 0000000000..cd0f397a52 --- /dev/null +++ b/packages/@n8n/config/src/configs/redis.config.ts @@ -0,0 +1,8 @@ +import { Config, Env } from '../decorators'; + +@Config +export class RedisConfig { + /** Prefix for all Redis keys managed by n8n. */ + @Env('N8N_REDIS_KEY_PREFIX') + prefix: string = 'n8n'; +} diff --git a/packages/@n8n/config/src/index.ts b/packages/@n8n/config/src/index.ts index 4a41829f35..b6b8cdf85c 100644 --- a/packages/@n8n/config/src/index.ts +++ b/packages/@n8n/config/src/index.ts @@ -1,6 +1,7 @@ import { z } from 'zod'; import { AiAssistantConfig } from './configs/ai-assistant.config'; +import { AiConfig } from './configs/ai.config'; import { AuthConfig } from './configs/auth.config'; import { CacheConfig } from './configs/cache.config'; import { CredentialsConfig } from './configs/credentials.config'; @@ -21,6 +22,7 @@ import { NodesConfig } from './configs/nodes.config'; import { PartialExecutionsConfig } from './configs/partial-executions.config'; import { PersonalizationConfig } from './configs/personalization.config'; import { PublicApiConfig } from './configs/public-api.config'; +import { RedisConfig } from './configs/redis.config'; import { TaskRunnersConfig } from './configs/runners.config'; import { ScalingModeConfig } from './configs/scaling-mode.config'; import { SecurityConfig } from './configs/security.config'; @@ -195,4 +197,14 @@ export class GlobalConfig { /** Public URL where the editor is accessible. Also used for emails sent from n8n. */ @Env('N8N_EDITOR_BASE_URL') editorBaseUrl: string = ''; + + /** URLs to external frontend hooks files, separated by semicolons. */ + @Env('EXTERNAL_FRONTEND_HOOKS_URLS') + externalFrontendHooksUrls: string = ''; + + @Nested + redis: RedisConfig; + + @Nested + ai: AiConfig; } diff --git a/packages/@n8n/config/test/config.test.ts b/packages/@n8n/config/test/config.test.ts index 58e7abfb73..806f36532b 100644 --- a/packages/@n8n/config/test/config.test.ts +++ b/packages/@n8n/config/test/config.test.ts @@ -348,6 +348,13 @@ describe('GlobalConfig', () => { loginLabel: '', }, }, + redis: { + prefix: 'n8n', + }, + externalFrontendHooksUrls: '', + ai: { + enabled: false, + }, }; it('should use all default values when no env variables are defined', () => { diff --git a/packages/cli/src/commands/start.ts b/packages/cli/src/commands/start.ts index f54e22ece0..3b436377e0 100644 --- a/packages/cli/src/commands/start.ts +++ b/packages/cli/src/commands/start.ts @@ -126,7 +126,7 @@ export class Start extends BaseCommand> { private async generateStaticAssets() { // Read the index file and replace the path placeholder const n8nPath = this.globalConfig.path; - const hooksUrls = config.getEnv('externalFrontendHooksUrls'); + const hooksUrls = this.globalConfig.externalFrontendHooksUrls; let scriptsString = ''; if (hooksUrls) { diff --git a/packages/cli/src/config/schema.ts b/packages/cli/src/config/schema.ts index d7bfad28d3..c20dad1038 100644 --- a/packages/cli/src/config/schema.ts +++ b/packages/cli/src/config/schema.ts @@ -139,22 +139,6 @@ export const schema = { }, }, - externalFrontendHooksUrls: { - doc: 'URLs to external frontend hooks files, ; separated', - format: String, - default: '', - env: 'EXTERNAL_FRONTEND_HOOKS_URLS', - }, - - redis: { - prefix: { - doc: 'Prefix for all n8n related keys', - format: String, - default: 'n8n', - env: 'N8N_REDIS_KEY_PREFIX', - }, - }, - /** * @important Do not remove until after cloud hooks are updated to stop using convict config. */ @@ -170,10 +154,8 @@ export const schema = { */ ai: { enabled: { - doc: 'Whether AI features are enabled', format: Boolean, - default: false, - env: 'N8N_AI_ENABLED', + default: Container.get(GlobalConfig).ai.enabled, }, }, }; diff --git a/packages/cli/src/scaling/multi-main-setup.ee.ts b/packages/cli/src/scaling/multi-main-setup.ee.ts index d0d5e45c8d..e926d4d2b7 100644 --- a/packages/cli/src/scaling/multi-main-setup.ee.ts +++ b/packages/cli/src/scaling/multi-main-setup.ee.ts @@ -5,7 +5,6 @@ import { MultiMainMetadata } from '@n8n/decorators'; import { Container, Service } from '@n8n/di'; import { InstanceSettings } from 'n8n-core'; -import config from '@/config'; import { Publisher } from '@/scaling/pubsub/publisher.service'; import { RedisClientService } from '@/services/redis-client.service'; import { TypedEmitter } from '@/typed-emitter'; @@ -48,7 +47,7 @@ export class MultiMainSetup extends TypedEmitter { private leaderCheckInterval: NodeJS.Timeout | undefined; async init() { - const prefix = config.getEnv('redis.prefix'); + const prefix = this.globalConfig.redis.prefix; const validPrefix = this.redisClientService.toValidPrefix(prefix); this.leaderKey = validPrefix + ':main_instance_leader'; diff --git a/packages/cli/src/services/cache/cache.service.ts b/packages/cli/src/services/cache/cache.service.ts index befbcceae5..99fb71345d 100644 --- a/packages/cli/src/services/cache/cache.service.ts +++ b/packages/cli/src/services/cache/cache.service.ts @@ -39,7 +39,7 @@ export class CacheService extends TypedEmitter { const { RedisClientService } = await import('../redis-client.service'); const redisClientService = Container.get(RedisClientService); - const prefixBase = config.getEnv('redis.prefix'); + const prefixBase = this.globalConfig.redis.prefix; const prefix = redisClientService.toValidPrefix( `${prefixBase}:${this.globalConfig.cache.redis.prefix}:`, );