Еженедельное резервное копирование 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.log2. Создайте скрипт /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.sh3. Настройте 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.sh2. Создайте скрипт очистки /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.sh3. Настройте cron
31 2 * * 0 /home/user/scripts/fetch_kata_backup.sh
0 3 * * 0 /home/user/scripts/cleanup_kata_backups.sh