Skip to main content

Еженедельное резервное копирование Central Node

Примечение: данная статья является примером реализации автоматического создания бэкапа Central Node и передачи созданного tar архива на внешнюю систему для хранения
Общая схема
  • Вс 02:00 - на Central Node запускается создание бэкапа в /home/admin/apt_backup
  • Вс 02:30 - Central Node запускает временный HTTP-сервер на порту 8000 (работает 90 минут)
  • Вс 02:31 - получатели (Windows\Linux) скачивают бэкап по HTTP
  • Вс 03:00 - получатели удаляют старые бэкапы (оставляют 5 последних)
  • Вс 04:00 - Central Node останавливает HTTP-сервер и порт закрывается
Часть 1: Подготовка и настройка Central Node
Примечание: все действия выполняются в Technical Support Mode под учетной записью root

1. Подготовка директорий

mkdir -p /home/admin/apt_backup
mkdir -p /home/admin/scripts
chmod 776 /home/admin/apt_backup
touch /home/admin/kata_backup.log
chmod 664 /home/admin/kata_backup.log

2. Создайте скрипт /home/admin/scripts/backup_transfer.sh

#!/bin/bash

BACKUP_DIR="/home/admin/apt_backup"
SERVER_PORT=8000
DURATION_MIN=90

LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/data_kata_*.tar 2>/dev/null | head -n1)

if [ -z "$LATEST_BACKUP" ]; then
    echo "Бэкап не найден" >&2
    exit 1
fi

FILENAME=$(basename "$LATEST_BACKUP")
IP=$(hostname -I | awk '{print $1}')
echo "Бэкап: $FILENAME"
echo "Доступен по: http://$IP:$SERVER_PORT/$FILENAME"
echo "Сервер будет работать $DURATION_MIN минут"

if command -v python3 &> /dev/null; then
    PYTHON_CMD="python3"
elif command -v python &> /dev/null; then
    PYTHON_CMD="python"
else
    exit 1
fi

echo "Используется: $($PYTHON_CMD --version 2>&1)"

# Открытие порта
sudo iptables -C INPUT -p tcp --dport $SERVER_PORT -j ACCEPT 2>/dev/null || \
sudo iptables -A INPUT -p tcp --dport $SERVER_PORT -j ACCEPT

# Проверка, не занят ли порт
if sudo lsof -i :$SERVER_PORT &> /dev/null; then
    echo "Порт $SERVER_PORT занят. Освобождаю..."
    sudo fuser -k $SERVER_PORT/tcp 2>/dev/null
    sleep 2
fi

# Запуск сервера
cd "$BACKUP_DIR" || { echo "Не удалось перейти в $BACKUP_DIR" >&2; exit 1; }

echo "Запускаю HTTP-сервер ($PYTHON_CMD -m http.server $SERVER_PORT)..."
$PYTHON_CMD -m http.server $SERVER_PORT > /dev/null 2>&1 &
SERVER_PID=$!

sleep 2

# Проверка
if ! kill -0 $SERVER_PID 2>/dev/null; then
    echo "Сервер упал. Проверьте, что порт свободен." >&2
    echo "Попробуйте вручную: cd $BACKUP_DIR && $PYTHON_CMD -m http.server $SERVER_PORT" >&2
    exit 1
fi

echo "Сервер запущен. PID: $SERVER_PID"

sleep $((DURATION_MIN * 60))

# Остановка
kill $SERVER_PID 2>/dev/null
wait $SERVER_PID 2>/dev/null
sudo iptables -D INPUT -p tcp --dport $SERVER_PORT -j ACCEPT 2>/dev/null

echo "Сервер остановлен. Порт закрыт."

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

chmod +x /home/admin/scripts/backup_transfer.sh

3. Настройте cron

crontab -e

Добавьте:

0 2 * * 0 /usr/bin/sudo /usr/bin/kata-run.sh kata-backup-restore backup -b /home/admin/apt_backup -c -d 5 -e -q -a -s -n -l /home/admin/kata_backup.log
30 2 * * 0 /home/admin/scripts/backup_transfer.sh
Часть 2: Получатель - Windows

1. Создайте скрипт C:\Scripts\Download-KataBackup.ps1

