RE:NODE

Valheim на Pterodactyl: egg, порты и переменные запуска

Автор Команда RE:NODE
12 мин чтения


Чтобы запустить Valheim в панели Pterodactyl, нужны четыре вещи: egg для Valheim, импортированный в nest; нода, у которой для сервера выделены два последовательных порта (игровой и следующий за ним, оба доступны по UDP); заполненные переменные запуска - имя сервера, имя мира, пароль, не имеющий общих слов ни с тем, ни с другим, и публичность вкл или выкл; и команда остановки ^C, чтобы кнопка Stop в панели отправляла SIGINT и мир сохранялся до завершения контейнера. Миры после этого лежат в файловом менеджере сервера в домашнем каталоге контейнера, а для модов используется отдельный egg с BepInEx, а не изменённый ванильный. Почти все проблемы сводятся к трём: выделен только один порт, пароль, который игра отвергает, или имя мира, не совпадающее с файлом.

Статья рассчитана на два типа читателей: тех, кто держит собственную панель Pterodactyl и добавляет в неё Valheim, и тех, кто арендует сервер Valheim у хостинга на базе Pterodactyl и хочет понять, что на самом деле делают вкладки Startup и Network.

Как Pterodactyl запускает сервер Valheim#

У Pterodactyl две половины. Панель - веб-приложение, где хранятся серверы, пользователи и настройки. Wings - демон на каждой машине (ноде), который создаёт контейнеры Docker, запускает и останавливает их, передаёт их консоль и отдаёт их файлы. Каждый игровой сервер - один контейнер с лимитами памяти, CPU и диска, заданными панелью, и томом на ноде, где лежат его файлы.

Что делает контейнер, определяет egg - JSON-файл с описанием одной игры. Egg'и сгруппированы в nest'ы. В egg входят:

ЧастьДля чего она в Valheim
Образ DockerСреда, в которой работает сервер, обычно образ Debian или Ubuntu с поддержкой SteamCMD
Скрипт установкиВыполняется один раз в отдельном контейнере-установщике: SteamCMD скачивает приложение 896660
Команда запускаСтрока valheim_server.x86_64 с переменными вместо значений
ПеременныеИмя, мир, пароль, публичность и всё остальное, что открывает egg
Команда остановки^C, которую Wings превращает в SIGINT
Done stringСтрока лога, по которой панель понимает, что сервер завершил запуск

Хороший egg избавляет тех, кто работает в панели, от необходимости знать о существовании SteamCMD. Плохой означает, что сервер переустанавливается при каждом запуске или убивается при каждой остановке. Формат в целом разобран в статье egg'и Pterodactyl для игровых серверов; здесь мы держимся того, что важно для Valheim. Если сам Pterodactyl вам в новинку, введением служит статья панель Pterodactyl: разбор.

Где взять egg для Valheim и как его импортировать#

В Pterodactyl нет egg'а для Valheim в комплекте. В репозитории egg'ов сообщества на GitHub - раньше parkervcp/eggs, теперь под организацией pelican-eggs - есть папка Valheim с отдельными egg'ами для ваниллы, для BepInEx и для Valheim Plus. Берите ванильный, если точно не знаете, что нужны моды; варианты описаны ниже.

Чтобы импортировать его в панели Pterodactyl 1.x:

  1. Скачайте .json-файл egg'а из репозитория. Прочитайте его - это скрипт установки вашего сервера.
  2. В админ-панели откройте Nests, выберите или создайте nest (удобен nest «Valheim» или «Survival games») и нажмите Import Egg.
  3. Откройте импортированный egg и проверьте список образов Docker, команду запуска и скрипт установки на соответствие ожиданиям.
  4. Создайте сервер с этим egg'ом. Панель выполнит скрипт установки, после чего сервер будет готов к запуску.

Контейнер-установщик выполняет скрипт egg'а с томом сервера, смонтированным в /mnt/server, а в работающем контейнере тот же том является домашним каталогом /home/container. Первая установка занимает несколько минут - сервер Valheim весит около 2 ГБ.

Если вы используете Pelican, форк Pterodactyl, egg'и импортируются похожим образом, но структура панели отличается; где находится импорт, смотрите в документации самого Pelican.

Переменные запуска и строка запуска#

