1. как сделать лучше если надо папку с linux сервера бэкапить на другой компьютер и хранить 5 последних бэкапов, посоветуй вариант

Для надежного бэкапа папки с Linux-сервера на другой компьютер с хранением 5 последних версий лучше всего использовать **Rsync в связке с `--link-dest`** или специализированные инструменты вроде **BorgBackup/Rsnapshot**. Вот оптимальные решения:

---

      1. **1. Вариант 1: Rsync + `--link-dest` (просто и эффективно)**
    • Как работает:**

- Каждый бэкап — это полная копия, но неизмененные файлы заменяются жесткими ссылками (экономия места). - Хранится только 5 последних снимков.

        1. **Шаги:**
    • ① Настройка SSH-доступа между серверами**

На **целевом компьютере** (куда бэкапируем): ```bash ssh-keygen -t ed25519 ssh-copy-id user@backup-server # Копируем ключ для авторизации без пароля ```

    • ② Скрипт для бэкапа (`/usr/local/bin/backup.sh`)**

```bash

  1. !/bin/bash

SOURCE_DIR="/path/to/source" # Папка для бэкапа BACKUP_DIR="/backups" # Папка на удаленном компьютере REMOTE="user@backup-server" # Адрес целевого ПК MAX_BACKUPS=5 # Сколько версий хранить

  1. Создаем новую папку с датой

DATE=$(date +%Y-%m-%d_%H-%M-%S) NEW_BACKUP="$BACKUP_DIR/$DATE"

  1. Последний бэкап для --link-dest

LATEST=$(ssh $REMOTE "ls -td $BACKUP_DIR/*/ | head -1")

  1. Rsync с инкрементным копированием

rsync -az --delete --link-dest="$LATEST" \

   "$SOURCE_DIR/" "$REMOTE:$NEW_BACKUP/"
  1. Удаляем старые бэкапы (оставляем 5 последних)

ssh $REMOTE "ls -td $BACKUP_DIR/*/ | tail -n +$(($MAX_BACKUPS + 1)) | xargs rm -rf" ```

    • ③ Добавляем скрипт в cron (ежедневный бэкап)**

```bash chmod +x /usr/local/bin/backup.sh crontab -e ``` Добавить строку: ```bash 0 3 * * * /usr/local/bin/backup.sh # Каждый день в 3:00 ```

    • Плюсы:**

- Минимум зависимостей (только `rsync` и `ssh`). - Жесткие ссылки экономят место.

---

      1. **2. Вариант 2: Rsnapshot (готовое решение)**
    • Установка:**

```bash sudo apt install rsnapshot # Debian/Ubuntu ```

    • Настройка (`/etc/rsnapshot.conf`):**

```ini config_version 1.2 snapshot_root /backups/ cmd_rsync /usr/bin/rsync retain daily 5 # Храним 5 последних бэкапов backup /path/to/source/ user@backup-server::backup/ ```

    • Запуск:**

```bash rsnapshot daily # Тест crontab -e ``` Добавить: ```bash 0 3 * * * /usr/bin/rsnapshot daily ```

    • Плюсы:**

- Готовые настройки ротации бэкапов. - Поддержка SSH (`backup user@server:/path/ /backup/`).

---

      1. **3. Вариант 3: BorgBackup (с шифрованием и дедупликацией)**
    • Установка:**

```bash sudo apt install borgbackup # Debian/Ubuntu ```

    • Инициализация репозитория:**

```bash borg init --encryption=repokey user@backup-server:/backups/repo ```

    • Скрипт для бэкапа:**

```bash

  1. !/bin/bash

SOURCE="/path/to/source" REPO="user@backup-server:/backups/repo" borg create --stats --progress "$REPO::$(date +%Y-%m-%d_%H-%M-%S)" "$SOURCE" borg prune --keep-last 5 "$REPO" # Оставляем 5 последних ```

    • Плюсы:**

- Шифрование данных. - Дедупликация (экономия места).

---

      1. **4. Вариант 4: Tar + SSH (если rsync недоступен)**
    • Скрипт:**

```bash

  1. !/bin/bash

SOURCE="/path/to/source" BACKUP="user@backup-server:/backups/" TAR_FILE="backup_$(date +%Y-%m-%d).tar.gz"

tar -czf - "$SOURCE" | ssh "$BACKUP" "cat > $TAR_FILE" ssh "$BACKUP" "ls -t /backups/backup_* | tail -n +6 | xargs rm -f" # Удаляем старые ```

---

      1. **Сравнение методов**

| **Критерий** | Rsync + `--link-dest` | Rsnapshot | BorgBackup | Tar + SSH | |--------------------|----------------------|-----------|------------|-----------| | Простота | ★★★★ | ★★★★ | ★★ | ★★★★★ | | Экономия места | ★★★★ (жесткие ссылки)| ★★★★ | ★★★★★ (дедупликация) | ★★ | | Шифрование | Нет | Нет | Да | Нет | | Скорость | Быстро | Быстро | Средняя | Медленно |

---

      1. **Что выбрать?**

- **Для простоты** → `Rsync + --link-dest` или `Rsnapshot`. - **Для безопасности** → `BorgBackup` (шифрование). - **Для минимализма** → `Tar + SSH`.

    • Рекомендация:**

```bash

  1. Оптимальный вариант (баланс простоты и функциональности)

sudo apt install rsnapshot nano /etc/rsnapshot.conf # Настраиваем пути rsnapshot daily ```

Все методы поддерживают **автоматическую ротацию** (хранение только 5 бэкапов). Для мониторинга добавьте проверку логов: ```bash grep -i error /var/log/syslog # Или journalctl -u cron ```

2. А можно еще добавить контроль свободного места?

