Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
-

### Server
- Feat: 公開ノートへのリアクション(Like)アクティビティをリレーサーバーへ配信するように(管理者設定 `deliverReactionsToRelays` で無効化可能、デフォルト有効) #17307
- Fix: ID生成アルゴリズムにULIDを使用している場合に通知が約10秒遅延する問題を修正


Expand Down
2 changes: 2 additions & 0 deletions locales/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1731,6 +1731,8 @@ _serverSettings:
fanoutTimelineDbFallback: "Fallback to database"
fanoutTimelineDbFallbackDescription: "When enabled, the timeline will fall back to the database for additional queries if the timeline is not cached. Disabling it further reduces the server load by eliminating the fallback process, but limits the range of timelines that can be retrieved."
reactionsBufferingDescription: "When enabled, performance during reaction creation will be greatly improved, reducing the load on the database. However, Redis memory usage will increase."
deliverReactionsToRelays: "Deliver reactions to relays"
deliverReactionsToRelaysDescription: "When enabled, Like activities on public notes are also delivered to relay servers, so federated servers receiving notes via relay will also receive reactions. Reactions are more frequent than notes, so this can be disabled to reduce the load on relays and downstream servers."
remoteNotesCleaning: "Automatic cleanup of remote notes"
remoteNotesCleaning_description: "When enabled, unused and outdated remote notes will be periodically cleaned up to prevent database bloat."
remoteNotesCleaningMaxProcessingDuration: "Maximum cleanup processing time"
Expand Down
2 changes: 2 additions & 0 deletions locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1752,6 +1752,8 @@ _serverSettings:
fanoutTimelineDbFallback: "データベースへのフォールバック"
fanoutTimelineDbFallbackDescription: "有効にすると、タイムラインがキャッシュされていない場合にDBへ追加で問い合わせを行うフォールバック処理を行います。無効にすると、フォールバック処理を行わないことでさらにサーバーの負荷を軽減することができますが、タイムラインが取得できる範囲に制限が生じます。"
reactionsBufferingDescription: "有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。"
deliverReactionsToRelays: "リアクションをリレーに配信する"
deliverReactionsToRelaysDescription: "有効にすると、公開ノートへのリアクション(Like)アクティビティをリレーサーバーへも配信します。リレー経由でノートを取得している連合サーバーがリアクションも受信できるようになります。リアクションは投稿より頻度が高いため、リレーや配信先の負荷を考慮して無効化することもできます。"
remoteNotesCleaning: "リモート投稿の自動クリーニング"
remoteNotesCleaning_description: "有効にすると、一定期間経過したリモートの投稿を定期的にクリーンアップしてデータベースの肥大化を抑制します。"
remoteNotesCleaningMaxProcessingDuration: "最大クリーニング処理継続時間"
Expand Down
2 changes: 2 additions & 0 deletions locales/ko-KR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1732,6 +1732,8 @@ _serverSettings:
fanoutTimelineDbFallback: "데이터베이스를 예비로 사용하기"
fanoutTimelineDbFallbackDescription: "활성화하면 타임라인의 캐시되어 있지 않은 부분에 대해 DB에 질의하여 정보를 가져옵니다. 비활성화하면 이를 실행하지 않음으로써 서버의 부하를 줄일 수 있지만, 타임라인에서 가져올 수 있는 게시물 범위가 한정됩니다."
reactionsBufferingDescription: "활성화 한 경우, 리액션 작성 퍼포먼스가 대폭 향상되어 DB의 부하를 줄일 수 있으나, Redis의 메모리 사용량이 많아집니다."
deliverReactionsToRelays: "리액션을 릴레이에 배포"
deliverReactionsToRelaysDescription: "활성화하면 공개 노트에 달린 리액션(Like) 액티비티를 릴레이 서버에도 배포합니다. 릴레이를 통해 노트를 받고 있는 연합 서버가 리액션도 수신할 수 있게 됩니다. 리액션은 노트보다 빈도가 높으므로, 릴레이나 배포 대상 서버의 부하를 고려하여 비활성화할 수 있습니다."
remoteNotesCleaning: "리모트 서버 노트 자동 정리 "
remoteNotesCleaning_description: "더 이상 사용되지 않는 오래된 리모트 노트를 정기적으로 정리하여, 데이터 베이스의 사용량을 절약할 수 있습니다."
remoteNotesCleaningMaxProcessingDuration: "리모트 노트 자동 정리 최대 실행 시간"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
* SPDX-FileCopyrightText: syuilo and misskey-project
* SPDX-License-Identifier: AGPL-3.0-only
*/

