Dev version only • No stable release yet • Help us build it!
Fixed Heliactyl Next is an early development fork of Heliactyl Next 3. It aims to fix critical bugs from older Heliactyl Next 3 versions and improve overall performance and usability.
Currently used by 2–5 hosting providers in testing — 100% free & open-source.
Join us to shape the next stable release!
Warning
Fixed Heliactyl Next 3 is not compatible with settings.json old generation files.
You can keep the same database.sqlite / heliactyl.db without issues.
Heliactyl is a high-performance client area for the Pterodactyl Panel. It allows your users to create, edit and delete servers, and earn coins to upgrade their resources.
You can get started straight away by following these steps:
- Clone the repo: Run
git clone https://github.com/OvernodeProjets/fixed-heliactyl-next.giton your machine - Enter the directory and configure the
config_example.tomlfile - most are optional except the Pterodactyl API - Check everything out and make sure you've configured Heliactyl correctly
- Create SSL certificates for your target domain and set up the NGINX reverse proxy
Caution
You must configure Wings on every node before deploying Fixed Heliactyl Next!
Without this step, your dashboard will be unable to communicate with Pterodactyl nodes.
For each node in your infrastructure, follow these steps:
-
Locate the Wings configuration file (typically at
/etc/pterodactyl/config.yml) -
Find the
allowed-originssetting in the configuration -
Update the value to one of the following options:
Option 1: Allow all origins (simplest, recommended for testing):
allowed-origins: ['*']
Option 2: Restrict to your dashboard domain (more secure, recommended for production):
allowed-origins: ['https://dashboard.yourdomain.com']
-
Restart Wings to apply the changes:
systemctl restart wings
You can either use a single domain setup or a split domain setup (recommended for production).
Basic configuration for a single domain:
server {
listen 80;
server_name <domain>;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name <domain>;
ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# WebSocket support for AFK system
location /api/afk/ws {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass "http://localhost:<port>/api/afk/ws";
}
# WebSocket support for server stats (real-time monitoring)
location ~ ^/api/server/[^/]+/ws$ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
proxy_pass http://localhost:<port>;
}
location / {
proxy_pass http://localhost:<port>/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
}
}For a production environment, we recommend splitting your website and dashboard into separate domains:
- Main website configuration (e.g., yourdomain.com):
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# Redirect dashboard routes to dashboard domain
location /auth {
return 301 https://dashboard.yourdomain.com/auth;
}
location /dashboard {
return 301 https://dashboard.yourdomain.com/dashboard;
}
# Serve only homepage and static assets
location / {
proxy_pass http://localhost:<port>/website;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Website-Only "true";
}
location /vps {
proxy_pass http://localhost:<port>/vps;
proxy_buffering off;
}
location /legals/sales {
proxy_pass http://localhost:<port>/legals/sales;
proxy_buffering off;
}
location /legals/tos {
proxy_pass http://localhost:<port>/legals/tos;
proxy_buffering off;
}
location /assets {
proxy_pass http://localhost:<port>/assets;
proxy_buffering off;
}
}- Dashboard configuration (e.g., dashboard.yourdomain.com):
server {
listen 80;
server_name dashboard.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name dashboard.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/dashboard.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dashboard.yourdomain.com/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# WebSocket support for AFK system
location /api/afk/ws {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass "http://localhost:<port>/api/afk/ws";
}
# WebSocket support for server stats (real-time monitoring)
location ~ ^/api/server/[^/]+/ws$ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
proxy_pass http://localhost:<port>;
}
# Redirect root to auth page
location = / {
return 301 https://dashboard.yourdomain.com/auth;
}
# Block access to website page on dashboard domain
location /website {
return 404;
}
location / {
proxy_pass http://localhost:<port>;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Dashboard-Only "true";
}
}- Update your config.toml:
[website]
port = 3000
domain = "https://dashboard.yourdomain.com" # Dashboard domainMake sure to:
- Replace with your Heliactyl port (default: 3000)
- Replace yourdomain.com with your actual domain
- Generate SSL certificates for both domains
- Create separate nginx config files for each domain
- Enable the configurations and restart nginx
These commands are available:
npm run start - starts Heliactyl
npm run build:css - builds TailwindCSS, required for making changes to the UI
If you encounter version or installation issues with Velocity (e.g., "latest" version not found), please update your Egg configuration using the fixed JSON file available here: Fixed Velocity Egg
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2017 - 2025 Foundry Technologies Inc
Copyright (c) 2022 - 2025 Overnode