Warning
This Project is in BETA and under active development and is not yet stable and is UNUSEABLE. APIs, features, and stored data may change without notice between releases. Not recommended for production use. Proceed with that in mind.
Open-source game server management panel
Website · Documentation · Discord · Report a Bug · Request a Feature
Airlink Panel is a web-based control panel for deploying, monitoring, and managing game servers across multiple machines. It communicates with daemons on each node to handle Docker containers, files, and SFTP.
What it does:
- Web UI for admins and users (EJS templates, Tailwind CSS)
- Node-based architecture: one panel controlling many daemons
- Addon system so you can extend functionality without touching core files
- REST API (v1 + legacy) with scoped API keys
- Real-time console, file manager, backups, and SFTP
- HMAC-signed daemon communication
- Server creation, power controls, and resource management
- User management with 2FA
- Analytics and player stats
- Multi-language support (i18n)
- Redis-backed sessions with user-index revocation
- Node.js cluster mode (auto-forks per CPU core)
- Unified log stream across all workers
- Redis-cached node health and search results
Documentation: airlinklabs.xyz/docs/quick-start/
| Avatar | Handle | Role |
|---|---|---|
| thavanish | Maintainer | |
| privt00 | Project Lead | |
| achul123 | Core Developer |
Contributions of all sizes are welcome. Take a look at the open issues if you're not sure where to start.
Made with contrib.rocks
- Node.js v22 or later
- pnpm v11 or later (
npm install -g pnpm) - Git
- Docker
- Redis
- MariaDB (or MySQL)
sudo su
bash <(curl -s https://raw.githubusercontent.com/airlinklabs/panel/refs/heads/main/installer.sh)The installer takes care of Node.js, Docker, database setup, the build step, and registering a systemd service.
Once installed, manage the panel with systemd:
systemctl start airlink-panel
systemctl stop airlink-panel
systemctl restart airlink-panel
journalctl -u airlink-panel -fcd /var/www/
git clone https://github.com/AirlinkLabs/panel.git
cd panel
node public/setup.mjs
pnpm run startThe setup script automatically:
- Verifies Node.js (>=22) and pnpm are installed
- Checks Redis is installed and running (installs/starts if missing)
- Checks MariaDB is installed and running (installs/starts if missing)
- Creates the
airlinkdatabase if it doesn't exist - Generates
.envwith a secure randomSESSION_SECRET - Runs
prisma generate+prisma db push - Installs dependencies and builds the project
Run non-interactively for CI:
node public/setup.mjs --yescd /var/www/
git clone https://github.com/AirlinkLabs/panel.git
cd panel
chown -R www-data:www-data /var/www/panel
chmod -R 755 /var/www/panel
cp example.env .env
# Edit .env: PORT, URL, SESSION_SECRET, DATABASE_URL
pnpm install
npx prisma generate
npx prisma db push
pnpm run build
pnpm run startnpm install -g pm2
pm2 start "pnpm run start" --name airlink-panel
pm2 save
pm2 startupCopy example.env to .env and fill in the required values:
| Variable | Required | Description |
|---|---|---|
NAME |
No | Panel display name (default: Airlink) |
NODE_ENV |
Yes | Set to production for live deployments |
URL |
Yes | Full URL the panel is served from, e.g. http://192.168.1.10:3000 |
PORT |
Yes | Port to listen on |
DATABASE_URL |
Yes | MySQL/MariaDB connection string, e.g. mysql://root:@127.0.0.1:3306/airlink |
REDIS_URL |
Yes | Redis connection string, e.g. redis://127.0.0.1:6379 |
SESSION_SECRET |
Yes | Random secret for session signing. Generate with openssl rand -hex 32 |
MYSQL_HOST |
No | MySQL host for auto-generate database host (default: 127.0.0.1) |
MYSQL_PORT |
No | MySQL port (default: 3306) |
MYSQL_USER |
No | MySQL user (default: root) |
MYSQL_PASSWORD |
No | MySQL password (default: empty) |
Important
DATABASE_URL must use the mysql:// scheme. SQLite is no longer supported.
Important
Set URL to the actual IP or hostname the panel is accessible from. Using http://localhost will block external access and cause CSP errors.
Important
SESSION_SECRET is auto-generated by the setup script. Only set it manually if skipping setup.
- Sessions: Stored in Redis (
airlink:sess:*) with a user index (airlink:usr:{id}) for admin revocation - Node health cache:
checkNodeStatusresults cached 15s per node to avoid hammering daemons - Search cache:
/api/searchresults cached 30s per user+query
The panel exposes a REST API with 138 HTTP routes and 4 WebSocket endpoints. See docs/specsheet.md for the full route catalog, request/response formats, authentication details, and notes on daemon communication.
Addons let you extend the panel without modifying core files. They live under storage/addons/ and can be managed from the /admin/addons page.
See storage/addons/README.md for the structure and API reference.
pnpm install
pnpm run dev # Start with auto-restart on file changes
pnpm run typecheck # Type checking
pnpm run lint # Linting
pnpm run build # Production build- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature - Commit your changes:
git commit -m 'feat: describe your change' - Push and open a pull request against
main
Please run pnpm run lint and pnpm run typecheck before submitting.
- Website: airlinklabs.xyz
- Docs: airlinklabs.xyz/docs/quick-start
- Discord: discord.gg/ujXyxwwMHc
- GitHub: github.com/airlinklabs/panel
MIT. See LICENSE for details.