Команда запуска в egg'е - это шаблон. Переменные записываются как {{NAME}} и заменяются значениями каждого сервера при старте. Упрощённая команда запуска Valheim выглядит так - точные имена переменных различаются между версиями egg'ов, поэтому смотрите свои на странице egg'а или на вкладке Startup сервера:

bash
./valheim_server.x86_64 -nographics -batchmode -name "{{SERVER_NAME}}" \    -port {{SERVER_PORT}} -world "{{WORLD}}" -password "{{PASSWORD}}" \    -public {{PUBLIC_SERVER}}

Настоящие egg'и добавляют перед этой строкой окружение, нужное Valheim, - LD_LIBRARY_PATH, указывающий на папку linux64 сервера, и SteamAppId=892970, - либо в команде запуска, либо в entrypoint образа Docker. Почему нужны обе переменные, объясняет руководство по установке через SteamCMD.

{{SERVER_PORT}} - не переменная egg'а. Её задаёт Wings равной основной аллокации сервера, поэтому порт никогда не появляется как редактируемое поле. Среди других встроенных значений - SERVER_IP и SERVER_MEMORY.

Переменные, которые обычно открывает egg для Valheim, по ролям:

ПеременнаяСоответствуетПримечания
Имя сервера-nameПоказывается в списке сообщества; не должно содержать пароль
Имя мира-worldИмя файла в worlds_local без расширения, с учётом регистра
Пароль-passwordМинимум 5 символов; никаких общих слов с именем или миром
Публичность-public1 включает сервер в список, 0 скрывает
Автообновление(entrypoint)Запускает обновление SteamCMD при каждом старте, если оно есть в egg'е
Дополнительные аргументыдописываютсяВ некоторых egg'ах есть текстовое поле для флагов вроде -crossplay

У каждой переменной есть правила валидации в синтаксисе Laravel (например, required|string|min:5) и два флага: видят ли её пользователи и могут ли они её редактировать. Как администратор панели, вы решаете, какие настройки принадлежат клиенту. Если сделать пароль редактируемым пользователем с правилом min:5, вы избавитесь от тикетов; а оставив саму команду запуска заблокированной, не дадите сломать путь к библиотекам.

У Valheim нет файла конфигурации, поэтому всё, что egg не открывает, нельзя изменить без редактирования egg'а. Если в вашем egg'е нет поля для кроссплея, модификаторов мира или интервала сохранения, администратор может добавить для них переменные или одну текстовую переменную «дополнительные аргументы» в конец команды запуска. Флаги и их значения по умолчанию описаны в справочнике аргументов запуска Valheim.

Аллокации: как правильно выделить оба UDP-порта#

В Pterodactyl порт - это аллокация: пара IP и порт, созданная на ноде и назначенная одному серверу. Wings публикует каждую аллокацию и для TCP, и для UDP, так что в панели нет настройки протокола, в которой можно ошибиться. Ошибиться можно в количестве.

Valheim занимает игровой порт и порт на единицу выше. Первый вы задаёте через -port; второй следует автоматически и отдельно не настраивается. Поэтому серверу Valheim нужны:

  1. Основная аллокация на игровом порту, например 2456. Она становится SERVER_PORT.
  2. Дополнительная аллокация на ближайшем следующем порту, 2457, назначенная тому же серверу.

Если второй аллокации нет, сервер всё равно запускается и всё равно занимает 2457 внутри контейнера - но снаружи он недоступен, потому что Docker его не опубликовал. Обычный симптом - сервер, к которому игроки могут подключиться по IP, но который никогда не появляется в списке сообщества, потому что список обращается к порту запросов. Другие причины этого симптома разобраны в статье сервер Valheim не отображается в списке.

Для администратора последовательность такая: на вкладке Allocation ноды добавьте IP и диапазон вроде 2456-2465; при создании сервера выберите основным 2456 и добавьте 2457 как дополнительную аллокацию. Для второго сервера Valheim на той же ноде начните с 2458 и 2459 рядом. Держите пару каждого сервера последовательной - аллокация на 2460 ничего не даёт серверу, чей игровой порт 2458.

