Pterodactyl es un panel de código abierto para gestionar servidores de juegos. Se divide en dos piezas: el Panel, una aplicación web en PHP desde la que administras usuarios, nodos y servidores, y Wings, el servicio que se ejecuta en cada nodo y lanza cada servidor de juego en un contenedor Docker aislado. En esta guía instalarás el Panel y Wings en un mismo servidor con Ubuntu 24.04, lo publicarás con HTTPS y desplegarás un primer servidor de Minecraft.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS y virtualización KVM, por ejemplo un VPS de CubePath. Wings usa Docker y no funciona en contenedores OpenVZ o LXC.
  • Al menos 2 vCPU y 4 GB de RAM: el Panel necesita poco, pero cada servidor de juego consume su propia memoria (un servidor de Minecraft pequeño, unos 2 GB).
  • Un usuario no root con privilegios sudo.
  • Un dominio o subdominio (en esta guía your_domain, por ejemplo panel.example.com) con un registro DNS A que apunte a la IP pública del servidor.
  • UFW activo con SSH permitido.

Paso 1: Instalar PHP, MariaDB, Redis y Nginx

Ubuntu 24.04 incluye PHP 8.3, compatible con Pterodactyl, así que no hace falta ningún repositorio externo. Instala PHP con las extensiones que necesita el Panel, junto con MariaDB, Redis, Nginx, Certbot y utilidades básicas:

sudo apt update
sudo apt install php8.3 php8.3-cli php8.3-common php8.3-fpm php8.3-gd php8.3-mysql php8.3-mbstring php8.3-bcmath php8.3-xml php8.3-curl php8.3-zip mariadb-server redis-server nginx certbot python3-certbot-nginx curl tar unzip git

Comprueba que los servicios están activos:

systemctl is-active php8.3-fpm mariadb redis-server nginx
active
active
active
active

Instala Composer, el gestor de dependencias de PHP, en /usr/local/bin:

curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
composer --version
Composer version 2.8.12

Paso 2: Crear la base de datos

Asegura la instalación de MariaDB (contraseña de root, eliminación de usuarios anónimos y de la base de datos de prueba):

sudo mariadb-secure-installation

Abre la consola de MariaDB:

sudo mariadb

Crea la base de datos y un usuario para el Panel. Sustituye your_strong_password por una contraseña larga y aleatoria y guárdala, la necesitarás en el paso 4:

CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'your_strong_password';
CREATE DATABASE panel;
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Paso 3: Descargar el Panel

Crea el directorio del Panel y descarga la última versión publicada:

