Потеря игрового мира из-за сбоя оборудования, ошибки в моде или случайного удаления — главный страх любого администратора игрового сервера. Ручные бэкапы не спасают: администраторы неизбежно забывают делать их регулярно. В то же время непродуманные скрипты архивации часто создают другую катастрофу — вызывают многосекундные лаги в игре из-за медленного сжатия и забивают 100% диска VPS старыми архивами.
В этой статье разобран процесс создания производительного пайплайна автоматического резервного копирования: с параллельным сжатием zstd, строгой политикой ротации устаревших копий и надёжным планировщиком systemd timer.
Скрипт архивации с параллельным сжатием Zstandard#
Классическое сжатие gzip работает в один поток и сильно нагружает процессор, вызывая просадку тикрейта (tick drop) на работающем сервере. Современный алгоритм Zstandard (zstd) сжимает данные в разы быстрее, эффективно задействуя доступные ядра CPU с минимальным воздействием на симуляцию игры.
Создайте рабочий каталог и скрипт создания резервных копий:
sudo mkdir -p /opt/scripts /opt/backups/gameserver
cat << 'EOF' | sudo tee /opt/scripts/backup-gameserver.sh
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/opt/backups/gameserver"
SOURCE_DIR="/opt/gameserver/saved"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
ARCHIVE_NAME="${BACKUP_DIR}/world_backup_${TIMESTAMP}.tar.zst"
mkdir -p "$BACKUP_DIR"
# Create compressed archive with multithreaded zstd
tar -I 'zstd -3 -T0' -cf "$ARCHIVE_NAME" -C "$SOURCE_DIR" .
# Verify archive integrity
zstd -t "$ARCHIVE_NAME"
# Prune archives older than 14 days
find "$BACKUP_DIR" -type f -name "world_backup_*.tar.zst" -mtime +14 -delete
EOF
sudo chmod +x /opt/scripts/backup-gameserver.sh
Уровень сжатия -3 обеспечивает идеальный баланс между скоростью работы и объемом архива, а параметр -T0 автоматически использует все доступные потоки процессора.
Проверка политики ротации и очистки архивов#
Без регулярного удаления устаревших копий любой сервер рано или поздно столкнется с ошибкой No space left on device.
Строка очистки в скрипте использует утилиту find:
-type f— обрабатывает только обычные файлы.-name "world_backup_*.tar.zst"— защищает посторонние файлы в директории от удаления.-mtime +14— выбирает архивы старше 14 дней.-delete— удаляет найденные файлы атомарно.
Проверьте корректность работы правила очистки в тестовом режиме:
find /opt/backups/gameserver -type f -name "world_backup_*.tar.zst" -mtime +14
Создание службы и таймера systemd#
Для запуска регулярных задач в современном Linux рекомендуется использовать таймеры systemd timer вместо устаревшего cron. Они предоставляют единый журнал выполнения в journalctl, контролируют зависимости и поддерживают директиву Persistent=true (если VPS был выключен во время запланированного запуска, таймер сработает сразу после включения).
Создайте юнит однократной службы:
cat << 'EOF' | sudo tee /etc/systemd/system/gameserver-backup.service
[Unit]
Description=Automated Game Server World Backup
After=network.target
[Service]
Type=oneshot
ExecStart=/opt/scripts/backup-gameserver.sh
User=root
EOF
Создайте юнит планировщика:
cat << 'EOF' | sudo tee /etc/systemd/system/gameserver-backup.timer
[Unit]
Description=Daily Game Server Backup Timer
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
Активация таймера и тестовый прогон#
Перечитайте конфигурацию системного демона и запустите таймер:
sudo systemctl daemon-reload
sudo systemctl enable --now gameserver-backup.timer
systemctl list-timers gameserver-backup.timer
Выполните разовый тестовый запуск службы резервного копирования, чтобы проверить корректность работы скрипта и права доступа:
sudo systemctl start gameserver-backup.service
sudo journalctl -u gameserver-backup.service --no-pager
Проверьте, что в целевом каталоге появился валидный архив с ненулевым размером:
ls -lh /opt/backups/gameserver/
Для распределения резервных копий по географически удаленным хранилищам S3 и автоматического мониторинга состояния бэкапов команды используют возможности панели управления серверами, где расписание снимков и валидация архивов выполняются на уровне инфраструктурного конвейера.




