RE:NODE

Руководства11 мин чтения

Команды админа Palworld, RCON и REST API

Как задать пароль админа, выполнять команды Palworld в игре и через RCON, работать с REST API через curl и сделать так, чтобы баны на выделенном сервере действовали.

0 прочтений

Администрирование выделенного сервера Palworld сводится к одному паролю и трём способам им пользоваться. Задайте AdminPassword в PalWorldSettings.ini, и вы сможете набрать в игровом чате /AdminPassword <ваш пароль>, чтобы открыть набор команд, подключить клиент Source RCON к порту 25575 или отправлять HTTP-запросы к REST API на порту 8212. Список команд короткий - около дюжины пунктов, никаких чит-команд, никакого создания предметов, - но он покрывает объявления, кики, баны, телепорты, принудительные сохранения и завершение с обратным отсчётом, а этого достаточно для любого скрипта автоматического перезапуска. В статье разобраны все три способа, форматы идентификаторов игроков, от которых зависит, сработает ли кик, и особенности, которыми RCON в Palworld отличается от RCON во всех остальных играх.

Как задать пароль админа#

Одна строка в конфиге, при остановленном сервере:

PalWorldSettings.ini
OptionSettings=(...,AdminPassword="7Tz-quay-brindle",ServerPassword="...",...)

К значению три правила. В нём не должно быть запятой, закрывающей скобки или двойной кавычки, потому что весь конфиг - это один кортеж через запятую внутри скобок, и эти символы завершают его раньше времени. Оно не должно совпадать с ServerPassword - паролем для входа, который знает каждый игрок. И оно хранится открытым текстом в файле, который может прочитать любой, у кого есть доступ к файлам, так что считайте доступ к файловому менеджеру и SFTP доступом админа: в статье субпользователи и минимальные привилегии эта проблема рассмотрена применительно к панели. Остальной конфигурационный файл разобран по ключам в статье настройки сервера Palworld.

Чтобы воспользоваться им в игре, нажмите Enter, откройте чат и отправьте:

code
/AdminPassword 7Tz-quay-brindle

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

Игровой чат/AdminPasswordКлиент RCONTCP 25575REST APITCP 8212AdminPasswordодин общий секретСервер Palworldобработчик команд
Три пути к одному набору команд

Список команд#

В чате каждая команда начинается с /. По RCON и в большинстве консолей панелей вы отправляете то же слово без слэша. Список короткий, и намеренно.

КомандаЧто делает
InfoВерсия и название сервера
ShowPlayersCSV со всеми подключёнными и их идентификаторами
SaveЗаписывает мир на диск прямо сейчас
Broadcast <message>Сообщение всем подключённым игрокам
KickPlayer <id>Отключает игрока
BanPlayer <id>Отключает и добавляет в список банов
UnBanPlayer <id>Снимает бан (только в новых сборках)
TeleportToPlayer <id>Телепортирует вас к нему
TeleportToMe <id>Телепортирует его к вам
Shutdown <seconds> <message>Обратный отсчёт, объявление, чистая остановка
DoExitНемедленно останавливает процесс

Вот и всё. Нет команды, чтобы создать предмет, изменить погоду, задать время, повысить игрока или отредактировать гильдию. Всё сверх списка выше требует серверного мода, а моддинг Palworld намного скуднее, чем у Valheim или Minecraft, так что планируйте вокруг встроенного набора, а не предполагайте, что нужный плагин существует.

Две из них заслуживают внимания. Shutdown 60 "Restarting for the weekly update" - та, на которой вы строите автоматизацию: она предупреждает всех, ждёт, сохраняет и чисто завершается. DoExit ничего этого не делает, а в игре, которая непрерывно пишет большой файл мира, именно так вы получаете обрезанное сохранение. Используйте Save, затем Shutdown, а DoExit оставьте для сервера, который перестал отвечать.

У Broadcast есть давнее странное поведение: в нескольких сборках он считает сообщение одним токеном и отбрасывает всё после первого пробела, когда его отправляют по RCON. Если ваши объявления приходят одним словом, в качестве обходного пути заменяйте пробелы подчёркиваниями или отправляйте сообщение через конечную точку announce в REST API, у которой такой проблемы нет.

Идентификаторы игроков и почему ваш кик ничего не сделал#

ShowPlayers возвращает текст через запятую со строкой заголовка:

code
name,playeruid,steamidOdin,1234567890,76561198012345678Freyja,0987654321,76561198087654321

Это два разных идентификатора. playeruid - внутренний дескриптор игры, и его смысл меняется от сборки к сборке; steamid - 17-значный SteamID64, которым пользуется всё остальное в экосистеме Steam. Текущие сборки ожидают для киков и банов форму с префиксом платформы:

code
BanPlayer steam_76561198012345678KickPlayer steam_76561198012345678

Передача голого SteamID64 или playeruid - самая частая причина того, что бан, кажется, проходит, а игрок сразу возвращается. Если команда вообще ничего не возвращает, это тоже обычно формат идентификатора, а не проблема с правами. Копируйте значение из ShowPlayers, а не просите его у игрока, потому что имя с запятой или нелатинским символом в CSV тоже не переживёт.

