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:
Leonid Pershin
2026-05-08 12:25:07 +03:00
parent 2f81d73f8e
commit b9f7d14562
17 changed files with 936 additions and 693 deletions
+74 -57
View File
@@ -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"