Pterohost docs

Автоматические бэкапы игрового сервера (rsync, cron)

Настройте автоматические бэкапы игрового сервера с rsync и cron: скрипт архивации, ротация по дате, выгрузка на удалённый сервер и восстановление.

Кратко: Автоматические бэкапы через cron + rsync/tar защищают данные игрового сервера от потери при сбое диска, ошибках администратора или атаке. Базовую схему можно настроить за 15-20 минут - один скрипт, одна cron-задача, и данные в безопасности.

Автоматические бэкапы игрового сервера (rsync, cron)

Потеря игровых данных - одна из самых болезненных ситуаций для администратора сервера. Мир Minecraft, нажитые ресурсы в Rust, прогресс в Project Zomboid - всё это может исчезнуть за секунду из-за отказа диска, случайного rm -rf или вирусной атаки. В 2026 году стандарт для игровых серверов - это автоматические бэкапы с ротацией по дате и копией на удалённом хранилище. В этой статье разберём полную цепочку: скрипт архивации, cron-расписание, выгрузку на внешний сервер через rsync/SSH и восстановление из бэкапа. Всё на реальных примерах для Linux (Ubuntu 22.04/24.04 и Debian 12).

Pterohost - игровой хостинг с NVMe-дисками, DDoS-защитой и поддержкой 24/7, где бэкапы можно настроить прямо через панель или по этой инструкции. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг

Что и зачем бэкапить

Прежде чем писать скрипты, определитесь, что именно нужно сохранять. Для большинства игровых серверов структура данных делится на три группы:

Тип данныхПримерыБэкапить?
Игровые миры и сохраненияworld/, SavedGames/, .mapОбязательно
Конфиги и настройкиserver.properties, config.yml, *.cfgОбязательно
Плагины и моды (конфиги)plugins/, mods/configs/Рекомендуется
Исполняемые файлыserver.jar, steamcmd, *.exeНе обязательно
Логиlogs/По желанию

Для Minecraft-сервера минимальный набор: папки world, world_nether, world_the_end, plugins и файл server.properties.

Для Rust: папка server/ с поддиректориями cfg/ и proceduralmap_*.map (сохранения мира).

Для Project Zomboid: папка ~/.config/ProjectZomboid/Saves/.

Структура директорий для бэкапов

Создайте удобную иерархию директорий заранее:

mkdir -p /opt/backups/minecraft/daily
mkdir -p /opt/backups/minecraft/weekly
mkdir -p /opt/backups/logs

Если сервер работает через Pterodactyl, данные обычно лежат в /var/lib/pterodactyl/volumes/{uuid}/. Узнать путь к конкретному серверу можно через панель или командой:

ls /var/lib/pterodactyl/volumes/

Для VPS с ручной установкой путь к серверу задаёте сами при установке - например /opt/minecraft/.

Скрипт бэкапа на bash

Создайте файл скрипта:

nano /opt/scripts/backup-gameserver.sh

Пример рабочего скрипта для Minecraft (адаптируйте пути под свою игру):

#!/bin/bash

# ===== НАСТРОЙКИ =====
SERVER_DIR="/opt/minecraft"
BACKUP_DIR="/opt/backups/minecraft/daily"
WEEKLY_DIR="/opt/backups/minecraft/weekly"
LOG_FILE="/opt/backups/logs/backup.log"
KEEP_DAILY=7        # сколько ежедневных бэкапов хранить
KEEP_WEEKLY=4       # сколько недельных бэкапов хранить
GAME="minecraft"    # имя для имён файлов

# ===== ПЕРЕМЕННЫЕ =====
DATE=$(date +%Y-%m-%d)
DATETIME=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILE="${BACKUP_DIR}/${GAME}_${DATETIME}.tar.gz"
DAY_OF_WEEK=$(date +%u)  # 1=пн, 7=вс

# ===== ФУНКЦИЯ ЛОГИРОВАНИЯ =====
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# ===== НАЧАЛО БЭКАПА =====
log "=== Начало бэкапа ${GAME} ==="

# Проверка наличия исходной директории
if [ ! -d "$SERVER_DIR" ]; then
    log "ОШИБКА: директория сервера ${SERVER_DIR} не найдена"
    exit 1
fi

# Создать директории если не существуют
mkdir -p "$BACKUP_DIR" "$WEEKLY_DIR"

