mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-18 02:21:13 +00:00
feat(core): Add command to trigger license refresh on workers (#7184)
This PR implements the updated license SDK so that worker and webhook instances do not auto-renew licenses any more. Instead, they receive a `reloadLicense` command via the Redis client that will fetch the updated license after it was saved on the main instance This also contains some refactoring with moving redis sub and pub clients into the event bus directly, to prevent cyclic dependency issues.
This commit is contained in:
committed by
GitHub
parent
d317e09c59
commit
9f797b96d8
@@ -11,8 +11,10 @@ import {
|
||||
SETTINGS_LICENSE_CERT_KEY,
|
||||
UNLIMITED_LICENSE_QUOTA,
|
||||
} from './constants';
|
||||
import { Service } from 'typedi';
|
||||
import type { BooleanLicenseFeature, NumericLicenseFeature } from './Interfaces';
|
||||
import Container, { Service } from 'typedi';
|
||||
import type { BooleanLicenseFeature, N8nInstanceType, NumericLicenseFeature } from './Interfaces';
|
||||
import type { RedisServicePubSubPublisher } from './services/redis/RedisServicePubSubPublisher';
|
||||
import { RedisService } from './services/redis.service';
|
||||
|
||||
type FeatureReturnType = Partial<
|
||||
{
|
||||
@@ -26,18 +28,28 @@ export class License {
|
||||
|
||||
private manager: LicenseManager | undefined;
|
||||
|
||||
instanceId: string | undefined;
|
||||
|
||||
private redisPublisher: RedisServicePubSubPublisher;
|
||||
|
||||
constructor() {
|
||||
this.logger = getLogger();
|
||||
}
|
||||
|
||||
async init(instanceId: string) {
|
||||
async init(instanceId: string, instanceType: N8nInstanceType = 'main') {
|
||||
if (this.manager) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.instanceId = instanceId;
|
||||
const isMainInstance = instanceType === 'main';
|
||||
const server = config.getEnv('license.serverUrl');
|
||||
const autoRenewEnabled = config.getEnv('license.autoRenewEnabled');
|
||||
const autoRenewEnabled = isMainInstance && config.getEnv('license.autoRenewEnabled');
|
||||
const offlineMode = !isMainInstance;
|
||||
const autoRenewOffset = config.getEnv('license.autoRenewOffset');
|
||||
const saveCertStr = isMainInstance
|
||||
? async (value: TLicenseBlock) => this.saveCertStr(value)
|
||||
: async () => {};
|
||||
|
||||
try {
|
||||
this.manager = new LicenseManager({
|
||||
@@ -46,9 +58,10 @@ export class License {
|
||||
productIdentifier: `n8n-${N8N_VERSION}`,
|
||||
autoRenewEnabled,
|
||||
autoRenewOffset,
|
||||
offlineMode,
|
||||
logger: this.logger,
|
||||
loadCertStr: async () => this.loadCertStr(),
|
||||
saveCertStr: async (value: TLicenseBlock) => this.saveCertStr(value),
|
||||
saveCertStr,
|
||||
deviceFingerprint: () => instanceId,
|
||||
});
|
||||
|
||||
@@ -86,6 +99,15 @@ export class License {
|
||||
},
|
||||
['key'],
|
||||
);
|
||||
if (config.getEnv('executions.mode') === 'queue') {
|
||||
if (!this.redisPublisher) {
|
||||
this.logger.debug('Initializing Redis publisher for License Service');
|
||||
this.redisPublisher = await Container.get(RedisService).getPubSubPublisher();
|
||||
}
|
||||
await this.redisPublisher.publishToCommandChannel({
|
||||
command: 'reloadLicense',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async activate(activationKey: string): Promise<void> {
|
||||
@@ -96,6 +118,14 @@ export class License {
|
||||
await this.manager.activate(activationKey);
|
||||
}
|
||||
|
||||
async reload(): Promise<void> {
|
||||
if (!this.manager) {
|
||||
return;
|
||||
}
|
||||
this.logger.debug('Reloading license');
|
||||
await this.manager.reload();
|
||||
}
|
||||
|
||||
async renew() {
|
||||
if (!this.manager) {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user