Практика Руководство

Автоматические бэкапы игрового сервера: systemd и zstd

Автоматическое резервное копирование игровых серверов: параллельное сжатие zstd, таймеры systemd timer и автоматическая ротация архивов.

Автоматические бэкапы игрового сервера: systemd и zstd

Потеря игрового мира из-за сбоя оборудования, ошибки в моде или случайного удаления — главный страх любого администратора игрового сервера. Ручные бэкапы не спасают: администраторы неизбежно забывают делать их регулярно. В то же время непродуманные скрипты архивации часто создают другую катастрофу — вызывают многосекундные лаги в игре из-за медленного сжатия и забивают 100% диска VPS старыми архивами.

В этой статье разобран процесс создания производительного пайплайна автоматического резервного копирования: с параллельным сжатием zstd, строгой политикой ротации устаревших копий и надёжным планировщиком systemd timer.

Скрипт архивации с параллельным сжатием Zstandard#

Классическое сжатие gzip работает в один поток и сильно нагружает процессор, вызывая просадку тикрейта (tick drop) на работающем сервере. Современный алгоритм Zstandard (zstd) сжимает данные в разы быстрее, эффективно задействуя доступные ядра CPU с минимальным воздействием на симуляцию игры.

Создайте рабочий каталог и скрипт создания резервных копий:

bash
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 — удаляет найденные файлы атомарно.

Проверьте корректность работы правила очистки в тестовом режиме:

bash
find /opt/backups/gameserver -type f -name "world_backup_*.tar.zst" -mtime +14

Создание службы и таймера systemd#

Для запуска регулярных задач в современном Linux рекомендуется использовать таймеры systemd timer вместо устаревшего cron. Они предоставляют единый журнал выполнения в journalctl, контролируют зависимости и поддерживают директиву Persistent=true (если VPS был выключен во время запланированного запуска, таймер сработает сразу после включения).

Создайте юнит однократной службы:

bash
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

Создайте юнит планировщика:

bash
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

Активация таймера и тестовый прогон#

Перечитайте конфигурацию системного демона и запустите таймер:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now gameserver-backup.timer
systemctl list-timers gameserver-backup.timer

Выполните разовый тестовый запуск службы резервного копирования, чтобы проверить корректность работы скрипта и права доступа:

bash
sudo systemctl start gameserver-backup.service
sudo journalctl -u gameserver-backup.service --no-pager

Проверьте, что в целевом каталоге появился валидный архив с ненулевым размером:

bash
ls -lh /opt/backups/gameserver/

Для распределения резервных копий по географически удаленным хранилищам S3 и автоматического мониторинга состояния бэкапов команды используют возможности панели управления серверами, где расписание снимков и валидация архивов выполняются на уровне инфраструктурного конвейера.

Источники#