Как создать резервную копию сервера

Подготовка и доступ к серверу

  1. Авторизуйтесь в панели управления proxify.cloud. Перейдите в раздел «Мои услуги» → «Выделенные серверы» и выберите нужный сервер. Нажмите кнопку «Консоль» или «VNC», чтобы открыть прямой доступ к CLI Ubuntu. Альтернативно подключитесь по SSH с вашего компьютера:
ssh root@<IP-адрес_сервера>
  1. Убедитесь, что вы находитесь в домашней директории root или пользователя, под которым запущен сервер (обычно minecraft или ubuntu). Проверьте текущего пользователя:
whoami
  1. Определите точный путь к директории сервера. Стандартные варианты:

    • /opt/minecraft
    • /home/minecraft/server
    • /var/lib/minecraft

    Найдите папку командой:

find / -type f -name "server.jar" 2>/dev/null | head -5

Запомните полный путь к родительской папке (например, /opt/minecraft). Далее в инструкции используется переменная $SERVER_DIR.

Остановка сервера перед бэкапом (рекомендуется)

  1. Чтобы гарантировать целостность миров и баз данных, остановите сервер. Если используется systemd-юнит:
systemctl stop minecraft

Если сервер запущен в screen или tmux под пользователем minecraft:

su - minecraft -c "screen -S mc -X stuff 'save-all\nsave-off\nstop\n'"

Подождите 10–15 секунд, пока процесс полностью завершится. Проверьте:

ps aux | grep -E "java.*server.jar" | grep -v grep

Вывод должен быть пустым.

Создание архива вручную через tar

  1. Перейдите в родительскую директорию сервера и создайте сжатый архив с текущей датой в имени:
cd /opt
tar -czvf "minecraft_backup_$(date +%F_%H-%M).tar.gz" minecraft
  • -c — создать архив
  • -z — сжатие gzip
  • -v — подробный вывод
  • -f — имя файла

Архив появится в /opt/minecraft_backup_YYYY-MM-DD_HH-MM.tar.gz.

  1. Проверьте целостность архива и его размер:
tar -tzvf minecraft_backup_$(date +%F_%H-%M).tar.gz | head -20
ls -lh minecraft_backup_*.tar.gz

Автоматизация: скрипт бэкапа с ротацией

  1. Создайте скрипт /usr/local/bin/mc_backup.sh:
cat > /usr/local/bin/mc_backup.sh << 'EOF'
#!/bin/bash
# Автоматический бэкап Minecraft-сервера с ротацией
# Настройте переменные ниже
SERVER_DIR="/opt/minecraft"
BACKUP_DIR="/opt/backups"
KEEP_DAYS=7
DATE=$(date +%F_%H-%M)
ARCHIVE_NAME="minecraft_${DATE}.tar.gz"

# Создаём папку для бэкапов, если нет
mkdir -p "${BACKUP_DIR}"

# Опционально: останавливаем сервер (раскомментируйте, если нужно)
# systemctl stop minecraft
# sleep 10

# Создаём архив
tar -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" -C "$(dirname "${SERVER_DIR}")" "$(basename "${SERVER_DIR}")"

# Опционально: запускаем сервер обратно
# systemctl start minecraft

# Удаляем старые бэкапы старше KEEP_DAYS дней
find "${BACKUP_DIR}" -type f -name "minecraft_*.tar.gz" -mtime +${KEEP_DAYS} -delete

echo "[$(date)] Бэкап создан: ${BACKUP_DIR}/${ARCHIVE_NAME}"
EOF
  1. Сделайте скрипт исполняемым и протестируйте:
chmod +x /usr/local/bin/mc_backup.sh
/usr/local/bin/mc_backup.sh

Проверьте результат в /opt/backups/.

Настройка systemd-таймера для ежедневного запуска

  1. Создайте unit-файл сервиса /etc/systemd/system/mc-backup.service:
[Unit]
Description=Minecraft Server Backup
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mc_backup.sh
User=root
  1. Создайте таймер /etc/systemd/system/mc-backup.timer:
[Unit]
Description=Daily Minecraft Backup Timer

[Timer]
Persistent=true
RandomizedDelaySec=1h

[Install]
WantedBy=timers.target
  1. Активируйте и запустите таймер:
systemctl daemon-reload
systemctl enable --now mc-backup.timer
systemctl list-timers --all | grep mc-backup

Бэкапы теперь будут создаваться ежедневно в случайное время в пределах часа от 00:00.

Копирование бэкапов на внешнее хранилище (rclone)

  1. Установите rclone для отправки копий в S3, Google Drive, Yandex Disk или SFTP:
