From af3258dc79488b73435819e7799eb1515f15a6aa Mon Sep 17 00:00:00 2001 From: syuilo 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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 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 { + 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 { - 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 { 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 { 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 { 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 @@
+ + + + + + + + @@ -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; });