Файрвол самой ноды тоже должен пропускать эти порты по UDP, как и любой облачный файрвол провайдера перед ней. Одна ловушка: Docker пишет собственные правила iptables для опубликованных портов, и трафик к контейнерам не проходит через обычные входящие правила ufw, поэтому список правил ufw, который выглядит закрытым, может быть открытым, а выглядящий открытым - не тем, что на самом деле пропустило трафик. Проверяйте снаружи, а не доверяйте списку правил. Арифметика портов и их проверка описаны в статье порты Valheim 2456-2458: разбор.

Остановка, done string и сохранения#

Две строки в конфигурации egg'а решают, поладят ли панель и Valheim.

Команда остановки - то, что панель отправляет, когда кто-то нажимает Stop или Restart. В большинстве игр это консольная команда вроде stop или quit. У Valheim нет консоли stdin, поэтому его egg'и используют ^C, которое Wings интерпретирует как «отправить SIGINT процессу». Это тот сигнал, который Valheim воспринимает как корректное завершение: он сохраняет мир и выходит. Если команда остановки в egg'е другая, панель ждёт, ничего не происходит, и в итоге кто-то нажимает Kill - а это отправляет SIGKILL и теряет всё с момента последнего сохранения.

Done string - строка из вывода сервера, которую панель отслеживает, чтобы перевести сервер из состояния «starting» в «running». Для Valheim это обычно строка из конца запуска, например сообщающая, что игровой сервер подключился к Steam. Если она никогда не совпадает, сервер работает, но навсегда остаётся в состоянии «starting». Какие строки печатает Valheim и в каком порядке, описано в статье лог сервера Valheim: разбор.

Каждый мир Valheim хранится в памяти и записывается каждые -saveinterval секунд (по умолчанию 1800). Кнопки панели при правильном использовании дают чистое сохранение:

Действие в панелиСигналМир сохранён
StopКоманда остановки egg'а (^C даёт SIGINT)Да
RestartОстановка, затем запускДа
KillSIGKILLНет
Контейнер достиг лимита памятиУбит ядромНет

По умолчанию в upstream-версии Pterodactyl контейнер, достигший лимита памяти, уходит в своп, а не останавливается. Это сохраняет процесс живым ценой сервера, который еле ползёт; в любом случае подбирайте память так, чтобы лимит не достигался. Реалистичные цифры есть в статье сколько RAM нужно серверу Valheim.

Файлы: где в файловом менеджере лежит мир#

Файловый менеджер и SFTP показывают том контейнера, который с точки зрения сервера является /home/container. Игра лежит в этой папке. Каталог сохранений Valheim, если egg не передаёт -savedir, - стандартный каталог Unity в домашней директории:

code
/home/container/.config/unity3d/IronGate/Valheim/    worlds_local/Midgard.db    worlds_local/Midgard.fwl    adminlist.txt    bannedlist.txt    permittedlist.txt

Некоторые egg'и задают -savedir в видимую папку в корне сервера, чтобы её было проще найти; проверьте свою строку запуска. Папки с точки в списках файлов легко пропустить, из-за чего иногда решают, что мир исчез, хотя он лежит в .config.

Чтобы загрузить мир из одиночной игры: остановите сервер, загрузите и .db, и .fwl в worlds_local, задайте переменной имени мира имя файла без расширения, затем запустите и следите по консоли, что мир загружается по имени. По SFTP Wings по умолчанию слушает порт 2022, а имя пользователя - это ваше имя в панели, соединённое через точку с коротким ID сервера; панель показывает оба на странице Settings сервера. Полная инструкция есть в статье загрузка локального мира Valheim на сервер.

Бэкапы панели - это архивы тома, поэтому они включают каталог сохранений. Администраторы могут исключать пути с помощью файла .pteroignore в корне сервера - исключение 2 ГБ файлов игры уменьшает бэкапы Valheim в разы, поскольку SteamCMD всегда может скачать их заново.

Вариант с BepInEx и моды#

Модам не нужен другой игровой сервер; им нужен другой способ его запуска. BepInEx подключается к Unity через загрузчик doorstop, настраиваемый переменными окружения, которые start_server_bepinex.sh из BepInExPack устанавливает перед запуском valheim_server.x86_64. Ванильный egg запускает бинарник напрямую и никогда не загружает BepInEx, сколько бы файлов модов вы ни загрузили.

