RE:NODE

Эксплуатация13 мин чтения

Панель Pterodactyl: Wings, eggs и контейнеры

Что такое Pterodactyl на самом деле: панель, демон Wings, eggs и по одному контейнеру Docker на сервер. Что даёт хостинг на панели и чего он не может.

0 прочтений

Pterodactyl - это панель управления игровыми серверами с открытым исходным кодом, и это две программы, а не одна. Панель - веб-приложение, которое знает, кто вы, какими серверами владеете и что вам разрешено с ними делать. Wings - небольшой демон, работающий на каждой физической машине, общающийся с Docker и единственный, кто вообще прикасается к вашим файлам. Ваш сервер - это контейнер Docker, который запускает Wings, с лимитом памяти, долей CPU, дисковой квотой и одним-двумя привязанными портами. Почти любой игровой хостинг с интерфейсом в браузере, которым вы пользовались, - это она, только с другим логотипом.

Знать это - не праздное любопытство. Это объясняет, почему у вас есть консоль, но нет shell, почему лимиты памяти ведут себя именно так, почему файловый менеджер работает мгновенно, а установить новое программное обеспечение нельзя, и почему «перезапуск панели» никогда не чинит упавший игровой сервер. Эта статья описывает механизм сверху донизу и даёт честный список того, чего такая схема не умеет.

Две программы, две задачи#

Панель - приложение на Laravel с фронтендом на React. В собственной базе данных она хранит аккаунты, серверы, права, аллокации, расписания и записи аудита. Она отрисовывает каждую страницу, которую вы видите. Чего у неё нет - вашего файла мира, ваших логов и вашего процесса: панель не знает, что внутри вашего сервера, только то, что ей сообщает Wings.

Wings - небольшой демон на Go, устанавливаемый на каждый узел. Он общается с сокетом Docker, создаёт и уничтожает контейнеры, применяет лимиты, передаёт вывод консоли, обслуживает SFTP и делает backup. По умолчанию он слушает порт 8080, а SFTP отдаёт на 2022, и его конфигурация - один файл /etc/pterodactyl/config.yml, содержащий токен, которым он аутентифицируется перед панелью.

HTTPSаккаунты и праваподписанные вызовы APIwebsocket консолизапуск, остановка, лимитыВыбраузер или SFTP-клиентПанельLaravel и ReactБаза панелипользователи, серверы, праваДемон Wingsпо одному на машинуDockerконтейнер на серверИгровой процессваш сервер
Панель, Wings и контейнер на каждый сервер

Обратите внимание на пунктирную линию от браузера к Wings. Когда вы открываете консоль, панель выдаёт браузеру короткоживущий токен, и после этого браузер открывает websocket прямо к Wings. Вывод консоли не проходит через панель. Поэтому консоль может работать мгновенно, а загрузка страницы - обычно, и поэтому консоль, которая перестала обновляться, чаще всего означает проблему с узлом, а не с сайтом.

Это объясняет и целый класс недоразумений. Если панель недоступна, ваши серверы продолжают работать: Wings не нуждается в панели, чтобы держать контейнер живым. Если недоступен Wings, панель по-прежнему загружается, а каждый сервер отображается как выключенный, независимо от того, так ли это.

Один сервер - один контейнер Docker#

Каждый сервер получает контейнер, собранный из образа, выбранного его egg, и каталог на узле, смонтированный в него. На узле этот каталог - /var/lib/pterodactyl/volumes/<uuid>; внутри контейнера он - /home/container, и это рабочий каталог, в котором запускается игра. Всё, что вы видите в файловом менеджере, - это один этот каталог.

То, что это даёт, и то, во что это обходится, - одно и то же:

  • Изоляция. Сервер, который заполнил диск, загрузил CPU целиком или был убит из-за памяти, не может затронуть соседа. Отдельная файловая система, отдельное пространство имён процессов, отдельные лимиты.
  • Нет root и нет постоянной системы. Вы - непривилегированный пользователь в контейнере, который выбрасывается и пересобирается из образа при каждом запуске сервера. Всё, что вы установили бы менеджером пакетов, исчезло бы при следующем запуске, даже если бы вы могли его запустить. Файлы в /home/container сохраняются; ничего другого - нет.
  • Образ определяет, что существует. Если в образе Java 21, а вашей сборке модов нужна Java 8, вы меняете образ, меняя egg или переменную, выбирающую его, а не устанавливая Java.