# Создать архив
log "Создание архива: ${BACKUP_FILE}"
tar -czf "$BACKUP_FILE" \
    --exclude="${SERVER_DIR}/logs" \
    --exclude="${SERVER_DIR}/crash-reports" \
    -C "$(dirname $SERVER_DIR)" \
    "$(basename $SERVER_DIR)" 2>>"$LOG_FILE"

if [ $? -eq 0 ]; then
    SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)
    log "Архив создан успешно: ${BACKUP_FILE} (${SIZE})"
else
    log "ОШИБКА: не удалось создать архив"
    exit 1
fi

# Проверка целостности архива
log "Проверка целостности архива..."
tar -tzf "$BACKUP_FILE" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    log "Архив прошёл проверку целостности"
    # Сохранить SHA256-хэш
    sha256sum "$BACKUP_FILE" >> "${BACKUP_DIR}/checksums.sha256"
else
    log "ОШИБКА: архив повреждён, удаляем"
    rm -f "$BACKUP_FILE"
    exit 1
fi

# Еженедельный бэкап (каждое воскресенье)
if [ "$DAY_OF_WEEK" -eq 7 ]; then
    WEEKLY_FILE="${WEEKLY_DIR}/${GAME}_weekly_${DATE}.tar.gz"
    cp "$BACKUP_FILE" "$WEEKLY_FILE"
    log "Создан еженедельный бэкап: ${WEEKLY_FILE}"
    # Удалить старые недельные бэкапы
    ls -t "${WEEKLY_DIR}/${GAME}_weekly_"*.tar.gz 2>/dev/null | tail -n +$((KEEP_WEEKLY + 1)) | xargs -r rm -v >> "$LOG_FILE" 2>&1
fi

# Ротация: удалить старые ежедневные бэкапы
log "Ротация старых бэкапов (оставляем ${KEEP_DAILY})..."
ls -t "${BACKUP_DIR}/${GAME}_"*.tar.gz 2>/dev/null | tail -n +$((KEEP_DAILY + 1)) | xargs -r rm -v >> "$LOG_FILE" 2>&1

log "=== Бэкап завершён успешно ==="

Сделайте скрипт исполняемым:

chmod +x /opt/scripts/backup-gameserver.sh

Проверьте работу вручную:

/opt/scripts/backup-gameserver.sh

Rsync: инкрементные бэкапы и синхронизация

Rsync эффективнее tar для инкрементных бэкапов - он передаёт только изменившиеся файлы. Это критично для больших серверов, где мир весит несколько гигабайт.

Локальный инкрементный бэкап с rsync

#!/bin/bash
# Инкрементный бэкап через rsync с hard links (экономит место)

SERVER_DIR="/opt/minecraft"
BACKUP_BASE="/opt/backups/minecraft"
DATE=$(date +%Y-%m-%d)
LATEST="${BACKUP_BASE}/latest"
DEST="${BACKUP_BASE}/${DATE}"

rsync -av --delete \
    --link-dest="$LATEST" \
    --exclude="logs/" \
    --exclude="crash-reports/" \
    "${SERVER_DIR}/" \
    "${DEST}/"

# Обновить символическую ссылку latest
rm -f "$LATEST"
ln -s "$DEST" "$LATEST"

Ключ --link-dest создаёт жёсткие ссылки на неизменившиеся файлы из предыдущего бэкапа, поэтому каждая папка с датой выглядит как полная копия, но занимает место только для изменённых файлов.

Выгрузка на удалённый сервер через rsync + SSH

Для серьёзной защиты нужна копия за пределами основного сервера. Настройте SSH-ключ для беспарольного соединения:

# Создать ключ если ещё нет
ssh-keygen -t ed25519 -C "backup@gameserver" -f /root/.ssh/backup_key -N ""

# Скопировать публичный ключ на удалённый сервер
ssh-copy-id -i /root/.ssh/backup_key.pub user@backup-server.example.com

Добавьте блок в /etc/ssh/config (или ~/.ssh/config):

Host backup-storage
    HostName backup-server.example.com
    User backupuser
    IdentityFile /root/.ssh/backup_key
    StrictHostKeyChecking accept-new

Функция выгрузки на удалённый сервер в основном скрипте:

# ===== ВЫГРУЗКА НА УДАЛЁННЫЙ СЕРВЕР =====
REMOTE_HOST="backup-storage"
REMOTE_DIR="/home/backupuser/gameservers/minecraft"