sudo mkdir -p /var/www/pterodactyl
cd /var/www/pterodactyl
sudo curl -Lo panel.tar.gz https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz
sudo tar -xzvf panel.tar.gz
sudo rm panel.tar.gz
sudo chmod -R 755 storage/* bootstrap/cache/

Copia el archivo de entorno de ejemplo e instala las dependencias de PHP:

sudo cp .env.example .env
sudo COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader

Genera la clave de cifrado de la aplicación:

sudo php artisan key:generate --force

Paso 4: Configurar el entorno e inicializar la base de datos

El Panel incluye asistentes interactivos para escribir la configuración en .env. Empieza por la configuración general:

sudo php artisan p:environment:setup

Responde a las preguntas principales así:

  • Egg Author Email: tu correo.
  • Application URL: https://your_domain (con https).
  • Application Timezone: por ejemplo Europe/Madrid.
  • Cache Driver, Session Driver y Queue Driver: redis.
  • Redis Host: localhost, sin contraseña y puerto 6379.

Configura la conexión a la base de datos con los datos del paso 2 (host 127.0.0.1, puerto 3306, base de datos panel, usuario pterodactyl):

sudo php artisan p:environment:database

Configura el envío de correo, necesario para restablecer contraseñas e invitar usuarios. Puedes usar SMTP con tu proveedor de correo:

sudo php artisan p:environment:mail

Crea las tablas e importa los datos iniciales, incluidos los "eggs", las plantillas de cada juego:

sudo php artisan migrate --seed --force

Crea tu usuario administrador. Responde yes a la pregunta de si es administrador:

sudo php artisan p:user:make

Por último, entrega los archivos al usuario con el que se ejecutan Nginx y PHP-FPM:

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

Paso 5: Configurar las tareas programadas y la cola

El Panel necesita ejecutar tareas cada minuto (copias programadas, limpieza) y procesar una cola de trabajos en segundo plano.

Abre el crontab de root:

sudo crontab -e

Añade esta línea al final:

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

Para la cola, crea un servicio de systemd:

sudo nano /etc/systemd/system/pteroq.service

Añade el siguiente contenido:

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

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

[Install]
WantedBy=multi-user.target

Activa e inicia el servicio y comprueba su estado:

sudo systemctl enable --now redis-server pteroq.service
systemctl status pteroq.service --no-pager
● pteroq.service - Pterodactyl Queue Worker
     Loaded: loaded (/etc/systemd/system/pteroq.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-09-25 10:20:14 UTC; 3s ago

Paso 6: Configurar Nginx y HTTPS

Desactiva el sitio por defecto de Nginx y crea uno para el Panel:

sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/sites-available/pterodactyl.conf

Añade esta configuración, sustituyendo your_domain por tu dominio:

server {
    listen 80;
    listen [::]:80;
    server_name your_domain;

    root /var/www/pterodactyl/public;
    index index.php;
    charset utf-8;

    access_log off;
    error_log /var/log/nginx/pterodactyl.app-error.log error;

    client_max_body_size 100m;
    client_body_timeout 120s;
    sendfile off;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.3-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;
    }

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

Activa el sitio, valida la configuración y recarga Nginx:

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

Abre HTTP y HTTPS en el firewall y obtén el certificado de Let's Encrypt. Certbot añadirá la configuración TLS y la redirección de HTTP a HTTPS:

sudo ufw allow "Nginx Full"
sudo certbot --nginx -d your_domain
Successfully deployed certificate for your_domain to /etc/nginx/sites-enabled/pterodactyl.conf
Congratulations! You have successfully enabled HTTPS on https://your_domain

Abre https://your_domain en el navegador e inicia sesión con el usuario del paso 4.

Paso 7: Instalar Docker y Wings

Wings ejecuta cada servidor de juego en un contenedor Docker. Instala Docker desde su repositorio oficial:

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

Descarga el binario de Wings para la arquitectura de tu servidor (amd64 o arm64):

sudo mkdir -p /etc/pterodactyl
ARCH=$(dpkg --print-architecture)
sudo curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_${ARCH}"
sudo chmod u+x /usr/local/bin/wings
sudo wings --version
wings v1.11.13

Crea el servicio de systemd para Wings:

sudo nano /etc/systemd/system/wings.service
[Unit]
Description=Pterodactyl Wings Daemon
After=docker.service
Requires=docker.service
PartOf=docker.service

[Service]
User=root
WorkingDirectory=/etc/pterodactyl
LimitNOFILE=4096
PIDFile=/var/run/wings/daemon.pid
ExecStart=/usr/local/bin/wings
Restart=on-failure
StartLimitInterval=180
StartLimitBurst=30
RestartSec=5s

[Install]
WantedBy=multi-user.target

No lo inicies todavía: antes necesitas el archivo de configuración que genera el Panel.

Paso 8: Registrar el nodo en el Panel

En el Panel, entra en el área de administración (icono de engranaje, arriba a la derecha):

  1. En Locations, pulsa Create New y crea una ubicación, por ejemplo con el código mad1.
  2. En Nodes, pulsa Create New y rellena:
    • FQDN: your_domain. Como el Panel usa HTTPS, el navegador solo puede hablar con Wings mediante un nombre de dominio con certificado; aquí reutilizas el que obtuviste en el paso 6.
    • Communicate Over SSL: Use SSL Connection.
    • Total Memory y Total Disk Space: lo que quieres repartir entre servidores de juego, dejando margen para el sistema (por ejemplo, 3072 MB en un servidor de 4 GB).
    • Daemon Port 8080 y Daemon SFTP Port 2022 (los valores por defecto).
  3. Guarda el nodo, abre su pestaña Configuration y copia el bloque YAML que muestra.

Pega ese contenido en el archivo de configuración de Wings:

sudo nano /etc/pterodactyl/config.yml

Comprueba que la sección ssl del archivo apunta a los certificados de Let's Encrypt de tu dominio (/etc/letsencrypt/live/your_domain/fullchain.pem y privkey.pem). Después abre los puertos de Wings en el firewall e inicia el servicio:

sudo ufw allow 8080/tcp
sudo ufw allow 2022/tcp
sudo systemctl enable --now wings

Verifica que arranca sin errores:

sudo journalctl -u wings -n 20 --no-pager

En el Panel, la lista Nodes debe mostrar el nodo con un corazón verde, señal de que el Panel contacta con Wings.

Paso 9: Crear las asignaciones y el primer servidor

Cada servidor de juego necesita una asignación: una combinación de IP y puerto del nodo.

  1. En Nodes, abre tu nodo y ve a la pestaña Allocation.
  2. En IP Address introduce la IP pública del servidor y en Ports el puerto o rango, por ejemplo 25565 para Minecraft o 25565-25570 para varios servidores.
  3. Guarda.

Wings publica esos puertos a través de Docker, que añade sus propias reglas de filtrado, así que el puerto del juego será accesible aunque no lo abras en UFW.

Ahora crea el servidor:

  1. Ve a Servers y pulsa Create New.
  2. Indica un nombre y el usuario propietario.
  3. Elige el nodo y la asignación 25565.
  4. En Resource Management, asigna memoria (por ejemplo, 2048 MB), disco y CPU.
  5. En Nest Configuration, elige el nest Minecraft y el egg Paper.
  6. Pulsa Create Server.

Wings descargará la imagen Docker y ejecutará el instalador del egg. Cuando termine, abre el servidor desde la vista de cliente del Panel, pulsa Start y sigue el arranque en la consola. Conecta con un cliente de Minecraft a your_server_ip:25565 para confirmar que funciona.

Solución de problemas

El nodo aparece con un corazón rojo. Revisa sudo journalctl -u wings. Las causas habituales son que el puerto 8080 está cerrado en UFW, que el FQDN del nodo no coincide con el dominio del certificado o que las rutas de ssl en config.yml son incorrectas.

Error 500 al abrir el Panel. Consulta el log de Laravel en /var/www/pterodactyl/storage/logs/ y el de Nginx en /var/log/nginx/pterodactyl.app-error.log. Suele deberse a permisos: repite el chown del paso 4.

Los servidores se quedan en "Installing". Comprueba que pteroq.service está activo y que el servidor tiene salida a Internet para descargar las imágenes de Docker.

Conclusión

Tienes Pterodactyl Panel funcionando con HTTPS, un nodo Wings conectado y un primer servidor de juego desplegado en su propio contenedor. Como siguientes pasos, añade más nodos Wings en otros servidores para repartir la carga, importa eggs de la comunidad para otros juegos y, si tus servidores reciben ataques, protege los puertos de juego con reglas en el firewall perimetral de CubePath.