Open-source, extensible game server management panel.
Currently supporting Hytale, with more games coming soon.
Features • Screenshots • Quick Start • Installation • Production • Security
- Multi-Server Management - Create and manage multiple game servers from a single dashboard
- Real-Time Console - Live server logs with ANSI color support and command input
- File Manager - Browse, edit, upload, and download server files with Monaco Editor
- Backup System - Create, restore, and manage backups with retention policies
- Scheduled Tasks - Automate restarts, backups, and commands with cron scheduling
- Dynamic Settings - Auto-generated config editor based on server's JSON config
- Roles & Permissions - Panel-wide roles and per-server access levels
- Multi-User Support - Multiple users with different roles
- Game Adapters - Extensible architecture for adding new game support
- Self-Updater - One-click updates from GitHub releases
- Cross-Platform - Windows and Linux support
- Docker Support - One-command deployment
| Game | Status |
|---|---|
| Hytale | Supported (with auto-download) |
| Minecraft | Planned |
Click to view screenshots
- Node.js 20+
- pnpm 8+
- Java 25+ (for Hytale servers - Adoptium recommended)
git clone https://github.com/MillerSpil/Deployy-Panel.git
cd Deployy-Panel
pnpm install
# Build shared package (required before running)
pnpm --filter @deployy/shared build
# Setup backend
cd packages/backend
cp .env.example .env
# Edit .env and set JWT_SECRET (generate with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")
pnpm prisma generate
pnpm prisma db push
pnpm prisma db seed
# Development (run in separate terminals)
# Terminal 1 - Backend:
pnpm dev
# Terminal 2 - Frontend:
cd ../frontend
pnpm dev
# Open http://localhost:5173Docker (Recommended for Production)
# Clone the repository
git clone https://github.com/MillerSpil/Deployy-Panel.git
cd Deployy-Panel
# Create environment file
cp packages/backend/.env.example .env
# Generate a secure JWT secret and add to .env
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# Edit .env and set JWT_SECRET to the generated value
# Also set NODE_ENV=production
# Build and start
docker build -t deployy-panel .
docker compose up -dThe panel will be available at http://localhost:3000
Configuration:
- Data persisted to
./datadirectory - Database at
/data/deployy.db
Commands:
docker compose logs -f # View logs
docker compose down # Stop
docker compose up -d # Start
docker build -t deployy-panel . --no-cache && docker compose up -d # RebuildManual Installation (Self-Hosted)
# Clone and install dependencies
git clone https://github.com/MillerSpil/Deployy-Panel.git
cd Deployy-Panel
pnpm install
# Setup backend
cd packages/backend
cp .env.example .env
# Edit .env - set a secure JWT_SECRET (minimum 32 characters)
# Initialize database
pnpm prisma generate
pnpm prisma db push
pnpm prisma db seed
# Build frontend
cd ../frontend
pnpm build
# Build backend
cd ../backend
pnpm build
# Start production server
NODE_ENV=production node dist/index.jsThe panel serves at http://localhost:3000
Development Setup
# Clone and install
git clone https://github.com/MillerSpil/Deployy-Panel.git
cd Deployy-Panel
pnpm install
# Setup backend
cd packages/backend
cp .env.example .env
# Edit .env - set JWT_SECRET (can use any string for dev)
# Initialize database
pnpm prisma generate
pnpm prisma db push
pnpm prisma db seedRun in two terminals:
# Terminal 1 - Backend (port 3000)
cd packages/backend
pnpm dev
# Terminal 2 - Frontend (port 5173)
cd packages/frontend
pnpm devOpen http://localhost:5173
For exposing Deployy Panel to the internet, you need HTTPS and a reverse proxy.
Windows - Caddy (Recommended)
Caddy automatically handles SSL certificates.
-
Download Caddy from https://caddyserver.com/download (Windows amd64)
-
Create
Caddyfilein the same folder:
panel.yourdomain.com {
reverse_proxy localhost:3000
}
- Run Caddy:
.\caddy.exe run- Run as Windows Service (optional):
.\caddy.exe install
.\caddy.exe startWindows - Firewall
# Allow Hytale game server (UDP)
New-NetFirewallRule -DisplayName "Hytale Server" -Direction Inbound -Protocol UDP -LocalPort 5520 -Action Allow
# Allow HTTP/HTTPS
New-NetFirewallRule -DisplayName "HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action AllowLinux - Caddy (Recommended)
-
Install Caddy - https://caddyserver.com/docs/install
-
Create Caddyfile:
panel.yourdomain.com {
reverse_proxy localhost:3000
}
- Start Caddy:
sudo systemctl enable --now caddyLinux - Nginx + Certbot
- Install:
sudo apt install nginx certbot python3-certbot-nginx- Create config (
/etc/nginx/sites-available/deployy):
server {
listen 80;
server_name panel.yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}- Enable and get SSL:
sudo ln -s /etc/nginx/sites-available/deployy /etc/nginx/sites-enabled/
sudo certbot --nginx -d panel.yourdomain.com
sudo systemctl restart nginxLinux - Firewall (UFW)
sudo ufw allow 5520/udp # Hytale game server
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPSAfter Setup: Update your .env:
NODE_ENV=production
FRONTEND_URL="https://panel.yourdomain.com"Environment Variables
Create .env in packages/backend/ (or project root for Docker):
# Database
DATABASE_URL="file:./dev.db"
# Server
PORT=3000
NODE_ENV=development
# Frontend URL (dev only - for CORS)
FRONTEND_URL="http://localhost:5173"
# Game server storage location
SERVERS_BASE_PATH="C:\\DeployyServers" # Windows
# SERVERS_BASE_PATH="/opt/deployy/servers" # Linux
# Authentication (REQUIRED)
JWT_SECRET="your-secret-key-minimum-32-characters-here"
JWT_EXPIRATION="24h"Generate JWT_SECRET:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Server Storage Paths
Game servers are installed to:
- Windows:
C:\DeployyServers\{server-name} - Linux:
/opt/deployy/servers/{server-name}
Change with SERVERS_BASE_PATH in your .env file.
- Open the panel in your browser
- Create an admin account (first user gets Admin role)
- Create a Hytale server with "Auto-download server files" enabled
- Authenticate with your Hytale account when prompted
Creating a Server
- Click "Create Server" on the dashboard
- Enter server name and port (default: 5520)
- Enable "Auto-download server files"
- Authenticate with your Hytale account
- Server files download automatically
Updating a Server
- Navigate to server's "Updates" tab
- Stop the server if running
- Click "Update Server"
- Authenticate when prompted
Server Requirements
- Java 25+ (Hytale uses modern Java features)
- 6-8GB RAM recommended
- UDP port 5520 (Hytale uses QUIC protocol)
Panel Roles
| Role | Access |
|---|---|
| Admin | Full access to everything |
| Moderator | View all servers, view users |
| User | Only access to own servers |
Server Access Levels
| Level | Capabilities |
|---|---|
| Owner | Full control, delete, manage access |
| Admin | Settings, files, backups |
| Operator | Start, stop, restart, commands |
| Viewer | View console only |
- JWT tokens in HTTP-only cookies
- Passwords hashed with bcrypt (14 rounds)
- 24-hour token expiration
- Rate limiting on auth endpoints
Rate Limits
- Auth endpoints: 5 requests per 15 minutes
- File operations: 30 requests per minute
- Backup operations: 10 requests per minute
Security Checklist (Public Deployments)
- Strong JWT_SECRET (64+ character random string)
- HTTPS enabled via reverse proxy
- Firewall configured (only expose necessary ports)
- Regular backups enabled
- Keep panel updated
Scripts
pnpm dev # Start all in dev mode
pnpm build # Build all packages
pnpm lint # Lint all packagesTech Stack
- Frontend: React 18, TypeScript, Tailwind CSS, Vite, Socket.IO
- Backend: Node.js, Express, Prisma (SQLite), Socket.IO, Zod
- Monorepo: pnpm workspaces
Project Structure
Deployy-Panel/
├── packages/
│ ├── backend/ # Express API server
│ │ ├── src/
│ │ │ ├── adapters/ # Game adapters
│ │ │ ├── routes/ # API endpoints
│ │ │ ├── services/ # Business logic
│ │ │ └── websocket/ # Socket.IO handlers
│ │ └── prisma/ # Database schema
│ │
│ ├── frontend/ # React web app
│ │ └── src/
│ │ ├── components/
│ │ ├── pages/
│ │ └── hooks/
│ │
│ └── shared/ # Shared TypeScript types
│
├── docs/ # Screenshots and assets
├── docker-compose.yml
├── Dockerfile
└── package.json
Adding Game Support
The panel uses an adapter pattern. To add a new game:
- Create adapter in
packages/backend/src/adapters/ - Extend
BaseAdapterclass - Implement:
install(),start(),stop(),restart() - Register in
AdapterFactory
"Invalid JWT secret"
Your JWT_SECRET is too short or not set. Generate one:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"Server won't start
- Check Java 25+ is installed:
java -version - Ensure the port isn't in use
- Check server logs in the console tab
Can't connect to game server
- Hytale uses UDP port 5520, not TCP
- Check your firewall allows UDP traffic
- Verify the port in server settings
Database errors
cd packages/backend
pnpm prisma db push
pnpm prisma db seedAGPL-3.0 - See LICENSE