Это решает egg с BepInEx от сообщества: его скрипт установки скачивает BepInExPack для Valheim вместе с сервером, а его запуск задаёт переменные doorstop. Перевод существующего сервера на него выполняет администратор в настройках Startup сервера в админ-панели, меняя egg; проверьте, вызывает ли смена egg'а переустановку в вашей версии панели, и сделайте бэкап.

Когда BepInEx загружается - его собственные строки появляются в начале консоли, - моды представляют собой .dll-файлы, которые кладутся в BepInEx/plugins через файловый менеджер или SFTP, а конфигурации появляются в BepInEx/config после первого запуска. Egg Valheim Plus работает так же, с Valheim Plus в комплекте; проверьте, что скачиваемая сборка соответствует версии вашей игры, потому что у Valheim Plus было несколько форков. Правила о том, какие моды нужны на сервере, на клиенте или на обоих, описаны в статье моды Valheim с BepInEx на сервере. На модифицированном сервере отключите любую переменную автообновления: патч Valheim ломает большинство модов, пока их не пересоберут.

Schedules: рестарты и бэкапы в Pterodactyl#

Расписания Pterodactyl принимают выражение cron и выполняют список задач по порядку, у каждой можно задать задержку: отправить консольную команду, выполнить действие с питанием или создать бэкап.

Для Valheim задача с консольной командой почти бесполезна - сервер ничего не читает из stdin, и предупредить игроков в игре нельзя, - поэтому расписание строится из действий с питанием и бэкапов:

ЗадачаДействиеЗадержка
1Действие с питанием: restart0
2Создать бэкап120 секунд

Запускайте его раз в неделю в тихий час - 0 5 * * 1 означает понедельник в 05:00 по часовому поясу панели. Рестарт останавливает сервер корректно, поэтому бэкап двумя минутами позже захватывает только что сохранённый мир. Второе расписание только с задачей бэкапа, ежедневное, покрывает остальные шесть дней. Почему для Valheim достаточно еженедельного рестарта, объясняет статья расписания рестартов, которые помогают, а синтаксис описан в статье выражения cron: разбор.

На RE:NODE#

RE:NODE запускает собственную панель поверх Pterodactyl и Wings, так что всё из этой статьи применимо напрямую. Сервер Valheim приходит с выделенными обоими UDP-портами, уже включённым кроссплеем и сгенерированным паролем; вкладка Startup содержит игровые переменные, а вкладка Network - место, где вы добавляете или удаляете порты. Моды загружаются через файловый менеджер или SFTP - белого списка нет. Слоты бэкапов идут с каждым тарифом, а вкладка Schedules запускает рестарты и бэкапы так, как описано выше.

FAQ#

Почему мой сервер Valheim на Pterodactyl не отображается в списке серверов?

Обычно потому, что выделен только игровой порт. Valheim также нужен порт на единицу выше для запросов Steam, назначенный тому же серверу как дополнительная аллокация. Подключитесь по IP, чтобы убедиться, что сам сервер работает, затем добавьте вторую аллокацию и перезапустите.

Безопасна ли для мира кнопка Stop в панели?

Да, если команда остановки в egg'е - ^C. Тогда Wings отправляет SIGINT, и Valheim сохраняется перед выходом. Kill пропускает сохранение. Если Stop, кажется, зависает, проверьте команду остановки в egg'е, прежде чем хвататься за Kill.

Можно ли включить кроссплей со стандартным egg'ом?

Если egg открывает переменную для кроссплея или дополнительных аргументов - да, добавьте -crossplay. Если нет, администратору придётся добавить её в egg. Игроки тогда подключаются по шестизначному коду, который печатается в консоли при каждом запуске.

Куда класть моды Valheim на сервере Pterodactyl?

В BepInEx/plugins, но только на сервере, использующем egg с BepInEx. Ванильный egg никогда не загружает BepInEx, поэтому файлы игнорируются. Сначала смените egg, убедитесь, что в консоли есть строки BepInEx, затем загружайте моды.

Почему сервер переустанавливается или обновляется при каждом запуске?

В egg'е включена переменная автообновления, и его entrypoint запускает SteamCMD перед стартом. Для ванильных серверов это удобно, для модифицированных вредно; отключите её на вкладке Startup, если ваш egg её открывает.