docs: add complete guide, env files, fix docker-compose
- Add GUIDE.md: complete user documentation covering installation, Docker deployment, AI providers, MCP server, N8N integration, email config, admin panel, env var reference, troubleshooting - Add mcp-server/.env.example with all MCP-specific variables - Update .env.docker.example with all 42 environment variables - Fix docker-compose.yml: parameterize PostgreSQL credentials, add missing env vars (CUSTOM_OPENAI, AI_PROVIDER_CHAT, ALLOW_REGISTRATION, RESEND_API_KEY) - Track memento-note/.env.example
This commit is contained in:
@@ -3,8 +3,19 @@ import { prisma } from '../lib/prisma'
|
||||
import bcrypt from 'bcryptjs'
|
||||
|
||||
async function main() {
|
||||
const email = 'test@example.com'
|
||||
const newPassword = 'password123'
|
||||
const email = process.argv[2]
|
||||
const newPassword = process.argv[3]
|
||||
|
||||
if (!email || !newPassword) {
|
||||
console.error('Usage: npx tsx scripts/reset-password-auto.ts <email> <new-password>')
|
||||
console.error('Example: npx tsx scripts/reset-password-auto.ts user@example.com mynewpassword')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
if (newPassword.length < 6) {
|
||||
console.error('Password must be at least 6 characters')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log(`Resetting password for ${email}...`)
|
||||
|
||||
@@ -19,9 +30,9 @@ async function main() {
|
||||
resetTokenExpiry: null
|
||||
},
|
||||
})
|
||||
console.log(`✅ Password successfully reset for ${user.email}`)
|
||||
console.log(`Password successfully reset for ${user.email}`)
|
||||
} catch (error) {
|
||||
console.error('❌ Error resetting password:', error)
|
||||
console.error('Error resetting password:', error)
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,12 @@
|
||||
/**
|
||||
* Script DIRECT de reset de mot de passe
|
||||
*
|
||||
* POURQUOI CE SCRIPT ?
|
||||
* -----------------
|
||||
* - Le compte `test@example.com` N'EXISTE PAS (vous avez raison !)
|
||||
* - L'envoi d'email nécessite une configuration SMTP complexe
|
||||
* - VOUS VOULEZ UNE SOLUTION DIRECTE, SANS PERDRE DE TEMPS
|
||||
*
|
||||
* CE QUE FAIT CE SCRIPT :
|
||||
* -------------------
|
||||
* - Réinitialise DIRECTEMENT le mot de passe d'un compte existant
|
||||
* - Sans avoir besoin d'email
|
||||
* - Sans avoir besoin d'interface graphique
|
||||
*
|
||||
* COMMENT UTILISER :
|
||||
* ---------------
|
||||
* 1. Ouvrez un terminal dans le dossier memento-note
|
||||
* 2. Exécutez: node scripts/reset-password.js
|
||||
* 3. Quand demandé, entrez l'email du compte à réinitialiser
|
||||
* 4. Entrez le nouveau mot de passe (2 fois pour confirmation)
|
||||
* 5. FINI ! Connectez-vous avec le nouveau mot de passe
|
||||
* Interactive password reset script
|
||||
*
|
||||
* USAGE:
|
||||
* 1. Open a terminal in the memento-note directory
|
||||
* 2. Run: node scripts/reset-password.js
|
||||
* 3. Enter the email of the account to reset
|
||||
* 4. Enter the new password (twice for confirmation)
|
||||
* 5. Done! Log in with the new password
|
||||
*/
|
||||
|
||||
const readline = require('readline');
|
||||
@@ -31,25 +18,25 @@ const rl = readline.createInterface({
|
||||
output: process.stdout
|
||||
});
|
||||
|
||||
console.log('╔══════════════════════════════════════════════════════════════════╗');
|
||||
console.log('║ RESET DE MOT DE PASSE DIRECT ║');
|
||||
console.log('║ ║');
|
||||
console.log('║ ⚠️ ATTENTION : Utilisez seulement pour VOTRE propre compte ! ║');
|
||||
console.log('║ ║');
|
||||
console.log('╚══════════════════════════════════════════════════════════════════════╝');
|
||||
console.log('================================================================');
|
||||
console.log(' INTERACTIVE PASSWORD RESET');
|
||||
console.log('');
|
||||
console.log(' WARNING: Use only for your own account!');
|
||||
console.log('');
|
||||
console.log('================================================================');
|
||||
console.log('');
|
||||
|
||||
rl.question('Entrez l\'EMAIL du compte à réinitialiser : ', async (email) => {
|
||||
rl.question('Enter the EMAIL of the account to reset: ', async (email) => {
|
||||
if (!email || !email.includes('@')) {
|
||||
console.log('❌ Erreur : Email invalide !');
|
||||
console.log('Error: Invalid email!');
|
||||
rl.close();
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
email = email.toLowerCase().trim();
|
||||
|
||||
console.log(`🔍 Recherche du compte : ${email}...`);
|
||||
|
||||
|
||||
console.log(`Looking up account: ${email}...`);
|
||||
|
||||
try {
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { email: email }
|
||||
@@ -57,56 +44,55 @@ rl.question('Entrez l\'EMAIL du compte à réinitialiser : ', async (email) => {
|
||||
|
||||
if (!user) {
|
||||
console.log('');
|
||||
console.log('❌ ERREUR : AUCUN compte trouvé avec cet email !');
|
||||
console.log('ERROR: No account found with this email!');
|
||||
console.log('');
|
||||
console.log('📋 COMPTES DISPONIBLES (si existants) :');
|
||||
console.log('─────────────────────────────────────────');
|
||||
|
||||
// Afficher tous les utilisateurs de la base de données
|
||||
console.log('AVAILABLE ACCOUNTS (if any):');
|
||||
console.log('-------------------------');
|
||||
|
||||
const allUsers = await prisma.user.findMany({
|
||||
select: { email: true, name: true, role: true, createdAt: true },
|
||||
orderBy: { createdAt: 'desc' }
|
||||
});
|
||||
|
||||
|
||||
if (allUsers.length > 0) {
|
||||
console.log('');
|
||||
allUsers.forEach((u, index) => {
|
||||
console.log(`${index + 1}. 📧 Email: ${u.email}`);
|
||||
console.log(` 👤 Nom: ${u.name || 'N/A'}`);
|
||||
console.log(` 🏷️ Rôle: ${u.role}`);
|
||||
console.log(` 📅 Créé: ${u.createdAt.toLocaleString('fr-FR')}`);
|
||||
console.log(`${index + 1}. Email: ${u.email}`);
|
||||
console.log(` Name: ${u.name || 'N/A'}`);
|
||||
console.log(` Role: ${u.role}`);
|
||||
console.log(` Created: ${u.createdAt.toLocaleString()}`);
|
||||
console.log('');
|
||||
});
|
||||
} else {
|
||||
console.log(' (Aucun compte dans la base de données)');
|
||||
console.log(' (No accounts in the database)');
|
||||
}
|
||||
|
||||
console.log('─────────────────────────────────────────');
|
||||
|
||||
console.log('-------------------------');
|
||||
console.log('');
|
||||
rl.close();
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`✅ Compte trouvé : ${user.email} (${user.name})`);
|
||||
console.log(`Account found: ${user.email} (${user.name})`);
|
||||
console.log('');
|
||||
|
||||
rl.question('Entrez le NOUVEAU mot de passe (minimum 6 caractères) : ', async (newPassword) => {
|
||||
rl.question('Enter the NEW password (minimum 6 characters): ', async (newPassword) => {
|
||||
if (!newPassword || newPassword.length < 6) {
|
||||
console.log('❌ Erreur : Le mot de passe doit avoir au moins 6 caractères !');
|
||||
console.log('Error: Password must be at least 6 characters!');
|
||||
rl.close();
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
rl.question('Confirmez le nouveau mot de passe : ', async (confirmPassword) => {
|
||||
rl.question('Confirm the new password: ', async (confirmPassword) => {
|
||||
if (newPassword !== confirmPassword) {
|
||||
console.log('❌ Erreur : Les mots de passe ne correspondent pas !');
|
||||
console.log('Error: Passwords do not match!');
|
||||
rl.close();
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('');
|
||||
console.log('🔄 Réinitialisation du mot de passe en cours...');
|
||||
|
||||
console.log('Resetting password...');
|
||||
|
||||
const hashedPassword = await bcrypt.hash(newPassword, 10);
|
||||
|
||||
await prisma.user.update({
|
||||
@@ -118,17 +104,15 @@ rl.question('Entrez l\'EMAIL du compte à réinitialiser : ', async (email) => {
|
||||
}
|
||||
});
|
||||
|
||||
console.log('✅ SUCCÈS ! Le mot de passe a été réinitialisé !');
|
||||
console.log('SUCCESS! Password has been reset!');
|
||||
console.log('');
|
||||
console.log('═══════════════════════════════════════════════════════════════════════');
|
||||
console.log('🎉 VOUS POUVEZ MAINTENANT VOUS CONNECTER !');
|
||||
console.log('═════════════════════════════════════════════════════════════════════');
|
||||
console.log('================================================================');
|
||||
console.log('YOU CAN NOW LOG IN!');
|
||||
console.log('================================================================');
|
||||
console.log('');
|
||||
console.log('📱 URL de connexion : http://localhost:3000/login');
|
||||
console.log('📧 Email :', email);
|
||||
console.log('🔑 Mot de passe :', newPassword);
|
||||
console.log('');
|
||||
console.log('⏩ Copiez ces informations et connectez-vous !');
|
||||
console.log('Login URL: http://localhost:3000/login');
|
||||
console.log('Email:', email);
|
||||
console.log('Password:', newPassword);
|
||||
console.log('');
|
||||
|
||||
rl.close();
|
||||
@@ -137,7 +121,7 @@ rl.question('Entrez l\'EMAIL du compte à réinitialiser : ', async (email) => {
|
||||
});
|
||||
} catch (error) {
|
||||
console.log('');
|
||||
console.log('❌ ERREUR lors de la réinitialisation :');
|
||||
console.log('ERROR during password reset:');
|
||||
console.error(error);
|
||||
rl.close();
|
||||
process.exit(1);
|
||||
|
||||
Reference in New Issue
Block a user