Pterodactyl – панель для создания и управления игровыми серверами

Когда игровой сервер один, им можно управлять по SSH: подключились, отредактировали конфиг, вышли. Но как только серверов становится два, три или десять, а к администрированию подключаются друзья или коллеги, такой подход перестает работать. Нужен интерфейс, в котором видно потребление ресурсов, есть консоль, файловый менеджер, бэкапы и разграничение прав.

Pterodactyl – это бесплатная панель, позволяющая упростить процесс управления игровыми серверами. Ключевая идея панели – изоляция. Каждый игровой сервер запускается в собственном Docker-контейнере с жесткими лимитами по оперативной памяти, процессору и диску – и получает удобный веб-интерфейс. Один упавший или «съевший» всю память сервер не мешает соседним, а пользователь панели физически не может выйти за пределы своего контейнера и добраться до файлов хост-системы.

В этой статье разберем, как устроена панель и как развернуть Pterodactyl на виртуальном сервере Beget с нуля – вместе с первым сервером Minecraft.

Основные возможности панели

  • Поддержка множества игр – быстрый запуск игровых серверов с помощью готовых шаблонов (Eggs) и возможность добавления новых шаблонов.
  • Удобное управление через веб-панель – запуск и настройка серверов, доступ к консоли, файлам и параметрам без постоянного использования командной строки.
  • Контроль и изоляция ресурсов – настройка ограничений CPU, RAM и дискового пространства, каждый сервер работает в своей защищенной среде.
  • Мониторинг статистики серверов в реальном времени – отображение графиков использования ресурсов (CPU, RAM, диск, сеть) для каждого сервера.
  • Гибкое управление доступом – управление пользователями, правами доступа.
  • Масштабируемость – возможность подключить несколько VPS с Wings и управлять всеми игровыми серверами через единую панель Pterodactyl.

При установке Pterodactyl уже есть несколько предустановленных конфигураций для популярных игр и приложений: 

  • Minecraft, включая Spigot, Sponge, BungeeCord, Waterfall
  • Rust
  • TeamSpeak
  • Mumble
  • Team Fortress 2
  • Counter-Strike 2
  • Garry's Mod
  • ARK: Survival Evolved

Дополнительные игры и конфигурации можно установить через официальный репозиторий Eggs

Panel и Wings

Pterodactyl состоит из двух самостоятельных компонентов, и это важно понимать до установки.

Panel – веб-приложение на Laravel. Именно его вы открываете в браузере. Панель хранит данные о пользователях, серверах и нодах в MySQL/MariaDB, использует Redis для кеша и очередей и работает за веб-сервером. Сами игровые серверы панель не запускает – она только отдает команды.

Wings – демон на Go, который устанавливается на каждую машину, где физически работают игровые серверы. Wings общается с Docker: создает контейнеры, следит за ресурсами, отдает логи и файлы, принимает SFTP-подключения. Панель и Wings общаются по HTTPS и WebSocket.

Такое разделение позволяет масштабироваться: панель может стоять на одном небольшом VPS, а игровые серверы – на нескольких мощных машинах. В терминологии Pterodactyl они называются нодами. Для домашнего или небольшого проекта Panel и Wings спокойно уживаются на одном сервере – именно этот вариант мы и разберем.

Обратите внимание!
Wings работает только на Linux и требует полноценного Docker. На виртуализации OpenVZ, Virtuozzo и LXC панель не заработает – нужна аппаратная виртуализация KVM. VPS Beget построены именно на KVM, поэтому проблем с совместимостью не будет.

Установка Pterodactyl: подготовка сервера

В данном примере установка будет производиться на сервере с Ubuntu 24.04 в качестве операционной системы.

После создания сервера подключитесь к нему по SSH и обновите пакеты:

apt update && apt upgrade -y

Дальше желательно направить на IP-адрес сервера домен. Понадобятся две A-записи:

  • panel.betutorial.ru – адрес самой панели;
  • node.betutorial.ru – адрес ноды, к которой будет обращаться Wings.

Обе записи могут указывать на один и тот же IP. Отдельный домен для ноды нужен потому, что панель и Wings используют разные SSL-сертификаты и разные порты.

Обратите внимание!
Работать по IP-адресу тоже можно – панель и нода будут работать по HTTP, и это не мешает соединению. Проблема возникает при смешении протоколов: если панель работает по HTTPS, а нода – по HTTP, браузер заблокирует WebSocket-соединение с консолью как небезопасный смешанный контент (mixed content). Поэтому если вы выпускаете SSL-сертификат для панели, обязательно настройте HTTPS и для ноды. Настоятельно рекомендуем использовать домен и HTTPS для обоих компонентов.

