12 KiB
GamePanel
Modern, open-source game server management panel built with a multi-tenant SaaS architecture. Inspired by Pterodactyl, enhanced with features like plugin management, visual task scheduler, live player tracking, and an in-browser config editor.
Features
Core
- Multi-Tenant Organizations — Isolated environments with role-based access control (Admin / User + custom JSONB permissions)
- Docker Container Management — Full lifecycle: create, start, stop, restart, kill, delete
- Multi-Node Architecture — Distribute game servers across multiple daemon nodes with health monitoring
- Live Console — xterm.js terminal with Socket.IO streaming, command history support
- File Manager — Browse, view, edit, create, and delete server files with path jail security
- Server Creation Wizard — 3-step guided flow: Basic Info, Node & Allocation, Resources
Game-Specific
- Config Editor — Tab-based UI with parsers for
.properties,.json,.yaml, and Source Engine.cfgformats - Plugin Management — Spiget API integration for Minecraft, manual install for other games, toggle/uninstall
- Player Tracking — Live player list via RCON protocol (Minecraft
list, CS2status)
Advanced
- Scheduled Tasks — Visual scheduler with interval, daily, weekly, and cron expression support
- Backup System — Create, restore, lock/unlock, delete backups with CDN storage integration
- Audit Logging — Track all actions across the panel with user, server, and IP metadata
Operations
- Rate Limiting — Configurable per-window request limits
- Security Headers — Helmet.js with CSP, XSS protection, content-type sniffing prevention
- Health Checks — Built-in endpoints for all services
- CI/CD — GitHub Actions pipeline for lint, test, and Docker build
Architecture
Browser ─── HTTPS + Socket.IO ──→ Web (React SPA / nginx)
│
REST + WS
│
API (Fastify + JWT)
│ │
PostgreSQL gRPC (protobuf)
│
Daemon (Rust + tonic) × N nodes
│
Docker API
│
Game Containers
The API acts as a gateway between the frontend and daemon nodes. The frontend never communicates directly with daemons.
Tech Stack
| Component | Technology |
|---|---|
| Monorepo | Turborepo + pnpm |
| Frontend | React 19 + Vite 6 + Tailwind CSS 3 + shadcn/ui |
| Backend API | Fastify 5 + TypeBox validation |
| Daemon | Rust + tonic gRPC + bollard (Docker) + tokio |
| Database | PostgreSQL 16 + Drizzle ORM |
| Auth | JWT (access + refresh) + Argon2id |
| Realtime | Socket.IO (frontend ↔ API) |
| Panel ↔ Daemon | gRPC with protobuf |
| Containers | Docker |
| CI/CD | GitHub Actions |
Monorepo Structure
source-gamepanel/
├── apps/
│ ├── api/ # Fastify REST API
│ │ ├── src/
│ │ │ ├── index.ts # App entry, plugin registration
│ │ │ ├── plugins/ # DB, auth plugins
│ │ │ ├── lib/ # Errors, JWT, permissions, pagination,
│ │ │ │ config parsers, Spiget client, schedule utils
│ │ │ └── routes/
│ │ │ ├── auth/ # Register, login, refresh, logout, me
│ │ │ ├── organizations/ # CRUD + members
│ │ │ ├── nodes/ # CRUD + allocations
│ │ │ ├── servers/ # CRUD + power, config, plugins, backups, schedules
│ │ │ └── admin/ # Users, games, audit logs (super admin)
│ │ └── Dockerfile
│ │
│ ├── web/ # React SPA
│ │ ├── src/
│ │ │ ├── components/
│ │ │ │ ├── ui/ # 13 shadcn/ui components
│ │ │ │ ├── layout/ # AppLayout, ServerLayout, Sidebar, Header
│ │ │ │ ├── server/ # PowerControls
│ │ │ │ └── error-boundary.tsx
│ │ │ ├── pages/
│ │ │ │ ├── auth/ # Login, Register
│ │ │ │ ├── dashboard/ # Stats + server list
│ │ │ │ ├── server/ # Console, Files, Config, Plugins,
│ │ │ │ │ Backups, Schedules, Players, Settings
│ │ │ │ ├── servers/ # Create wizard
│ │ │ │ ├── nodes/ # List + detail (health dashboard)
│ │ │ │ ├── organizations/ # Org list + create
│ │ │ │ ├── admin/ # Users, Games, Audit logs
│ │ │ │ └── settings/ # Members
│ │ │ ├── lib/ # API client, socket, utils
│ │ │ ├── stores/ # Zustand auth store
│ │ │ └── hooks/ # Theme hook
│ │ ├── nginx.conf
│ │ └── Dockerfile
│ │
│ └── daemon/ # Rust daemon
│ ├── src/
│ │ ├── main.rs # gRPC server, heartbeat, scheduler init
│ │ ├── config.rs # YAML config loader
│ │ ├── auth.rs # gRPC token interceptor
│ │ ├── grpc/ # Service implementations
│ │ ├── docker/ # Container lifecycle (bollard)
│ │ ├── server/ # State machine, manager
│ │ ├── filesystem/ # Path jail, CRUD operations
│ │ ├── game/ # RCON client, Minecraft, CS2 modules
│ │ ├── scheduler/ # Task polling + execution
│ │ └── backup/ # tar.gz, CDN upload/download, restore
│ ├── Cargo.toml
│ └── Dockerfile
│
├── packages/
│ ├── database/ # Drizzle schema + migrations + seed
│ │ └── src/schema/ # 10 tables: users, orgs, nodes, servers,
│ │ allocations, games, backups, plugins,
│ │ schedules, audit_logs
│ ├── shared/ # Types, permissions, roles
│ ├── proto/ # daemon.proto (gRPC service definition)
│ └── ui/ # Base UI utilities (cn, cva)
│
├── docker-compose.yml # Full production stack
├── docker-compose.dev.yml # Dev: PostgreSQL + Redis only
├── daemon-config.yml # Daemon configuration template
├── .env.example # Environment variables reference
├── .github/workflows/ci.yml # CI/CD pipeline
├── turbo.json
└── pnpm-workspace.yaml
Supported Games
| Game | Docker Image | Default Port | Config Format | Plugin Support |
|---|---|---|---|---|
| Minecraft: Java Edition | itzg/minecraft-server |
25565 | .properties, .yml, .json |
Spiget API + manual |
| Counter-Strike 2 | cm2network/cs2 |
27015 | Source .cfg (keyvalue) |
Manual |
| Minecraft: Bedrock Edition | itzg/minecraft-bedrock-server |
19132 | .properties |
— |
| Terraria | ryshe/terraria |
7777 | keyvalue | — |
| Rust | didstopia/rust-server |
28015 | — | — |
Adding new games requires only a database seed entry — no code changes needed.
API Endpoints
Auth
| Method | Path | Description |
|---|---|---|
| POST | /api/auth/register |
Create account |
| POST | /api/auth/login |
Login (returns JWT + refresh cookie) |
| POST | /api/auth/refresh |
Refresh access token |
| POST | /api/auth/logout |
Invalidate session |
| GET | /api/auth/me |
Current user profile |
Organizations
| Method | Path | Description |
|---|---|---|
| GET | /api/organizations |
List user's orgs |
| POST | /api/organizations |
Create org |
| GET/PATCH/DELETE | /api/organizations/:orgId |
Org CRUD |
| GET/POST/DELETE | /api/organizations/:orgId/members |
Member management |
Servers
| Method | Path | Description |
|---|---|---|
| GET/POST | .../servers |
List / create |
| GET/PATCH/DELETE | .../servers/:serverId |
Server CRUD |
| POST | .../servers/:serverId/power |
Power actions (start/stop/restart/kill) |
| GET/PUT | .../servers/:serverId/config |
Config read/write |
| GET/POST/DELETE | .../servers/:serverId/plugins |
Plugin management |
| GET/POST/DELETE | .../servers/:serverId/backups |
Backup management |
| POST | .../servers/:serverId/backups/:id/restore |
Restore backup |
| GET/POST/PATCH/DELETE | .../servers/:serverId/schedules |
Scheduled tasks |
Admin (Super Admin only)
| Method | Path | Description |
|---|---|---|
| GET | /api/admin/users |
All users |
| GET/POST | /api/admin/games |
Game management |
| GET | /api/admin/audit-logs |
Audit trail |
Permission System
Dot-notation permissions with hybrid RBAC (role defaults + per-user JSONB overrides):
server.create server.read server.update server.delete
console.read console.write
files.read files.write files.delete files.archive
backup.read backup.create backup.restore backup.delete backup.manage
schedule.read schedule.manage
plugin.read plugin.manage
config.read config.write
power.start power.stop power.restart power.kill
node.read node.manage
org.settings org.members
subuser.read subuser.manage
Quick Start
See INSTALLATION.md for detailed setup instructions.
# Clone
git clone https://github.com/your-org/source-gamepanel.git
cd source-gamepanel
# Environment
cp .env.example .env
# Edit .env — set JWT_SECRET and JWT_REFRESH_SECRET
# Start infrastructure
docker compose -f docker-compose.dev.yml up -d
# Install dependencies
pnpm install
# Run migrations and seed
pnpm db:migrate
pnpm db:seed
# Start development
pnpm dev
Open http://localhost:5173 — login with admin@gamepanel.local / admin123.
Production Deployment
# Configure environment
cp .env.example .env
# Edit .env with production values (strong JWT secrets, real DB passwords)
# Deploy full stack
docker compose up -d --build
# Run migrations inside the API container
docker compose exec api node -e "..."
# Or connect to the DB directly and run drizzle-kit migrate
The web service is exposed on port 80 with nginx handling SPA routing and API proxying.
Development
pnpm dev # Start all services (API + Web + DB)
pnpm build # Build all packages
pnpm lint # Lint all packages
pnpm format # Format with Prettier
pnpm db:studio # Open Drizzle Studio (DB browser)
pnpm db:generate # Generate migration files
pnpm db:migrate # Apply migrations
pnpm db:seed # Seed admin user + games
# Daemon (separate terminal)
cd apps/daemon
cargo run # Requires protoc installed
cargo test # Run unit tests
cargo clippy # Lint Rust code
License
This project is private. All rights reserved.