Rust news
SOCIAL:
В категориях: Гайды Rust

Сервер Rust на Linux с использованием Docker

Автообновление сервера и мода Oxide с помощью скрипта Rustide

Вы хотели запустить сервер Rust на  Linux, но поняли, что хлопот будет слишком много, и дело того не стоит?

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

Это руководство предполагает наличие общих знаний о Linux, таких как основные команды и обеспечение безопасности (файрвол, ssh).

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


Что такое Docker?

Docker — это система для запуска служб, таких как приложения, в миниатюрных контейнерах.

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

Контейнеры являются легковесными, быстрыми и безопасными, и не имеют другого определения, кроме собственно термина «контейнеры».

Они одинаково работают на всех поддерживаемых системах, что делает их идеальными для запуска одиночных служб или приложений (или сервера Rust, как в данном случае).

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

С помощью томов вы с исключительной лёгкостью можете перемещать контейнеры Docker между серверами, восстанавливать их из резервных копий или после аппаратных сбоев (если у вас есть резервные копии!).

Мы не будем здесь особо вдаваться в подробности о системе Docker, но если вы хотите прочитать о нём больше, можете перейти по этой ссылке.


Предварительная установка

Новое: Вы можете пропустить этап предварительной установки и конфигурирования Docker, если просто хотите протестировать эту систему.

Это можно сделать, нажав на кнопку:

Install on DigitalOcean

Вам понадобятся две вещи: выделенный сервер с достаточным объёмом памяти (желательно 4 ГБ или более) и относительно современная версия операционной системы, такая как Ubuntu 14/15/16 или Debian 7/8.

Технически ОС не имеет значения, при условии, что на ней возможен запуск Docker. Сам сервер является полностью независимым от операционной системы.

Примечание: Если вы используете Debian, прочтите эту статью, чтобы обновить ядро.

В оставшейся части этого руководства мы будем подразумевать, что вы используете Ubuntu 14.04.


Установка

Убедитесь, что у вас установлен curl:

Установите Docker:

Вот это и есть вся установка.

Осталось только выполнить настройку системы, но этим мы займёмся в следующем разделе.


Первый запуск

К этому моменту мы уже готовы запустить сервера Rust в первый раз. Давате сделаем это!

Запустить наш сервер можно с помощью простой команды:

При этом сначала загружается последний образ rust-server из Docker Hub (публичное хранилище образов Docker), затем продолжается запуск нового контейнера rust-server и присваивается ему имя rust-server.

ВАЖНО: Название образа (didstopia/rust-server) обязательно должно быть последним аргументом.

Остальные аргументы нужно добавить перед названием образа, в противном случае они будут игнорироваться.

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

Как только это будет сделано, вы должны увидеть, как запустится сервер.

Для завершения работы сервера вы можете либо нажать CTRL+ C, что приведёт к инициированию процедуры завершения работы rust-server, либо открыть другое окно терминала и ввести следующую команду:

Команды для Docker являются довольно простыми и интуитивными, но вы можете вызвать их полный список, выполнив следующее действие:


Firewall

Далее мы должны открыть несколько портов, чтобы a) связать сервер со Steam и b) получить возможность удалённого администрирования (RCON), работающую вне контейнера Docker.

Используя любой файрвол на ваш выбор (iptables, ufw и т.д.), откройте следующие порты:

Вот пример того, как бы мы установили ufw на свежеустановленную Ubuntu:


Конфигурация

Почти всё уже готово! Все, что осталось сделать, это настроить сервер согласно вашим предпочтениям и активировать автоматический запуск сервера одновременно с хостовой системой (на случай её перезагрузки или сбоя).

Во-первых создайте файл, в котором будет содержаться конфигурация сервера (переменные среды). Например, в /rust.env.

Вставьте внутрь файла следующие строки и внесите изменения при необходимости (не используйте двойные кавычки):

Если вы уже имели дело с серверами Rust, можете использовать первую переменную (RUST_SERVER_STARTUP_ARGUMENTS)  чтобы изменить такие параметры, как интервалы сохранения, максимальное количество игроков и так далее.

Остальные переменные не требуют пояснений.

Есть ещё много переменных, которые можно изменить для настройки сервера по своему вкусу. Список всех переменных (и многое другое) можно найти в репозитории контейнеров.


Активация

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

Выполните следующую команду, чтобы убедиться, что вы всё правильно настроили:

Некоторые части этой команды на данный момент могут показаться вам знакомыми, так как всё, что они делают – это загрузка последней версии сервера и присвоение ей имени.
Внимательный пользователь заметит, что мы добавили флаг -d, который отключает процесс (или переводит в фоновый режим), поэтому на этот раз вы не увидите обычного консольного вывода от сервера.

Флаг -p фактически связывает порты нашей локальной (или хостовой) машины с портами контейнеров, что позволяет нам подключаться к серверу, находясь за пределами нашей сети. Если посмотреть более внимательно, вы увидите порт 8080, работающий совместно с webrcon для предоставления услуг встроенного веб-сервера, который в дальнейшем можно использовать для удалённого доступа к серверу с помощью любого браузера. Вы можете отключить эту функцию, удалив привязку портов для порта 8080.