Установка зависимостей

Подключите репозитории с актуальными версиями PHP и Redis:

apt -y install software-properties-common curl apt-transport-https ca-certificates gnupg
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list
apt update

Установите PHP, базу данных, веб-сервер и вспомогательные утилиты:

apt -y install php8.3 php8.3-{common,cli,gd,mysql,mbstring,bcmath,xml,fpm,curl,zip} mariadb-server nginx tar unzip git redis-server

Установите Composer – менеджер зависимостей PHP:

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

Создание базы данных

Запустите защищенную настройку MariaDB и задайте пароль root (если он еще не задан):

mariadb-secure-installation

Затем создайте базу и пользователя для панели:

mariadb -u root -p
CREATE USER 'pterodactyl'@'127.0.0.1' IDENTIFIED BY 'ваш_надежный_пароль';
CREATE DATABASE panel;
GRANT ALL PRIVILEGES ON panel.* TO 'pterodactyl'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit

Загрузка и настройка панели

Скачайте файлы панели:

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

Подготовьте конфигурацию и установите зависимости:

cp .env.example .env
COMPOSER_ALLOW_SUPERUSER=1 composer install --no-dev --optimize-autoloader
php artisan key:generate --force
Обратите внимание!
Обязательно сохраните значение ключа шифрования APP_KEY из файла .env в надежном месте. Он используется в качестве ключа шифрования для всех данных, которые необходимо хранить в безопасности (например, ключи API). Если вы его потеряете, все зашифрованные данные будут безвозвратно утеряны, даже при наличии резервных копий базы данных.

Основная среда Pterodactyl легко настраивается с помощью нескольких встроенных в приложение команд CLI.

Первая команда настраивает окружение: URL панели, часовой пояс, драйверы кеша, сессий и очередей – на все три вопроса выбирайте Redis.

php artisan p:environment:setup

Вторая команда запрашивает параметры подключения к базе данных. Хост – 127.0.0.1, порт – 3306, база – panel, пользователь – pterodactyl, пароль – тот, что вы задали на этапе создания базы данных.

php artisan p:environment:database

Третья настраивает отправку почты – она нужна для писем о сбросе пароля и приглашений. Данный шаг можно отложить, но без настроенного SMTP не будут работать письма о сбросе пароля и приглашения – по умолчанию панель пытается отправлять через локальный sendmail, которого на чистом VPS нет.

php artisan p:environment:mail

Создайте структуру базы данных и загрузите стандартный набор яиц:

php artisan migrate --seed --force

Egg (яйцо) – шаблон, описывающий, как установить и запустить конкретную игру: Docker-образ, что скачать, какие переменные показать пользователю. Nest (гнездо) – группа яиц.

Создайте учетную запись администратора:

php artisan p:user:make

Последним шагом в процессе настройки является настройка правильных прав доступа к файлам панели, чтобы веб-сервер мог корректно их использовать:

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

Планировщик и обработчик очередей

Панель использует cron для расписаний и отдельный процесс для фоновых задач. Откройте crontab:

crontab -e

И добавьте строку:

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

Затем создайте службу обработчика очередей – файл /etc/systemd/system/pteroq.service:

# Pterodactyl Queue Worker File
# ----------------------------------

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

[Service]
# On some systems the user and group might be different.
# Some systems use `apache` or `nginx` as the user and group.
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

Включите службы:

systemctl enable --now redis-server
systemctl enable --now pteroq.service

Настройка NGINX и SSL

Необходимо выпустить сертификаты для обоих доменов: для самой панели и ноды. 

Установим certbot:

apt -y install certbot python3-certbot-nginx

Выпускаем сертификаты:

systemctl stop nginx
certbot certonly --standalone -d panel.betutorial.ru
certbot certonly --standalone -d node.betutorial.ru

Удалите стандартный конфиг NGINX:

rm /etc/nginx/sites-enabled/default

Создайте и откройте свой файл конфигурации /etc/nginx/sites-available/pterodactyl.conf:

nano /etc/nginx/sites-available/pterodactyl.conf

Копируем содержимое ниже, заменив <domain> на имя вашего домена для панели, и вставляем в открытый файл конфигурации: 

server {
    # Replace the example <domain> with your domain name or IP address
    listen 80;
    server_name <domain>;
    return 301 https://$server_name$request_uri;
}

