From af3258dc79488b73435819e7799eb1515f15a6aa Mon Sep 17 00:00:00 2001
From: syuilo <Syuilotan@yahoo.co.jp>
Date: Sun, 2 Jul 2023 16:02:32 +0900
Subject: [PATCH] perf(backend): make some features optionable

Resolve #11064
Resolve #11065
---
 CHANGELOG.md                                  |   4 ++++
 locales/index.d.ts                            |   2 ++
 locales/ja-JP.yml                             |   2 ++
 packages/backend/assets/avatar.png            | Bin 0 -> 13477 bytes
 .../1688280713783-add-meta-options.js         |  13 ++++++++++++
 .../backend/src/daemons/ServerStatsService.ts |  12 ++++++++---
 packages/backend/src/models/entities/Meta.ts  |  10 +++++++++
 packages/backend/src/server/ServerService.ts  |  15 ++++++++++----
 .../src/server/api/endpoints/admin/meta.ts    |  10 +++++++++
 .../server/api/endpoints/admin/update-meta.ts |  10 +++++++++
 .../src/server/api/endpoints/server-info.ts   |  19 ++++++++++++++++++
 .../src/pages/admin/other-settings.vue        |  14 +++++++++++++
 .../src/widgets/server-metric/index.vue       |   2 +-
 13 files changed, 105 insertions(+), 8 deletions(-)
 create mode 100644 packages/backend/assets/avatar.png
 create mode 100644 packages/backend/migration/1688280713783-add-meta-options.js

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 681105fb7e..72c4f53d18 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,10 @@
 
 ## 13.x.x (unreleased)
 
+### General
+- identicon生成を無効にしてパフォーマンスを向上させることができるようになりました
+- サーバーのマシン情報の公開を無効にしてパフォーマンスを向上させることができるようになりました
+
 ### Client
 - Fix: サーバーメトリクスが90度傾いている
 
