Update Russian translations across multiple resource packs, enhancing item names, descriptions, and GUI elements for improved localization; modify install-service.sh to clarify server setup instructions and ensure compatibility with systemd services.
This commit is contained in:
@@ -0,0 +1,225 @@
|
||||
# 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
|
||||
```
|
||||
+74
-57
@@ -1,17 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
# install-service.sh
|
||||
# Создаёт systemd-сервис для запуска Minecraft сервера (через ./start.sh)
|
||||
# Создаёт systemd-сервис для запуска Minecraft сервера через ./run.sh
|
||||
# и сразу его поднимает. Должен быть запущен от root через sudo.
|
||||
#
|
||||
# Сервис будет работать от того же пользователя, который вызвал sudo
|
||||
# (т.е. от $SUDO_USER). Это значит:
|
||||
# - не нужно создавать отдельного юзера и делать chown;
|
||||
# - git pull / редактирование конфигов работают как обычно, без sudo;
|
||||
# - домашний каталог пользователя доступен сервису.
|
||||
# (т.е. от $SUDO_USER): не нужно создавать отдельного юзера, git pull и
|
||||
# редактирование конфигов работают как обычно.
|
||||
#
|
||||
# ВАЖНО: перед установкой сервиса один раз запустите сервер вручную:
|
||||
# ./start.sh
|
||||
# start.sh сам поставит Java (если не установлена), скачает и развернёт
|
||||
# NeoForge, сгенерирует user_jvm_args.txt, скачает server.jar и спросит
|
||||
# про EULA. После того как сервер успешно запустился (увидите 'Done!'),
|
||||
# остановите его (команда 'stop' в консоли или Ctrl+C) и запускайте
|
||||
# этот скрипт. Сервис будет использовать run.sh, который уже не делает
|
||||
# никаких интерактивных шагов — просто запускает java.
|
||||
#
|
||||
# Использование:
|
||||
# sudo ./install-service.sh
|
||||
# sudo ./install-service.sh --name minecraft --java-args "-Xms4G -Xmx8G"
|
||||
# sudo ./install-service.sh --name minecraft
|
||||
# sudo ./install-service.sh --uninstall
|
||||
#
|
||||
# Флаги:
|
||||
@@ -19,7 +26,6 @@
|
||||
# --user <user> Переопределить пользователя для сервиса
|
||||
# (по умолчанию: $SUDO_USER)
|
||||
# --dir <путь> Каталог сервера (по умолчанию: каталог скрипта)
|
||||
# --java-args <строка> Дополнительные JVM-аргументы (напр. "-Xms4G -Xmx8G")
|
||||
# --uninstall Остановить, выключить и удалить сервис
|
||||
# -h | --help Показать справку
|
||||
|
||||
@@ -28,11 +34,10 @@ set -euo pipefail
|
||||
SERVICE_NAME="minecraft"
|
||||
SERVICE_USER=""
|
||||
SERVER_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
JAVA_ARGS=""
|
||||
UNINSTALL=0
|
||||
|
||||
print_help() {
|
||||
sed -n '2,25p' "$0" | sed 's/^# \{0,1\}//'
|
||||
sed -n '2,32p' "$0" | sed 's/^# \{0,1\}//'
|
||||
}
|
||||
|
||||
err() {
|
||||
@@ -45,7 +50,6 @@ while [[ $# -gt 0 ]]; do
|
||||
--name) SERVICE_NAME="$2"; shift 2 ;;
|
||||
--user) SERVICE_USER="$2"; shift 2 ;;
|
||||
--dir) SERVER_DIR="$2"; shift 2 ;;
|
||||
--java-args) JAVA_ARGS="$2"; shift 2 ;;
|
||||
--uninstall) UNINSTALL=1; shift ;;
|
||||
-h|--help) print_help; exit 0 ;;
|
||||
*) err "Неизвестный аргумент: $1 (используйте --help)" ;;
|
||||
@@ -97,76 +101,91 @@ echo ">> Сервис будет работать от: ${SERVICE_USER}:${SERVIC
|
||||
|
||||
# 4. Проверка содержимого каталога сервера
|
||||
[[ -d "${SERVER_DIR}" ]] || err "каталог сервера не найден: ${SERVER_DIR}"
|
||||
[[ -f "${SERVER_DIR}/start.sh" ]] || err "не найден ${SERVER_DIR}/start.sh"
|
||||
[[ -f "${SERVER_DIR}/run.sh" ]] || err "не найден ${SERVER_DIR}/run.sh"
|
||||
|
||||
# 4a. Предупреждение про /home — типичная причина status=200/CHDIR.
|
||||
# ProtectHome=read-only блокирует доступ к /home. Если сервер
|
||||
# в /home — ослабим защиту в unit-файле (см. ниже).
|
||||
if [[ "${SERVER_DIR}" == /home/* ]]; then
|
||||
chmod +x "${SERVER_DIR}/run.sh" 2>/dev/null || true
|
||||
|
||||
# 5. Проверка готовности сервера (артефакты, которые создаёт start.sh)
|
||||
need_first_run() {
|
||||
cat >&2 <<EOF
|
||||
|
||||
============================ ВНИМАНИЕ ============================
|
||||
Каталог сервера находится в /home/. Для systemd рекомендуется
|
||||
переносить такие сервисы в /opt (или /srv): это удобнее с точки
|
||||
зрения прав и sandbox-настроек.
|
||||
Сервер ещё не подготовлен к запуску через run.sh:
|
||||
$1
|
||||
|
||||
Скрипт продолжит работу — ProtectHome будет ослаблен в unit-файле.
|
||||
run.sh — это лёгкий лаунчер, он только запускает java и не умеет
|
||||
скачивать NeoForge / Java / server.jar и спрашивать EULA. Поэтому
|
||||
ПЕРЕД установкой сервиса нужно один раз запустить сервер вручную:
|
||||
|
||||
cd ${SERVER_DIR}
|
||||
./start.sh
|
||||
|
||||
start.sh сам:
|
||||
- поставит Java (или подскажет, как поставить системно);
|
||||
- скачает и развернёт NeoForge в libraries/;
|
||||
- сгенерирует user_jvm_args.txt;
|
||||
- скачает server.jar;
|
||||
- спросит про EULA.
|
||||
|
||||
Когда сервер успешно поднимется (в логе появится 'Done (Xs)!'),
|
||||
остановите его: в консоли наберите 'stop' и нажмите Enter
|
||||
(или Ctrl+C). После этого запустите этот скрипт повторно:
|
||||
|
||||
sudo ./install-service.sh
|
||||
====================================================================
|
||||
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Файл NeoForge unix_args.txt — самый надёжный признак, что start.sh отработал.
|
||||
NEOFORGE_ARGS_FILE="$(ls -1 "${SERVER_DIR}"/libraries/net/neoforged/neoforge/*/unix_args.txt 2>/dev/null | head -n1 || true)"
|
||||
if [[ -z "${NEOFORGE_ARGS_FILE}" ]]; then
|
||||
need_first_run "не найден libraries/net/neoforged/neoforge/<версия>/unix_args.txt — NeoForge не развёрнут."
|
||||
fi
|
||||
|
||||
chmod +x "${SERVER_DIR}/start.sh" "${SERVER_DIR}/run.sh" 2>/dev/null || true
|
||||
[[ -f "${SERVER_DIR}/user_jvm_args.txt" ]] \
|
||||
|| need_first_run "не найден user_jvm_args.txt — start.sh не сгенерировал JVM-аргументы."
|
||||
|
||||
# 4b. Проверка Java. start.sh иначе попытается интерактивно поставить
|
||||
# Jabba и упадёт в systemd с "User did not agree to Jabba installation".
|
||||
REQUIRED_JAVA_VERSION="$(grep -E '^RECOMMENDED_JAVA_VERSION=' "${SERVER_DIR}/variables.txt" 2>/dev/null \
|
||||
| cut -d= -f2 | tr -d '"' | head -n1)"
|
||||
REQUIRED_JAVA_VERSION="${REQUIRED_JAVA_VERSION:-21}"
|
||||
[[ -f "${SERVER_DIR}/server.jar" && -s "${SERVER_DIR}/server.jar" ]] \
|
||||
|| need_first_run "server.jar отсутствует или пустой — start.sh не докачал лаунчер."
|
||||
|
||||
EULA_FILE="${SERVER_DIR}/eula.txt"
|
||||
if [[ ! -f "${EULA_FILE}" ]] || ! grep -qE '^\s*eula\s*=\s*true' "${EULA_FILE}"; then
|
||||
need_first_run "${EULA_FILE} отсутствует или eula=false — без принятия EULA сервер не стартует."
|
||||
fi
|
||||
|
||||
# 6. Проверка Java (run.sh вызывает 'java' из PATH)
|
||||
if ! command -v java >/dev/null 2>&1; then
|
||||
cat >&2 <<EOF
|
||||
|
||||
============================ ВНИМАНИЕ ============================
|
||||
Java не найдена в системе. Сначала установите Java ${REQUIRED_JAVA_VERSION},
|
||||
затем запустите этот скрипт повторно.
|
||||
В системе не найдена команда 'java'. run.sh не сможет стартовать
|
||||
сервер. Установите Java одним из способов:
|
||||
|
||||
Рекомендуемый способ (системный пакет, виден всем пользователям):
|
||||
# Системно (рекомендуется — видна и в shell, и в systemd):
|
||||
sudo apt update
|
||||
sudo apt install -y openjdk-21-jre-headless
|
||||
|
||||
sudo apt update
|
||||
sudo apt install -y openjdk-${REQUIRED_JAVA_VERSION}-jre-headless
|
||||
|
||||
Альтернатива — скрипт ./install_java.sh (использует Jabba, ставит
|
||||
Java в \$HOME пользователя). Запускайте его от того же юзера, под
|
||||
которым будет работать сервис (${SERVICE_USER}), без sudo.
|
||||
После установки запустите этот скрипт повторно.
|
||||
====================================================================
|
||||
|
||||
EOF
|
||||
err "java не найдена в PATH. Установите Java ${REQUIRED_JAVA_VERSION} и повторите."
|
||||
err "java не найдена в PATH."
|
||||
fi
|
||||
|
||||
JAVA_MAJOR="$(java -version 2>&1 | awk -F\" '/version/ {print $2}' | cut -d. -f1)"
|
||||
if [[ "${JAVA_MAJOR}" == "1" ]]; then
|
||||
JAVA_MAJOR="$(java -version 2>&1 | awk -F\" '/version/ {print $2}' | cut -d. -f2)"
|
||||
fi
|
||||
if [[ "${JAVA_MAJOR}" != "${REQUIRED_JAVA_VERSION}" ]]; then
|
||||
echo ">> ВНИМАНИЕ: установлена Java ${JAVA_MAJOR}, ожидалась ${REQUIRED_JAVA_VERSION}." >&2
|
||||
echo " Сервер может не стартовать. Рекомендуется openjdk-${REQUIRED_JAVA_VERSION}-jre-headless." >&2
|
||||
fi
|
||||
|
||||
# 5. Проверка EULA
|
||||
EULA_FILE="${SERVER_DIR}/eula.txt"
|
||||
if [[ ! -f "${EULA_FILE}" ]] || ! grep -qE '^\s*eula\s*=\s*true' "${EULA_FILE}"; then
|
||||
# 7. Предупреждение про /home — типичная причина status=200/CHDIR.
|
||||
if [[ "${SERVER_DIR}" == /home/* ]]; then
|
||||
cat >&2 <<EOF
|
||||
Внимание: ${EULA_FILE} отсутствует или eula=false.
|
||||
В systemd нет интерактивного stdin, поэтому сервер не сможет спросить согласие.
|
||||
Подтвердите EULA вручную перед стартом сервиса:
|
||||
echo 'eula=true' > ${EULA_FILE}
|
||||
Скрипт продолжит и создаст unit, но сервис стартанёт только после принятия EULA.
|
||||
|
||||
>> ВНИМАНИЕ: каталог сервера находится в /home/. Для systemd
|
||||
рекомендуется переносить сервисы в /opt (или /srv).
|
||||
ProtectHome будет ослаблен в unit-файле.
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
# 6. Генерация systemd unit-файла
|
||||
# 8. Генерация systemd unit-файла
|
||||
if [[ "${SERVER_DIR}" == /home/* ]]; then
|
||||
PROTECT_HOME_LINE="ProtectHome=false"
|
||||
else
|
||||
@@ -185,9 +204,7 @@ Type=simple
|
||||
User=${SERVICE_USER}
|
||||
Group=${SERVICE_GROUP}
|
||||
WorkingDirectory=${SERVER_DIR}
|
||||
Environment=WAIT_FOR_USER_INPUT=false
|
||||
$( [[ -n "${JAVA_ARGS}" ]] && echo "Environment=JAVA_ARGS=${JAVA_ARGS}" )
|
||||
ExecStart=/usr/bin/env bash ${SERVER_DIR}/start.sh
|
||||
ExecStart=/usr/bin/env bash ${SERVER_DIR}/run.sh nogui
|
||||
Restart=on-failure
|
||||
RestartSec=10s
|
||||
TimeoutStopSec=120
|
||||
@@ -208,7 +225,7 @@ EOF
|
||||
|
||||
chmod 644 "${UNIT_FILE}"
|
||||
|
||||
# 7. Активация сервиса
|
||||
# 9. Активация сервиса
|
||||
echo ">> Перечитываю systemd, включаю и запускаю сервис..."
|
||||
systemctl daemon-reload
|
||||
systemctl enable "${SERVICE_NAME}.service"
|
||||
|
||||
Reference in New Issue
Block a user