Включение RCON#

RCON - это протокол Source: TCP-соединение, один пароль, открытый текст в обе стороны. Включают его два ключа, а пароль админа и есть пароль RCON.

ini
OptionSettings=(...,RCONEnabled=True,RCONPort=25575,AdminPassword="...",...)

Перезапустите и обращайтесь. Подойдёт любой клиент Source RCON. mcrcon и rcon-cli от gorcon - два, к которым обычно тянутся:

bash
$ rcon-cli --address 203.0.113.10:25575 --password '7Tz-quay-brindle' "ShowPlayers"$ mcrcon -H 203.0.113.10 -P 25575 -p '7Tz-quay-brindle' "Save" "Info"$ rcon-cli -a 203.0.113.10:25575 -p '7Tz-quay-brindle' \    "Broadcast Server_restarts_in_five_minutes"

Реализация Palworld не вполне стандартна, и полезно знать, какие странности ваши, а какие принадлежат игре:

  • Ответы могут приходить с опозданием на один пакет, так что клиент может вывести ответ на предыдущую команду. Клиенты, написанные для Minecraft, обычно справляются; совсем простые - нет.
  • Имена игроков не из ASCII в некоторых сборках возвращаются искажёнными, потому что ответ закодирован не так, как ожидает протокол. Это влияет на отображение, а не на команду.
  • Shutdown может вообще не вернуть ответ, поскольку сервер уже уходит. Клиент, который его ждёт, будет выглядеть зависшим. Так и должно быть.

Есть ещё одна вещь, удивляющая пришедших из других игр: Palworld не читает команды из стандартного ввода. Набрать ShowPlayers в консоли панели само по себе ничего не даёт, потому что игра туда никогда не смотрит. Некоторые образы панелей связывают консоль с RCON, и кажется, что это работает; если у вашего нет, единственный путь - RCON или REST API. Это же означает, что автоматизированная задача «отправить эту консольную команду» на самом деле внутри является вызовом RCON.

У RCON нет ни шифрования, ни учётных записей пользователей, поэтому он никогда не должен быть доступен из открытого интернета. Закройте его правилом файрвола или заходите через SSH-туннель с той машины, с которой администрируете. Минимум описан в статье безопасная работа с RCON, а само правило - в статье правила файрвола, которые важны. На панели вы управляете тем, какие порты существуют, на вкладке Network, и RCON - одно из выделений, а не то, о чём можно тихо забыть.

REST API#

Новые сборки поставляются с HTTP-API для администрирования, с которым автоматизировать проще, чем с RCON, и у которого нет странности с broadcast. Два ключа:

ini
OptionSettings=(...,RESTAPIEnabled=True,RESTAPIPort=8212,AdminPassword="...",...)

Аутентификация - HTTP Basic с именем пользователя admin и паролем админа в качестве пароля. Конечные точки находятся под /v1/api/:

МетодПутьНазначение
GET/v1/api/infoВерсия, название сервера
GET/v1/api/playersПодключённые игроки с идентификаторами и пингом
GET/v1/api/settingsДействующие настройки в том виде, как их разобрал сервер
GET/v1/api/metricsFPS сервера, время кадра, число игроков, аптайм
POST/v1/api/announceРазослать сообщение
POST/v1/api/kickКикнуть по идентификатору пользователя
POST/v1/api/banЗабанить по идентификатору пользователя
POST/v1/api/unbanСнять бан
POST/v1/api/saveПринудительное сохранение
POST/v1/api/shutdownОстановка с обратным отсчётом и сообщением
POST/v1/api/stopОстановить сейчас
bash
$ curl -u admin:'7Tz-quay-brindle' http://203.0.113.10:8212/v1/api/metrics$ curl -u admin:'7Tz-quay-brindle' -H 'Content-Type: application/json' \    -d '{"message":"Restarting in 5 minutes"}' \    http://203.0.113.10:8212/v1/api/announce$ curl -u admin:'7Tz-quay-brindle' -H 'Content-Type: application/json' \    -d '{"userid":"steam_76561198012345678","message":"Griefing"}' \    http://203.0.113.10:8212/v1/api/ban

GET /v1/api/settings - самый полезный вызов из списка, которым почти никто не пользуется. Он возвращает настройки в том виде, как их разобрал сервер, и это единственный надёжный способ выяснить, что в вашем конфигурационном файле синтаксическая ошибка и все множители тихо вернулись к 1.0. После любого изменения конфига сравните его с тем, что, по-вашему, вы написали.

GET /v1/api/metrics возвращает частоту и время кадра сервера вместе с числом игроков. Здоровый сервер Palworld держится на целевой частоте кадров; число, которое проседает по вечерам, пока растёт память, - сигнал, описанный в статье почему вашему серверу Palworld нужно больше памяти, чем вы думаете, и это лучшее раннее предупреждение, чем ожидание жалоб игроков на откаты.

Баны, список банов и глобальный список#

Бан записывается в обычный текстовый файл рядом с сохранениями:

code
Pal/Saved/SaveGames/banlist.txt