log "Выгрузка бэкапа на удалённый сервер ${REMOTE_HOST}..."
rsync -az --remove-source-files \
    "${BACKUP_FILE}" \
    "${REMOTE_HOST}:${REMOTE_DIR}/" 2>>"$LOG_FILE"

if [ $? -eq 0 ]; then
    log "Выгрузка на удалённый сервер завершена"
else
    log "ПРЕДУПРЕЖДЕНИЕ: не удалось выгрузить на удалённый сервер (локальный бэкап сохранён)"
fi

Флаг --remove-source-files удаляет локальный файл после успешной передачи - используйте его только если хотите хранить бэкапы исключительно на удалённой машине.

Бэкап работающего Minecraft-сервера через RCON

Бэкап работающего сервера безопасен для большинства игр, но Minecraft периодически держит данные в памяти. Чтобы гарантировать сохранение мира перед архивацией, используйте RCON:

# Установить mcrcon
apt-get install -y mcrcon 2>/dev/null || {
    # Сборка из исходников если нет в репо
    git clone https://github.com/Tiiffi/mcrcon /tmp/mcrcon
    cd /tmp/mcrcon && make && cp mcrcon /usr/local/bin/
}

Добавьте в начало скрипта перед созданием архива:

# Отправить save-all и отключить автосохранение перед бэкапом
RCON_HOST="localhost"
RCON_PORT="25575"
RCON_PASS="ваш_rcon_пароль"

mcrcon -H "$RCON_HOST" -P "$RCON_PORT" -p "$RCON_PASS" \
    "say [Backup] Начинается бэкап сервера, возможны лаги 30 сек" \
    "save-all" \
    "save-off" 2>>"$LOG_FILE"

sleep 5  # дать время записать данные на диск

# ... создание архива ...

# После архивации включить автосохранение обратно
mcrcon -H "$RCON_HOST" -P "$RCON_PORT" -p "$RCON_PASS" \
    "save-on" \
    "say [Backup] Бэкап завершён" 2>>"$LOG_FILE"

Для RCON нужно включить его в server.properties:

enable-rcon=true
rcon.port=25575
rcon.password=ваш_rcon_пароль

Настройка cron-расписания

Откройте crontab от пользователя root:

crontab -e

Примеры расписаний:

# Бэкап каждые 6 часов
0 */6 * * * /opt/scripts/backup-gameserver.sh >> /opt/backups/logs/cron.log 2>&1

# Бэкап раз в сутки в 4:00
0 4 * * * /opt/scripts/backup-gameserver.sh >> /opt/backups/logs/cron.log 2>&1

# Два бэкапа в день: в 6:00 и в 18:00
0 6,18 * * * /opt/scripts/backup-gameserver.sh >> /opt/backups/logs/cron.log 2>&1

# Бэкап каждый час в рабочее время (9:00-21:00)
0 9-21 * * * /opt/scripts/backup-gameserver.sh >> /opt/backups/logs/cron.log 2>&1

Формат cron: минута час день_месяца месяц день_недели команда.

Проверить, что cron запускается правильно:

# Проверить статус cron
systemctl status cron

# Посмотреть последние выполнения через syslog
grep CRON /var/log/syslog | tail -20

# Посмотреть лог нашего скрипта
tail -50 /opt/backups/logs/backup.log

Ротация бэкапов: схема хранения

Профессиональная схема ротации - “дед-отец-сын” (Grandfather-Father-Son):

УровеньЧастотаХранитьИтого
Сын (ежечасно)Каждые 6 часов4 бэкапа1 день
Отец (ежедневно)Раз в день7 бэкапов1 неделя
Дед (еженедельно)По воскресеньям4 бэкапа1 месяц

Для автоматической ротации можно использовать logrotate-подобный подход или tmpwatch/tmpreaper:

# Удалить бэкапы старше 7 дней
find /opt/backups/minecraft/daily -name "*.tar.gz" -mtime +7 -delete

# Удалить бэкапы старше 30 дней
find /opt/backups/minecraft/weekly -name "*.tar.gz" -mtime +30 -delete

Добавьте эти строки в crontab как отдельные задачи или в конец скрипта бэкапа.

Восстановление из бэкапа

Алгоритм восстановления:

Шаг 1: Остановить сервер

# Если сервер в systemd
systemctl stop minecraft

# Если через screen
screen -S minecraft -X stuff "stop\n"
sleep 10

Шаг 2: Найти нужный бэкап

# Список бэкапов с датой и размером
ls -lh /opt/backups/minecraft/daily/

