Tweaking config instructions and initialization - resolves #365

Configuration instructions encourage the user to use a configuration
file called `development.yaml` (for self-build) or `production.yaml`
(for Docker build) but do not provide instructions to point Mjölnir
to read from these files.

This patch:
- allows Mjölnir to read `production.yaml` if available, without
	additional instructions needed;
- change the instructions for self-build to use `default.yaml`,
	which is read without additional instructions;
- add instructions in case the user wishes to use `development.yaml`;
- tweak the error message in case the config file isn't setup at
	all to clarify this for users.
This commit is contained in:
David Teller 2022-09-07 10:18:38 +02:00
parent 4d5447cb50
commit fdccffdcf2
3 changed files with 49 additions and 8 deletions

View File

@ -7,9 +7,26 @@ cd mjolnir
yarn install yarn install
yarn build yarn build
# Copy and edit the config. It *is* recommended to change the data path. # Edit the config.
cp config/default.yaml config/development.yaml # You probably should change `dataPath`.
nano config/development.yaml nano config/default.yaml
node lib/index.js node lib/index.js
``` ```
Or, if you wish to use a different configuration file, e.g. `development.yaml`
```bash
git clone https://github.com/matrix-org/mjolnir.git
cd mjolnir
yarn install
yarn build
# Edit the config.
# You probably should change `dataPath`.
cp config/default.yaml config/development.yaml
nano config/development.yaml
NODE_ENV=development node lib/index.js
```

View File

@ -170,12 +170,36 @@ const defaultConfig: IConfig = {
}, },
}; };
export function read(): IConfig { export function read(checkConfigured = true): IConfig {
const config_dir = process.env.NODE_CONFIG_DIR || "./config"; const config_dir = process.env.NODE_CONFIG_DIR || "./config";
const config_file = `${process.env.NODE_ENV || "default"}.yaml` let config_path;
for (let key of [
const content = fs.readFileSync(path.join(config_dir, config_file), "utf8"); process.env.NODE_ENV,
"production",
"default"
]) {
if (!key) {
continue;
}
const candidate_path = path.join(config_dir, `${key}.yaml`);
if (!fs.existsSync(candidate_path)) {
continue;
}
config_path = candidate_path;
break;
}
if (!config_path) {
throw new Error("Could not find any valid configuration file");
}
const content = fs.readFileSync(config_path, "utf8");
const parsed = load(content); const parsed = load(content);
const config = {...defaultConfig, ...(parsed as object)} as IConfig; const config = {...defaultConfig, ...(parsed as object)} as IConfig;
if (checkConfigured && config.accessToken === "YOUR_TOKEN_HERE") {
// A small check to simplify the error message in case
// the configuration file hasn't been modified.
throw new Error(`Invalid access token in configuration file ${config_path}. `
+ "This usually indicates that Mjölnir's configuration file was not setup "
+ "or that Mjölnir is using the wrong configuration file.");
}
return config; return config;
} }

View File

@ -22,7 +22,7 @@ import { read as configRead } from "../../src/config";
import { RULE_ROOM, RULE_SERVER, RULE_USER } from "../../src/models/ListRule"; import { RULE_ROOM, RULE_SERVER, RULE_USER } from "../../src/models/ListRule";
function createTestMjolnir(defaultShortcode: string|null = null): Mjolnir { function createTestMjolnir(defaultShortcode: string|null = null): Mjolnir {
const config = configRead(); const config = configRead(false);
const client = { const client = {
// Mock `MatrixClient.getAccountData` . // Mock `MatrixClient.getAccountData` .
getAccountData: (eventType: string): Promise<any> => { getAccountData: (eventType: string): Promise<any> => {