Одна запись на строку, в той же форме с префиксом, которую принимают команды. Его можно править вручную при остановленном сервере; так снимают бан в сборке без UnBanPlayer и так заполняют новый сервер существующим списком. Правки, сделанные при работающем сервере, могут быть затёрты, потому что сервер перезаписывает файл, когда кого-то банит.

Есть и общесетевой список. BanListURL по умолчанию указывает на опубликованный список банов Pocketpair, и сервер получает его при запуске. Два практических следствия: ваш сервер наследует баны, которых не делал, а если URL недоступен, сервер записывает в лог сбой и продолжает работу. Вы можете направить BanListURL на текстовый список в том же формате, который размещаете сами, чтобы делить один список банов между несколькими серверами, - полезно, если у вас их больше одного и вы хотите, чтобы грифер пропал с обоих.

Баны привязаны к учётной записи платформы, а не к адресу. Человека со второй учётной записью Steam бан не остановит, а в базовой игре нет ничего, что банит по IP. Если сервер становится мишенью, ServerPassword - более эффективный инструмент, чем список банов.

Автоматизация рутины#

Всё, что стоит автоматизировать на сервере Palworld, - это Save, предупреждение и Shutdown. Перезапуск каждую ночь держит память ровной, а объявление не даёт людям терять штурм базы из-за него.

bash
# 23:55 - предупреждение за пять минут, сохранение, затем чистая остановка с отсчётом$ rcon-cli -a 127.0.0.1:25575 -p "$RCON_PASS" "Broadcast Nightly_restart_in_5_minutes"$ sleep 240$ rcon-cli -a 127.0.0.1:25575 -p "$RCON_PASS" "Save"$ rcon-cli -a 127.0.0.1:25575 -p "$RCON_PASS" "Shutdown 60 Nightly_restart"

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

Одного автоматизировать не стоит: перезапуск по таймеру без проверки игроков. Обратный отсчёт в 23:00 хотя бы раз в месяц приходится на середину чьего-то вечера. Либо выберите час, когда никто не играет, либо запускайте перезапуск по числу игроков, которое даёт /v1/api/metrics.

Диагностика проблем#

RCON отвергает пароль. В пароле в ini есть запятая, скобка или кавычка, и разборщик конфига остановился раньше, так что сервер работает с пустым паролем админа. Проверьте GET /v1/api/settings или ещё раз посмотрите на конфиг.

RCON подключается, команды ничего не возвращают. Обычно это то самое поведение со смещением ответов на единицу. Отправьте команду дважды и посмотрите, придёт ли первый ответ при втором вызове; если да, виноват клиент, а не сервер.

Порт открыт, но никто не отвечает. RCONEnabled=True вступает в силу только после перезапуска, и это TCP-порт, тогда как игровой порт - UDP, поэтому правило файрвола, скопированное с игрового порта, его не покроет. Общая форма этой ошибки описана в статье порты игровых серверов простыми словами.

Забаненный игрок продолжает возвращаться. Неверная форма идентификатора, вторая учётная запись или список банов, перезаписываемый у вас из-под рук. Проверьте banlist.txt после бана и убедитесь, что строка там есть в форме steam_<id>.

`/AdminPassword` ничего не отвечает в чате. Пароль не совпадает, или у вас сборка, где ответ в чате подавлен. Сразу после этого попробуйте /Info: если вернулась строка версии, вы админ.

Предупреждения о завершении не доходят до игроков. Баг с разбиением broadcast по пробелам. Используйте подчёркивания или конечную точку announce в REST.

FAQ#

Работают ли команды админа Palworld в кооперативе?

Нет. Набор команд существует только на выделенном сервере. У мира, размещённого изнутри игры, нет ни пароля админа, ни RCON, ни REST API, и это одна из лучших причин перенести мир группы на выделенный сервер.

Можно ли дать кому-то права админа, не делясь паролем?

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

В чём разница между Shutdown и DoExit?

Shutdown принимает обратный отсчёт в секундах и сообщение, объявляет его, сохраняет и чисто завершается. DoExit завершает процесс немедленно, без предупреждения и без гарантии сохранения. Используйте DoExit только тогда, когда сервер перестал отвечать на что-либо другое.

Что лучше, RCON или REST API?

REST API, если он есть в вашей сборке. Он возвращает структурированный JSON, у него работающая конечная точка announce, а у /v1/api/settings и /v1/api/metrics нет эквивалента в RCON. RCON тоже стоит включить, потому что на нём говорит больше готовых инструментов.

Как найти SteamID64 игрока?

Выполните ShowPlayers, пока он подключён, и возьмите третий столбец. Не спрашивайте его у игрока: число на странице профиля Steam - то же значение, но люди присылают адрес с vanity-URL или 32-разрядную форму, и ни то ни другое не работает.

Замедляет ли сервер включённый RCON?

Нет. Это простаивающий TCP-слушатель, который ничего не делает, пока не подключится клиент. Цена включения - риск для безопасности, а не производительность, поэтому ответ - включить его и закрыть файрволом, а не оставлять выключенным.


Комментарии

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

0/2000