{ // eslint-
set.allowExternalApRedirect = ps.allowExternalApRedirect;
}
+ if (ps.enableRemoteNotesCleaning !== undefined) {
+ set.enableRemoteNotesCleaning = ps.enableRemoteNotesCleaning;
+ }
+
+ if (ps.remoteNotesCleaningExpiryDaysForEachNotes !== undefined) {
+ set.remoteNotesCleaningExpiryDaysForEachNotes = ps.remoteNotesCleaningExpiryDaysForEachNotes;
+ }
+
+ if (ps.remoteNotesCleaningMaxProcessingDurationInMinutes !== undefined) {
+ set.remoteNotesCleaningMaxProcessingDurationInMinutes = ps.remoteNotesCleaningMaxProcessingDurationInMinutes;
+ }
+
const before = await this.metaService.fetch(true);
await this.metaService.update(set);
diff --git a/packages/frontend/src/components/MkServerSetupWizard.vue b/packages/frontend/src/components/MkServerSetupWizard.vue
index e5614d63d7..23e0e85bc9 100644
--- a/packages/frontend/src/components/MkServerSetupWizard.vue
+++ b/packages/frontend/src/components/MkServerSetupWizard.vue
@@ -55,7 +55,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
+
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description1 }}
{{ i18n.ts._serverSetupWizard.doYouConnectToFediverse_description2 }}
{{ i18n.ts.learnMore }}
@@ -63,6 +63,11 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts._serverSetupWizard.youCanConfigureMoreFederationSettingsLater }}
+
+
+ {{ i18n.ts._serverSetupWizard.remoteContentsCleaning }}
+ {{ i18n.ts._serverSetupWizard.remoteContentsCleaning_description }}
+
@@ -110,6 +115,10 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.federation }}:
{{ serverSettings.federation === 'none' ? i18n.ts.no : i18n.ts.all }}
+
+
{{ i18n.ts._serverSettings.remoteNotesCleaning }}:
+
{{ serverSettings.enableRemoteNotesCleaning ? i18n.ts.yes : i18n.ts.no }}
+
FTT:
{{ serverSettings.enableFanoutTimeline ? i18n.ts.yes : i18n.ts.no }}
@@ -185,7 +194,9 @@ import { misskeyApi } from '@/utility/misskey-api.js';
import { i18n } from '@/i18n.js';
import MkFolder from '@/components/MkFolder.vue';
import MkRadios from '@/components/MkRadios.vue';
+import MkSwitch from '@/components/MkSwitch.vue';
import MkInfo from '@/components/MkInfo.vue';
+import MkLink from '@/components/MkLink.vue';
const emit = defineEmits<{
(ev: 'finished'): void;
@@ -202,6 +213,7 @@ const q_name = ref(currentMeta.name ?? '');
const q_use = ref('single');
const q_scale = ref('small');
const q_federation = ref(currentMeta.federation === 'none' ? 'no' : 'yes');
+const q_remoteContentsCleaning = ref(currentMeta.enableRemoteNotesCleaning);
const q_adminName = ref(currentMeta.maintainerName ?? '');
const q_adminEmail = ref(currentMeta.maintainerEmail ?? '');
@@ -219,6 +231,7 @@ const serverSettings = computed
(() => {
emailRequiredForSignup: q_use.value === 'open',
enableIpLogging: q_use.value === 'open',
federation: q_federation.value === 'yes' ? 'all' : 'none',
+ enableRemoteNotesCleaning: q_remoteContentsCleaning.value,
enableFanoutTimeline: true,
enableFanoutTimelineDbFallback: q_use.value === 'single',
enableReactionsBuffering,
diff --git a/packages/frontend/src/pages/admin/job-queue.job.vue b/packages/frontend/src/pages/admin/job-queue.job.vue
index 659aa02b50..4ecdb74199 100644
--- a/packages/frontend/src/pages/admin/job-queue.job.vue
+++ b/packages/frontend/src/pages/admin/job-queue.job.vue
@@ -98,7 +98,7 @@ SPDX-License-Identifier: AGPL-3.0-only
Progress
- {{ Math.floor(job.progress * 100) }}%
+ {{ Math.floor(job.progress) }}%
@@ -150,7 +150,7 @@ SPDX-License-Identifier: AGPL-3.0-only
Update
-
+
diff --git a/packages/frontend/src/pages/admin/performance.vue b/packages/frontend/src/pages/admin/performance.vue
index c28621b11e..ff3a5b9d7f 100644
--- a/packages/frontend/src/pages/admin/performance.vue
+++ b/packages/frontend/src/pages/admin/performance.vue
@@ -101,6 +101,35 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
+
+ Remote Notes Cleaning (仮)
+ Enabled
+ Disabled
+
+
+
+
+
+
+ {{ i18n.ts.enable }}{{ i18n.ts.modified }}
+ {{ i18n.ts._serverSettings.remoteNotesCleaning_description }}
+
+
+
+
+ {{ i18n.ts._serverSettings.remoteNotesCleaningExpiryDaysForEachNotes }} ({{ i18n.ts.inDays }}){{ i18n.ts.modified }}
+ {{ i18n.ts._time.day }}
+
+
+
+ {{ i18n.ts._serverSettings.remoteNotesCleaningMaxProcessingDuration }} ({{ i18n.ts.inMinutes }}){{ i18n.ts.modified }}
+ {{ i18n.ts._time.minute }}
+
+
+
+
@@ -196,6 +225,19 @@ const rbtForm = useForm({
fetchInstance(true);
});
+const remoteNotesCleaningForm = useForm({
+ enableRemoteNotesCleaning: meta.enableRemoteNotesCleaning,
+ remoteNotesCleaningExpiryDaysForEachNotes: meta.remoteNotesCleaningExpiryDaysForEachNotes,
+ remoteNotesCleaningMaxProcessingDurationInMinutes: meta.remoteNotesCleaningMaxProcessingDurationInMinutes,
+}, async (state) => {
+ await os.apiWithDialog('admin/update-meta', {
+ enableRemoteNotesCleaning: state.enableRemoteNotesCleaning,
+ remoteNotesCleaningExpiryDaysForEachNotes: state.remoteNotesCleaningExpiryDaysForEachNotes,
+ remoteNotesCleaningMaxProcessingDurationInMinutes: state.remoteNotesCleaningMaxProcessingDurationInMinutes,
+ });
+ fetchInstance(true);
+});
+
const headerActions = computed(() => []);
const headerTabs = computed(() => []);
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index 7594117deb..c0a6dca67e 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -9370,6 +9370,9 @@ export interface operations {
proxyRemoteFiles: boolean;
signToActivityPubGet: boolean;
allowExternalApRedirect: boolean;
+ enableRemoteNotesCleaning: boolean;
+ remoteNotesCleaningExpiryDaysForEachNotes: number;
+ remoteNotesCleaningMaxProcessingDurationInMinutes: number;
};
};
};
@@ -12599,6 +12602,9 @@ export interface operations {
proxyRemoteFiles?: boolean;
signToActivityPubGet?: boolean;
allowExternalApRedirect?: boolean;
+ enableRemoteNotesCleaning?: boolean;
+ remoteNotesCleaningExpiryDaysForEachNotes?: number;
+ remoteNotesCleaningMaxProcessingDurationInMinutes?: number;
};
};
};
--
cgit v1.2.3-freya
From 1082145c749dd2812dd89ca4ad323d6591ebac49 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Fri, 1 Aug 2025 12:54:33 +0900
Subject: enhance: ジョブのログを表示できるように
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
packages/backend/src/core/QueueService.ts | 7 ++
packages/backend/src/server/api/endpoint-list.ts | 1 +
.../api/endpoints/admin/queue/show-job-logs.ts | 45 +++++++++++++
.../frontend/src/pages/admin/job-queue.job.vue | 9 +++
packages/misskey-js/etc/misskey-js.api.md | 8 +++
packages/misskey-js/src/autogen/apiClientJSDoc.ts | 11 ++++
packages/misskey-js/src/autogen/endpoint.ts | 3 +
packages/misskey-js/src/autogen/entities.ts | 2 +
packages/misskey-js/src/autogen/types.ts | 76 ++++++++++++++++++++++
9 files changed, 162 insertions(+)
create mode 100644 packages/backend/src/server/api/endpoints/admin/queue/show-job-logs.ts
(limited to 'packages/backend/src/core/QueueService.ts')
diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts
index 06170b242a..4be568b334 100644
--- a/packages/backend/src/core/QueueService.ts
+++ b/packages/backend/src/core/QueueService.ts
@@ -810,6 +810,13 @@ export class QueueService {
}
}
+ @bindThis
+ public async queueGetJobLogs(queueType: typeof QUEUE_TYPES[number], jobId: string) {
+ const queue = this.getQueue(queueType);
+ const result = await queue.getJobLogs(jobId);
+ return result.logs;
+ }
+
@bindThis
public async queueGetJobs(queueType: typeof QUEUE_TYPES[number], jobTypes: JobType[], search?: string) {
const RETURN_LIMIT = 100;
diff --git a/packages/backend/src/server/api/endpoint-list.ts b/packages/backend/src/server/api/endpoint-list.ts
index 5c4a58a6fc..c0c43dd5c9 100644
--- a/packages/backend/src/server/api/endpoint-list.ts
+++ b/packages/backend/src/server/api/endpoint-list.ts
@@ -70,6 +70,7 @@ export * as 'admin/queue/inbox-delayed' from './endpoints/admin/queue/inbox-dela
export * as 'admin/queue/retry-job' from './endpoints/admin/queue/retry-job.js';
export * as 'admin/queue/remove-job' from './endpoints/admin/queue/remove-job.js';
export * as 'admin/queue/show-job' from './endpoints/admin/queue/show-job.js';
+export * as 'admin/queue/show-job-logs' from './endpoints/admin/queue/show-job-logs.js';
export * as 'admin/queue/promote-jobs' from './endpoints/admin/queue/promote-jobs.js';
export * as 'admin/queue/jobs' from './endpoints/admin/queue/jobs.js';
export * as 'admin/queue/stats' from './endpoints/admin/queue/stats.js';
diff --git a/packages/backend/src/server/api/endpoints/admin/queue/show-job-logs.ts b/packages/backend/src/server/api/endpoints/admin/queue/show-job-logs.ts
new file mode 100644
index 0000000000..b9292ed12a
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/queue/show-job-logs.ts
@@ -0,0 +1,45 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Injectable } from '@nestjs/common';
+import { Endpoint } from '@/server/api/endpoint-base.js';
+import { QUEUE_TYPES, QueueService } from '@/core/QueueService.js';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireModerator: true,
+ kind: 'read:admin:queue',
+
+ res: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ optional: false, nullable: false,
+ type: 'string',
+ },
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ queue: { type: 'string', enum: QUEUE_TYPES },
+ jobId: { type: 'string' },
+ },
+ required: ['queue', 'jobId'],
+} as const;
+
+@Injectable()
+export default class extends Endpoint { // eslint-disable-line import/no-default-export
+ constructor(
+ private queueService: QueueService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ return this.queueService.queueGetJobLogs(ps.queue, ps.jobId);
+ });
+ }
+}
diff --git a/packages/frontend/src/pages/admin/job-queue.job.vue b/packages/frontend/src/pages/admin/job-queue.job.vue
index 4ecdb74199..f96830e57a 100644
--- a/packages/frontend/src/pages/admin/job-queue.job.vue
+++ b/packages/frontend/src/pages/admin/job-queue.job.vue
@@ -155,6 +155,10 @@ SPDX-License-Identifier: AGPL-3.0-only
+
+
Load logs
+
{{ log }}
+
@@ -198,6 +202,7 @@ const emit = defineEmits<{
const tab = ref('info');
const editData = ref(JSON5.stringify(props.job.data, null, '\t'));
const canEdit = true;
+const logs = ref([]);
type TlType = TlEvent<{
type: 'created' | 'processed' | 'finished';
@@ -268,6 +273,10 @@ async function removeJob() {
os.apiWithDialog('admin/queue/remove-job', { queue: props.queueType, jobId: props.job.id });
}
+async function loadLogs() {
+ logs.value = await os.apiWithDialog('admin/queue/show-job-logs', { queue: props.queueType, jobId: props.job.id });
+}
+
// TODO
// function moveJob() {
//
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index 4ed1c3629f..ae12547f35 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -296,6 +296,12 @@ type AdminQueueRemoveJobRequest = operations['admin___queue___remove-job']['requ
// @public (undocumented)
type AdminQueueRetryJobRequest = operations['admin___queue___retry-job']['requestBody']['content']['application/json'];
+// @public (undocumented)
+type AdminQueueShowJobLogsRequest = operations['admin___queue___show-job-logs']['requestBody']['content']['application/json'];
+
+// @public (undocumented)
+type AdminQueueShowJobLogsResponse = operations['admin___queue___show-job-logs']['responses']['200']['content']['application/json'];
+
// @public (undocumented)
type AdminQueueShowJobRequest = operations['admin___queue___show-job']['requestBody']['content']['application/json'];
@@ -1559,6 +1565,8 @@ declare namespace entities {
AdminQueueRetryJobRequest,
AdminQueueShowJobRequest,
AdminQueueShowJobResponse,
+ AdminQueueShowJobLogsRequest,
+ AdminQueueShowJobLogsResponse,
AdminQueueStatsResponse,
AdminRelaysAddRequest,
AdminRelaysAddResponse,
diff --git a/packages/misskey-js/src/autogen/apiClientJSDoc.ts b/packages/misskey-js/src/autogen/apiClientJSDoc.ts
index 4a13045592..5407b7a653 100644
--- a/packages/misskey-js/src/autogen/apiClientJSDoc.ts
+++ b/packages/misskey-js/src/autogen/apiClientJSDoc.ts
@@ -713,6 +713,17 @@ declare module '../api.js' {
credential?: string | null,
): Promise>;
+ /**
+ * No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:admin:queue*
+ */
+ request(
+ endpoint: E,
+ params: P,
+ credential?: string | null,
+ ): Promise>;
+
/**
* No description provided.
*
diff --git a/packages/misskey-js/src/autogen/endpoint.ts b/packages/misskey-js/src/autogen/endpoint.ts
index 5ef493946c..d7cb2a46eb 100644
--- a/packages/misskey-js/src/autogen/endpoint.ts
+++ b/packages/misskey-js/src/autogen/endpoint.ts
@@ -88,6 +88,8 @@ import type {
AdminQueueRetryJobRequest,
AdminQueueShowJobRequest,
AdminQueueShowJobResponse,
+ AdminQueueShowJobLogsRequest,
+ AdminQueueShowJobLogsResponse,
AdminQueueStatsResponse,
AdminRelaysAddRequest,
AdminRelaysAddResponse,
@@ -717,6 +719,7 @@ export type Endpoints = {
'admin/queue/remove-job': { req: AdminQueueRemoveJobRequest; res: EmptyResponse };
'admin/queue/retry-job': { req: AdminQueueRetryJobRequest; res: EmptyResponse };
'admin/queue/show-job': { req: AdminQueueShowJobRequest; res: AdminQueueShowJobResponse };
+ 'admin/queue/show-job-logs': { req: AdminQueueShowJobLogsRequest; res: AdminQueueShowJobLogsResponse };
'admin/queue/stats': { req: EmptyRequest; res: AdminQueueStatsResponse };
'admin/relays/add': { req: AdminRelaysAddRequest; res: AdminRelaysAddResponse };
'admin/relays/list': { req: EmptyRequest; res: AdminRelaysListResponse };
diff --git a/packages/misskey-js/src/autogen/entities.ts b/packages/misskey-js/src/autogen/entities.ts
index a11bbefde5..a14febb6e6 100644
--- a/packages/misskey-js/src/autogen/entities.ts
+++ b/packages/misskey-js/src/autogen/entities.ts
@@ -91,6 +91,8 @@ export type AdminQueueRemoveJobRequest = operations['admin___queue___remove-job'
export type AdminQueueRetryJobRequest = operations['admin___queue___retry-job']['requestBody']['content']['application/json'];
export type AdminQueueShowJobRequest = operations['admin___queue___show-job']['requestBody']['content']['application/json'];
export type AdminQueueShowJobResponse = operations['admin___queue___show-job']['responses']['200']['content']['application/json'];
+export type AdminQueueShowJobLogsRequest = operations['admin___queue___show-job-logs']['requestBody']['content']['application/json'];
+export type AdminQueueShowJobLogsResponse = operations['admin___queue___show-job-logs']['responses']['200']['content']['application/json'];
export type AdminQueueStatsResponse = operations['admin___queue___stats']['responses']['200']['content']['application/json'];
export type AdminRelaysAddRequest = operations['admin___relays___add']['requestBody']['content']['application/json'];
export type AdminRelaysAddResponse = operations['admin___relays___add']['responses']['200']['content']['application/json'];
diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts
index c0a6dca67e..50a96174c7 100644
--- a/packages/misskey-js/src/autogen/types.ts
+++ b/packages/misskey-js/src/autogen/types.ts
@@ -584,6 +584,15 @@ export type paths = {
*/
post: operations['admin___queue___show-job'];
};
+ '/admin/queue/show-job-logs': {
+ /**
+ * admin/queue/show-job-logs
+ * @description No description provided.
+ *
+ * **Credential required**: *Yes* / **Permission**: *read:admin:queue*
+ */
+ post: operations['admin___queue___show-job-logs'];
+ };
'/admin/queue/stats': {
/**
* admin/queue/stats
@@ -10167,6 +10176,73 @@ export interface operations {
};
};
};
+ 'admin___queue___show-job-logs': {
+ requestBody: {
+ content: {
+ 'application/json': {
+ /** @enum {string} */
+ queue: 'system' | 'endedPollNotification' | 'deliver' | 'inbox' | 'db' | 'relationship' | 'objectStorage' | 'userWebhookDeliver' | 'systemWebhookDeliver';
+ jobId: string;
+ };
+ };
+ };
+ responses: {
+ /** @description OK (with results) */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ 'application/json': string[];
+ };
+ };
+ /** @description Client error */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Authentication error */
+ 401: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Forbidden error */
+ 403: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description I'm Ai */
+ 418: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ /** @description Internal server error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ 'application/json': components['schemas']['Error'];
+ };
+ };
+ };
+ };
admin___queue___stats: {
responses: {
/** @description OK (with results) */
--
cgit v1.2.3-freya
From 7595bff43bc5f93bb0c1019796996eed9e25a4e5 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Sat, 9 Aug 2025 14:37:09 +0900
Subject: fix(backend): prevent run repeatable job immediately
Fix #16357
---
packages/backend/src/core/QueueService.ts | 1 +
1 file changed, 1 insertion(+)
(limited to 'packages/backend/src/core/QueueService.ts')
diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts
index 4be568b334..0f225a8242 100644
--- a/packages/backend/src/core/QueueService.ts
+++ b/packages/backend/src/core/QueueService.ts
@@ -103,6 +103,7 @@ export class QueueService {
for (const def of REPEATABLE_SYSTEM_JOB_DEF) {
this.systemQueue.upsertJobScheduler(def.name, {
pattern: def.pattern,
+ immediately: false,
}, {
name: def.name,
opts: {
--
cgit v1.2.3-freya