226 lines
8.8 KiB
Markdown
226 lines
8.8 KiB
Markdown
# 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 <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/<user>/`. 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
|
||
```
|