export class DeliverReactionsToRelays1777776758782 {
name = 'DeliverReactionsToRelays1777776758782'

async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "deliverReactionsToRelays" boolean NOT NULL DEFAULT true`);
}

async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "deliverReactionsToRelays"`);
}
}
11 changes: 11 additions & 0 deletions packages/backend/src/core/ReactionService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { NotificationService } from '@/core/NotificationService.js';
import PerUserReactionsChart from '@/core/chart/charts/per-user-reactions.js';
import { emojiRegex } from '@/misc/emoji-regex.js';
import { ApDeliverManagerService } from '@/core/activitypub/ApDeliverManagerService.js';
import { RelayService } from '@/core/RelayService.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
Expand Down Expand Up @@ -97,6 +98,7 @@ export class ReactionService {
private globalEventService: GlobalEventService,
private apRendererService: ApRendererService,
private apDeliverManagerService: ApDeliverManagerService,
private relayService: RelayService,
private notificationService: NotificationService,
private perUserReactionsChart: PerUserReactionsChart,
) {
Expand Down Expand Up @@ -280,6 +282,10 @@ export class ReactionService {
}
}

if (note.visibility === 'public' && this.meta.deliverReactionsToRelays) {
this.relayService.deliverToRelays(user, content);
}

trackPromise(dm.execute());
}
//#endregion
Expand Down Expand Up @@ -332,6 +338,11 @@ export class ReactionService {
dm.addDirectRecipe(reactee as MiRemoteUser);
}
dm.addFollowersRecipe();

if (note.visibility === 'public' && this.meta.deliverReactionsToRelays) {
this.relayService.deliverToRelays(user, content);
}

trackPromise(dm.execute());
}
//#endregion
Expand Down
5 changes: 5 additions & 0 deletions packages/backend/src/models/Meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,11 @@ export class MiMeta {
})
public enableReactionsBuffering: boolean;

@Column('boolean', {
default: true,
})
public deliverReactionsToRelays: boolean;

