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

Для всех версий KATA Примечение: данная статья является примером реализации автоматического создания бэкапа 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