apt update && apt install -y rclone
rclone config

Следуйте интерактивному мастеру: n → имя remote_backup → тип хранилища (например, s3 для S3-совместимых) → введите ключи доступа.

  1. Добавьте строку загрузки в скрипт бэкапа (после создания архива, до ротации):
rclone copy "${BACKUP_DIR}/${ARCHIVE_NAME}" "remote_backup:minecraft-backups/" --progress

Полный обновлённый скрипт теперь отправляет копию в облако сразу после создания.

Проверка восстановления (test restore)

  1. Раз в месяц проводите тестовое восстановление на отдельной директории, не затрагивая продакшн:
mkdir -p /tmp/test_restore
cd /tmp/test_restore
tar -xzvf /opt/backups/minecraft_2025-01-15_03-30.tar.gz
ls -la minecraft/

Убедитесь, что присутствуют ключевые файлы: server.jar, world/, server.properties, banned-players.json, ops.json.

  1. При необходимости запустите тестовый сервер на другом порту (например, 25566) для проверки загрузки мира:
cd /tmp/test_restore/minecraft
java -Xms1G -Xmx2G -jar server.jar nogui --port 25566

Подключитесь локально и проверьте чанки. После теста остановите процесс Ctrl+C и удалите /tmp/test_restore.

Бэкап через панель proxify.cloud (снимки диска)

  1. В панели proxify.cloud откройте страницу вашего выделенного сервера. Перейдите во вкладку «Резервные копии» → «Создать снимок».

    • Выберите тип: «Полный снимок диска» (включает ОС, конфиги, все данные).
    • Добавьте описание: manual_pre_update_$(date +%F).
    • Нажмите «Создать». Ожидайте завершения (обычно 5–15 минут в зависимости от диска).
  2. Снимки хранятся в инфраструктуре proxify.cloud и не занимают место на вашем диске. Для восстановления: выберите снимок → «Восстановить» → подтвердите перезагрузку сервера. Внимание: это откатит весь диск к моменту снимка.

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

  1. Добавьте отправку уведомления в Telegram или email в конец скрипта /usr/local/bin/mc_backup.sh:
# Telegram
TG_BOT_TOKEN="123456:ABC-DEF"
TG_CHAT_ID="-1001234567890"
curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
     -d chat_id="${TG_CHAT_ID}" \
     -d text="✅ Minecraft backup done: ${ARCHIVE_NAME} ($(du -h ${BACKUP_DIR}/${ARCHIVE_NAME} | cut -f1))" \
     >/dev/null

Для email используйте mailutils и sendmail.

Возможные проблемы и решения

Проблема Причина Решение
Архив создаётся пустым (0 байт) Переменная $SERVER_DIR указывает несуществующий путь Проверьте ls -ld $SERVER_DIR перед запуском скрипта. Исправьте путь в скрипте.
tar: Removing leading '/' from member names Использован абсолютный путь внутри архива Всегда переходите в родительскую папку и архивируйте относительный путь: tar -czf ... -C /opt minecraft.
Бэкап не запускается по таймеру Таймер не активен или Persistent=true не сработал Выполните systemctl status mc-backup.timer, проверьте systemctl list-timers. При необходимости systemctl restart mc-backup.timer.
Ошибка rclone: failed to copy: access denied Неверные credentials или политики бакета Перезапустите rclone config, проверьте права IAM/ACL на бакете. Тест: rclone ls remote_backup:minecraft-backups/.
Сервер не останавливается перед бэкапом Systemd-юнит называется иначе или процесс завис Уточните имя: `systemctl list-units
Место на диске заканчивается Ротация не работает (KEEP_DAYS не срабатывает) Проверьте find /opt/backups -type f -name "minecraft_*.tar.gz" -mtime +7. Убедитесь, что mtime файлов обновляется при создании (tar -c обновляет mtime).
Восстановление снимка proxify.cloud не загружается Сервер застрял в BIOS/GRUB после отката диска В консоли VNC выберите правильный загрузочный диск. При необходимости загрузитесь в rescue-режим и переустановите GRUB: grub-install /dev/sda && update-grub.
Мир повреждён после восстановления Бэкап сделан без save-off / сервер писал чанки в момент архивации Всегда выполняйте save-all + save-off перед tar, либо используйте снимки диска (crash-consistent).
Скрипт не пишет логи Вывод уходит в journald, а не в файл Добавьте в unit StandardOutput=append:/var/log/mc_backup.log StandardError=append:/var/log/mc_backup.log и перезагрузите демон: systemctl daemon-reload.