Скрипт для бэкапов
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 2s
This commit is contained in:
@@ -121,3 +121,146 @@ DNS-записи распространяются не мгновенно, но
|
|||||||
!!! note "Клиенты Minecraft читают SRV-запись"
|
!!! note "Клиенты Minecraft читают SRV-запись"
|
||||||
|
|
||||||
С помощью SRV-записи можно подменять как порт, так и домен сервера. Стандартный клиент Minecraft Java Edition при подключении по домену автоматически ищет SRV-запись _minecraft._tcp.<домен> в DNS. Если такая запись есть, клиент использует указанные в ней порт и хост. С Bedrock Edition могут возникнуть сложности, там не все клиенты читают 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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user