Manual Installation Guide

This guide covers manual installation of Trexzactyl Panel without using the automated installer. Recommended for advanced users who want full control over the installation process.

Prerequisites

Before starting, ensure you have:

  • Ubuntu 20.04/22.04/24.04 or Debian 11/12
  • Root or sudo access
  • Domain name (for SSL)
  • Minimum 2GB RAM, 10GB disk space

Step 1: Install Dependencies

Update System

sudo apt update && sudo apt upgrade -y

Install Required Packages

sudo apt install -y software-properties-common curl apt-transport-https ca-certificates gnupg

Add PHP Repository

sudo add-apt-repository -y ppa:ondrej/php
sudo apt update

Install PHP 8.1 and Extensions

sudo apt install -y php8.1 php8.1-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip}

Install Composer

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Install MariaDB

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
sudo apt update
sudo apt install -y mariadb-server mariadb-client

Secure MariaDB:

sudo mysql_secure_installation

Install Redis

sudo apt install -y redis-server
sudo systemctl enable --now redis-server

Install Nginx

sudo apt install -y nginx
sudo systemctl enable nginx

Step 2: Create Database

Login to MariaDB:

mysql -u root -p

Create database and user:

CREATE DATABASE panel;
CREATE USER 'pterodactyl'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Step 3: Download Panel Files

Create Directory

sudo mkdir -p /var/www/trexzactyl
cd /var/www/trexzactyl

Download Panel

sudo curl -Lo panel.tar.gz https://github.com/Trexzactyl/trexzactyl/releases/latest/download/panel.tar.gz
sudo tar -xzvf panel.tar.gz
sudo chmod -R 755 storage/* bootstrap/cache/

Step 4: Install Dependencies

sudo composer install --no-dev --optimize-autoloader

Step 5: Environment Configuration

Copy Environment File

sudo cp .env.example .env

Generate Application Key

sudo php artisan key:generate --force

Configure Environment

Edit /var/www/trexzactyl/.env:

APP_NAME=Trexzactyl
APP_ENV=production
APP_DEBUG=false
APP_URL=https://panel.example.com

DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=panel
DB_USERNAME=pterodactyl
DB_PASSWORD=your_secure_password

CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_DRIVER=smtp
MAIL_HOST=smtp.example.com
MAIL_PORT=587
MAIL_USERNAME=your_email@example.com
MAIL_PASSWORD=your_email_password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=noreply@example.com
MAIL_FROM_NAME=Trexzactyl

Step 6: Database Setup

Run migrations:

sudo php artisan migrate --seed --force

Step 7: Create Admin User

sudo php artisan p:user:make

Follow the prompts to create your admin account.

Step 8: Set Permissions

sudo chown -R www-data:www-data /var/www/trexzactyl/*

Step 9: Configure Crontab

Add to crontab:

sudo crontab -e

Add this line:

* * * * * php /var/www/trexzactyl/artisan schedule:run >> /dev/null 2>&1

Step 10: Create Queue Worker Service

Create /etc/systemd/system/pteroq.service:

[Unit]
Description=Pterodactyl Queue Worker
After=redis-server.service

[Service]
User=www-data
Group=www-data
Restart=always
ExecStart=/usr/bin/php /var/www/trexzactyl/artisan queue:work --queue=high,standard,low --sleep=3 --tries=3
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s

[Install]
WantedBy=multi-user.target

Enable and start:

sudo systemctl enable --now pteroq.service

Step 11: Configure Nginx

Create /etc/nginx/sites-available/pterodactyl.conf:

server {
    listen 80;
    server_name panel.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name panel.example.com;

    root /var/www/trexzactyl/public;
    index index.php;

    access_log /var/log/nginx/trexzactyl.app-access.log;
    error_log  /var/log/nginx/trexzactyl.app-error.log error;

    client_max_body_size 100m;
    client_body_timeout 120s;

    sendfile off;

    ssl_certificate /etc/letsencrypt/live/panel.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/panel.example.com/privkey.pem;
    ssl_session_cache shared:SSL:10m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";
    ssl_prefer_server_ciphers on;

    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header Content-Security-Policy "frame-ancestors 'self'";
    add_header X-Frame-Options DENY;
    add_header Referrer-Policy same-origin;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param PHP_VALUE "upload_max_filesize = 100M \n post_max_size=100M";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTP_PROXY "";
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        include /etc/nginx/fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

Enable site:

sudo ln -s /etc/nginx/sites-available/pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf
sudo nginx -t
sudo systemctl restart nginx

Step 12: Install SSL Certificate

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d panel.example.com

Step 13: Install Node.js and Build Assets

Install Node.js

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs

Build Frontend Assets

cd /var/www/trexzactyl
npm install
npm run build:production

Step 14: Final Steps

Clear Cache

cd /var/www/trexzactyl
php artisan config:clear
php artisan cache:clear
php artisan view:clear

Restart Services

sudo systemctl restart nginx
sudo systemctl restart php8.1-fpm
sudo systemctl restart pteroq

Verification

  1. Visit your panel URL: https://panel.example.com
  2. Login with your admin credentials
  3. Check that all services are running:
sudo systemctl status nginx
sudo systemctl status php8.1-fpm
sudo systemctl status pteroq
sudo systemctl status redis-server
sudo systemctl status mariadb

Troubleshooting

Permission Issues

sudo chown -R www-data:www-data /var/www/trexzactyl/*
sudo chmod -R 755 /var/www/trexzactyl/storage
sudo chmod -R 755 /var/www/trexzactyl/bootstrap/cache

Queue Worker Not Running

sudo systemctl status pteroq
sudo journalctl -u pteroq -n 50

Database Connection Failed

Verify credentials in .env file and test connection:

mysql -u pterodactyl -p panel

White Screen / 500 Error

Check logs:

tail -f /var/log/nginx/trexzactyl.app-error.log
tail -f /var/www/trexzactyl/storage/logs/laravel.log

Next Steps

After panel installation:

  1. Install Wings on your game server nodes
  2. Configure SSL if not already done
  3. Set up backups
  4. Configure email

Automated Alternative

For easier installation, use the automated installer:

bash <(curl -s http://installer.trexz.xyz/install.sh)

The automated installer handles all these steps automatically with proper error checking and validation.