summaryrefslogtreecommitdiff
path: root/packages/backend/src/config.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/config.ts')
-rw-r--r--packages/backend/src/config.ts149
1 files changed, 149 insertions, 0 deletions
diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts
new file mode 100644
index 0000000000..11d8db5c04
--- /dev/null
+++ b/packages/backend/src/config.ts
@@ -0,0 +1,149 @@
+/**
+ * Config loader
+ */
+
+import * as fs from 'node:fs';
+import { fileURLToPath } from 'node:url';
+import { dirname } from 'node:path';
+import * as yaml from 'js-yaml';
+
+/**
+ * ユーザーが設定する必要のある情報
+ */
+export type Source = {
+ repository_url?: string;
+ feedback_url?: string;
+ url: string;
+ port: number;
+ disableHsts?: boolean;
+ db: {
+ host: string;
+ port: number;
+ db: string;
+ user: string;
+ pass: string;
+ disableCache?: boolean;
+ extra?: { [x: string]: string };
+ };
+ redis: {
+ host: string;
+ port: number;
+ family?: number;
+ pass: string;
+ db?: number;
+ prefix?: string;
+ };
+ elasticsearch: {
+ host: string;
+ port: number;
+ ssl?: boolean;
+ user?: string;
+ pass?: string;
+ index?: string;
+ };
+
+ proxy?: string;
+ proxySmtp?: string;
+ proxyBypassHosts?: string[];
+
+ allowedPrivateNetworks?: string[];
+
+ maxFileSize?: number;
+
+ accesslog?: string;
+
+ clusterLimit?: number;
+
+ id: string;
+
+ outgoingAddressFamily?: 'ipv4' | 'ipv6' | 'dual';
+
+ deliverJobConcurrency?: number;
+ inboxJobConcurrency?: number;
+ deliverJobPerSec?: number;
+ inboxJobPerSec?: number;
+ deliverJobMaxAttempts?: number;
+ inboxJobMaxAttempts?: number;
+
+ syslog: {
+ host: string;
+ port: number;
+ };
+
+ mediaProxy?: string;
+ proxyRemoteFiles?: boolean;
+
+ signToActivityPubGet?: boolean;
+};
+
+/**
+ * Misskeyが自動的に(ユーザーが設定した情報から推論して)設定する情報
+ */
+export type Mixin = {
+ version: string;
+ host: string;
+ hostname: string;
+ scheme: string;
+ wsScheme: string;
+ apiUrl: string;
+ wsUrl: string;
+ authUrl: string;
+ driveUrl: string;
+ userAgent: string;
+ clientEntry: string;
+};
+
+export type Config = Source & Mixin;
+
+const _filename = fileURLToPath(import.meta.url);
+const _dirname = dirname(_filename);
+
+/**
+ * Path of configuration directory
+ */
+const dir = `${_dirname}/../../../.config`;
+
+/**
+ * Path of configuration file
+ */
+const path = process.env.NODE_ENV === 'test'
+ ? `${dir}/test.yml`
+ : `${dir}/default.yml`;
+
+export function loadConfig() {
+ const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/meta.json`, 'utf-8'));
+ const clientManifest = JSON.parse(fs.readFileSync(`${_dirname}/../../../built/_client_dist_/manifest.json`, 'utf-8'));
+ const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
+
+ const mixin = {} as Mixin;
+
+ const url = tryCreateUrl(config.url);
+
+ config.url = url.origin;
+
+ config.port = config.port ?? parseInt(process.env.PORT ?? '', 10);
+
+ mixin.version = meta.version;
+ mixin.host = url.host;
+ mixin.hostname = url.hostname;
+ mixin.scheme = url.protocol.replace(/:$/, '');
+ mixin.wsScheme = mixin.scheme.replace('http', 'ws');
+ mixin.wsUrl = `${mixin.wsScheme}://${mixin.host}`;
+ mixin.apiUrl = `${mixin.scheme}://${mixin.host}/api`;
+ mixin.authUrl = `${mixin.scheme}://${mixin.host}/auth`;
+ mixin.driveUrl = `${mixin.scheme}://${mixin.host}/files`;
+ mixin.userAgent = `Misskey/${meta.version} (${config.url})`;
+ mixin.clientEntry = clientManifest['src/init.ts'];
+
+ if (!config.redis.prefix) config.redis.prefix = mixin.host;
+
+ return Object.assign(config, mixin);
+}
+
+function tryCreateUrl(url: string) {
+ try {
+ return new URL(url);
+ } catch (e) {
+ throw `url="${url}" is not a valid URL.`;
+ }
+}