enhancement: refactor env-only values into configuration

This commit is contained in:
Ben Irvin 2024-01-17 15:59:25 +01:00
parent 316470cdf8
commit 9469280178
12 changed files with 124 additions and 40 deletions

View File

@ -68,6 +68,18 @@ Will display the correct start-up message according to the specified boolean.
:::note
Can be disabled by setting `STRAPI_HIDE_STARTUP_MESSAGE` to `true`.
Can be disabled by setting the server config value:
```javascript
// in config/server.js
{
logger: {
startup: {
enabled: false;
}
},
// ...the rest of your server config
}
```
:::

View File

@ -18,4 +18,16 @@ In order to use remote transfer providers, the remote Strapi server must have a
## Disabling Remote Transfers
If desired, the remote transfer feature of a server can be completely disabled by setting the environment variable `STRAPI_DISABLE_REMOTE_DATA_TRANSFER` to true.
The remote transfer feature of a server can be completely disabled by setting the server config value:
```javascript
// in config/server.js
{
transfer: {
remote: {
enabled: false;
}
}
// ...the rest of your server config
}
```

View File

@ -8,7 +8,7 @@ tags:
# Remote Provider Websocket
When the data transfer feature is enabled for a Strapi server (an `admin.transfer.token.salt` config value has been set and `STRAPI_DISABLE_REMOTE_DATA_TRANSFER` is not set to true), Strapi will create websocket servers available on the routes `/admin/transfer/runner/pull` and `/admin/transfer/runner/push`.
When the data transfer feature is enabled for a Strapi server (an `admin.transfer.token.salt` config value has been set and `server.transfer.remote.enabled` is not set to false), Strapi will create websocket servers available on the routes `/admin/transfer/runner/pull` and `/admin/transfer/runner/push`.
Opening a websocket connection on those routes requires a valid transfer token as a bearer token in the Authorization header.

View File

@ -26,4 +26,17 @@ module.exports = ({ env }) => ({
requestTimeout: 1000 * 60 * 10, // set request timeout to 600000ms (10 minutes)
},
},
transfer: {
remote: {
// enabled: false,
},
},
logger: {
updates: {
// enabled: false,
},
startup: {
// enabled: false,
},
},
});

View File