diff --git a/locales/index.d.ts b/locales/index.d.ts
index eed29f408c..af6b803278 100644
--- a/locales/index.d.ts
+++ b/locales/index.d.ts
@@ -1066,6 +1066,8 @@ export interface Locale {
     "additionalEmojiDictionary": string;
     "installed": string;
     "branding": string;
+    "enableServerMachineStats": string;
+    "enableIdenticonGeneration": string;
     "_initialAccountSetting": {
         "accountCreated": string;
         "letsStartAccountSetup": string;
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 8004e53575..e7202bfbb5 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1063,6 +1063,8 @@ goToMisskey: "Misskeyへ"
 additionalEmojiDictionary: "絵文字の追加辞書"
 installed: "インストール済み"
 branding: "ブランディング"
+enableServerMachineStats: "サーバーのマシン情報を公開する"
+enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
 
 _initialAccountSetting:
   accountCreated: "アカウントの作成が完了しました!"
diff --git a/packages/backend/assets/avatar.png b/packages/backend/assets/avatar.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b95a0c560c32cf2a0060d9e911b1cc3171dfaba
GIT binary patch
literal 13477
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
N83{%4N>Rgr{|}U&QN#cM

literal 0
HcmV?d00001

diff --git a/packages/backend/migration/1688280713783-add-meta-options.js b/packages/backend/migration/1688280713783-add-meta-options.js
new file mode 100644
index 0000000000..12406fe085
--- /dev/null
+++ b/packages/backend/migration/1688280713783-add-meta-options.js
@@ -0,0 +1,13 @@
+export class AddMetaOptions1688280713783 {
+    name = 'AddMetaOptions1688280713783'
+
+    async up(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "meta" ADD "enableServerMachineStats" boolean NOT NULL DEFAULT false`);
+        await queryRunner.query(`ALTER TABLE "meta" ADD "enableIdenticonGeneration" boolean NOT NULL DEFAULT true`);
+    }
+
+    async down(queryRunner) {
+        await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableIdenticonGeneration"`);
+        await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "enableServerMachineStats"`);
+    }
+}
diff --git a/packages/backend/src/daemons/ServerStatsService.ts b/packages/backend/src/daemons/ServerStatsService.ts
index 6cd71c0e2a..375fd5e516 100644
--- a/packages/backend/src/daemons/ServerStatsService.ts
+++ b/packages/backend/src/daemons/ServerStatsService.ts
@@ -3,6 +3,7 @@ import si from 'systeminformation';
 import Xev from 'xev';
 import * as osUtils from 'os-utils';
 import { bindThis } from '@/decorators.js';
+import { MetaService } from '@/core/MetaService.js';
 import type { OnApplicationShutdown } from '@nestjs/common';
 
 const ev = new Xev();
@@ -14,9 +15,10 @@ const round = (num: number) => Math.round(num * 10) / 10;
 
 @Injectable()
 export class ServerStatsService implements OnApplicationShutdown {
-	private intervalId: NodeJS.Timer;
+	private intervalId: NodeJS.Timer | null = null;
 
 	constructor(
+		private metaService: MetaService,
 	) {
 	}
 
@@ -24,7 +26,9 @@ export class ServerStatsService implements OnApplicationShutdown {
 	 * Report server stats regularly
 	 */
 	@bindThis
-	public start(): void {
+	public async start(): Promise<void> {
+		if (!(await this.metaService.fetch(true)).enableServerMachineStats) return;
+
 		const log = [] as any[];
 
 		ev.on('requestServerStatsLog', x => {
@@ -64,7 +68,9 @@ export class ServerStatsService implements OnApplicationShutdown {
 
 	@bindThis
 	public dispose(): void {
-		clearInterval(this.intervalId);
+		if (this.intervalId) {
+			clearInterval(this.intervalId);
+		}
 	}
 
 	@bindThis
diff --git a/packages/backend/src/models/entities/Meta.ts b/packages/backend/src/models/entities/Meta.ts
index f799551f30..a251c0b31c 100644
--- a/packages/backend/src/models/entities/Meta.ts
+++ b/packages/backend/src/models/entities/Meta.ts
@@ -413,6 +413,16 @@ export class Meta {
 	})
 	public enableChartsForFederatedInstances: boolean;
 
+	@Column('boolean', {
+		default: false,
+	})
+	public enableServerMachineStats: boolean;
+
+	@Column('boolean', {
+		default: true,
+	})
+	public enableIdenticonGeneration: boolean;
+
 	@Column('jsonb', {
 		default: { },
 	})
diff --git a/packages/backend/src/server/ServerService.ts b/packages/backend/src/server/ServerService.ts
index c3d45e4ad6..1bae71617b 100644
--- a/packages/backend/src/server/ServerService.ts
+++ b/packages/backend/src/server/ServerService.ts
@@ -16,6 +16,7 @@ import { createTemp } from '@/misc/create-temp.js';
 import { UserEntityService } from '@/core/entities/UserEntityService.js';
 import { LoggerService } from '@/core/LoggerService.js';
 import { bindThis } from '@/decorators.js';
+import { MetaService } from '@/core/MetaService.js';
 import { ActivityPubServerService } from './ActivityPubServerService.js';
 import { NodeinfoServerService } from './NodeinfoServerService.js';
 import { ApiServerService } from './api/ApiServerService.js';
@@ -45,6 +46,7 @@ export class ServerService implements OnApplicationShutdown {
 		@Inject(DI.emojisRepository)
 		private emojisRepository: EmojisRepository,
 
+		private metaService: MetaService,
 		private userEntityService: UserEntityService,
 		private apiServerService: ApiServerService,
 		private openApiServerService: OpenApiServerService,
@@ -161,11 +163,16 @@ export class ServerService implements OnApplicationShutdown {
 		});
 
 		fastify.get<{ Params: { x: string } }>('/identicon/:x', async (request, reply) => {
-			const [temp, cleanup] = await createTemp();
-			await genIdenticon(request.params.x, fs.createWriteStream(temp));
 			reply.header('Content-Type', 'image/png');
 			reply.header('Cache-Control', 'public, max-age=86400');
-			return fs.createReadStream(temp).on('close', () => cleanup());
+
+			if ((await this.metaService.fetch()).enableIdenticonGeneration) {
+				const [temp, cleanup] = await createTemp();
+				await genIdenticon(request.params.x, fs.createWriteStream(temp));
+				return fs.createReadStream(temp).on('close', () => cleanup());
+			} else {
+				return reply.redirect('/static-assets/avatar.png');
+			}
 		});
 
 		fastify.get<{ Params: { code: string } }>('/verify-email/:code', async (request, reply) => {
@@ -224,7 +231,7 @@ export class ServerService implements OnApplicationShutdown {
 
 	@bindThis
 	public async dispose(): Promise<void> {
-    await this.streamingApiServerService.detach();
+		await this.streamingApiServerService.detach();
 		await this.#fastify.close();
 	}
 
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index 4cc1b6011f..28aec7a090 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -262,6 +262,14 @@ export const meta = {
 				type: 'boolean',
 				optional: false, nullable: false,
 			},
+			enableServerMachineStats: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
+			enableIdenticonGeneration: {
+				type: 'boolean',
+				optional: false, nullable: false,
+			},
 			policies: {
 				type: 'object',
 				optional: false, nullable: false,
@@ -364,6 +372,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 				enableActiveEmailValidation: instance.enableActiveEmailValidation,
 				enableChartsForRemoteUser: instance.enableChartsForRemoteUser,
 				enableChartsForFederatedInstances: instance.enableChartsForFederatedInstances,
+				enableServerMachineStats: instance.enableServerMachineStats,
+				enableIdenticonGeneration: instance.enableIdenticonGeneration,
 				policies: { ...DEFAULT_POLICIES, ...instance.policies },
 			};
 		});
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index 1de5e9efd3..5c9d8e3fac 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -96,6 +96,8 @@ export const paramDef = {
 		enableActiveEmailValidation: { type: 'boolean' },
 		enableChartsForRemoteUser: { type: 'boolean' },
 		enableChartsForFederatedInstances: { type: 'boolean' },
+		enableServerMachineStats: { type: 'boolean' },
+		enableIdenticonGeneration: { type: 'boolean' },
 		serverRules: { type: 'array', items: { type: 'string' } },
 		preservedUsernames: { type: 'array', items: { type: 'string' } },
 	},
@@ -399,6 +401,14 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
 				set.enableChartsForFederatedInstances = ps.enableChartsForFederatedInstances;
 			}
 
+			if (ps.enableServerMachineStats !== undefined) {
+				set.enableServerMachineStats = ps.enableServerMachineStats;
+			}
+
+			if (ps.enableIdenticonGeneration !== undefined) {
+				set.enableIdenticonGeneration = ps.enableIdenticonGeneration;
+			}
+
 			if (ps.serverRules !== undefined) {
 				set.serverRules = ps.serverRules;
 			}
diff --git a/packages/backend/src/server/api/endpoints/server-info.ts b/packages/backend/src/server/api/endpoints/server-info.ts
index 1620e8ae52..552441e430 100644
--- a/packages/backend/src/server/api/endpoints/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/server-info.ts
@@ -2,9 +2,12 @@ import * as os from 'node:os';
 import si from 'systeminformation';
 import { Injectable } from '@nestjs/common';
 import { Endpoint } from '@/server/api/endpoint-base.js';
+import { MetaService } from '@/core/MetaService.js';
 
 export const meta = {
 	requireCredential: false,
+	allowGet: true,
+	cacheSec: 60 * 1,
 
 	tags: ['meta'],
 } as const;
@@ -19,8 +22,24 @@ export const paramDef = {
 @Injectable()
 export default class extends Endpoint<typeof meta, typeof paramDef> {
 	constructor(
+		private metaService: MetaService,
 	) {
 		super(meta, paramDef, async () => {
+			if (!(await this.metaService.fetch()).enableServerMachineStats) return {
+				machine: '?',
+				cpu: {
+					model: '?',
+					cores: 0,
+				},
+				mem: {
+					total: 0,
+				},
+				fs: {
+					total: 0,
+					used: 0,
+				},
+			};
+
 			const memStats = await si.mem();
 			const fsStats = await si.fsSize();
 
diff --git a/packages/frontend/src/pages/admin/other-settings.vue b/packages/frontend/src/pages/admin/other-settings.vue
index 15d720a070..d3e1d9efc1 100644
--- a/packages/frontend/src/pages/admin/other-settings.vue
+++ b/packages/frontend/src/pages/admin/other-settings.vue
@@ -4,6 +4,14 @@
 	<MkSpacer :contentMax="700" :marginMin="16" :marginMax="32">
 		<FormSuspense :p="init">
 			<div class="_gaps_s">
+				<MkSwitch v-model="enableServerMachineStats">
+					<template #label>{{ i18n.ts.enableServerMachineStats }}</template>
+				</MkSwitch>
+
+				<MkSwitch v-model="enableIdenticonGeneration">
+					<template #label>{{ i18n.ts.enableIdenticonGeneration }}</template>
+				</MkSwitch>
+
 				<MkSwitch v-model="enableChartsForRemoteUser">
 					<template #label>{{ i18n.ts.enableChartsForRemoteUser }}</template>
 				</MkSwitch>
@@ -27,17 +35,23 @@ import { i18n } from '@/i18n';
 import { definePageMetadata } from '@/scripts/page-metadata';
 import MkSwitch from '@/components/MkSwitch.vue';
 
+let enableServerMachineStats: boolean = $ref(false);
+let enableIdenticonGeneration: boolean = $ref(false);
 let enableChartsForRemoteUser: boolean = $ref(false);
 let enableChartsForFederatedInstances: boolean = $ref(false);
 
 async function init() {
 	const meta = await os.api('admin/meta');
+	enableServerMachineStats = meta.enableServerMachineStats;
+	enableIdenticonGeneration = meta.enableIdenticonGeneration;
 	enableChartsForRemoteUser = meta.enableChartsForRemoteUser;
 	enableChartsForFederatedInstances = meta.enableChartsForFederatedInstances;
 }
 
 function save() {
 	os.apiWithDialog('admin/update-meta', {
+		enableServerMachineStats,
+		enableIdenticonGeneration,
 		enableChartsForRemoteUser,
 		enableChartsForFederatedInstances,
 	}).then(() => {
diff --git a/packages/frontend/src/widgets/server-metric/index.vue b/packages/frontend/src/widgets/server-metric/index.vue
index e019ff540b..1a78f4bcd6 100644
--- a/packages/frontend/src/widgets/server-metric/index.vue
+++ b/packages/frontend/src/widgets/server-metric/index.vue
@@ -62,7 +62,7 @@ const { widgetProps, configure, save } = useWidgetPropsManager(name,
 
 const meta = ref(null);
 
-os.api('server-info', {}).then(res => {
+os.apiGet('server-info', {}).then(res => {
 	meta.value = res;
 });
 
-- 
GitLab