Примечание: обратите внимание на необходимость указания IP адреса Centra Node.
param(
    [string]$KataIP = "<УКАЖИТЕ IP АДРЕС CENTRAL NODE>",
    [int]$Port = 8000,
    [string]$LocalPath = "C:\KataBackups"
)

if (-not (Test-Path $LocalPath)) { mkdir $LocalPath }

$urlList = "http://$KataIP`:$Port/"
try {
    $list = Invoke-WebRequest -Uri $urlList -UseBasicParsing -TimeoutSec 10
} catch {
    Write-Error "Не удалось подключиться к KATA"
    exit 1
}

$files = [regex]::Matches($list.Content, 'href="([^"]*data_kata_[^"]*\.tar)"') | ForEach-Object { $_.Groups[1].Value }
if (!$files) { Write-Error "Файлы не найдены"; exit 1 }

$LatestFile = $files | Sort-Object | Select-Object -Last 1
$DownloadUrl = "http://$KataIP`:$Port/$LatestFile"
$LocalFile = Join-Path $LocalPath $LatestFile

Write-Host "Скачиваю: $LatestFile"
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri $DownloadUrl -OutFile $LocalFile -UseBasicParsing -TimeoutSec 3600
Write-Host "Готово: $LocalFile"

2. Создайте скрипт очистки C:\Scripts\Cleanup-KataBackups.ps1

param([string]$BackupPath = "C:\KataBackups", [int]$KeepCount = 5)
if (-not (Test-Path $BackupPath)) { exit 1 }
$files = Get-ChildItem -Path $BackupPath -File -Filter "data_kata_*.tar" | Sort-Object LastWriteTime -Descending
if ($files.Count -gt $KeepCount) {
    $files | Select-Object -Skip $KeepCount | Remove-Item -Force
}

3. Настройте Планировщик заданий

  • Откройте Планировщик заданий → Создать задачу.
  • Общие:
    • Имя: Download backup CN
    • Выполнять для всех пользователей
    • Выполнять с наивысшими правами
  • Триггер:
    • Еженедельно → Укажите дату/время, например, воскресенье, 02:31
    • Повторять каждые: 1 минуту → в течение: 5 минут (на случай, если сервер ещё не запущен)
  • Действие:
    • Программа или сценарий → powershell.exe
    • Аргументы → -ExecutionPolicy Bypass -File "С:\Scripts\Download-KataBackup.ps1"

По удалению бэкапов повторите создание задачи в планировщике, указав время 03:00 и в действиях замените путь до скрипта Cleanup-KataBackups.ps1

Часть 3: Получатель - Linux

1. Создайте скрипт /home/user/scripts/fetch_kata_backup.sh

Примечание: обратите внимание на необходимость указания IP адреса Centra Node.
#!/bin/bash
KATA_IP="<УКАЖИТЕ IP АДРЕС CENTRAL NODE>"
PORT=8000
LOCAL_DIR="/mnt/backups/kata"

mkdir -p "$LOCAL_DIR"
LIST=$(curl -s "http://$KATA_IP:$PORT/")
FILENAME=$(echo "$LIST" | grep -o 'href="data_kata_[^"]*\.tar"' | sed 's/href="//;s/"$//' | sort | tail -n1)

if [ -z "$FILENAME" ]; then
    echo "Файлы не найдены" >&2
    exit 1
fi

echo "Скачиваю: $FILENAME"
curl -L "http://$KATA_IP:$PORT/$FILENAME" -o "$LOCAL_DIR/$FILENAME" --connect-timeout 30 --max-time 3600
echo "Готово: $LOCAL_DIR/$FILENAME"

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

chmod +x /home/user/scripts/fetch_kata_backup.sh

2. Создайте скрипт очистки /home/user/scripts/cleanup_kata_backups.sh

#!/bin/bash
BACKUP_DIR="/mnt/backups/kata"
KEEP=5
ls -t "$BACKUP_DIR"/data_kata_*.tar 2>/dev/null | tail -n +$((KEEP+1)) | xargs rm -f

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

chmod +x /home/user/scripts/cleanup_kata_backups.sh

3. Настройте cron

31 2 * * 0 /home/user/scripts/fetch_kata_backup.sh
0 3 * * 0 /home/user/scripts/cleanup_kata_backups.sh