Skip to content

Commit

Permalink
perf(backend): make some features optionable
Browse files Browse the repository at this point in the history
Resolve #11064
Resolve #11065
  • Loading branch information
syuilo committed Jul 2, 2023
1 parent 734c41a commit af3258d
Show file tree
Hide file tree
Showing 13 changed files with 105 additions and 8 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@

## 13.x.x (unreleased)

### General
- identicon生成を無効にしてパフォーマンスを向上させることができるようになりました
- サーバーのマシン情報の公開を無効にしてパフォーマンスを向上させることができるようになりました

### Client
- Fix: サーバーメトリクスが90度傾いている

Expand Down
2 changes: 2 additions & 0 deletions locales/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1066,6 +1066,8 @@ export interface Locale {
"additionalEmojiDictionary": string;
"installed": string;
"branding": string;
"enableServerMachineStats": string;
"enableIdenticonGeneration": string;
"_initialAccountSetting": {
"accountCreated": string;
"letsStartAccountSetup": string;
Expand Down
2 changes: 2 additions & 0 deletions locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1063,6 +1063,8 @@ goToMisskey: "Misskeyへ"
additionalEmojiDictionary: "絵文字の追加辞書"
installed: "インストール済み"
branding: "ブランディング"
enableServerMachineStats: "サーバーのマシン情報を公開する"
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"

_initialAccountSetting:
accountCreated: "アカウントの作成が完了しました!"
Expand Down
Binary file added packages/backend/assets/avatar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions packages/backend/migration/1688280713783-add-meta-options.js
Original file line number Diff line number Diff line change
@@ -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"`);
}
}
12 changes: 9 additions & 3 deletions packages/backend/src/daemons/ServerStatsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -14,17 +15,20 @@ 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,
) {
}

/**
* 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 => {
Expand Down Expand Up @@ -64,7 +68,9 @@ export class ServerStatsService implements OnApplicationShutdown {

@bindThis
public dispose(): void {
clearInterval(this.intervalId);
if (this.intervalId) {
clearInterval(this.intervalId);
}
}

@bindThis
Expand Down
10 changes: 10 additions & 0 deletions packages/backend/src/models/entities/Meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: { },
})
Expand Down
15 changes: 11 additions & 4 deletions packages/backend/src/server/ServerService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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();
}

Expand Down
10 changes: 10 additions & 0 deletions packages/backend/src/server/api/endpoints/admin/meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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 },
};
});
Expand Down
10 changes: 10 additions & 0 deletions packages/backend/src/server/api/endpoints/admin/update-meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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' } },
},
Expand Down Expand Up @@ -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;
}
Expand Down
19 changes: 19 additions & 0 deletions packages/backend/src/server/api/endpoints/server-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();

Expand Down
14 changes: 14 additions & 0 deletions packages/frontend/src/pages/admin/other-settings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -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(() => {
Expand Down
2 changes: 1 addition & 1 deletion packages/frontend/src/widgets/server-metric/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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;
});
Expand Down

1 comment on commit af3258d

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chromatic detects changes. Please review the changes on Chromatic.

Please sign in to comment.