mirror of
https://github.com/labring/FastGPT.git
synced 2026-05-10 01:08:08 +08:00
58000324e2
* feat(marketplace): update plugin/ download count statistic (#5957) * feat: download count * feat: update ui * fix: ui * chore: update sdk verison * chore: update .env.template * chore: adjust * chore: remove console.log * chore: adjust * Update projects/marketplace/src/pages/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update projects/marketplace/src/pages/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update projects/app/src/pages/config/tool/marketplace.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * fix: update refresh; feat: marketplace download count per hour --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * download * marketplace code * fix: ui (#5963) * feat: support dataset and files as global variables (#5961) * json & dataset * file * fix file var * fix * fix init * remove * perf: file vars * fix: file uploading errors (#5969) * fix: file uploading errors * fix build * perf: fileselector ux * feat: integrate S3 for dataset with compatibility (#5941) * fix: text split * remove test * feat: integrate S3 for dataset with compatibility * fix: delay s3 files delete timing * fix: remove imageKeys * fix: remove parsed images' TTL * fix: improve codes by pr comments --------- Co-authored-by: archer <545436317@qq.com> * remove log * perf: request limit * chore: s3 migration script (#5971) * test * perf: s3 code * fix: migration script (#5972) * perf: s3 move object * wip: fix s3 bugs (#5976) * fix: incorrect replace origin logic (#5978) * fix: add downloadURL (#5980) * perf: file variable ttl & quick create dataset with temp s3 bucket (#5973) * perf: file variable ttl & quick create dataset with temp s3 bucket * fix * plugin & form input variables (#5979) * plugin & form input variables * fix * docs: 4143.mdx (#5981) * doc: update 4143.mdx (#5982) * fix form input file ttl (#5983) * trans file type (#5986) * trans file type * fix * fix: S3 script early return (#5985) * fix: S3 script typeof * fix: truncate large filename to fit S3 name * perf(permission): add a schema verification for resource permission, tmbId, groupId, orgId should be set at least one of them (#5987) * fix: version & typo (#5988) * fix-v4.14.3 (#5991) * fix: empty alt make replace JWT failed & incorrect image dataset preview url (#5989) * fix: empty alt make replace JWT failed & incorrect image dataset preview url * fix: s3 files recovery script * fix: incorrect chat external url parsing (#5993) --------- Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: heheer <heheer@sealos.io> Co-authored-by: Roy <whoeverimf5@gmail.com>
83 lines
2.4 KiB
TypeScript
83 lines
2.4 KiB
TypeScript
import { MongoS3TTL } from './schema';
|
|
import { addLog } from '../system/log';
|
|
import { setCron } from '../system/cron';
|
|
import { checkTimerLock } from '../system/timerLock/utils';
|
|
import { TimerIdEnum } from '../system/timerLock/constants';
|
|
import path from 'node:path';
|
|
|
|
export async function clearExpiredMinioFiles() {
|
|
try {
|
|
const expiredFiles = await MongoS3TTL.find({
|
|
expiredTime: { $lte: new Date() }
|
|
}).lean();
|
|
if (expiredFiles.length === 0) {
|
|
addLog.info('No expired minio files to clean');
|
|
return;
|
|
}
|
|
|
|
addLog.info(`Found ${expiredFiles.length} expired minio files to clean`);
|
|
|
|
let success = 0;
|
|
let fail = 0;
|
|
|
|
for (const file of expiredFiles) {
|
|
try {
|
|
const bucketName = file.bucketName;
|
|
const bucket = global.s3BucketMap[bucketName];
|
|
|
|
if (bucket) {
|
|
await bucket.delete(file.minioKey);
|
|
|
|
if (!file.minioKey.includes('-parsed/')) {
|
|
try {
|
|
const dir = path.dirname(file.minioKey);
|
|
const basename = path.basename(file.minioKey);
|
|
const ext = path.extname(basename);
|
|
|
|
if (ext) {
|
|
const nameWithoutExt = path.basename(basename, ext);
|
|
const parsedPrefix = `${dir}/${nameWithoutExt}-parsed`;
|
|
|
|
await bucket.addDeleteJob({ prefix: parsedPrefix });
|
|
addLog.info(`Scheduled deletion of parsed images: ${parsedPrefix}`);
|
|
}
|
|
} catch (error) {
|
|
addLog.debug(`Failed to schedule parsed images deletion for ${file.minioKey}`);
|
|
}
|
|
}
|
|
|
|
await MongoS3TTL.deleteOne({ _id: file._id });
|
|
|
|
success++;
|
|
addLog.info(
|
|
`Deleted expired minio file: ${file.minioKey} from bucket: ${file.bucketName}`
|
|
);
|
|
} else {
|
|
addLog.warn(`Bucket not found: ${file.bucketName}`);
|
|
}
|
|
} catch (error) {
|
|
fail++;
|
|
addLog.error(`Failed to delete minio file: ${file.minioKey}`, error);
|
|
}
|
|
}
|
|
|
|
addLog.info(`Minio TTL cleanup completed. Success: ${success}, Failed: ${fail}`);
|
|
} catch (error) {
|
|
addLog.error('Error in clearExpiredMinioFiles', error);
|
|
}
|
|
}
|
|
|
|
export function clearExpiredS3FilesCron() {
|
|
// 每小时执行一次
|
|
setCron('0 */1 * * *', async () => {
|
|
if (
|
|
await checkTimerLock({
|
|
timerId: TimerIdEnum.clearExpiredMinioFiles,
|
|
lockMinuted: 59
|
|
})
|
|
) {
|
|
await clearExpiredMinioFiles();
|
|
}
|
|
});
|
|
}
|