From 7ef2c626e29af3c42e91cb1de7d057d306456dd1 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Sat, 2 Aug 2025 18:04:04 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20feat:=20Add=20Reset-Mei?= =?UTF-8?q?li-Sync=20Script=20for=20MongoDB=20Flags=20(#8823)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/reset-meili-sync.js | 92 ++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 93 insertions(+) create mode 100644 config/reset-meili-sync.js diff --git a/config/reset-meili-sync.js b/config/reset-meili-sync.js new file mode 100644 index 000000000..e29324d6a --- /dev/null +++ b/config/reset-meili-sync.js @@ -0,0 +1,92 @@ +const path = require('path'); +const mongoose = require(path.resolve(__dirname, '..', 'api', 'node_modules', 'mongoose')); +require('module-alias')({ base: path.resolve(__dirname, '..', 'api') }); +const { askQuestion, silentExit } = require('./helpers'); +const connect = require('./connect'); + +(async () => { + await connect(); + + console.purple('---------------------------------------'); + console.purple('Reset MeiliSearch Synchronization Flags'); + console.purple('---------------------------------------'); + console.yellow('\nThis script will reset the MeiliSearch indexing flags in MongoDB.'); + console.yellow('Use this when MeiliSearch data has been deleted or corrupted,'); + console.yellow('and you need to trigger a full re-synchronization.\n'); + + const confirm = await askQuestion( + 'Are you sure you want to reset all MeiliSearch sync flags? (y/N): ', + ); + + if (confirm.toLowerCase() !== 'y') { + console.orange('Operation cancelled.'); + silentExit(0); + } + + try { + // Reset _meiliIndex flags for messages + console.cyan('\nResetting message sync flags...'); + const messageResult = await mongoose.connection.db + .collection('messages') + .updateMany({ _meiliIndex: true }, { $set: { _meiliIndex: false } }); + + console.green(`✓ Reset ${messageResult.modifiedCount} message sync flags`); + + // Reset _meiliIndex flags for conversations + console.cyan('\nResetting conversation sync flags...'); + const conversationResult = await mongoose.connection.db + .collection('conversations') + .updateMany({ _meiliIndex: true }, { $set: { _meiliIndex: false } }); + + console.green(`✓ Reset ${conversationResult.modifiedCount} conversation sync flags`); + + // Get current counts + const totalMessages = await mongoose.connection.db.collection('messages').countDocuments(); + const totalConversations = await mongoose.connection.db + .collection('conversations') + .countDocuments(); + + console.purple('\n---------------------------------------'); + console.green('MeiliSearch sync flags have been reset successfully!'); + console.cyan(`\nTotal messages to sync: ${totalMessages}`); + console.cyan(`Total conversations to sync: ${totalConversations}`); + console.yellow('\nThe next time LibreChat starts or performs a sync check,'); + console.yellow('all data will be re-indexed into MeiliSearch.'); + console.purple('---------------------------------------\n'); + + // Ask if user wants to see advanced options + const showAdvanced = await askQuestion('Show advanced options? (y/N): '); + + if (showAdvanced.toLowerCase() === 'y') { + console.cyan('\nAdvanced Options:'); + console.yellow('1. To trigger immediate sync, restart LibreChat'); + console.yellow('2. To disable sync, set MEILI_NO_SYNC=true in .env'); + console.yellow( + '3. To adjust sync batch size, set MEILI_SYNC_BATCH_SIZE in .env (default: 100)', + ); + console.yellow('4. To adjust sync delay, set MEILI_SYNC_DELAY_MS in .env (default: 100ms)'); + console.yellow( + '5. To change sync threshold, set MEILI_SYNC_THRESHOLD in .env (default: 1000)\n', + ); + } + + silentExit(0); + } catch (error) { + console.red('\nError resetting MeiliSearch sync flags:'); + console.error(error); + silentExit(1); + } +})(); + +process.on('uncaughtException', (err) => { + if (!err.message.includes('fetch failed')) { + console.error('There was an uncaught error:'); + console.error(err); + } + + if (err.message.includes('fetch failed')) { + return; + } else { + process.exit(1); + } +}); diff --git a/package.json b/package.json index 36327241a..c39c5444d 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "reset-password": "node config/reset-password.js", "ban-user": "node config/ban-user.js", "delete-user": "node config/delete-user.js", + "reset-meili-sync": "node config/reset-meili-sync.js", "update-banner": "node config/update-banner.js", "delete-banner": "node config/delete-banner.js", "backend": "cross-env NODE_ENV=production node api/server/index.js",