Искать в Базе знаний

Сервер Minecraft

Бокс с Minecraft можно установить из готового образа в Панели управления, но если вам нужны нестандартные ядра или интересно настроить всё самому — вот инструкция по ручной установке Minecraft-сервера на бокс.
Для успешного размещения своего сервера понадобится несколько вещей:
  1. Бокс с объемом оперативной памяти от 2 Гб (больше — лучше)

    Ядра серверов Minecraft очень требовательны к ресурсам системы. В нашей инструкции мы будем использовать ядро Vanilla, но можно использовать и любое другое ядро: разница будет только в настройке уже самого сервера и имени его jar-файла.

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

    Инструкция предназначена для боксов с ОC Ubuntu, но по аналогии можно использовать и другую систему. Логика предлагаемого решения от этого не поменяется.

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

  2. Опционально: пользователь с правами sudo

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

    Можно работать и под пользователем root, но это менее безопасно.

  3. Любой текстовый редактор на боксе

    Используемый нами редактор vim в процессе изменения файлов можете заменить любым удобным для вас, например, nano. Это никак не повлияет на работу с инструкцией.

Подготовка среды

Установка пакетов Java
Размещение сервера начинаем с подготовки сопровождающего ПО. Первое на очереди — платформа Java, на которой и работает первое и истинное издание Minecraft.
Обновим системные репозитории, чтобы наша система знала о наличии новых пакетов:
sudo apt update
Установим «безголовую» 16-ю версию java без поддержки графических интерфейсов — она идеально подойдет для запуска сервера:
sudo apt install openjdk-16-jre-headless
Дополнительно установим терминальный мультиплексор tmux, который позволяет создавать автономные сессии. — это пригодится для тестирования сервера или его быстрого запуска:
sudo apt install tmux
Теперь, когда сама среда для запуска сервера появилась на боксе, можем двигаться дальше.
Скачивание и размещение сервера
Создаем еще одного пользователя: от его имени уже будет запускаться и работать сам сервер. Делаем это так:
sudo useradd -r -m -U -d /home/minecraft -s /bin/bash minecraft
Этот пользователь будет системным и без пароля: подключиться к боксу по SSH такой пользователь не сможет, скомпрометировать его не получится — это нам и нужно.
Переключимся на него:
sudo su minecraft
Теперь создаем директории для сервера и утилиты mcrcon, которая позволит вам управлять вашим сервером:
mkdir /home/minecraft/server
mkdir /home/minecraft/mcrcon
Перейдем в директорию сервера:
cd /home/minecraft/server
Теперь откроем сайт игры, скопируйте адрес ссылки с названием «minecraft_server.x.xx.x,jar», где x.xx.x — актуальная версия игры. Используем wget, чтобы скачать ядро сервера. Выглядеть это будет примерно так:
wget https://launcher.mojang.com/v1/objects/a16d67e5807f57fc4e550299cf20226194497dc2/server.jar

Запуск сервера и управление им

1-й способ: Быстрый
Если перед вами стоит задача просто протестировать какую-либо сборку сервера или его работу в целом с тем количеством аппаратных ресурсов, что есть на данный момент, запустить сервер можно просто в tmux.
Все, что в них запущено, будет работать, пока не будет выключен бокс или завершена сессия. При этом от сессии можно будет отключиться, как и от самого бокса: сервер при этом будет работать.
Убедитесь, что в данный момент вы работаете как созданный в предыдущем пункте пользователь и находитесь в директории с файлами сервера. Проверить себя можно командами whoami и pwd соответственно.
Создаем новую сессию tmux:
tmux new
Теперь мы можем приступить к запуску и настройке сервера. Запускаем его такой командой:
java -Xms1024M -Xmx1024M -jar server.jar nogui
Разберем подробнее аргументы, что мы использовали:
  1. Параметры -Xms и -Xmx отвечают за выделенную изначально и максимально доступную память для работы сервера.

    В основном различные ядра серверов требуют не менее 1Гб памяти для фоновой работы. Дополнительная память разнится от используемого ядра и используемых модов и плагинов.

    Максимально доступную серверу память можно увеличить до ~70-80% от объема памяти бокса, если он используется только для размещения сервера, например:

    java -Xms1024M -Xmx1536M -jar server.jar nogui
    Также стоит настроить swap, чтобы случайные или временные всплески потребления памяти не приводили к остановке сервера. В этом случае серверу можно будет разрешить использовать еще больше памяти в параметре -Xmx, что без swap делать не рекомендуем: система и другие утилиты также потребляют ресурсы машины.

    Настройка swap нужна и для первичной генерации мира: это очень ресурсоёмкий процесс.

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

  2. Параметр -jar нужен для выбора исполняемого файла, в случае с ванильным ядром — server.jar.

  3. Параметр nogui запускает сервер без графического интерфейса: он нам не понадобится.
Определившись с объемом памяти, запускаем сервер.
Первый запуск сервера займет некоторое время и завершится ошибкой, но это вполне нормально:
[16:48:01] [main/ERROR]: Failed to load properties from file: server.properties
[16:48:01] [main/WARN]: Failed to load eula.txt 
[16:48:01] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
Это связано с тем, что серверу для работы необходимы два файла: server.properties и eula.txt, которых на момент запуска в его директории не было.
Но это не проблема: при первом запуске сервер создал их автоматически.
Первым делом откроем для редактирования файл eula.txt:
vim eula.txt
Первая строка файла содержит ссылку на лицензионное соглашение игры: ознакомьтесь с ним. Когда вы будете готовы его подтвердить, измените строку «eula=false» на «eula=true», затем сохраните и закройте этот файл.
Второй файл server.properties содержит различные настройки сервера, например, игровой режим или максимальное количество игроков в момент времени. Подробнее о его содержимом можно прочитать на официальной вики.
Настроив сервер, запускаем его:
java -Xms1024M -Xmx1536M -jar server.jar nogui
В нашем случае мы выделили серверу 1Гб памяти на старте и 1536Мб — максимально доступный объем.
Серверу потребуется некоторое время для запуска и прогрузки мира, после этого он отправит сообщение следующего вида:
[18:33:32] [Server thread/INFO]: Done (18.042s)! For help, type "help"
Если вы столкнулись с сообщением «Убито» или «Killed», или сервер в процессе запуска перестал подавать признаки жизни, настройте swap, для первого запуска и генерации мира этого хватит. Если сервер начнет отваливаться уже в процессе игры, лучше повысить объем оперативной памяти для бокса, поскольку со swap он будет работать медленнее.
Выйдем из сессии tmux, не завершая ее и не выключая таким образом сервер, с помощью комбинации клавиш CTRL+B, затем следом D.
Теперь вернемся к нашему основному пользователю с помощью комбинации клавиш CTRL+D и откроем необходимый для сетевой игры порт:
sudo ufw allow 25565/tcp
Для других систем это можно сделать с помощью аналогичных утилит управления файрволом системы. Если вы меняли порт в server.properties, укажите его вместо 25565.
С этого момента сервер запущен и к нему можно подключиться по стандартному порту 25565 или тому, который вы указали в настройках сервера. Управление сервером можно производить прямо из этой же сессии tmux либо добавить вашего игрока в список администраторов и управлять сервером уже из игры.
Чтобы зайти обратно в сессию tmux используйте такую команду:
tmux a
При этом нужно работать от пользователя, которого мы специально создали для запуска сервера, поскольку сессию мы тоже создавали от его имени (su ваш_юзер).
Если сессий несколько и вы попали не туда, делайте так:
tmux ls
tmux a -t номер_сессии
Первая команда покажет все доступные сессии, вторая позволит подключиться к нужной.
2-й способ: Долгосрочный
Этот способ ориентирован на долгую, надежную работу сервера и удобство взаимодействия с ним.
На этом этапе предположим, что вы выполнили предыдущие шаги, в том числе из способа «Быстрый» и смогли получить работающий сервер на своей машине, а теперь ищете способы сделать все красиво.
Вернитесь к основному пользователю с помощью комбинации клавиш CTRL+D, если сейчас вы непрерывно следуете этой инструкции и только что работали с tmux. Если вы уже под основным пользователем — это отлично. Проверить себя можно командой whoami.

Установка утилиты mcrcon

Эта утилита позволит нам подключаться к серверу с бокса и выполнять различные его команды: менять режим игры, время и всякое.
Сначала установим GCC — набор компиляторов для различных языков программирования. Он нам понадобится, чтобы скомпилировать утилиту:
sudo apt install gcc
Перейдем в директорию, которую мы создали специально для утилиты, загрузим и скомпилируем ее:
cd /home/minecraft/mcrcon/
git clone https://github.com/Tiiffi/mcrcon.git ./
gcc -std=gnu11 -pedantic -Wall -Wextra -O2 -s -o mcrcon mcrcon.c
Проверим, что все хорошо:
./mcrcon -v
Если вы увидели на экране примерно следующее, то все действительно хорошо:
mcrcon 0.7.1 (built: Aug 31 2021 19:28:38) - https://github.com/Tiiffi/mcrcon
Bug reports:
tiiffi+mcrcon at gmail
https://github.com/Tiiffi/mcrcon/issues/
Теперь отредактируем файл настроек сервера, чтобы эта утилита в принципе могла к нему подключаться:
sudo vim /home/minecraft/server/server.properties
Интересуют нас следующие изменения:
rcon.port=25575
rcon.password=ваш_пароль
enable-rcon=true
Параметр rcon.port задает порт для подключения к серверу с помощью этой утилиты. Если подключение извне не планируется, что предпочтительно в вопросе безопасности, лучше изменить этот порт на нестандартный и запретить к нему подключаться с помощью файрвола системы или же нашего файрвола.
Значение rcon.password изменим на пароль, с которым вы будете подключаться к серверу.
К тому, как утилитой пользоваться, мы вернемся чуть позже.

Добавление юнита systemd

Systemd — это система управления службами в Linux. С ее помощью можем настроить автоматический запуск сервера вместе с боксом, перезапуск в случае, если что-то пойдет не так.
В плане автономности это гораздо надежнее, чем использовать какой-нибудь терминальный мультиплексор.
Создадим файл нашего сервиса и перейдем к его редактированию:
sudo vim /etc/systemd/system/minecraft.service
Заполним его следующим содержимым:
[Unit]
Description=Minecraft Server
After=network-online.target

[Service]
User=minecraft
WorkingDirectory=/home/minecraft/server
ExecStart=/usr/bin/java -Xms1024M -Xmx1536M -jar server.jar nogui
ExecStop=/home/minecraft/mcrcon/mcrcon -H 0.0.0.0 -P 25575 -p ваш_пароль stop
Restart=always

[Install]
WantedBy=multi-user.target
В строке, начинающейся с «ExecStart=», не забываем изменить параметры -Xmx и Xms согласно нашим предпочтениям и возможностям. Здесь все так же, как при запуске сервера «Быстрым» способом.
В строке с «ExecStop» меняем порт после ключа -P, если вы его изменяли в файле настроек сервера в параметре rcon.port, а также указываем пароль, который вы задали в файле настроек сервера в rcon.password.
Сохраним и закроем файл, затем сообщим системе, что мы добавили новый сервис:
sudo systemctl daemon-reload
Запускаем сервер, проверяем его статус и включаем автозапуск:
sudo service minecraft start
sudo service minecraft status
sudo systemctl enable minecraft
После выполнения второй команды вы должны заметить в ее выводе надпись «active (running)». Это значит, что все получилось и сервер запущен.

Управление сервером