Образы берутся из публичных реестров - проект публикует набор в ghcr.io/pterodactyl/yolks, размеченный по средам выполнения, так что egg для Minecraft может работать на yolks:java_21, а приложение Node.js - на yolks:nodejs_22. Образ выбирает хостинг; в аккаунте клиента версию обычно выбирают из выпадающего списка на вкладке Startup, а не вводят имя образа.

Eggs: как панель узнаёт, как установить игру#

Egg - это файл JSON, который описывает всё необходимое для запуска одного вида серверов. В основном проекте они сгруппированы в nests, то есть просто в папки с общей темой. Один egg содержит:

ЧастьЧто в ней
Образы DockerСреда выполнения, нужная игре, один или несколько на выбор
Скрипт установкиСкрипт bash, запускаемый один раз во временном контейнере
Команда запускаСтрока, запускающая игру, с переменными внутри
ПеременныеПоля, которые вы видите на вкладке Startup, со значениями по умолчанию и правилами
Парсер конфигурацииКакие файлы переписывать при запуске и какие ключи
Определение запускаСтрока лога, означающая «теперь сервер работает»
Команда остановкиКак завершить работу чисто, например stop или ^C

Установка - отдельный шаг, не то же самое, что запуск. Когда сервер создаётся, Wings запускает временный контейнер, монтирует пустой каталог сервера в /mnt/server, выполняет скрипт установки - обычно SteamCMD или скачивание и распаковка - и выбрасывает этот контейнер. Только после этого стартует настоящий контейнер. Поэтому новый сервер сидит на экране установки, а его консоль пуста, пока установка не закончится.

Команда запуска использует подстановки, которые заполняет панель:

bash
java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}} nogui

{{SERVER_MEMORY}}, {{SERVER_IP}} и {{SERVER_PORT}} берутся из тарифа и аллокации; всё остальное в двойных фигурных скобках - переменная, которую объявляет egg, и именно её вам показывает вкладка Startup. Измените имя файла jar в этом поле, и строка запуска изменится.

Парсер конфигурации - часть, которую никто не видит и о которую часто спотыкаются. Egg можно заставить переписывать server.properties при каждом запуске, чтобы server-port соответствовал аллокации. Если вы правите ключ, которым владеет egg, ваша правка перезаписывается при следующем запуске, и выглядит так, будто файл вернулся сам. Исправление - менять его там, где ожидает панель, то есть на вкладке Startup или Network, а не в файле.

Вкладки и что каждая на самом деле делает#

  • Console. Websocket к Wings, передающий стандартный вывод процесса, плюс командная строка, пишущая в его стандартный ввод. Это собственная консоль игры без фильтров, поэтому полезная ошибка всегда именно в ней. О том, на что смотреть, - в статье чтение консоли.
  • Files. HTTP-API файлов на Wings, ограниченное томом. Загрузка, редактор, архивы, распаковываемые на месте. Большие операции лучше делать по SFTP: SFTP и файловый менеджер.
  • Databases. Панель создаёт базу данных и пользователя на управляемом ею хосте баз данных, генерирует пароль и показывает данные для подключения. Внутри вашего контейнера она никогда не работает.
  • Schedules. Cron-выражение, хранимое в панели, с упорядоченными задачами - консольная команда, backup, действие с питанием, - у каждой своя задержка. Их запускает собственный планировщик панели и обращается к Wings. Пять полей разобраны в статье cron-выражения простыми словами.
  • Backups. Wings упаковывает том в tar и хранит архив. Восстановление заменяет содержимое тома. Backup - это backup файлов, а не памяти, поэтому игра, которая давно не сохранялась, даёт backup старого мира: всегда сначала отправляйте команду сохранения.
  • Network. Пары IP и порт, выделенные этому серверу. Основная - то, к чему привязывается игра; дополнительные нужны для query-портов, RCON, веб-карты или второй службы. Какие нужны вам, описано в статье порты игрового сервера.
  • Startup. Переменные egg в виде формы.
  • Users. Subusers с правами по отдельности, так можно дать модератору консоль без оплаты и кнопки удаления.

