June 5
Автоматическое резервное копирование директории /root/node на удалённый сервер
+ в скрипт: docker exec -it node-wg-1 iptables -t mangle -A FORWARD -o wg0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
+ в скрипт: ethtool -K ens3 tso off gso off gro off
Самый удобный вариант — не редактировать руками скрипт, а сделать установочный скрипт, который принимает параметры, например так:
bash setup-node-backup.sh austria-2 10.10.10.10
austria-2— это имя сервера, которое пойдёт в путь и в имя архива10.10.10.10— IP резервного сервера
1.1. Скрипт установки ноды
nano setup-node-backup.sh
#!/bin/bash
set -euo pipefail
SERVER_NAME="${1:-}"
REMOTE_HOST="${2:-}"
if [ -z "$SERVER_NAME" ] || [ -z "$REMOTE_HOST" ]; then
echo "Использование: bash setup-node-backup.sh <server_name> <reserve_ip>"
echo "Пример: bash setup-node-backup.sh austria-2 192.168.1.10"
exit 1
fi
WATCH_DIR="/root/node"
LOCAL_BACKUP_DIR="/root/node_backups"
SCRIPT_PATH="/usr/local/bin/node-backup-watcher.sh"
SERVICE_PATH="/etc/systemd/system/node-backup-watcher.service"
REMOTE_USER="root"
REMOTE_DIR="/root/backup_node/${SERVER_NAME}"
echo "[1/7] Устанавливаем зависимости..."
apt update
apt install -y inotify-tools zip openssh-client
echo "[2/7] Создаём директорию для локальных архивов..."
mkdir -p "$LOCAL_BACKUP_DIR"
echo "[2.1/7] Проверяем директорию для наблюдения..."
if [ ! -d "$WATCH_DIR" ]; then
echo "Ошибка: директория $WATCH_DIR не существует"
exit 1
fi
echo "[3/7] Проверяем SSH-ключ..."
mkdir -p /root/.ssh
chmod 700 /root/.ssh
if [ ! -f /root/.ssh/id_rsa ]; then
ssh-keygen -t rsa -b 4096 -N "" -f /root/.ssh/id_rsa
fi
echo "[3.1/7] Устанавливаем SSH-доступ на удалённый сервер..."
ssh-copy-id -o StrictHostKeyChecking=accept-new "${REMOTE_USER}@${REMOTE_HOST}"
echo "[3.2/7] Проверяем SSH-подключение..."
ssh -o BatchMode=yes -o ConnectTimeout=5 -o StrictHostKeyChecking=accept-new "${REMOTE_USER}@${REMOTE_HOST}" "echo SSH_OK" >/dev/null
echo "SSH-доступ настроен успешно."
echo "[4/7] Создаём скрипт резервного копирования..."
cat > "$SCRIPT_PATH" <<EOF
#!/bin/bash
set -euo pipefail
WATCH_DIR="${WATCH_DIR}"
LOCAL_BACKUP_DIR="${LOCAL_BACKUP_DIR}"
REMOTE_USER="${REMOTE_USER}"
REMOTE_HOST="${REMOTE_HOST}"
REMOTE_DIR="${REMOTE_DIR}"
SERVER_NAME="${SERVER_NAME}"
mkdir -p "\$LOCAL_BACKUP_DIR"
if [ ! -d "\$WATCH_DIR" ]; then
echo "Ошибка: директория \$WATCH_DIR не существует"
exit 1
fi
create_backup() {
TIMESTAMP=\$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE_NAME="\${SERVER_NAME}-backup_\${TIMESTAMP}.zip"
ARCHIVE_PATH="\${LOCAL_BACKUP_DIR}/\${ARCHIVE_NAME}"
echo "Создаём архив: \$ARCHIVE_PATH"
cd "\$(dirname "\$WATCH_DIR")"
zip -r -q "\$ARCHIVE_PATH" "\$(basename "\$WATCH_DIR")"
echo "Отправляем архив на резервный сервер..."
ssh "\${REMOTE_USER}@\${REMOTE_HOST}" "mkdir -p '\${REMOTE_DIR}'"
scp "\$ARCHIVE_PATH" "\${REMOTE_USER}@\${REMOTE_HOST}:\${REMOTE_DIR}/"
echo "Очищаем старые локальные архивы, оставляем только 3 последних..."
find "\$LOCAL_BACKUP_DIR" -maxdepth 1 -type f -name "\${SERVER_NAME}-backup_*.zip" -printf '%T@ %p\n' \\
| sort -rn \\
| awk 'NR>3 {sub(/^[^ ]+ /, ""); print}' \\
| xargs -r rm -f --
echo "Бэкап завершён: \$ARCHIVE_NAME"
}
echo "Watcher запущен. Отслеживаем: \$WATCH_DIR"
inotifywait -m -r -e modify,create,delete,move "\$WATCH_DIR" --format '%w%f %e' | while read -r event
do
echo "Обнаружено изменение: \$event"
sleep 5
create_backup
done
EOF
chmod +x "$SCRIPT_PATH"
echo "[5/7] Создаём systemd-сервис..."
cat > "$SERVICE_PATH" <<EOF
[Unit]
Description=Node Folder Backup Watcher
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=${SCRIPT_PATH}
Restart=always
RestartSec=3
User=root
[Install]
WantedBy=multi-user.target
EOF
echo "[6/7] Создаём папку на резервном сервере..."
ssh "${REMOTE_USER}@${REMOTE_HOST}" "mkdir -p '${REMOTE_DIR}'"
echo "[7/7] Активируем сервис..."
systemctl daemon-reload
systemctl enable node-backup-watcher.service
systemctl restart node-backup-watcher.service
echo
echo "Готово."
echo "Имя сервера: ${SERVER_NAME}"
echo "Резервный сервер: ${REMOTE_HOST}"
echo "Удалённая директория: ${REMOTE_DIR}"
echo
systemctl --no-pager --full status node-backup-watcher.servicechmod +x setup-node-backup.sh
1.2. Также, что касается скрипта бэкапа tower
nano setup-tower-backup.sh
#!/bin/bash
set -e
SERVER_NAME="$1"
REMOTE_HOST="$2"
if [ -z "$SERVER_NAME" ] || [ -z "$REMOTE_HOST" ]; then
echo "Использование: bash setup-tower-backup.sh <server_name> <reserve_ip>"
echo "Пример: bash setup-tower-backup.sh tower 192.168.1.10"
exit 1
fi
WATCH_DIR="/root/tower"
LOCAL_BACKUP_DIR="/root/tower_backups"
SCRIPT_PATH="/usr/local/bin/tower-backup-watcher.sh"
SERVICE_PATH="/etc/systemd/system/tower-backup-watcher.service"
REMOTE_USER="root"
REMOTE_DIR="/root/backup_tower/${SERVER_NAME}"
echo "[1/7] Устанавливаем зависимости..."
apt update
apt install -y inotify-tools zip openssh-client
echo "[2/7] Создаём директорию для локальных архивов..."
mkdir -p "$LOCAL_BACKUP_DIR"
if [ ! -d "$WATCH_DIR" ]; then
echo "Ошибка: папка $WATCH_DIR не существует"
exit 1
fi
echo "[3/7] Проверяем SSH-ключ..."
if [ ! -f /root/.ssh/id_rsa ]; then
ssh-keygen -t rsa -b 4096 -N "" -f /root/.ssh/id_rsa
fi
echo "[3.1/7] Устанавливаем SSH-доступ на удалённый сервер..."
ssh-copy-id "${REMOTE_USER}@${REMOTE_HOST}"
echo "[3.2/7] Проверяем SSH-подключение..."
ssh -o BatchMode=yes -o ConnectTimeout=5 "${REMOTE_USER}@${REMOTE_HOST}" "echo SSH_OK" >/dev/null
echo "SSH-доступ настроен успешно."
echo "[4/7] Создаём скрипт резервного копирования..."
cat > "$SCRIPT_PATH" <<EOF
#!/bin/bash
WATCH_DIR="${WATCH_DIR}"
LOCAL_BACKUP_DIR="${LOCAL_BACKUP_DIR}"
REMOTE_USER="${REMOTE_USER}"
REMOTE_HOST="${REMOTE_HOST}"
REMOTE_DIR="${REMOTE_DIR}"
SERVER_NAME="${SERVER_NAME}"
mkdir -p "\$LOCAL_BACKUP_DIR"
inotifywait -m -r -e modify,create,delete,move "\$WATCH_DIR" | while read -r path action file
do
sleep 5
TIMESTAMP=\$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE_NAME="\${SERVER_NAME}-tower-backup_\$TIMESTAMP.zip"
ARCHIVE_PATH="\$LOCAL_BACKUP_DIR/\$ARCHIVE_NAME"
cd /root
zip -r -q "\$ARCHIVE_PATH" "tower"
ssh "\${REMOTE_USER}@\${REMOTE_HOST}" "mkdir -p '\${REMOTE_DIR}'"
scp "\$ARCHIVE_PATH" "\${REMOTE_USER}@\${REMOTE_HOST}:\${REMOTE_DIR}/"
# Оставляем только 3 последних архива локально
ls -tp "\$LOCAL_BACKUP_DIR" | grep -v '/#39; | tail -n +4 | xargs -r -I {} rm -- "\$LOCAL_BACKUP_DIR/{}"
done
EOF
chmod +x "$SCRIPT_PATH"
echo "[5/7] Создаём systemd-сервис..."
cat > "$SERVICE_PATH" <<EOF
[Unit]
Description=Tower Folder Backup Watcher
After=network.target
[Service]
ExecStart=${SCRIPT_PATH}
Restart=always
RestartSec=3
User=root
[Install]
WantedBy=multi-user.target
EOF
echo "[6/7] Создаём папку на резервном сервере..."
ssh "${REMOTE_USER}@${REMOTE_HOST}" "mkdir -p '${REMOTE_DIR}'"
echo "[7/7] Активируем сервис..."
systemctl daemon-reload
systemctl enable tower-backup-watcher.service
systemctl restart tower-backup-watcher.service
echo
echo "Готово."
echo "Имя сервера: ${SERVER_NAME}"
echo "Резервный сервер: ${REMOTE_HOST}"
echo "Локальная директория: ${WATCH_DIR}"
echo "Удалённая директория: ${REMOTE_DIR}"
echo
systemctl --no-pager --full status tower-backup-watcher.servicechmod +x setup-tower-backup.sh
2. Как запускать
bash setup-node-backup.sh austria-2 192.168.1.50 bash setup-tower-backup.sh austria-2 192.168.1.10
austria-2-backup_2026-04-09_14-30-15.zip
/root/backup_node/austria-2
3. Что важно
В скрипте забито явное указание имени сервера.
Вот тут оно задаётся напрямую:
bash setup-node-backup.sh austria-2 192.168.1.50
То есть имя не берётся из hostname, не вычисляется автоматически, а передаётся вручную и явно.
June 5, 10:04
0 views