refactor(core): Prevent a server from starting if it's configured to use S3, but the license does not allow it (#13532)

This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™
2025-02-27 09:21:45 +01:00
committed by GitHub
parent 7fb88e623f
commit 223ec2d9c9
5 changed files with 10 additions and 105 deletions

View File

@@ -148,7 +148,7 @@ export abstract class BaseCommand extends Command {
const isSelected = config.getEnv('binaryDataManager.mode') === 's3';
const isAvailable = config.getEnv('binaryDataManager.availableModes').includes('s3');
if (!isSelected && !isAvailable) return;
if (!isSelected) return;
if (isSelected && !isAvailable) {
throw new UserError(
@@ -157,51 +157,19 @@ export abstract class BaseCommand extends Command {
}
const isLicensed = Container.get(License).isFeatureEnabled(LICENSE_FEATURES.BINARY_DATA_S3);
if (isSelected && isAvailable && isLicensed) {
this.logger.debug(
'License found for external storage - object store to init in read-write mode',
if (!isLicensed) {
this.logger.error(
'No license found for S3 storage. \n Either set `N8N_DEFAULT_BINARY_DATA_MODE` to something else, or upgrade to a license that supports this feature.',
);
await this._initObjectStoreService();
return;
return this.exit(1);
}
if (isSelected && isAvailable && !isLicensed) {
this.logger.debug(
'No license found for external storage - object store to init with writes blocked. To enable writes, please upgrade to a license that supports this feature.',
);
await this._initObjectStoreService({ isReadOnly: true });
return;
}
if (!isSelected && isAvailable) {
this.logger.debug(
'External storage unselected but available - object store to init with writes unused',
);
await this._initObjectStoreService();
return;
}
}
private async _initObjectStoreService(options = { isReadOnly: false }) {
const objectStoreService = Container.get(ObjectStoreService);
this.logger.debug('Initializing object store service');
this.logger.debug('License found for external storage - Initializing object store service');
try {
await objectStoreService.init();
objectStoreService.setReadonly(options.isReadOnly);
await Container.get(ObjectStoreService).init();
this.logger.debug('Object store init completed');
} catch (e) {
const error = e instanceof Error ? e : new Error(`${e}`);
this.logger.debug('Object store init failed', { error });
}
}