Автоматические бэкапы игрового сервера (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 хостинг