Панель RE:NODE - это наш собственный код поверх Pterodactyl и Wings, а не стандартная установка, поэтому кое-что здесь ведёт себя иначе намеренно. Вывод консоли без фильтров, с историей и автодополнением, а живые графики памяти, CPU и диска рисуются относительно лимитов, а не относительно узла. Учётные данные SFTP выдаются на сервер, а не на аккаунт, и это важно, как только вы даёте доступ к одному серверу тому, кому не нужны остальные. У слотов баз данных есть кнопка «открыть в phpMyAdmin», которая входит по одноразовому токену со сроком шестьдесят секунд. Контроль доступа - это роли, команды и права, а не плоский список subusers, с ограничением по времени и журналом действий на каждый сервер: практическая версия есть в статье subusers и минимум привилегий и в руководстве о людях и правах.

Лимиты и что бывает на их краю#

Три лимита задаются на каждый сервер и применяются ядром через Docker, а не игрой.

ЛимитКак выражаетсяНа краю
ПамятьМегабайты, жёсткий лимит cgroupКонтейнер убивается
CPUПроцент одного ядра - 250 это 2,5 ядраТроттлинг, но не убийство
ДискМегабайты квоты на томеЗапись не удаётся; сервер обычно падает

Именно память порождает обращения в поддержку. Контейнер на пределе останавливается ядром, а не замедляется, и у игры нет шанса сохраниться. В стандартном Pterodactyl OOM killer по умолчанию отключён, из-за чего контейнер уходит в swap и ползёт; RE:NODE делает противоположное намеренно, поэтому сервер на пределе останавливается и чисто перезапускается, а не остаётся в состоянии пробуксовки. Оба выбора защитимы, и ломаются они по-разному: наш стоит вам того, что не было сохранено, их - всем по часу сервера, который формально отвечает. В любом случае исправление одно: уменьшить интервал сохранения или купить ту память, которая игре действительно нужна. Сторона Java, где кроется большая часть сюрпризов, разобрана в статье лимиты памяти узла простыми словами.

CPU - это троттлинг, а не потолок объёма выполняемой работы: на 100% вашей доли игра просто работает медленнее. Сервер, упёршийся в лимит CPU, медленный, а не сломанный, и здесь это никогда не повод для приостановки. Сбои из-за дисковой квоты выглядят как повреждение данных, но это не оно: файл мира в порядке, запись просто не произошла.

Помимо лимитов контейнера есть сторож сбоев: он раз в пару минут проверяет сервер, у которого время работы пошло назад или который сам ушёл офлайн. Перезапуски, о которых вы просили, не считаются. Три неожиданных перезапуска за час выводят предупреждение на странице сервера и открывают обращение; шесть - приостанавливают его, потому что сервер, зациклившийся на сбое при запуске, впустую жжёт CPU узла. Диагностика - в статье почему ваш игровой сервер постоянно перезапускается.

Чего панель намеренно не может#

Это честный список, и именно из-за него некоторым людям панель не подходит совсем.

  • Нет root и нет shell. Консоль - это stdin игры, а не bash. Вы не можете запустить apt, htop, tcpdump или скрипт, который должен работать как демон.
  • Один сервер - одна игра. Контейнер выполняет команду запуска из egg. Запуск второго процесса рядом с ним не предусмотрен конструкцией; вторая игра - это второй сервер.
  • Никаких системных служб. Нет systemd, нет cron внутри контейнера, нет собственных правил файрвола. Первые два заменяет вкладка Schedules панели; третье - забота хостинга.
  • Никакого произвольного программного обеспечения. Если вашему моду нужна нативная библиотека, которой нет в образе, ответ - другой образ, что у большинства хостингов означает другой egg, а значит, просьбу к ним.
  • Порты - это порты. Вы получаете аллокации, указанные в вашем тарифе, и можете добавлять или убирать их на вкладке Network в пределах тарифа. Привязать что-либо где-либо вы не можете.

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

