# PupaMLupa — серверная часть Каталог содержит всё необходимое для запуска Minecraft-сервера (NeoForge 21.1.228, Minecraft 1.21.1) под Linux + systemd. Инструкция ниже — для **чистой установки на Linux-сервер** (Ubuntu 22.04+ / Debian 12+). Для других ОС логика та же, отличаться будут только команды установки пакетов. --- ## 1. Требования - Linux с systemd (Ubuntu / Debian / Rocky / Arch — любой современный). - Обычный пользователь с правом `sudo` (например, `mrleo1nid`). - Java 21 в `PATH` (см. ниже). - Открытый порт `25565` (или тот, что в `server.properties`). - ~10 ГБ свободного места под Java + NeoForge + моды + мир. --- ## 2. Получить репозиторий Каталог `/opt` обычно принадлежит `root`, поэтому первый клон делается через `sudo`, а затем владельца передаём своему пользователю: ```bash sudo git clone https://github.com/<...>/PupaMLupa.git /opt/PupaMLupa sudo chown -R "$USER:$USER" /opt/PupaMLupa cd /opt/PupaMLupa/Server chmod +x start.sh run.sh install-service.sh install_java.sh ``` Дальше все команды — **без `sudo`**, кроме явно указанных. --- ## 3. Установить Java 21 Используйте системный пакет — он виден и в shell, и в systemd, и не требует Jabba: ```bash sudo apt update sudo apt install -y openjdk-21-jre-headless java -version # должно показать "21.x.x" ``` > Альтернатива: Eclipse Temurin от Adoptium (`temurin-21-jre` через > Adoptium APT-репозиторий) — поведение идентично openjdk. > > Скрипт `install_java.sh` (Jabba) тоже работает, но ставит Java в > `~/.jabba` и требует интерактивного `I agree`. Для systemd-сервиса > это неудобно — лучше системный пакет. --- ## 4. Первый запуск (вручную, один раз) `run.sh` — это лёгкий лаунчер `java @user_jvm_args.txt @libraries/.../unix_args.txt`, он не умеет ничего скачивать. Поэтому **первый запуск** надо сделать через `start.sh`, чтобы он: - скачал и развернул NeoForge в `libraries/`; - сгенерировал `user_jvm_args.txt`; - скачал `server.jar`; - спросил про EULA. ```bash cd /opt/PupaMLupa/Server echo 'eula=true' > eula.txt # принимаем EULA заранее ./start.sh ``` Дождитесь, когда в логе появится: ``` [Server thread/INFO]: Done (Xs)! For help, type "help" ``` После этого остановите сервер: ``` stop ``` (или нажмите `Ctrl+C`). Сервер сохранит мир и завершится. --- ## 5. Установить systemd-сервис ```bash sudo ./install-service.sh ``` Что произойдёт: - скрипт проверит, что вы — root (через `sudo`); - определит пользователя сервиса по `$SUDO_USER` (= ваш юзер); - проверит наличие `run.sh`, NeoForge, `user_jvm_args.txt`, `server.jar`, принятый EULA, наличие `java` в `PATH`; - создаст `/etc/systemd/system/minecraft.service`; - сделает `daemon-reload`, `enable`, `start`; - покажет статус сервиса. Теперь сервер будет автоматически: - запускаться при загрузке системы; - перезапускаться при падении (через 10 секунд); - писать логи в journald. ### Флаги install-service.sh | Флаг | Описание | |---|---| | `--name <имя>` | Имя сервиса (по умолчанию `minecraft`) | | `--user ` | Переопределить пользователя сервиса | | `--dir <путь>` | Каталог сервера (по умолчанию — каталог скрипта) | | `--uninstall` | Остановить и удалить сервис | | `-h`, `--help` | Справка | --- ## 6. Управление сервером ```bash sudo systemctl status minecraft # текущее состояние sudo systemctl stop minecraft # остановить sudo systemctl start minecraft # запустить sudo systemctl restart minecraft # перезапустить sudo systemctl disable minecraft # убрать из автозапуска sudo systemctl enable minecraft # вернуть в автозапуск sudo journalctl -u minecraft -f # живые логи sudo journalctl -u minecraft -n 200 --no-pager # последние 200 строк sudo journalctl -u minecraft --since "1 hour ago" ``` > Внимание: при `Type=simple` ввод команд в консоль сервера > (`/op`, `/say`) напрямую не работает — у systemd нет stdin. > Если нужна интерактивная консоль, используйте RCON > (включается в `server.properties`: `enable-rcon=true`, > `rcon.password=...`) и подключайтесь утилитой `mcrcon`. --- ## 7. Обновление сервера Поскольку сервис работает от вашего пользователя, обновление — обычные git-команды без `sudo`: ```bash cd /opt/PupaMLupa git pull # если изменились моды/конфиги — перезапустить sudo systemctl restart minecraft sudo journalctl -u minecraft -f ``` Если при `git pull` приехали новые версии модов, и сервер падает с ошибками вроде `Module xxx not found`, проверьте что список модов синхронизирован с клиентом (см. `sync-mods-from-client.ps1`). --- ## 8. Удалить сервис ```bash cd /opt/PupaMLupa/Server sudo ./install-service.sh --uninstall ``` Скрипт остановит сервис, отключит автозапуск, удалит unit-файл и сделает `daemon-reload`. Файлы сервера (мир, конфиги, моды) НЕ трогаются — их можно удалить вручную, если нужно. --- ## 9. Полезные пути | Путь | Что внутри | |---|---| | `/opt/PupaMLupa/Server/` | корень сервера | | `/opt/PupaMLupa/Server/world/` | мир | | `/opt/PupaMLupa/Server/logs/` | свежие логи Minecraft | | `/opt/PupaMLupa/Server/server.properties` | настройки сервера | | `/opt/PupaMLupa/Server/variables.txt` | настройки `start.sh` (RAM, версия) | | `/opt/PupaMLupa/Server/user_jvm_args.txt` | финальные JVM-аргументы | | `/etc/systemd/system/minecraft.service` | unit-файл systemd | --- ## 10. Решение типовых проблем ### `status=200/CHDIR` Каталог сервера лежит в `/home//`. systemd по умолчанию блокирует `/home`. Скрипт сам ослабляет `ProtectHome`, если видит такой путь, но **рекомендуется хранить сервер в `/opt`**. ### `User did not agree to Jabba installation` В `PATH` нет `java`, и `start.sh` пытается поставить её через интерактивный Jabba. Решение — поставить системную Java (см. раздел 3) и перезапустить сервис. ### `Error: could not open user_jvm_args.txt` / `Permission denied` Файлы сервера принадлежат не вашему пользователю (например, после `sudo git clone` остался владелец `root`). Вернуть себе: ```bash sudo chown -R "$USER:$USER" /opt/PupaMLupa ``` ### `Module io.netty.buffer not found, required by netty_endec` (и подобные) Не хватает мода или библиотеки на сервере, которая есть на клиенте. Сравните `mods/` на клиенте и в `Server/mods/`. Скрипт `sync-mods-from-client.ps1` помогает копировать недостающие jar. ### EULA не принят Сервер в systemd не сможет интерактивно спросить согласие. Создайте файл вручную: ```bash echo 'eula=true' > /opt/PupaMLupa/Server/eula.txt ```