# Если бэкапы на удалённом сервере
rsync --list-only backup-storage:/home/backupuser/gameservers/minecraft/

Шаг 3: Проверить целостность перед восстановлением

# Быстрая проверка
tar -tzf /opt/backups/minecraft/daily/minecraft_2026-06-05_04-00-00.tar.gz > /dev/null && echo "OK" || echo "АРХИВ БИТЫЙ"

# Проверить SHA256-хэш (если сохраняли)
sha256sum -c /opt/backups/minecraft/daily/checksums.sha256 2>/dev/null | grep "minecraft_2026-06-05"

Шаг 4: Восстановить данные

# Переименовать текущую папку (не удалять - это страховка)
mv /opt/minecraft /opt/minecraft.old.$(date +%s)

# Распаковать бэкап
mkdir -p /opt/minecraft
tar -xzf /opt/backups/minecraft/daily/minecraft_2026-06-05_04-00-00.tar.gz \
    -C /opt/ 2>&1 | tail -5

# Проверить что файлы на месте
ls -la /opt/minecraft/

Шаг 5: Запустить и проверить

systemctl start minecraft
journalctl -u minecraft -f

Если всё работает - удалите minecraft.old.* через несколько дней.

Мониторинг и уведомления

Бэкап без мониторинга - это полбэкапа. Добавьте уведомление в конец скрипта, чтобы знать о сбоях:

# Уведомление через Telegram-бот
TELEGRAM_BOT_TOKEN="ваш_токен"
TELEGRAM_CHAT_ID="ваш_chat_id"
STATUS_MSG="Бэкап ${GAME} $(date '+%Y-%m-%d %H:%M') - OK. Размер: ${SIZE}"

curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
    -d "chat_id=${TELEGRAM_CHAT_ID}" \
    -d "text=${STATUS_MSG}" > /dev/null

Более простой вариант - отправка на email через mail:

# Установить mailutils
apt-get install -y mailutils

# Отправить итог лога на почту
tail -20 "$LOG_FILE" | mail -s "Backup ${GAME} - OK" admin@yourdomain.com

Также полезно настроить алерт на переполнение диска - бэкапы без ротации могут забить всё свободное место:

# Добавить в crontab - проверять место раз в час
0 * * * * df /opt/backups | awk 'NR==2 {if ($5+0 > 85) print "DISK " $5 " FULL"}' | mail -s "Disk Alert" admin@yourdomain.com

Особенности для разных игр

Rust

SERVER_DIR="/opt/rust/server/rust"
# Важно сохранять .map файл и папку cfg
tar -czf "$BACKUP_FILE" \
    -C /opt/rust/server/rust \
    cfg/ \
    *.map 2>>"$LOG_FILE"

Project Zomboid

# Данные лежат в домашней директории пользователя сервера
SERVER_DIR="/home/zomboid/.config/ProjectZomboid/Saves"

7 Days to Die

SERVER_DIR="/opt/7dtd/saves"
# 7DTD сохраняет миры в отдельной папке
tar -czf "$BACKUP_FILE" \
    -C /opt/7dtd \
    saves/ \
    serverconfig.xml 2>>"$LOG_FILE"

Связанные материалы

Для полноценного управления сервером пригодятся также наши инструкции по подключению к базам данных: Подключение к MySQL серверу и Управление базами данных MySQL - для игр, которые хранят данные в SQL (плагины Minecraft, некоторые моды Rust). Для передачи файлов бэкапов между серверами вручную или через файловый менеджер смотрите Подключение по FTP/SFTP.

Заключение

Автоматические бэкапы через cron и rsync - это минимальный необходимый уровень защиты для любого игрового сервера. Описанная схема с ротацией ежедневных и еженедельных бэкапов, проверкой целостности SHA256 и выгрузкой на удалённый сервер покрывает большинство сценариев потери данных. Главное правило: бэкап считается настоящим только тогда, когда вы хотя бы один раз успешно восстановились из него. Потратьте 10 минут на тестовое восстановление - и убедитесь, что всё работает именно так, как ожидаете. Настройте уведомления о сбоях, следите за местом на диске и регулярно проверяйте логи.

Pterohost - надёжный хостинг для игровых серверов с автоматическими снапшотами, NVMe-дисками и круглосуточной поддержкой - чтобы вы не беспокоились о сохранности данных. Промокод 4START даёт -20% на первый заказ. Заказать Minecraft хостинг