Rust Руководство

Как настроить vanilla-сервер Rust на Ubuntu: порты, RCON и копии мира

Запустите vanilla Rust на Ubuntu: SteamCMD, identity, разные game/query-порты, закрытый RCON через SSH и копия мира.

Как настроить vanilla-сервер Rust на Ubuntu: порты, RCON и копии мира

Установите публичную серверную ветку Rust PC от отдельного Linux-пользователя, отделите игровой трафик от администрирования и сохраните мир перед обновлениями. Команды рассчитаны на свежую Ubuntu 24.04 x86_64 на VPS с публичным IP, доступом sudo и клиентом Rust PC. Console Edition, плагины и кастомные карты требуют другого порядка действий.

Facepunch указывает 12 ГБ свободной RAM и 15 ГБ диска; крупным картам нужно больше памяти. Оставьте запас Ubuntu и место под обновления и архивы. VPS с 16 ГБ общей RAM — стартовое выделение ресурсов для проверки, а не обещание определённого числа игроков. В примере процедурная карта размера 3000 и лимит десять игроков.

Игра и браузер используют разные UDP-порты. RCON остаётся на loopback; копируйте identity после сохранения и завершения Rust.

Подготовьте отдельного пользователя и SteamCMD#

Выполните команды на VPS. 32-битные библиотеки нужны SteamCMD; игра запускается отдельным процессом. Не запускайте их от root.

bash
sudo apt update
sudo apt install -y ca-certificates curl tar lib32gcc-s1 lib32stdc++6 nano ufw openssl
sudo adduser --system --group --home /srv/rust rust
sudo install -d -o rust -g rust -m 750 /srv/rust /srv/rust/steamcmd /srv/rust/game
sudo -u rust -H /bin/bash -c 'cd /srv/rust/steamcmd && curl -fsSLo steamcmd.tar.gz https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz && tar -xzf steamcmd.tar.gz'
sudo -u rust -H /srv/rust/steamcmd/steamcmd.sh +force_install_dir /srv/rust/game +login anonymous +app_update 258550 -beta public validate +quit

Благодаря -H значение HOME принадлежит rust: SteamCMD не создаёт свои данные в домашнем каталоге SSH-пользователя. Ссылку на архив, anonymous-вход и приложение 258550 документирует Facepunch. Явная ветка public помогает не унаследовать staging при последующих обновлениях. Дождитесь сообщения SteamCMD о завершённой установке; возвращение командной строки само по себе не доказывает полную загрузку.

Зафиксируйте identity и параметры карты#

В этой установке identity называется friends. Создайте каталог конфигурации до первого запуска:

bash
sudo install -d -o rust -g rust -m 750 /srv/rust/game/server/friends/cfg
sudo -u rust nano /srv/rust/game/server/friends/cfg/server.cfg

Запишите в файл:

text
server.hostname "Friends vanilla server"
server.maxplayers 10
server.level "Procedural Map"
server.seed 123456
server.worldsize 3000

Создайте случайный пароль RCON в файле окружения, доступном только root. Параметры запуска RCON передаются в командной строке игры; обычные игровые настройки остаются в server.cfg:

bash
sudo install -o root -g root -m 600 /dev/null /srv/rust/rcon.env
sudo /bin/bash -c 'umask 077; printf "RUST_RCON_PASSWORD=%s\n" "$(openssl rand -hex 24)" > /srv/rust/rcon.env'
sudo chmod 600 /srv/rust/game/server/friends/cfg/server.cfg

При настройке локального клиента прочитайте пароль приватно через sudo nano /srv/rust/rcon.env. Systemd читает этот файл и передаёт секрет игре. Аргумент запуска может быть виден другим пользователям того же хоста: допускайте на VPS только доверенных администраторов и не публикуйте полный список аргументов процесса. Facepunch описывает привязку адреса RCON; здесь используется loopback, а фактический сокет проверяется ниже. RCON должен оставаться недоступным из Интернета, даже если установленная сборка иначе обрабатывает bind.

Identity выбирает каталог данных: после её изменения существующий мир может выглядеть пропавшим. Сохраните identity, размер карты и seed в заметках к копии. В справочнике файлов identity описаны мир, карта, базы игроков и сопровождающие WAL-файлы. Один .sav не является полной резервной копией.

Запустите игру через systemd#

Создайте sudo nano /etc/systemd/system/rust.service:

ini
[Unit]
Description=Rust vanilla dedicated server
Wants=network-online.target
After=network-online.target

[Service]
Type=exec
User=rust
Group=rust
Environment=HOME=/srv/rust
EnvironmentFile=/srv/rust/rcon.env
UMask=0077
WorkingDirectory=/srv/rust/game
ExecStart=/srv/rust/game/RustDedicated -batchmode -nographics +server.identity friends +server.port 28015 +server.queryport 28017 +rcon.ip 127.0.0.1 +rcon.port 28016 +rcon.web 1 +rcon.password ${RUST_RCON_PASSWORD} +app.port 1- -logfile /srv/rust/rust.log
Restart=on-failure
RestartSec=15
TimeoutStopSec=180
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target

В службе используются настройки окружения и перезапуска systemd; UMask=0077 ограничивает доступ к новым логам и данным. Параметры запуска без графики описывает Unity.

Игра использует UDP 28015, запросы браузера серверов — UDP 28017. Это должны быть разные порты. RCON использует TCP 28016 на loopback. Явные значения избавляют от зависимости от query-порта по умолчанию, который учитывает ещё и RCON-порт. Rust+ намеренно выключен документированным параметром +app.port 1-, учитывающим особенности парсера; его дополнительное подключение здесь не настраивается.

