Трендовые github проекты в нашем телеграм канале. Подпишись → Minecraft и Valheim в homelab: юнит, compose и закрытые порты
Сервер для друзей обычно начинается с java -jar в screen и заканчивается тем, что после перезагрузки хоста никто не может зайти, а процесс всё это время работал от root с открытым наружу десятком портов. Ниже — два рабочих способа сделать это аккуратно: systemd на хосте и Docker Compose. Примеры — Minecraft как самый частый случай и Valheim как типичный сервер из экосистемы Steam.
Что определить до установки
Ресурсы. Ванильному серверу Minecraft официально нужен 1 ГБ RAM, для 5–10 игроков разумно закладывать 2–4 ГБ. Модовые сборки едят больше: 3 ГБ примерно на 3–8 игроков, 4 ГБ — на 8–15, дальше всё зависит от конкретного набора модов. Valheim требует минимум 4 ядра и 2 ГБ RAM, и с запасом по памяти работает заметно стабильнее.
Дистрибутив. Ubuntu 22.04/24.04 LTS или Debian 12+. На старых системах Valheim может не стартовать: ему нужна glibc 2.29 или новее. Если обновлять ОС на старом железе не хочется, Docker решает проблему — контейнер приносит свои библиотеки.
Способ запуска. systemd на хосте даёт минимум слоёв и прозрачную диагностику. Docker упрощает обновления, перенос на другую машину и запуск нескольких инстансов.
Вариант 1: systemd на хосте
Отдельный пользователь и Java
Игровой сервер принимает соединения из интернета, поэтому запускать его от root нельзя. Заводим отдельного пользователя и ставим Java. Для Minecraft 1.20.5 и новее нужна Java 21:
sudo apt update && sudo apt upgrade -y
sudo adduser minecraft
sudo apt install -y curl unzip openjdk-21-jdk
Первый запуск
Под пользователем minecraft создаём каталог и скачиваем server.jar со страницы загрузки Java Edition на сайте Mojang — ссылка на конкретную версию меняется, поэтому её нужно брать оттуда актуальной:
su - minecraft
mkdir -p ~/minecraft-server && cd ~/minecraft-server
curl -L -o minecraft_server.jar <ссылка_на_server.jar>
echo "eula=true" > eula.txt
java -Xms2G -Xmx2G -jar minecraft_server.jar nogui
eula=true означает согласие с лицензией Mojang, ответственность за соблюдение условий остаётся на вас. -Xms и -Xmx задают минимальный и максимальный размер heap: 2 ГБ хватает ванильному серверу на 5–10 человек, для модов начинайте с 4–6 ГБ.
Шаблонный юнит
Чтобы сервер поднимался после перезагрузки и перезапускался при падении, нужен unit-файл. Шаблон с @ позволяет держать несколько миров на одной машине. Файл /etc/systemd/system/minecraft@.service:
[Unit]
Description=Minecraft Server %i
After=network.target
[Service]
WorkingDirectory=/opt/minecraft/%i
Type=simple
User=minecraft
Group=minecraft
ProtectSystem=full
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
Environment="MCMINMEM=512M" "MCMAXMEM=1024M"
ExecStart=/usr/bin/java -Xms${MCMINMEM} -Xmx${MCMAXMEM} -jar server.jar nogui
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
Директивы Protect* закрывают процессу запись в системные каталоги, доступ к домашним папкам, параметрам ядра, модулям и cgroups. Для сетевого сервиса это стандартный набор, и он почти ничего не стоит. Обратите внимание, что WorkingDirectory указывает на /opt/minecraft/%i: файлы мира для инстанса server должны лежать в /opt/minecraft/server. Каталог из пробного запуска в ~/minecraft-server перенесите туда: ProtectHome=true скрывает домашние папки от сервиса. Значения памяти в Environment здесь скромные, под свою нагрузку их стоит поднять до тех же 2 ГБ.
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft@server
journalctl -u minecraft@server -f
Остановка — systemctl stop minecraft@server, логи — в journald, никаких висящих сессий tmux.
Вариант 2: Docker Compose
Для Minecraft стандартом де-факто стал образ itzg/minecraft-server. Он сам скачивает нужную версию игры, умеет ставить модлоадеры и настраивается переменными окружения, так что следить за версиями Java вручную не придётся.
services:
minecraft:
image: itzg/minecraft-server
tty: true
stdin_open: true
ports:
- "25565:25565"
environment:
EULA: "TRUE"
TYPE: "VANILLA"
VERSION: "LATEST"
MEMORY: "2G"
volumes:
- ./minecraft-data:/data
restart: unless-stopped
Без EULA: "TRUE" контейнер не стартует. MEMORY задаёт heap JVM. Том ./minecraft-data:/data хранит мир и конфиги: если его забыть, всё пропадёт при первом пересоздании контейнера.
docker compose up -d
docker compose logs -f minecraft
Valheim
Valheim распространяется через SteamCMD, готового jar у него нет. Образ didstopia/valheim-server принимает имя сервера, имя мира и пароль через переменные окружения и сам проверяет обновления. Пароль обязателен — без него сервер не запустится. Игра использует UDP-порты 2456–2458, их нужно пробросить и открыть в файрволе.
Если серверов под разные игры несколько, посмотрите на LinuxGSM: это набор скриптов, который устанавливает, обновляет и бэкапит десятки выделенных серверов, включая Minecraft и Valheim. Знание systemd он не заменяет, но рутину с обновлениями и мониторингом берёт на себя.
Что выбрать
Один-два сервера для своей компании проще держать в systemd: меньше слоёв, диагностика через journalctl и ps. Несколько инстансов или регулярные переезды между машинами — повод взять Docker. Накладные расходы контейнера на I/O в типичных сценариях небольшие; если сервер упирается в диск или сеть, причину ищите в железе и настройках.
Безопасность
Открытый порт игрового сервера сканеры находят быстро, даже если там «просто майнкрафт».
Файрвол. Открыты только игровые порты: TCP 25565 для Minecraft, UDP 2456–2458 для Valheim. Перед ufw enable убедитесь, что разрешён SSH, иначе отрежете себе доступ:
sudo ufw allow 25565/tcp
sudo ufw allow 2456:2458/udp
sudo ufw enable
Права. Отдельный непривилегированный пользователь, Protect* в юните или --read-only и --cap-drop для контейнера — минимум, с которого стоит начинать.
Приватная сеть. Если играете узким кругом, сервер можно вообще не публиковать: поднимите Tailscale или WireGuard, пустите игроков в эту сеть и закройте публичный порт. Для большого открытого сообщества так неудобно, для пяти друзей — самый безопасный вариант.
Производительность
Minecraft упирается в скорость одного ядра и объём памяти. Дополнительные ядра сервер использует, но основной игровой цикл крутится в одном потоке. На VPS выгоднее взять меньше ядер с высокой частотой, чем 16 медленных.
Второй рычаг — server.properties. Когда при большом онлайне падает TPS, снизьте simulation-distance до 4–6 и view-distance до 6–12. Начинать стоит с simulation-distance: от него зависит, сколько чанков обрабатывается каждый тик. view-distance в основном определяет, как далеко игрок видит мир, и на нагрузку влияет меньше.
У Valheim узкие места — сеть и UDP-порты. При ручной установке проверьте, что LD_LIBRARY_PATH указывает на каталог linux64 внутри папки сервера: иначе бинарник не найдёт свои библиотеки и упадёт на старте.
Минимальный чеклист перед тем, как раздать адрес друзьям: процесс работает от отдельного пользователя, наружу открыты только игровые порты, запуск описан в юните или docker-compose.yml, а мир лежит на томе, который попадает в бэкап.