Отличное дополнение! Контроль свободного места перед бэкапом критически важен, чтобы избежать сбоев. Вот как добавить эту проверку в каждый из вариантов:

---

      1. **1. Для Rsync + `--link-dest` (вариант из первого решения)**

Дополним скрипт проверкой:

```bash

  1. !/bin/bash

SOURCE_DIR="/path/to/source" BACKUP_DIR="/backups" REMOTE="user@backup-server" MAX_BACKUPS=5 MIN_SPACE_GB=10 # Минимум 10 ГБ свободного места

  1. Проверка свободного места на удаленном сервере

FREE_SPACE=$(ssh $REMOTE "df -BG --output=avail $BACKUP_DIR | tail -1 | tr -d 'G'") if [ "$FREE_SPACE" -lt "$MIN_SPACE_GB" ]; then

   echo "Ошибка: На сервере $REMOTE осталось только ${FREE_SPACE}GB. Требуется минимум ${MIN_SPACE_GB}GB."
   exit 1

fi

  1. Остальная часть скрипта (rsync + ротация)

DATE=$(date +%Y-%m-%d_%H-%M-%S) NEW_BACKUP="$BACKUP_DIR/$DATE" LATEST=$(ssh $REMOTE "ls -td $BACKUP_DIR/*/ | head -1")

rsync -az --delete --link-dest="$LATEST" "$SOURCE_DIR/" "$REMOTE:$NEW_BACKUP/"

  1. Удаляем старые бэкапы

ssh $REMOTE "ls -td $BACKUP_DIR/*/ | tail -n +$(($MAX_BACKUPS + 1)) | xargs rm -rf" ```

---

      1. **2. Для Rsnapshot**

Добавим проверку в `rsnapshot.conf` через `pre-exec`:

```ini

  1. В /etc/rsnapshot.conf

config_version 1.2 snapshot_root /backups/ cmd_rsync /usr/bin/rsync retain daily 5

  1. Проверка места перед выполнением

pre_exec bash -c 'if [ $(df -BG --output=avail /backups/ | tail -1 | tr -d "G") -lt 10 ]; then exit 1; fi'

backup /path/to/source/ user@backup-server::backup/ ```

---

      1. **3. Для BorgBackup**

Добавим проверку в скрипт:

```bash

  1. !/bin/bash

SOURCE="/path/to/source" REPO="user@backup-server:/backups/repo" MIN_SPACE_GB=10

  1. Проверка места

FREE_SPACE=$(ssh user@backup-server "df -BG --output=avail /backups | tail -1 | tr -d 'G'") if [ "$FREE_SPACE" -lt "$MIN_SPACE_GB" ]; then

   echo "Ошибка: Недостаточно места на сервере. Свободно: ${FREE_SPACE}GB, требуется: ${MIN_SPACE_GB}GB."
   exit 1

fi

  1. Создание бэкапа

borg create --stats --progress "$REPO::$(date +%Y-%m-%d_%H-%M-%S)" "$SOURCE" borg prune --keep-last 5 "$REPO" ```

---

      1. **4. Для Tar + SSH**

Модифицируем скрипт:

```bash

  1. !/bin/bash

SOURCE="/path/to/source" BACKUP="user@backup-server:/backups/" TAR_FILE="backup_$(date +%Y-%m-%d).tar.gz" MIN_SPACE_GB=5 # Минимум 5 ГБ

  1. Проверка места

FREE_SPACE=$(ssh "$BACKUP" "df -BG --output=avail /backups | tail -1 | tr -d 'G'") if [ "$FREE_SPACE" -lt "$MIN_SPACE_GB" ]; then

   echo "Ошибка: Недостаточно места. Свободно: ${FREE_SPACE}GB, требуется: ${MIN_SPACE_GB}GB."
   exit 1

fi

  1. Создание бэкапа

tar -czf - "$SOURCE" | ssh "$BACKUP" "cat > /backups/$TAR_FILE"

  1. Удаление старых (оставляем 5 последних)

ssh "$BACKUP" "ls -t /backups/backup_* | tail -n +6 | xargs rm -f" ```

---

      1. **Дополнительные улучшения**

1. **Уведомления об ошибках** (если место кончилось):

  ```bash
  # Добавить в начало скрипта (после проверки места)
  if [ "$FREE_SPACE" -lt "$MIN_SPACE_GB" ]; then
      echo "Ошибка: Недостаточно места на сервере" | mail -s "Ошибка бэкапа" admin@example.com
      exit 1
  fi
  ```
  Требуется установленный `mailutils`.

2. **Автоматическая очистка при нехватке места**:

  ```bash
  # Удалить самый старый бэкап, если места нет
  while [ "$FREE_SPACE" -lt "$MIN_SPACE_GB" ]; do
      OLDEST=$(ssh $REMOTE "ls -td $BACKUP_DIR/*/ | tail -1")
      ssh $REMOTE "rm -rf $OLDEST"
      FREE_SPACE=$(ssh $REMOTE "df -BG --output=avail $BACKUP_DIR | tail -1 | tr -d 'G'")
  done
  ```

3. **Проверка места перед каждым бэкапом** в cron:

  ```bash
  0 3 * * * /usr/local/bin/check_space.sh && /usr/local/bin/backup.sh
  ```

---

      1. **Как проверить свободное место вручную**

На целевом сервере: ```bash df -h /backups # Общий вывод df -BG --output=avail /backups | tail -1 | tr -d 'G' # Только число (в гигабайтах) ```

---

      1. **Итог**

Теперь ваши бэкапы будут: 1. Проверять свободное место перед запуском. 2. Прерываться с ошибкой (или очищать старые данные), если места недостаточно. 3. Гарантированно хранить только 5 последних версий.

Для самых надежных сетапов рекомендуем **BorgBackup + проверку места** — это сочетание безопасности и контроля ресурсов.