Files

226 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```