mirror of
				https://github.com/9technologygroup/patchmon.net.git
				synced 2025-10-31 20:13:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const { PrismaClient } = require("@prisma/client");
 | |
| const bcrypt = require("bcryptjs");
 | |
| const readline = require("node:readline");
 | |
| 
 | |
| const prisma = new PrismaClient();
 | |
| 
 | |
| const rl = readline.createInterface({
 | |
| 	input: process.stdin,
 | |
| 	output: process.stdout,
 | |
| });
 | |
| 
 | |
| const question = (query) =>
 | |
| 	new Promise((resolve) => rl.question(query, resolve));
 | |
| 
 | |
| async function setupAdminUser() {
 | |
| 	try {
 | |
| 		console.log("🔐 Setting up PatchMon Admin User");
 | |
| 		console.log("=====================================\n");
 | |
| 
 | |
| 		// Check if any users exist
 | |
| 		const existingUsers = await prisma.users.count();
 | |
| 		if (existingUsers > 0) {
 | |
| 			console.log("⚠️  Users already exist in the database.");
 | |
| 			const overwrite = await question(
 | |
| 				"Do you want to create another admin user? (y/N): ",
 | |
| 			);
 | |
| 			if (
 | |
| 				overwrite.toLowerCase() !== "y" &&
 | |
| 				overwrite.toLowerCase() !== "yes"
 | |
| 			) {
 | |
| 				console.log("❌ Setup cancelled.");
 | |
| 				return;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Get user input
 | |
| 		const username = await question("Enter admin username: ");
 | |
| 		if (!username.trim()) {
 | |
| 			console.log("❌ Username is required.");
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		const email = await question("Enter admin email: ");
 | |
| 		if (!email.trim()) {
 | |
| 			console.log("❌ Email is required.");
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		const password = await question(
 | |
| 			"Enter admin password (min 6 characters): ",
 | |
| 		);
 | |
| 		if (password.length < 6) {
 | |
| 			console.log("❌ Password must be at least 6 characters.");
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Check if username or email already exists
 | |
| 		const existingUser = await prisma.users.findFirst({
 | |
| 			where: {
 | |
| 				OR: [{ username: username.trim() }, { email: email.trim() }],
 | |
| 			},
 | |
| 		});
 | |
| 
 | |
| 		if (existingUser) {
 | |
| 			console.log("❌ Username or email already exists.");
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Hash password
 | |
| 		console.log("\n🔄 Creating admin user...");
 | |
| 		const passwordHash = await bcrypt.hash(password, 12);
 | |
| 
 | |
| 		// Create admin user
 | |
| 		const user = await prisma.users.create({
 | |
| 			data: {
 | |
| 				id: require("node:crypto").randomUUID(),
 | |
| 				username: username.trim(),
 | |
| 				email: email.trim(),
 | |
| 				password_hash: passwordHash,
 | |
| 				role: "admin",
 | |
| 				is_active: true,
 | |
| 				created_at: new Date(),
 | |
| 				updated_at: new Date(),
 | |
| 			},
 | |
| 			select: {
 | |
| 				id: true,
 | |
| 				username: true,
 | |
| 				email: true,
 | |
| 				role: true,
 | |
| 				created_at: true,
 | |
| 			},
 | |
| 		});
 | |
| 
 | |
| 		console.log("✅ Admin user created successfully!");
 | |
| 		console.log("\n📋 User Details:");
 | |
| 		console.log(`   Username: ${user.username}`);
 | |
| 		console.log(`   Email: ${user.email}`);
 | |
| 		console.log(`   Role: ${user.role}`);
 | |
| 		console.log(`   Created: ${user.created_at.toISOString()}`);
 | |
| 
 | |
| 		console.log("\n🎉 Setup complete!");
 | |
| 		console.log("\nNext steps:");
 | |
| 		console.log(
 | |
| 			"1. The backend server is already running as a systemd service",
 | |
| 		);
 | |
| 		console.log("2. The frontend is already built and served by Nginx");
 | |
| 		console.log(
 | |
| 			"3. Visit https://" +
 | |
| 				process.env.FQDN +
 | |
| 				" and login with your credentials",
 | |
| 		);
 | |
| 		console.log(
 | |
| 			"4. Use the management script: ./manage.sh {status|restart|logs|update|backup|credentials|reset-admin}",
 | |
| 		);
 | |
| 	} catch (error) {
 | |
| 		console.error("❌ Error setting up admin user:", error);
 | |
| 	} finally {
 | |
| 		rl.close();
 | |
| 		await prisma.$disconnect();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Run the setup
 | |
| setupAdminUser();
 |