server {
    # Replace the example <domain> with your domain name or IP address
    listen 443 ssl http2;
    server_name <domain>;

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

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

    # allow larger file uploads and longer script runtimes
    client_max_body_size 100m;
    client_body_timeout 120s;

    sendfile off;

    # SSL Configuration - Replace the example <domain> with your 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 "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
    ssl_prefer_server_ciphers on;

    # See https://hstspreload.org/ before uncommenting the line below.
    # add_header Strict-Transport-Security "max-age=15768000; preload;";
    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.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;
        include /etc/nginx/fastcgi_params;
    }

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

Активируйте конфигурацию и запустите NGINX:

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

Перейдите по адресу панели в браузере – вы должны увидеть форму входа. Войдите под учетной записью, созданной командой p:user:make.

формf входа

Установка Wings

Панель готова, но запускать серверы ей пока нечем. Установите Docker:

curl -sSL https://get.docker.com/ | CHANNEL=stable bash
systemctl enable --now docker

Если при создании сервера вы уже выбрали готовый образ Docker из маркетплейса, этот шаг можно пропустить – Docker уже установлен и запущен.

Скачайте бинарный файл Wings:

mkdir -p /etc/pterodactyl
curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")"
chmod u+x /usr/local/bin/wings
Обратите внимание!
Если на сервере включен файрвол (ufw или аналогичный), откройте порты, необходимые для работы Wings: 8080/tcp – API Wings, по нему панель обращается к ноде и 2022/tcp – SFTP для доступа к файлам сервера. Также понадобится открыть порты, выделенные под игровые серверы (например, 25565-25575/tcp и udp). Без этого нода не сможет подключиться к панели, а игроки – к серверу.

Создание ноды в панели

Вернитесь в веб-интерфейс и перейдите в административную часть (иконка шестеренки в правом верхнем углу).

Сначала создайте локацию. Для этого перейдите в раздел Locations (Локации) и нажмите Create New.

В появившемся окне введите идентификатор (Short Code) и описание локации (Description). Для сохранения нажмите Create.

создание локации

Затем создайте ноду. Для этого перейдите в раздел Nodes и нажмите Create New.

Обратите внимание!
На одном сервере запускается один экземпляр Wings, поэтому одному VPS соответствует одна нода.

На открывшейся странице необходимо ввести следующие параметры:  

  • Name – название ноды;
  • Description – описание;
  • Location – выбор созданной локации;
  • FQDN – домен или IP для подключения Wings. Например, node.betutorial.ru;
  • Communicate Over SSL – использование HTTPS или HTTP;
  • Total Memory – сколько RAM разрешено раздать игровым серверам (с запасом для системы и панели: на VPS с 6 ГБ – 4500–5000 МБ);
  • Total Disk Space – то же самое для диска;
  • Memory / Disk Over-Allocation – процент допустимого превышения; -1 отключает проверку совсем (лимита нет), 0 – ровно по лимиту.
создание ноды

Для сохранения Node с указанными настройками нажмите на кнопку Create Node

После создания Node откроется раздел Назначение (Allocation) для созданной ноды. В этой вкладке необходимо добавить комбинацию IP-адреса и порта, которая потом назначается серверу в этой ноде. Укажите IP-адрес сервера и диапазон портов, например, 25565-25575. Каждый игровой сервер займет как минимум один порт из этого списка. Для добавления необходимо нажать на кнопку Submit.

Далее откройте вкладку Configuration

конфигурация ноды

Указанную конфигурацию требуется добавить на VPS в конфигурацию Wings:

nano /etc/pterodactyl/config.yml

Вставьте содержимое и сохраните файл. 

Альтернативный вариант – на той же вкладке нажать Generate Token и выполнить указанную команду wings configure прямо в терминале, тогда конфиг создастся автоматически.

Проверьте запуск в отладочном режиме:

wings --debug

Если ошибок нет, остановите процесс сочетанием Ctrl+C и создайте службу – файл /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

Запустите Wings:

systemctl enable --now wings

Обновите страницу со списком нод в панели – рядом с вашей Node должен появиться зеленый индикатор с информацией о версии демона.

состояние ноды

Создание первого игрового сервера

Для добавления сервера вам необходимо перейти в раздел Servers, далее нажать на кнопку Create New.