Свой Pterodactyl или аренда у того, кто его держит#

Pterodactyl бесплатен, и вы можете его установить. Сама установка занимает вечер: веб-сервер, PHP, база данных, обработчик очереди, Wings, Docker, сертификат. Официальная документация хороша и актуальна.

Что вы берёте на себя потом - то, что никто не считает. Вы отвечаете за обновления ОС, обновления Docker, обновления панели и их миграции, продление сертификата, хранилище backup не на том же диске, файрвол и доступность узла в три часа ночи. Вы же отвечаете за проблему злоупотреблений, как только аккаунт есть у кого-то, кроме вас. Для одного человека с тремя серверами на одной машине это вполне разумный проект на выходные, а более лёгкие альтернативы описаны в статье несколько игровых серверов на одном VDS. Для сообщества, которое ждёт, что сервер работает, пока вы в отпуске, это второе хобби.

Причина интересоваться всем этим как клиенту в том, что это подсказывает, о чём спрашивать хостинг. Уходят ли backup с машины, которую они защищают. Что происходит на пределе памяти. Выдаются ли учётные данные SFTP на сервер или на аккаунт. Можете ли вы сами добавить порт. Все это ответы уровня панели, и хостинг, который не может дать их быстро, - это хостинг, который об этом не думал.

Проблемы, которые выглядят как проблемы панели, но не являются ими#

В консоли пусто, а сервер «офлайн». Wings не отвечает. Ничто из того, что вы сделаете в панели, не поможет, а игра может всё ещё работать. Это страница статуса и обращение, а не повторная попытка.

Сервер запускается и сразу останавливается без ошибки. Прочитайте последние двадцать строк перед остановкой. Почти всегда это отсутствующий файл, который называет команда запуска, порт, который уже занят, или конфиг, который игра отказывается разбирать.

Моё изменение конфига пропало после перезапуска. Этим ключом владеет парсер конфигурации egg. Задайте его на вкладке Startup или Network.

Файловый менеджер не загружает сборку модов на 4 GB. Загрузка через браузер на таком размере - не тот инструмент. Используйте SFTP или загрузите zip и распакуйте на месте.

Всё медленно, а графики выглядят нормально. Смотрите, какой именно график. Суммарный CPU по ядрам может держаться на 30%, пока горячий однопоточный поток игры упёрся в потолок, а график памяти может выглядеть здоровым вплоть до момента, когда всплеск переходит лимит.

FAQ#

Бесплатен ли Pterodactyl, и не экономит ли на качестве хостинг, который его использует?

Он бесплатен и с открытым исходным кодом, и его использование - не срезание углов. Он решает скучные и опасные части - изоляцию, аллокации, права, backup - способом, который проверило множество людей. Хостинги отличаются железом под ним, тем, что они надстроили, и тем, отвечает ли кто-то на обращения.

Можно ли получить SSH-доступ к моему игровому серверу?

Нет. Сервер на панели - это контейнер с игрой, и SSH в него не входит. Вам доступны SFTP для файлов и консоль для игры. Если нужен shell, вам нужен VDS.

Почему я не могу установить плагин, которого панель не знает?

Можете: плагины, моды и конфиги - просто файлы, которые вы загружаете через файловый менеджер или SFTP, и списка одобренных модов нет. Нельзя установить системное программное обеспечение, потому что контейнер пересобирается из образа при каждом запуске.

Что такое egg, одним предложением?

Файл-рецепт, который сообщает панели, какой образ Docker использовать, как установить игру, как её запустить и какие настройки показывать вам на вкладке Startup.

Пересоздаёт ли смена тарифа сервер?

Нет. Лимиты памяти, CPU и диска меняются у уже существующего сервера. Том, а значит и ваш мир, остаётся на месте.

Продолжает ли панель работать, если мой сервер упал, и наоборот?

Да, и то, и другое. Это отдельные программы. Упавший игровой сервер оставляет панель вполне работоспособной, так вы и читаете лог, объясняющий причину; сбой панели оставляет работающие серверы работать, потому что Wings не спрашивает разрешения держать контейнер живым.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000