Автозапуск сервера Minecraft через systemd

Автозапуск сервера Minecraft на Ubuntu правильно делать через systemd: создаёшь unit-файл с User, WorkingDirectory и ExecStart, включаешь его через systemctl enable — и сервер сам поднимается после перезагрузки и сам перезапускается при падении. screen и nohup для этого не годятся.
Почему screen и nohup — плохое решение для боевого сервера

Запуск через nohup java -jar server.jar & держит процесс живым, только пока жива сессия и сама система, но никак не следит за тем, упал сервер или нет — если Java вылетит с ошибкой памяти, процесс просто исчезнет, а сервер останется недоступен, пока кто-то вручную не зайдёт и не перезапустит. screen решает проблему с отключением от терминала, но у него та же дыра: после перезагрузки машины никто не поднимет сессию screen автоматически, и после падения сервера внутри неё никто не перезапустит java. Оба варианта работают, пока всё стабильно, и оба молчат, когда что-то ломается ночью.
Unit-файл для systemd
Создай файл /etc/systemd/system/minecraft.service с правами root. Ниже рабочий пример — подставь свой путь к серверу и объём памяти.
[Unit] Description=Minecraft Server After=network.target [Service] Type=simple User=minecraft WorkingDirectory=/opt/minecraft ExecStart=/usr/bin/java -Xmx2G -Xms1G -jar server.jar nogui Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target
User=minecraft — сервер работает от имени того же непривилегированного пользователя, что создавали при установке, а не от root. WorkingDirectory — папка, где лежит server.jar и файлы мира. Restart=on-failure значит: если процесс завершится с ошибкой, systemd подождёт RestartSec и попробует поднять его снова — вручную ничего делать не нужно.
Включи и запусти сервис
sudo systemctl daemon-reload sudo systemctl enable minecraft sudo systemctl start minecraft sudo systemctl status minecraft
daemon-reload нужен каждый раз после правки unit-файла, чтобы systemd подхватил изменения. enable добавляет сервис в автозагрузку — теперь он поднимется и после перезагрузки машины сам.
Как отправлять команды в консоль сервера
Тут есть честный компромисс. При запуске напрямую через ExecStart, как в примере выше, systemd не даёт удобного интерактивного доступа к stdin процесса — просто написать команду в консоль не получится. Два рабочих способа обойти это, и оба не идеальны:
- RCON — включи enable-rcon=true, задай rcon.password и rcon.port в server.properties, и отправляй команды удалённо консольным rcon-клиентом. Плюс: сервер всё так же полностью управляется systemd, Restart работает штатно. Минус: нужен отдельный клиент и порт, который тоже стоит закрыть от внешнего доступа файрволом, оставив только localhost или доверенный IP
- Запуск внутри tmux или screen, которые сам стартует ExecStart — тогда можно подключиться и печатать команды напрямую в консоль сервера, как раньше. Минус: получается двойной слой (systemd следит за оболочкой tmux, а не напрямую за java), это усложняет корректную остановку и слегка размывает то, о чём предупреждали выше про screen и nohup
Для боевого сервера честнее и надёжнее первый вариант — RCON. Он не ломает управление через systemd и остаётся рабочим способом отправлять команды типа save-all или stop без входа в саму систему.
Логи через journalctl
journalctl -u minecraft -f journalctl -u minecraft --since "1 hour ago"
Флаг -f держит вывод в реальном времени, как tail -f — удобно смотреть, что происходит при старте или сразу после падения сервера.
Что почитать дальше: journalctl по-человечески · Служба не запускается: разбор по systemd.

Хостинг Minecraft от 349 ₽ в месяц
Ryzen 9 7950X до 5,7 ГГц на ядро, бэкапы каждый день, моды и карты из панели.
Выбрать тариф