Флаг -v является самым важным, так как символ -v означает volume (том), то есть, этот флаг позволяет монтировать тома в локальную файловую систему, находясь внутри контейнера. Первая часть представляет собой путь к хосту (/rust в данном случае), а вторая часть – путь к контейнеру (/steamcmd/rust, который всегда является одним и тем же).

Так как контейнеры Docker не постоянные (их невозможно навсегда настроить под себя, изменения не сохраняются и т. д.), использование томов позволит вам хранить установочные данные Rust, а также данные сервера (уровень, пользователи, чертежи, журнал). Сохранение установочных данных Rust на хост-системе означает, что при перезапуске контейнера вам не придётся повторно загружать весь сервер, хотя при необходимости вы всё же можете его обновить.

Как вы уже догадались, флаг --env-file просто загружает из файла переменные, которые мы ранее настроили.

Сейчас вы можете спросить, как мы получим доступ к консоли сервера. Можно сделать это с помощью следующей команды:

Если бы нам надо было остановить сервер, мы бы запустили следующую команду:

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

Наконец, если мы получаем сообщение об ошибке, где говорится, что сервер с именем rust-server уже существует, мы можем принудительно удалить контейнер с помощью:

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


Автоматический запуск

В Ubuntu 14.04 используется система под названием upstart, которую мы будем использовать в данном примере для автоматического запуска нашего сервера Rust.

Создайте новый файл /etc/init/rust-server.conf и вставьте в него следующее:

Обратите внимание, что этот скрипт запуска использует флаг --rm, который удаляет контейнер после его остановки. Это позволяет осуществлять чистый запуск/остановку сервера, так как название контейнера при этом всегда будет доступно. Также мы можем принудительно разрушать контейнеры, как в случае остановки, так и при запуске сервера, если что пойдёт не так.

В upstart лог-файл находится по адресу  /var/log/upstart/rust-server.log, и вам следует проверить его на наличие ошибок, если сервер не запускается. Обычно дело бывает просто в конфликте имён, который можно решить путём уничтожения контейнера с помощью docker rm -f rust-server и последующего его перезапуска.

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

В Docker имеется прекрасный список примеров того, как можно это сделать с другими менеджерами процессов.


Администрирование сервера

Так как образ Docker, который мы используем, запускает встроенный веб-сервер (при условии использования webrcon), мы можем получить к нему доступ по адресу http://server-ip-or-hostname:8080. Пароль используется тот самый, что вы установили в файле rust.env.

Также можете использовать инструменты удалённого доступа RCON, такие как RustAdmin.

Разработчики Rust обычно выпускают обновления каждый четверг, но, благодаря чудесным возможностям Docker, вы можете просто запустить команду service rust-server restart, и контейнер грациозно выключится, перезагрузится, проверит наличие обновлений и установит их при необходимости.

С этого момента поддержание сервера будет очень лёгким делом. 🙂


Отправка команд серверу

Отправка команд в linux-версии сервера Rust является сложным делом, потому что это можно сделать только с помощью RCON.

Мне удалось создать внутри образа Docker небольшое приложение,  которое называется rcon, и которое можно использовать для отправки и получения данных от сервера.

Чтобы использовать его, запустите команду Docker:

где rust-server – это название вашего контейнера.

Как я уже говорил, он также старается вернуть ответ от сервера, и в данном случае он вернёт 263 FPS или что-то близкое к этому.

Вы можете встроить эту строку в скрипт bash, или вызывать её вручную, но если ваш сервер установлен с webrcon, она должна «просто работать».


Некоторые хитрости

Исправление проблемы с памятью

Rust (или, точнее, Unity) — имеет традицию падать при использовании более 16 ГБ памяти. Docker легко может решить эту проблему в том случае, если ваш компьютер имеет более 16 ГБ.

Всё, что вам нужно сделать, добавить -m 16g к стартовым аргументам в команде запуска Docker. Это ограничит максимальное количество памяти, которое может потреблять один контейнер.

Помните, что все аргументы Docker должны быть добавлены перед названием образа (в данном случае didstopia/rust-server), иначе они будут игнорироваться!

Указание определённой ветки

Вы можете использовать переменную среды RUST_BRANCH, чтобы настроить ваш сервер на использование определённой ветви Rust.

Это изменит параметры установки, например, для использования предрелизной ветки Rust, вы должны поставить значение RUST_BRANCH="-beta prerelease". Примечание: аргумент -beta указывает на конкретную ветку.

Активация полностью автоматических обновлений

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

Вы можете активировать эту функцию с помощью переменной RUST_UPDATE_CHECKING=1, включающей проверку наличия обновлений.

Кроме того, вы можете указать конкретную ветку для обновлений (по умолчанию стоит «public») с помощью RUST_UPDATE_BRANCH="staging". Обратите внимание, что вы не должны указывать какие-либо аргументы, такие как  «-beta«, так как эта переменная несколько отличается от описанной выше переменной для указания ветки.


Оригинал