import fs from "fs"; import crypto from "crypto"; import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); const allPermissions = [ "dashboard_read", "tools_read", "websites_manage", "domains_manage", "files_manage", "databases_manage", "email_manage", "metrics_read", "security_manage", "software_manage", "advanced_manage", "servers_manage", "users_manage", "resellers_manage", "backups_manage", "automation_manage", "notifications_read", "audit_read", "support_manage", "settings_manage", ]; function hashPassword(password) { const salt = crypto.randomBytes(24).toString("hex"); const hash = crypto.scryptSync(password, salt, 64).toString("hex"); return `scrypt$${salt}$${hash}`; } function initials(name) { return name .split(/\s+/) .filter(Boolean) .map((part) => part[0]) .join("") .slice(0, 2) .toUpperCase(); } async function main() { const email = process.env.ADMIN_EMAIL || "admin@cp.asabbagh.com"; const password = process.env.ADMIN_PASSWORD || crypto.randomBytes(30).toString("base64url"); const name = process.env.ADMIN_NAME || "CoaxysPanel Administrator"; const accountId = process.env.ADMIN_ACCOUNT_ID || "acct-main"; await prisma.hostingAccount.upsert({ where: { id: accountId }, create: { id: accountId, username: "coaxys", primaryDomain: "example.com", homeDirectory: "/home/coaxys", sharedIp: "127.0.0.1", theme: "dark", }, update: {}, }); const user = await prisma.user.upsert({ where: { email }, create: { name, email, passwordHash: hashPassword(password), role: "owner", avatarInitials: initials(name), twoFactorEnabled: false, permissions: { create: allPermissions.map((permission) => ({ permission })), }, accounts: { create: { accountId }, }, }, update: { name, passwordHash: hashPassword(password), role: "owner", avatarInitials: initials(name), twoFactorEnabled: false, }, }); await prisma.accountUser.upsert({ where: { userId_accountId: { userId: user.id, accountId } }, create: { userId: user.id, accountId }, update: {}, }); await prisma.userPermission.deleteMany({ where: { userId: user.id } }); await prisma.userPermission.createMany({ data: allPermissions.map((permission) => ({ userId: user.id, permission })), }); const credentialPath = ".admin-credentials"; const content = [ "CoaxysPanel admin credentials", `Generated: ${new Date().toISOString()}`, `URL: https://cp.asabbagh.com/login`, `Email: ${email}`, `Password: ${password}`, "", ].join("\n"); fs.writeFileSync(credentialPath, content, { mode: 0o600 }); fs.chmodSync(credentialPath, 0o600); console.log(`Admin account ready: ${email}`); console.log(`Credentials written to ${credentialPath}`); } main() .catch((error) => { console.error(error); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });