Инструкция Настройка сервера Minecraft как службы в Ubuntu Linux

Настройка сервера Minecraft как службы в Ubuntu Linux
Краткое описание:
Отслеживание падения сервера и автозапуск Minecraft-сервера после перезагрузки
1 328
Всем привет, в данной статье я постараюсь максимально подробно описать, как запустить сервер Minecraft как службу на сервере с Linux.

Данная служба будет автоматически отслеживать падения сервера, поднимать Minecraft сервер после перезагрузки физического сервера (ну или виртуальной машины), а также позволит администраторам легко и корректно перезапускать сервер используя команду /stop из консоли сервера или игры.

Все действия я выполнял на Ubuntu 24.04, но актуально практически для всех дистрибутивов (за исключением установки пакетов через apt). Это гайд именно для Linux-систем!

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

Создайте linux-пользователя minecraft. Помещать его в группу sudo/wheel НЕ нужно! Как это сделать я напишу в данную статью чуть позднее, поэтому надеюсь что вы знаете как это делать, либо способны найти в интернетах инструкцию, коих написано нереально много. После создания пользователя логиньтесь под своим основным пользователем с правами суперпользователя.


Шаг 1. Установка необходимых пакетов​

Заходим на наш Linux-сервер под пользователем с правами на sudo (не рекомендуется использовать учетную запись root для настройки).

Во-первых для того чтобы у нас был интерактивный доступ в консоль нам будет необходим screen.
Обновим список доступных пакетов и установим screen используя команду:
Bash:
sudo apt update && sudo apt install screen -y
Надеюсь нужная версия Java у вас уже установлена, а если нет, то установить JDK 21 можно используя команду:
Bash:
sudo apt install openjdk-21-jdk -y


Шаг 2. Настройка скрипта запуска и завершения работы Minecraft-сервера​

Сервер мы будем запускать исключительно как службу, поэтому для ручного/тестового запуска в дальнейшем можете переименовать ваш текущий start.sh в run.sh или что-то подобное. Тот start.sh что мы с вами сделаем не будет предназначен для запуска напрямую из терминала!!!

Я буду настраивать запуск сервера Purpur. Если запускаете другое ядро, то внимательно читайте комментарии.
Помещаем файлы сервера в каталог /home/minecraft/server/

Создаем файл start.sh со следующим содержимым. Замените purpur-1.21.3-2355.jar на имя вашего jar-файла сервера
Bash:
#!/bin/bash

# Директория с Minecraft сервером
SERVER_DIR="/home/minecraft/server"
cd $SERVER_DIR

# Проверка, занят ли порт 25565
check_port() {
    if lsof -i:25565 >/dev/null; then
        echo "Порт 25565 занят. Пытаюсь завершить процесс, который его использует..."
        kill -9 $(lsof -t -i:25565)
        sleep 2
    fi
}

# Запуск Minecraft сервера в сессии screen
start_server() {
    check_port
    echo "Запуск Minecraft сервера..."

    # Запуск сервера в фоновом процессе с использованием screen. Сюда можете добавить необходимые java-ключи и изменить название файла ядра
    screen -dmS minecraft java -Duser.timezone=Europe/Moscow --add-modules=jdk.incubator.vector -jar purpur-1.21.3-2355.jar --nogui
    echo "Сервер работает. Вы можете подключиться к консоли с помощью 'screen -r minecraft'."
}

# Проверка активности порта (когда сервер завершится)
check_server_status() {
    echo "Ожидаем, пока сервер займет порт 25565..."
    sleep 10
    server_running=false

    while true; do
        if lsof -i:25565 >/dev/null; then
            if [ "$server_running" = false ]; then
                echo "Сервер работает."
                server_running=true
            fi
            sleep 5
        else
            echo "Сервер завершился, перезапуск через 5 секунд..."
            sleep 5
            break
        fi
    done
}

# Основной цикл для перезапуска сервера
while true; do
    start_server
    check_server_status
done
Теперь создадим скрипт для завершения работы сервера, который будет отрабатывать при завершении службы. Для имени файла server.jar используйте "java.*server" вместо "java.*purpur".
Bash:
#!/bin/bash

# Директория с Minecraft сервером
SERVER_DIR="/home/minecraft/server"
cd $SERVER_DIR

# Отправляем команду stop в консоль Minecraft через screen
screen -S minecraft -X stuff "$(echo -ne '\r')stop$(echo -ne '\r')"

# Ждем завершения процесса Purpur.
while pgrep -f "java.*purpur" > /dev/null; do
    sleep 1
done

# После завершения процесса закрываем screen
screen -S minecraft -X quit

exit 0
Разрешаем запуск start.sh и stop.sh:
Bash:
sudo chmod +x /home/minecraft/server/start.sh && sudo chmod +x /home/minecraft/server/stop.sh


Шаг 3. Создаем службу и настраиваем права​


Создаем файл службы командой:
Bash:
sudo nano /etc/systemd/system/minecraft.service
И вставляем туда следующее содержимое:
Код:
[Unit]
Description=Minecraft server
After=network.target

[Service]
User=minecraft
WorkingDirectory=/home/minecraft/server
ExecStart=/bin/bash /home/minecraft/server/start.sh
ExecStop=/usr/bin/bash /home/minecraft/server/stop.sh
TimeoutStopSec=300
KillMode=process
KillSignal=SIGTERM
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
Обновляем службы командой:
Bash:
sudo systemctl daemon-reload
Добавляем службу minecraft в автозапуск:
Bash:
sudo systemctl enable minecraft.service

На всякий случай рекурсивно меняем владельца каталога minecraft на пользователя minecraft:
Bash:
sudo chown -R minecraft:minecraft /home/minecraft/


Шаг 4. Запускаем службу и проверяем ее статус​


Запускаем службу minecraft следующей командой:
Bash:
sudo systemctl start minecraft
И проверяем через секунд 10-15 ее статус:
Bash:
sudo systemctl status minecraft
Для выхода из проверки статуса используйте сочетание клавиш Ctrl+C. Если все запустилось корректно, то вы увидите примерно следующий вывод:
Bash:
● minecraft.service - Minecraft server
     Loaded: loaded (/etc/systemd/system/minecraft.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-12-10 14:46:44 MSK; 1h 2min ago
   Main PID: 18616 (bash)
      Tasks: 94 (limit: 11848)
     Memory: 3.4G (peak: 3.4G)
        CPU: 1min 43.023s
     CGroup: /system.slice/minecraft.service
             ├─18616 /bin/bash /home/minecraft/server/start.sh
             ├─18619 SCREEN -dmS minecraft java -Duser.timezone=Europe/Moscow --add-modules=jdk.incub...>
             ├─18621 java -Duser.timezone=Europe/Moscow --add-modules=jdk.incubator.vector -jar purpu...>
             └─21544 sleep 5

Dec 10 14:46:44 zxcmcserver systemd[1]: minecraft.service: Scheduled restart job, restart counter is at 1.
Dec 10 14:46:44 zxcmcserver systemd[1]: Started minecraft.service - Minecraft server.
Dec 10 14:46:44 zxcmcserver bash[18616]: Запуск Minecraft сервера...
Dec 10 14:46:44 zxcmcserver bash[18616]: Сервер работает. Вы можете подключиться к консоли с помощью 'screen -r min...'
Dec 10 14:46:44 zxcmcserver bash[18616]: Ожидаем, пока сервер займет порт 25565...
Dec 10 14:46:54 zxcmcserver bash[18616]: Сервер работает.

Для завершения работы сервера используйте команду:
Bash:
sudo systemctl stop minecraft

Для подключения к консоли сервера сначала переключитесь на пользователя minecraft:
Bash:
sudo su - minecraft
А затем введите команду
Bash:
screen -r minecraft
Для выхода из консоли на английской раскладке нажмите Ctrl+A и затем D. Для входа в режим прокрутки используйте Ctrl+A и затем Esc. Для выхода из режима прокрутки повторно нажмите Esc.

Затем, чтобы выйти из сеанса пользователя minecraft и вернуться к своему основному пользователю выполните команду:
Bash:
exit

Для завершения работы сервера используйте команду:
Bash:
sudo systemctl stop minecraft

Теперь ваш сервер будет постоянно активен, в случае завершения его работы по любой причине, кроме остановки через sudo systemctl stop minecraft сервер будет автоматически перезапускаться. Спасибо за прочтение.

Автор

phantomfighterxx

Еще ресурсы от phantomfighterxx

Полный перевод SunLight и nightcore
Полный перевод SunLight и nightcore
Полный качественный перевод плагинов SunLight и nightcore, в т.ч. всех комментариев в конфигах.
Перевод Nexo
Перевод Nexo
Перевод плагина Nexo на русский язык
Перевод WorldGuard и WGExtender
Перевод WorldGuard и WGExtender
Переведенные плагины WorldGuard и WGExtender на русский язык.
Создание кастомных пластинок с помощью Nexo
Создание кастомных пластинок с помощью Nexo
Гайд на добавление пластинок со своей музыкой на свой Minecraft сервер без модов.
Black Esc Buttons - кастомное меню паузы
Black Esc Buttons - кастомное меню паузы
Кастомное русифицированное меню паузы в оттенках черного
Перевод AxAuctions
Перевод AxAuctions
Перевод плагина и конфигураций AxAuctions на русский язык.
Перевод Selection Visualizer
Перевод Selection Visualizer
Перевод плагина Selection Visualizer от Zrips на русский язык.
ВерхНиз