Подключиться к серверу для управления им с бокса можно с помощью следующей команды:
sudo /home/minecraft/mcrcon/mcrcon -H 0.0.0.0 -P 25575 -p ваш_пароль
Порт после ключа -P аналогичным образом заменяется на тот, что вы указали в rcon.port.
Если вы видите надпись Logged in — вы уже можете управлять вашим сервером, если «Connection refused» – попробуйте подключиться еще раз, убедитесь, что у бокса есть свободные ресурсы.
В консоли будет возможно использовать все стандартные команды сервера. Выйти из нее можно с помощью комбинации клавиш CTRL+C.
Можно передать и единичную команду, например, так:
sudo /home/minecraft/mcrcon/mcrcon -H 0.0.0.0 -P 25575 -p ваш_пароль "time set 0"
Поскольку это не очень удобно, добавим короткий алиас для взаимодействия с сервером таким образом. Откроем файл ~/.bashrc текущего пользователя:
vim ~/.bashrc
В его конце добавим такую строчку:
alias servcontrol="sudo /home/minecraft/mcrcon/mcrcon -H 0.0.0.0 -P 25575 -p ваш_пароль"
Вместо «servcontrol» можете указать любое слово, которое вам будет удобно использовать при передаче команд серверу.
Сохраним и закроем файл, затем применим внесенные изменения:
source ~/.bashrc
Теперь прошлые длинные команды заменены на следующие:
servcontrol
servcontrol "time set 0"

Резервное копирование

Настроим резервное копирование данных сервера, чтобы не потерять ни единого чанка, если что-то пойдет не так.
Переключимся на пользователя для запуска сервера, в нашем случае minecraft:
sudo su minecraft
И создадим директорию для хранения бекапов:
mkdir /home/minecraft/backup
Теперь создадим сам скрипт:
vim /home/minecraft/backup_script.sh
И заполним его следующим содержимым:
#!/bin/bash

# Добавляем функцию mcrcon, чтобы не дублировать команду и не множить сущности
# Порт 25575 аналогичным образом меняем на используемый нами в rcon.port, а ваш_пароль на пароль из rcon.password
function mcrcon {
/home/minecraft/mcrcon/mcrcon -H 0.0.0.0 -P 25575 -p ваш_пароль "$1"
}
# Выключаем автоматическую запись новых изменений на сервере: они на это время встанут в очередь
mcrcon "save-off"
# Пишем все незаписанное на диск
mcrcon "save-all"
# Архивируем и сжимаем наш сервер в отдельный архив
tar -cvpzf /home/minecraft/backup/server-$(date +%F).tar.gz /home/minecraft/server
# Включаем сохранения
mcrcon "save-on"

# Удаляем старые бекапы, оставляя только копии за последние 7 дней
find /home/minecraft/backup/ -type f -ctime +7 -name '*.gz' -delete
Теперь превратив файл в исполняемый:
chmod +x /home/minecraft/backup_script.sh
Запустим его, пока руками:
/home/minecraft/backup_script.sh
Проверим, что архив с файлами создался:
ls -aFo /home/minecraft/backup
И добавим задание в планировщик cron:
crontab -e
Выбираем удобный текстовый редактор и добавляем в конце файла такую строчку:
0 3 * * * /home/minecraft/backup_script.sh
Сохраняем файл. Теперь скрипт будет запускаться каждый день ровно в 3 часа ночи. Время по желанию можно изменить: лучше всего выбрать то время, когда на сервере меньше всего игроков, а в идеале никого нет.
Поскольку чанки игры требуют достаточно много дискового пространства, для хранения бекапов подключите Дополнительный диск на NVMe, или же выгружайте старые бекапы на свой локальный компьютер либо в удаленные хранилища.
На этом моменте — все.
Что мы имеем:
  1. Автозапускаемый и перезапускаемый работающий сервер
  2. Возможность управления им
  3. Создание резервных копий
Оставшаяся работа уже связана с самим сервером игры и его разнообразной настройкой.