bash
sudo systemctl daemon-reload
sudo systemctl enable --now rust
sudo systemctl status rust --no-pager
sudo tail -n 80 /srv/rust/rust.log
sudo ss -lunp
sudo ss -ltnp 'sport = :28016'

Дождитесь Server startup complete в игровом логе. Проверьте, что оба UDP-сокета принадлежат Rust, а RCON слушает 127.0.0.1:28016. Если он слушает публичный адрес, исправьте конфигурацию до администрирования; внешний TCP 28016 оставьте закрытым. Подробный лог находится в /srv/rust/rust.log: одного journalctl может быть недостаточно. Следите за объёмом файла и архивируйте его при обслуживании, чтобы он не заполнил диск.

systemctl stop здесь не считается доказательством корректного сохранения мира. Для обслуживания ниже используется RCON-команда quit; копирование начинается после завершения сохранения и выхода Rust.

Откройте игровые порты и проверьте реальный вход#

Перед включением UFW разрешите фактический SSH-порт и сохраните правила остальных служб. В примере SSH работает на 22:

bash
sudo ufw allow 22/tcp
sudo ufw allow 28015/udp
sudo ufw allow 28017/udp
sudo ufw enable
sudo ufw status

Оставьте текущую сессию открытой и проверьте второе SSH-подключение. Разрешите UDP 28015 и 28017 также в firewall провайдера. Публичное правило TCP 28016 добавлять не нужно. Команды UFW соответствуют документации Ubuntu.

В клиенте Rust PC нажмите F1 и подставьте адрес VPS:

text
connect VPS_IP:28015

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

В примере публичный vanilla-сервер: слово «friends» в названии не ограничивает вход. Для закрытой группы отдельно примените порядок настройки скрытого сервера с whitelist от Facepunch и проверьте допуск игроков.

Подключите локальный RCON через SSH#

На своём компьютере установите доверенный локальный клиент с поддержкой WebRCON; один из вариантов — бесплатное настольное приложение Rustadmin. Его облачный online-вариант не сможет подключиться через этот частный туннель. Откройте туннель со своего компьютера, заменив SSH-пользователя и адрес; при другом SSH-порте добавьте -p YOUR_SSH_PORT:

bash
ssh -N -o ExitOnForwardFailure=yes -L 127.0.0.1:28016:127.0.0.1:28016 SSH_USER@VPS_IP

Терминал оставьте открытым. В локальном клиенте выберите WebRCON, хост 127.0.0.1, RCON-порт 28016 и пароль из rcon.env. Если клиент не получает игровые/query-данные через этот TCP-туннель, это само по себе не доказывает отказ RCON: UDP-подключения отдельные. Проверьте командную консоль через find save: ожидается информация о командах установленной сборки, а не ошибка соединения.

Сделайте копию после подтверждённого корректного выхода#

Предупредите игроков. В командной консоли RCON отправьте команды по одной и дождитесь завершения сохранения:

text
server.save
quit

В записи Facepunch о реализации save/quit описано финальное сохранение при quit. Проверьте поведение установленной сборки: в SSH-сессии VPS изучите конец лога и состояние процесса/службы:

bash
sudo tail -n 80 /srv/rust/rust.log
sudo systemctl show rust -p ActiveState -p Result -p MainPID
sudo ss -lunp

Продолжайте, только когда сохранение закончено, Rust завершился, ActiveState=inactive, Result=success, MainPID=0, а игровые сокеты исчезли. Одно значение MainPID=0 бывает и во время ожидания автоматического перезапуска после сбоя. Разрыв RCON-соединения тоже не подтверждает завершение. Если сохранение не удалось, процесс перезапускается или был принудительно убит, сначала устраните проблему: следующий архив пока нельзя считать согласованной копией.

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

bash
(
set -e
sudo df -h /srv /var/backups
sudo install -d -m 700 /var/backups/rust
RUST_BACKUP="/var/backups/rust/backup-$(date +%F-%H%M%S).tar.gz"
sudo tar -C /srv -czf "$RUST_BACKUP" rust
sudo tar -tzf "$RUST_BACKUP" > /dev/null
sudo install -m 600 -o "$(id -un)" "$RUST_BACKUP" "$HOME/rust-backup.tar.gz"
sudo systemctl start rust
)

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

bash
scp SSH_USER@VPS_IP:rust-backup.tar.gz ./rust-backup.tar.gz

При нестандартном SSH-порте добавьте -P YOUR_SSH_PORT к scp. В архиве находятся пароль RCON и данные игроков: ограничьте доступ и храните несколько датированных версий за пределами VPS. Просмотр состава подтверждает читаемость, но не успешное восстановление игры. До использования копии как гарантии проверьте распаковку и мир на изолированном совместимом сервере.

Обновляйте сервер и отличайте рестарт от wipe#

Создайте и скачайте копию, корректно завершите игру описанным выше способом, затем повторите команду SteamCMD:

bash
sudo -u rust -H /srv/rust/steamcmd/steamcmd.sh +force_install_dir /srv/rust/game +login anonymous +app_update 258550 -beta public validate +quit
sudo systemctl start rust
sudo tail -n 80 /srv/rust/rust.log

Сохраните сведения о старой сборке вместе с её миром и проверьте вход после обновления. Не ставьте SteamCMD validation в каждый запуск: тогда обычный рестарт зависит от текущего релиза, а если позже добавите расширения, проверка может заменить модифицированные файлы.

Принудительный map wipe может изменить протокол сохранения и создать новый мир; это не означает, что каждое обновление стирает blueprints. Facepunch объясняет различие и предостерегает от переименования старых сохранений ради обхода принудительного wipe. Изменение seed, размера или identity тоже влияет на выбор мира. При неожиданном сбросе сохраните все файлы и сравните эти параметры и протокол, прежде чем что-либо удалять.