====== Librechat ====== ; URL : https://librechat.smns-bw.org/ ; MongoDB Adminuser : mdbo ; MongoDB Adminuser PW : U2FsdGVkX1/6ORVZ1u2ulqcEjXtv89TL0JKf/CsVERKIofBJk/ek5qWn2yVgxJAH \\ npm läuft innerhalb des Containers! ===== Librechat updaten ===== docker compose down git pull docker compose pull docker compose up -d ===== Nutzerstatistik auslesen ===== npm run user-stats Dafür musste config/user-stats.js erweitert werden: const path = require('path'); require('module-alias')({ base: path.resolve(__dirname, '..', 'api') }); const { silentExit } = require('./helpers'); const Conversation = require('~/models/schema/convoSchema'); const Message = require('~/models/schema/messageSchema'); const User = require('~/models/User'); const { Transaction } = require('~/models/Transaction'); // Correctly destructure to get the Transaction model const connect = require('./connect'); (async () => { await connect(); console.log('-----------------------------'); console.log('Show the stats of all users'); console.log('-----------------------------'); let users = await User.find({}); let userData = []; for (const user of users) { let conversationsCount = (await Conversation.count({ user: user._id })) ?? 0; let messagesCount = (await Message.count({ user: user._id })) ?? 0; // Aggregate transaction data for the user let transactions = await Transaction.find({ user: user._id }); // Aggregate transaction data for the user let totalRawAmount = transactions.reduce((sum, tx) => sum + tx.rawAmount, 0); let totalTokenValue = transactions.reduce((sum, tx) => sum + tx.tokenValue, 0); userData.push({ User: user.name, Email: user.email, Conversations: conversationsCount, Messages: messagesCount, TotalRawAmount: totalRawAmount, TotalTokenValue: totalTokenValue, }); } userData.sort((a, b) => { if (a.Conversations !== b.Conversations) { return b.Conversations - a.Conversations; } return b.Messages - a.Messages; }); console.table(userData); silentExit(0); })(); 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')) { process.exit(1); } }); ===== Nutzern Balance/Token geben ===== Im Container: npm run add-balance wiebke.walbaum@smns-bw.de 1000000000 Es läuft ein bash Skript add_balance.sh via Crontab alle 3min, dass jedem Nutzer, der keine Balance hat 1Mrd gibt: */3 * * * * root /opt/librechat/add_balance.sh >> /opt/librechat/logs/add_balance.log 2>&1 #!/bin/bash add_balance=${1:-1000000000} response=$(docker exec LibreChat npm run list-balances | grep "has no balance") emails=($(echo "$response" | grep -oP "[a-zA-Z0-9_.+-]+@[a-zA-Z-]+\.[a-zA-Z-.]+")) for email in "${emails[@]}"; do docker exec LibreChat npm run add-balance "$email" "$add_balance" done ===== Nutzer händisch anlegen ===== In den Container via sh: docker exec -it LibreChat sh Nutzer anlegen z.B.: npm run create-user Email: > sven.hirth@smns-bw.de Name: (default is: sven.hirth) > Sven Hirth Username: (default is: sven.hirth) > shirth Password: (leave blank, to generate one) > Your password is: abcdef123456 User created successfully! Passwort dem Nutzer mitteilen. ===== Aktivitäten in der MongoDB ===== Connect: docker exec -it chat-mongodb mongosh Useful commands: show dbs use LibreChat show collections db.users.find() User erstellen db.createUser({ user: "mdbo", pwd: "", roles: ["userAdminAnyDatabase", "readWriteAnyDatabase"] }) User löschen db.users.deleteOne({email: 'tatjana.tull@smns-bw.de'}); User Rechte geben db.grantRolesToUser("mdbo", ["clusterAdmin", "readAnyDatabase"]); User Plugin auf DALL-E 3 setzen db.users.update({provider: "local"}, {$set: {plugins: ['dalle']}}, {multi: true}) User händisch auf E-Mail verifiziert setzen db.users.updateOne( { username: 'wwalbaum' }, { $set: { emailVerified: true } } )