From 96176d2f0c263ef2e9348c1a094def9a842ce228 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Thu, 9 Oct 2025 15:29:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/misc/minecraft-server.md | 143 ++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/docs/misc/minecraft-server.md b/docs/misc/minecraft-server.md index 49f6b99..d2984a2 100644 --- a/docs/misc/minecraft-server.md +++ b/docs/misc/minecraft-server.md @@ -121,3 +121,146 @@ DNS-записи распространяются не мгновенно, но !!! note "Клиенты Minecraft читают SRV-запись" С помощью SRV-записи можно подменять как порт, так и домен сервера. Стандартный клиент Minecraft Java Edition при подключении по домену автоматически ищет SRV-запись _minecraft._tcp.<домен> в DNS. Если такая запись есть, клиент использует указанные в ней порт и хост. С Bedrock Edition могут возникнуть сложности, там не все клиенты читают SRV-запись. + + +## Автоматическое создание бэкапов + +Скрипт ниже автоматически создаёт бэкапы при завершении работы сервера. Особенно удобно сочетать его с настройкой `ENABLE_AUTOSTOP`, тогда при завершении игровой сессии бэкап будет создан автоматически. + +=== "Терминал" + ```sh + # Создаём скрипт в директории рядом с docker-compose.yml + nano run-and-backup.sh + + # После создания скрипта надо дать ему права на выполнение + chmod u+x run-and-backup.sh + ``` + +=== "run-and-backup.sh" + + ```bash + #!/usr/bin/env bash + set -euo pipefail + + # === настройки === + PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + DATA_DIR="${PROJECT_DIR}/data" + BACKUP_DIR="${PROJECT_DIR}/backups" + KEEP_BACKUPS=3 + TAR_COMPRESS_FLAGS="-czf" + + mkdir -p "$BACKUP_DIR" + + ts() { date +"%Y-%m-%d_%H-%M-%S"; } + + show_help() { + cat <<'EOF' + run-and-backup.sh — запускает Minecraft-сервер через Docker Compose + и создаёт резервную копию каталога ./data после завершения работы. + + ИСПОЛЬЗОВАНИЕ: + ./run-and-backup.sh — запустить сервер в foreground + ./run-and-backup.sh -d — запустить в background (логи в run-and-backup.log) + ./run-and-backup.sh -b — только сделать бэкап и выйти + ./run-and-backup.sh -h — показать эту справку + + ЧТО ДЕЛАЕТ: + 1) docker compose up (следит за завершением контейнера) + 2) по Ctrl+C или штатному выходу — docker compose down + 3) создаёт архив ./backups/mc-data-YYYY-MM-DD_HH-MM-SS.tar.gz + 4) хранит последние KEEP_BACKUPS бэкапов + + КАК ВОССТАНОВИТЬ СЕРВЕР ИЗ БЭКАПА: + 1) Остановите сервер: + docker compose down + 2) Очистите или перенесите текущие данные: + mv ./data ./data.old + mkdir ./data + ИЛИ + rm -rf ./data/* + 3) Распакуйте нужный архив в ./data: + tar -xzf ./backups/mc-data-YYYY-MM-DD_HH-MM-SS.tar.gz -C ./data + 4) Запустите сервер + + ПРИМЕЧАНИЯ: + • Архив содержит всё из ./data (мир, плагины, конфиги, whitelist, ops и т.д.) + • Для фонового режима логи скрипта пишутся в ./run-and-backup.log + EOF + } + + backup() { + local stamp archive + stamp="$(ts)" + archive="${BACKUP_DIR}/mc-data-${stamp}.tar.gz" + + if [[ ! -d "$DATA_DIR" ]]; then + echo "[!] Нет каталога DATA_DIR: $DATA_DIR" >&2 + exit 1 + fi + + echo "[*] Бэкап ${DATA_DIR} -> ${archive}" + tar $TAR_COMPRESS_FLAGS "$archive" -C "$DATA_DIR" . + echo "[+] Готово: $archive" + + echo "[*] Ротация: оставляю последние ${KEEP_BACKUPS}" + ls -1t "${BACKUP_DIR}"/mc-data-*.tar.* 2>/dev/null | tail -n +$((KEEP_BACKUPS+1)) | xargs -r rm -f + } + + graceful_down_and_backup() { + echo "[*] Останавливаю docker compose (graceful)..." + docker compose down || true + backup + } + + # ---- разбор флагов ---- + bg=false + do_backup_only=false + + while getopts ":dbh" opt; do + case "$opt" in + d) bg=true ;; + b) do_backup_only=true ;; + h) show_help; exit 0 ;; + \?) echo "Неизвестный флаг: -$OPTARG" >&2; show_help; exit 2 ;; + esac + done + + # -b имеет приоритет: просто делаем бэкап и выходим + if $do_backup_only; then + backup + exit 0 + fi + + # запуск в фоне + if $bg; then + echo "[*] Запускаю в background (логи: ${PROJECT_DIR}/run-and-backup.log)" + nohup "$0" >"${PROJECT_DIR}/run-and-backup.log" 2>&1 & + echo "[✓] PID: $!" + exit 0 + fi + + # ---- основной режим ---- + trap graceful_down_and_backup INT TERM + + echo "[*] Запускаю docker compose в foreground (Ctrl+C для остановки)..." + if docker compose up; then + echo "[*] docker compose завершился сам — делаю бэкап..." + backup + else + echo "[!] docker compose завершился с ошибкой; если это был Ctrl+C, бэкап уже выполнен ловушкой." + fi + + echo "[✓] Готово." + ``` + +Теперь можно запускать сервер командой `./run-and-backup.sh`. + +```sh +./run-and-backup.sh -d +``` + +Вывести справку можно командой. + +```sh +./run-and-backup.sh -h +``` \ No newline at end of file