@Column('integer', {
default: 0,
})
Expand Down
5 changes: 5 additions & 0 deletions packages/backend/src/server/api/endpoints/admin/meta.ts
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,10 @@ export const meta = {
type: 'boolean',
optional: false, nullable: false,
},
deliverReactionsToRelays: {
type: 'boolean',
optional: false, nullable: false,
},
notesPerOneAd: {
type: 'number',
optional: false, nullable: false,
Expand Down Expand Up @@ -731,6 +735,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
perUserHomeTimelineCacheMax: instance.perUserHomeTimelineCacheMax,
perUserListTimelineCacheMax: instance.perUserListTimelineCacheMax,
enableReactionsBuffering: instance.enableReactionsBuffering,
deliverReactionsToRelays: instance.deliverReactionsToRelays,
notesPerOneAd: instance.notesPerOneAd,
summalyProxy: instance.urlPreviewSummaryProxyUrl,
urlPreviewEnabled: instance.urlPreviewEnabled,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ export const paramDef = {
perUserHomeTimelineCacheMax: { type: 'integer' },
perUserListTimelineCacheMax: { type: 'integer' },
enableReactionsBuffering: { type: 'boolean' },
deliverReactionsToRelays: { type: 'boolean' },
notesPerOneAd: { type: 'integer' },
silencedHosts: {
type: 'array',
Expand Down Expand Up @@ -676,6 +677,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
set.enableReactionsBuffering = ps.enableReactionsBuffering;
}

if (ps.deliverReactionsToRelays !== undefined) {
set.deliverReactionsToRelays = ps.deliverReactionsToRelays;
}

if (ps.notesPerOneAd !== undefined) {
set.notesPerOneAd = ps.notesPerOneAd;
}
Expand Down
22 changes: 22 additions & 0 deletions packages/frontend/src/pages/admin/relays.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@ SPDX-License-Identifier: AGPL-3.0-only
<div class="_spacer" style="--MI_SPACER-w: 800px;">
<SearchMarker path="/admin/relays" :label="i18n.ts.relays" :keywords="['relays']" icon="ti ti-planet">
<div class="_gaps">
<SearchMarker :keywords="['reaction', 'like', 'deliver']">
<div class="_panel" style="padding: 16px;">
<MkSwitch v-model="deliverReactionsToRelays" @change="onChange_deliverReactionsToRelays">
<template #label><SearchLabel>{{ i18n.ts._serverSettings.deliverReactionsToRelays }}</SearchLabel></template>
<template #caption><SearchText>{{ i18n.ts._serverSettings.deliverReactionsToRelaysDescription }}</SearchText></template>
</MkSwitch>
</div>
</SearchMarker>

<div v-for="relay in relays" :key="relay.inbox" class="relaycxt _panel" style="padding: 16px;">
<div>{{ relay.inbox }}</div>
<div style="margin: 8px 0;">
Expand All @@ -28,12 +37,25 @@ SPDX-License-Identifier: AGPL-3.0-only
import { ref, computed } from 'vue';
import * as Misskey from 'misskey-js';
import MkButton from '@/components/MkButton.vue';
import MkSwitch from '@/components/MkSwitch.vue';
import * as os from '@/os.js';
import { misskeyApi } from '@/utility/misskey-api.js';
import { fetchInstance } from '@/instance.js';
import { i18n } from '@/i18n.js';
import { definePage } from '@/page.js';

const meta = await misskeyApi('admin/meta');

const relays = ref<Misskey.entities.AdminRelaysListResponse>([]);
const deliverReactionsToRelays = ref(meta.deliverReactionsToRelays);

function onChange_deliverReactionsToRelays(value: boolean) {
os.apiWithDialog('admin/update-meta', {
deliverReactionsToRelays: value,
}).then(() => {
fetchInstance(true);
});
}

async function addRelay() {
const { canceled, result: inbox } = await os.inputText({
Expand Down
8 changes: 8 additions & 0 deletions packages/i18n/src/autogen/locale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6868,6 +6868,14 @@ export interface Locale extends ILocale {
* 有効にすると、リアクション作成時のパフォーマンスが大幅に向上し、データベースへの負荷を軽減することが可能です。ただし、Redisのメモリ使用量は増加します。
*/
"reactionsBufferingDescription": string;
/**
* リアクションをリレーに配信する
*/
"deliverReactionsToRelays": string;
/**
* 有効にすると、公開ノートへのリアクション(Like)アクティビティをリレーサーバーへも配信します。リレー経由でノートを取得している連合サーバーがリアクションも受信できるようになります。リアクションは投稿より頻度が高いため、リレーや配信先の負荷を考慮して無効化することもできます。
*/
"deliverReactionsToRelaysDescription": string;
/**
* リモート投稿の自動クリーニング
*/
Expand Down
2 changes: 2 additions & 0 deletions packages/misskey-js/src/autogen/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9472,6 +9472,7 @@ export interface operations {
perUserHomeTimelineCacheMax: number;
perUserListTimelineCacheMax: number;
enableReactionsBuffering: boolean;
deliverReactionsToRelays: boolean;
notesPerOneAd: number;
backgroundImageUrl: string | null;
deeplAuthKey: string | null;
Expand Down Expand Up @@ -12821,6 +12822,7 @@ export interface operations {
perUserHomeTimelineCacheMax?: number;
perUserListTimelineCacheMax?: number;
enableReactionsBuffering?: boolean;
deliverReactionsToRelays?: boolean;
notesPerOneAd?: number;
silencedHosts?: string[] | null;
mediaSilencedHosts?: string[] | null;
Expand Down
Loading