@ -5,26 +5,28 @@ import { getService } from '../utils';
export default () => async (ctx: Context, next: Next) => {
const transferUtils = getService('transfer').utils;
const { hasValidTokenSalt, isDataTransferEnabled, isDisabledFromEnv } = transferUtils;
const { hasValidTokenSalt, isRemoteTransferEnabled } = transferUtils;
if (isDataTransferEnabled()) {
// verify that data transfer is enabled
if (isRemoteTransferEnabled()) {
return next();
}
// if it has been manually disabled, return a not found
if (strapi.config.get('server.transfer.remote.enabled') === false) {
return ctx.notFound();
}
// if it's enabled but doesn't have a valid salt, throw a not implemented
if (!hasValidTokenSalt()) {
return ctx.notImplemented(
'The server configuration for data transfer is invalid. Please contact your server administrator.',
// @ts-expect-error have to pass multiple arguments to surface the error details
{
code: 'INVALID_TOKEN_SALT',
}
);
}
if (isDisabledFromEnv()) {
return ctx.notFound();
}
// This should never happen as long as we're handling individual scenarios above
throw new Error('Unexpected error while trying to access a data transfer route');
};

View File

@ -398,7 +398,6 @@ describe('Transfer Token', () => {
transfer: {
utils: {
hasValidTokenSalt: jest.fn(() => true),
isDisabledFromEnv: jest.fn(() => false),
},
},
},

View File

@ -313,10 +313,10 @@ const hash = (accessKey: string): string => {
};
const checkSaltIsDefined = () => {
const { hasValidTokenSalt, isDisabledFromEnv } = getService('transfer').utils;
const { hasValidTokenSalt } = getService('transfer').utils;
// Ignore the check if the data-transfer feature is manually disabled
if (isDisabledFromEnv()) {
if (!strapi.config.get('server.transfer.remote.enabled')) {
return;
}

View File

@ -1,13 +1,6 @@
import { env } from '@strapi/utils';
import { getService } from '../../utils';
/**
* Returns whether the data transfer features have been disabled from the env configuration
*/
const isDisabledFromEnv = (): boolean => {
return env.bool('STRAPI_DISABLE_REMOTE_DATA_TRANSFER', false) as boolean;
};
/**
* A valid transfer token salt must be a non-empty string defined in the Strapi config
*/
@ -20,10 +13,17 @@ const hasValidTokenSalt = (): boolean => {
/**
* Checks whether data transfer features are enabled
*/
const isDataTransferEnabled = (): boolean => {
const isRemoteTransferEnabled = (): boolean => {
const { utils } = getService('transfer');
return !utils.isDisabledFromEnv() && utils.hasValidTokenSalt();
// TODO v6: Remove this warning
if (env.bool('STRAPI_DISABLE_REMOTE_DATA_TRANSFER')) {
strapi.log.warn(
'STRAPI_DISABLE_REMOTE_DATA_TRANSFER is no longer supported. Instead, set transfer.remote.enabled to false in your server configuration'
);
}
return strapi.config.get('server.transfer.remote.enabled') && utils.hasValidTokenSalt();
};
export { isDataTransferEnabled, isDisabledFromEnv, hasValidTokenSalt };
export { isRemoteTransferEnabled, hasValidTokenSalt };

View File

@ -4,7 +4,7 @@ import path from 'path';
import _ from 'lodash';
import { omit } from 'lodash/fp';
import dotenv from 'dotenv';
import type { Config } from '@strapi/types';
import loadConfigDir from './config-loader';
dotenv.config({ path: process.env.ENV_PATH });
@ -16,18 +16,31 @@ const { version: strapiVersion } = require(path.join(__dirname, '../../../packag
const defaultConfig = {
server: {
host: process.env.HOST || os.hostname() || 'localhost',
port: process.env.PORT || 1337,
port: Number(process.env.PORT) || 1337,
proxy: false,
cron: { enabled: false },
admin: { autoOpen: false },
dirs: { public: './public' },
},
admin: {},
transfer: {
remote: {
enabled: true,
},
},
logger: {
updates: {
enabled: true,
},
startup: {
enabled: true,
},
},
} satisfies Partial<Config.Server>,
admin: {} satisfies Partial<Config.Admin>,
api: {
rest: {
prefix: '/api',
},
},
} satisfies Partial<Config.Api>,
};
export default (dirs: { app: string; dist: string }, initialConfig: any = {}) => {

View File

@ -35,6 +35,10 @@ export default (app: Strapi) => {
},
logFirstStartupMessage() {
if (!strapi.config.get('server.logger.startup.enabled')) {
return;
}
this.logStats();
console.log(chalk.bold('One more thing...'));
@ -53,6 +57,9 @@ export default (app: Strapi) => {
},
logDefaultStartupMessage() {
if (!strapi.config.get('server.logger.startup.enabled')) {
return;
}
this.logStats();
console.log(chalk.bold('Welcome back!'));
@ -71,17 +78,13 @@ export default (app: Strapi) => {
},
logStartupMessage({ isInitialized }: { isInitialized: boolean }) {
// Should the startup message be displayed?
const hideStartupMessage = process.env.STRAPI_HIDE_STARTUP_MESSAGE
? process.env.STRAPI_HIDE_STARTUP_MESSAGE === 'true'
: false;
if (hideStartupMessage === false) {
if (!isInitialized) {
this.logFirstStartupMessage();
} else {
this.logDefaultStartupMessage();
}
if (!strapi.config.get('server.logger.startup.enabled')) {
return;
}
if (!isInitialized) {
this.logFirstStartupMessage();
} else {
this.logDefaultStartupMessage();
}
},
};

View File

@ -85,9 +85,17 @@ const createUpdateNotifier = (strapi: Strapi) => {
return {
notify({ checkInterval = CHECK_INTERVAL, notifInterval = NOTIF_INTERVAL } = {}) {
if (env.bool('STRAPI_DISABLE_UPDATE_NOTIFICATION', false) || !config) {
// TODO v6: Remove this warning
if (env.bool('STRAPI_DISABLE_UPDATE_NOTIFICATION', false)) {
strapi.log.warn(
'STRAPI_DISABLE_UPDATE_NOTIFICATION is no longer supported. Instead, set logger.updates.enabled to false in your server configuration.'
);
}
if (!strapi.config.get('server.logger.updates.enabled') || !config) {
return;
}
display(notifInterval);
checkUpdate(checkInterval); // doesn't need to await
},

View File

@ -15,6 +15,25 @@ export interface WebhooksProp {
populateRelations?: boolean;
}
export interface LoggerProp {
updates?: {
enabled?: boolean;
};
startup?: {
enabled?: boolean;
};
}
export interface TransferProp {
remote?: {
enabled?: boolean;
};
}
export interface AdminProp {
autoOpen?: boolean;
}
export interface Server {
// required
host: string;
@ -30,4 +49,7 @@ export interface Server {
cron?: CronProp;
dirs?: DirsProp;
webhooks?: WebhooksProp;
logger?: LoggerProp;
transfer?: TransferProp;
admin?: AdminProp;
}