На открывшейся странице необходимо ввести следующие данные:  

  • В блоке Core Details укажите основные сведения о сервере: имя сервера (Server Name), email владельца сервера (Server Owner) и описание сервера (Server Description).
  • Node – созданная нода, Default Allocation – свободный порт из диапазона.
  • Resource Limits – лимиты сервера. Для ванильного Minecraft на 10 игроков достаточно 2048 МБ RAM и 5120 МБ диска. Поле CPU Limit задается в процентах от одного ядра: 100 – одно полное ядро, 200 – два.
  • Nest – выберите Minecraft, Egg – например, Paper (оптимизированное ядро) или Vanilla Minecraft.
  • Startup Configuration – здесь задаются переменные яйца: версия игры, версия сборки, объем памяти для JVM.
создание игрового сервера

Нажмите Create Server. Панель отдаст команду Wings, тот скачает Docker-образ и выполнит скрипт установки – на это уйдет от одной до нескольких минут. За процессом можно наблюдать в консоли сервера: пока идет установка, она показывает лог загрузки файлов.

Когда сервер перейдет в статус Offline, нажмите Start. В консоли пойдет привычный вывод Minecraft, а через несколько секунд статус сменится на Running.

Обратите внимание!
При первом запуске Minecraft потребует принять лицензионное соглашение. Откройте вкладку Files, найдите eula.txt и замените eula=false на eula=true, после чего перезапустите сервер. У большинства яиц для Minecraft есть переменная, позволяющая принять EULA сразу при создании.

Подключаться к серверу игроки будут по адресу node.betutorial.ru:25565 (или по IP-адресу с указанием выданного порта).

Установка дополнительных яиц

Стандартного набора хватает не всегда: например, для конкретной сборки модов или свежей игры может понадобиться отдельное яйцо. Их публикуют в сообществе в виде JSON-файлов.

Скачайте нужный файл, затем в административной части откройте Nests, выберите или создайте гнездо и нажмите Import Egg. После загрузки яйцо появится в списке при создании нового сервера.

Обратите внимание!
Яйцо – это, по сути, инструкция для выполнения команд на вашем сервере в контейнере установки. Загружайте яйца только из источников, которым доверяете, и по возможности просматривайте содержимое JSON-файла перед импортом.

FAQ

Как обновить Panel и Wings?

Panel и Wings – это отдельные компоненты Pterodactyl, которые обновляются независимо.

Перед обновлением рекомендуется создать резервную копию базы данных и конфигурационных файлов. 

  • Panel
cd /var/www/pterodactyl
php artisan down
curl -L https://github.com/pterodactyl/panel/releases/latest/download/panel.tar.gz | tar -xzv
chmod -R 755 storage/* bootstrap/cache
composer install --no-dev --optimize-autoloader
php artisan view:clear
php artisan config:clear
php artisan migrate --seed --force
chown -R www-data:www-data /var/www/pterodactyl/*
php artisan queue:restart
php artisan up
  • Wings
systemctl stop wings
curl -L -o /usr/local/bin/wings "https://github.com/pterodactyl/wings/releases/latest/download/wings_linux_$([[ "$(uname -m)" == "x86_64" ]] && echo "amd64" || echo "arm64")"
chmod u+x /usr/local/bin/wings
systemctl restart wings
Как проверить состояние служб Pterodactyl?

Для проверки работы основных компонентов используйте: 

systemctl status nginx 
systemctl status php8.3-fpm
systemctl status mariadb
systemctl status redis-server
systemctl status wings
Как выбрать конфигурацию VPS для игровых серверов?

На VPS с Ubuntu 24.04 и установленным Pterodactyl без серверов уже используется часть ресурсов (обычно около 1 ГБ RAM и около 4 ГБ диска под систему и панель).

Итоговые требования зависят от:

  • количества игровых серверов;
  • числа игроков;
  • используемых модов и плагинов.

При расчете конфигурации VPS важно учитывать:

  • нагрузку ОС;
  • ресурсы Panel и Wings;
  • хранение логов и резервных копий;
  • сами игровые серверы;
  • запас производительности для стабильной работы.
Можно ли масштабировать инфраструктуру Pterodactyl?

Да. Pterodactyl поддерживает работу с несколькими VPS через систему Nodes – это позволяет распределять игровые серверы между разными VPS и управлять ими через одну панель. 

Для этого выберите VPS с Ubuntu 24.04 и установите на нем Docker и Wings так же, как описано в разделе “Установка Wings” выше, а затем создайте для этого сервера ноду в панели – см. раздел “Создание ноды в панели”.

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить Pterodactyl или наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем сообществе в Telegram.