import { createDb } from './client'; import { games } from './schema/games'; import { users } from './schema/users'; async function seed() { const databaseUrl = process.env.DATABASE_URL; if (!databaseUrl) { console.error('DATABASE_URL is required'); process.exit(1); } const db = createDb(databaseUrl); // Seed super admin console.log('Seeding super admin...'); // Password: admin123 (argon2id hash) // In production, change this immediately after first login const ADMIN_PASSWORD_HASH = '$argon2id$v=19$m=65536,t=3,p=4$3968YbMY1wOYMK5NTLa2dQ$j8BkXfK7znAAiuYiC9zWgOaBK11VeimROd28QOMMgd0'; await db .insert(users) .values({ email: 'admin@gamepanel.local', username: 'admin', passwordHash: ADMIN_PASSWORD_HASH, isSuperAdmin: true, }) .onConflictDoUpdate({ target: users.email, set: { username: 'admin', passwordHash: ADMIN_PASSWORD_HASH, isSuperAdmin: true, updatedAt: new Date(), }, }); // Seed games console.log('Seeding games...'); await db .insert(games) .values([ { slug: 'minecraft-java', name: 'Minecraft: Java Edition', dockerImage: 'itzg/minecraft-server:latest', defaultPort: 25565, startupCommand: '/start', stopCommand: 'stop', configFiles: [ { path: 'server.properties', parser: 'properties', editableKeys: [ 'server-port', 'max-players', 'motd', 'difficulty', 'gamemode', 'level-seed', 'pvp', 'spawn-protection', 'view-distance', 'online-mode', 'white-list', ], }, { path: 'ops.json', parser: 'json' }, { path: 'whitelist.json', parser: 'json' }, { path: 'bukkit.yml', parser: 'yaml' }, { path: 'spigot.yml', parser: 'yaml' }, ], environmentVars: [ { key: 'EULA', default: 'TRUE', description: 'Accept Minecraft EULA', required: true }, { key: 'TYPE', default: 'PAPER', description: 'Server type (VANILLA, PAPER, SPIGOT, FORGE, FABRIC)', required: true, }, { key: 'VERSION', default: 'LATEST', description: 'Minecraft version', required: true, }, { key: 'MEMORY', default: '1G', description: 'JVM memory allocation', required: false }, ], }, { slug: 'cs2', name: 'Counter-Strike 2', dockerImage: 'cm2network/cs2:latest', defaultPort: 27015, startupCommand: '', stopCommand: 'quit', configFiles: [ { path: 'game/csgo/cfg/server.cfg', parser: 'keyvalue', editableKeys: [ 'hostname', 'sv_password', 'rcon_password', 'sv_cheats', 'mp_autoteambalance', 'mp_limitteams', ], }, { path: 'game/csgo/cfg/autoexec.cfg', parser: 'keyvalue' }, ], automationRules: [ { id: 'cs2-install-latest-metamod', event: 'server.install.completed', enabled: true, runOncePerServer: true, continueOnError: false, actions: [ { id: 'install-cs2-metamod', type: 'http_directory_extract', indexUrl: 'https://mms.alliedmods.net/mmsdrop/2.0/', assetNamePattern: '^mmsource-2\\.0\\.0-git\\d+-linux\\.tar\\.gz$', destination: '/game/csgo', stripComponents: 0, maxBytes: 256 * 1024 * 1024, }, ], }, { id: 'cs2-install-latest-counterstrikesharp-runtime', event: 'server.install.completed', enabled: true, runOncePerServer: true, continueOnError: false, actions: [ { id: 'install-cs2-runtime', type: 'github_release_extract', owner: 'roflmuffin', repo: 'CounterStrikeSharp', assetNamePatterns: [ '^counterstrikesharp-with-runtime-.*linux.*\\.zip$', '^counterstrikesharp-with-runtime.*\\.zip$', ], destination: '/game/csgo', stripComponents: 0, maxBytes: 256 * 1024 * 1024, }, ], }, ], environmentVars: [ { key: 'SRCDS_TOKEN', default: '', description: 'Steam Game Server Login Token (optional for local testing)', required: false, }, { key: 'CS2_SERVERNAME', default: 'GamePanel CS2 Server', description: 'Server name', required: false }, { key: 'CS2_PORT', default: '27015', description: 'Game port', required: false }, { key: 'CS2_STARTMAP', default: 'de_dust2', description: 'Initial map', required: false }, { key: 'CS2_MAXPLAYERS', default: '16', description: 'Max players', required: false }, { key: 'CS2_RCONPW', default: '', description: 'RCON password', required: false }, { key: 'CS2_IP', default: '0.0.0.0', description: 'Bind address', required: false, }, ], }, { slug: 'minecraft-bedrock', name: 'Minecraft: Bedrock Edition', dockerImage: 'itzg/minecraft-bedrock-server:latest', defaultPort: 19132, startupCommand: '', stopCommand: 'stop', configFiles: [ { path: 'server.properties', parser: 'properties', editableKeys: [ 'server-name', 'server-port', 'max-players', 'gamemode', 'difficulty', 'level-seed', 'online-mode', 'allow-cheats', 'view-distance', ], }, ], environmentVars: [ { key: 'EULA', default: 'TRUE', description: 'Accept Minecraft EULA', required: true }, { key: 'VERSION', default: 'LATEST', description: 'Bedrock server version', required: true }, ], }, { slug: 'terraria', name: 'Terraria', dockerImage: 'ryshe/terraria:latest', defaultPort: 7777, startupCommand: '', stopCommand: 'exit', configFiles: [ { path: 'serverconfig.txt', parser: 'keyvalue', editableKeys: [ 'worldname', 'maxplayers', 'password', 'motd', 'difficulty', 'worldsize', ], }, ], environmentVars: [ { key: 'WORLD_NAME', default: 'world', description: 'World file name', required: true }, ], }, { slug: 'rust', name: 'Rust', dockerImage: 'didstopia/rust-server:latest', defaultPort: 28015, startupCommand: '', stopCommand: 'quit', configFiles: [], environmentVars: [ { key: 'RUST_SERVER_NAME', default: 'My Rust Server', description: 'Server name', required: true }, { key: 'RUST_SERVER_MAXPLAYERS', default: '50', description: 'Max players', required: false }, { key: 'RUST_SERVER_IDENTITY', default: 'default', description: 'Server identity', required: false }, { key: 'RUST_RCON_PASSWORD', default: '', description: 'RCON password', required: true }, ], }, ]) .onConflictDoNothing(); console.log('Seed completed successfully!'); process.exit(0); } seed().catch((err) => { console.error('Seed failed:', err); process.exit(1); });