DeepSeek/rsync.backup
1. как сделать лучше если надо папку с linux сервера бэкапить на другой компьютер и хранить 5 последних бэкапов, посоветуй вариант
Для надежного бэкапа папки с Linux-сервера на другой компьютер с хранением 5 последних версий лучше всего использовать **Rsync в связке с `--link-dest`** или специализированные инструменты вроде **BorgBackup/Rsnapshot**. Вот оптимальные решения:
---
- **1. Вариант 1: Rsync + `--link-dest` (просто и эффективно)**
- Как работает:**
- Каждый бэкап — это полная копия, но неизмененные файлы заменяются жесткими ссылками (экономия места). - Хранится только 5 последних снимков.
- **Шаги:**
- ① Настройка SSH-доступа между серверами**
На **целевом компьютере** (куда бэкапируем): ```bash ssh-keygen -t ed25519 ssh-copy-id user@backup-server # Копируем ключ для авторизации без пароля ```
- ② Скрипт для бэкапа (`/usr/local/bin/backup.sh`)**
```bash
- !/bin/bash
SOURCE_DIR="/path/to/source" # Папка для бэкапа BACKUP_DIR="/backups" # Папка на удаленном компьютере REMOTE="user@backup-server" # Адрес целевого ПК MAX_BACKUPS=5 # Сколько версий хранить
- Создаем новую папку с датой
DATE=$(date +%Y-%m-%d_%H-%M-%S) NEW_BACKUP="$BACKUP_DIR/$DATE"
- Последний бэкап для --link-dest
LATEST=$(ssh $REMOTE "ls -td $BACKUP_DIR/*/ | head -1")
- Rsync с инкрементным копированием
rsync -az --delete --link-dest="$LATEST" \
"$SOURCE_DIR/" "$REMOTE:$NEW_BACKUP/"
- Удаляем старые бэкапы (оставляем 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`). - Жесткие ссылки экономят место.
---
- **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/`).
---
- **3. Вариант 3: BorgBackup (с шифрованием и дедупликацией)**
- Установка:**
```bash sudo apt install borgbackup # Debian/Ubuntu ```
- Инициализация репозитория:**
```bash borg init --encryption=repokey user@backup-server:/backups/repo ```
- Скрипт для бэкапа:**
```bash
- !/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 последних ```
- Плюсы:**
- Шифрование данных. - Дедупликация (экономия места).
---
- **4. Вариант 4: Tar + SSH (если rsync недоступен)**
- Скрипт:**
```bash
- !/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" # Удаляем старые ```
---
- **Сравнение методов**
| **Критерий** | Rsync + `--link-dest` | Rsnapshot | BorgBackup | Tar + SSH | |--------------------|----------------------|-----------|------------|-----------| | Простота | ★★★★ | ★★★★ | ★★ | ★★★★★ | | Экономия места | ★★★★ (жесткие ссылки)| ★★★★ | ★★★★★ (дедупликация) | ★★ | | Шифрование | Нет | Нет | Да | Нет | | Скорость | Быстро | Быстро | Средняя | Медленно |
---
- **Что выбрать?**
- **Для простоты** → `Rsync + --link-dest` или `Rsnapshot`. - **Для безопасности** → `BorgBackup` (шифрование). - **Для минимализма** → `Tar + SSH`.
- Рекомендация:**
```bash
- Оптимальный вариант (баланс простоты и функциональности)
sudo apt install rsnapshot nano /etc/rsnapshot.conf # Настраиваем пути rsnapshot daily ```
Все методы поддерживают **автоматическую ротацию** (хранение только 5 бэкапов). Для мониторинга добавьте проверку логов: ```bash grep -i error /var/log/syslog # Или journalctl -u cron ```
2. А можно еще добавить контроль свободного места?
Отличное дополнение! Контроль свободного места перед бэкапом критически важен, чтобы избежать сбоев. Вот как добавить эту проверку в каждый из вариантов:
---
- **1. Для Rsync + `--link-dest` (вариант из первого решения)**
Дополним скрипт проверкой:
```bash
- !/bin/bash
SOURCE_DIR="/path/to/source" BACKUP_DIR="/backups" REMOTE="user@backup-server" MAX_BACKUPS=5 MIN_SPACE_GB=10 # Минимум 10 ГБ свободного места
- Проверка свободного места на удаленном сервере
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
- Остальная часть скрипта (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/"
- Удаляем старые бэкапы
ssh $REMOTE "ls -td $BACKUP_DIR/*/ | tail -n +$(($MAX_BACKUPS + 1)) | xargs rm -rf" ```
---
- **2. Для Rsnapshot**
Добавим проверку в `rsnapshot.conf` через `pre-exec`:
```ini
- В /etc/rsnapshot.conf
config_version 1.2 snapshot_root /backups/ cmd_rsync /usr/bin/rsync retain daily 5
- Проверка места перед выполнением
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/ ```
---
- **3. Для BorgBackup**
Добавим проверку в скрипт:
```bash
- !/bin/bash
SOURCE="/path/to/source" REPO="user@backup-server:/backups/repo" MIN_SPACE_GB=10
- Проверка места
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
- Создание бэкапа
borg create --stats --progress "$REPO::$(date +%Y-%m-%d_%H-%M-%S)" "$SOURCE" borg prune --keep-last 5 "$REPO" ```
---
- **4. Для Tar + SSH**
Модифицируем скрипт:
```bash
- !/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 ГБ
- Проверка места
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
- Создание бэкапа
tar -czf - "$SOURCE" | ssh "$BACKUP" "cat > /backups/$TAR_FILE"
- Удаление старых (оставляем 5 последних)
ssh "$BACKUP" "ls -t /backups/backup_* | tail -n +6 | xargs rm -f" ```
---
- **Дополнительные улучшения**
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 ```
---
- **Как проверить свободное место вручную**
На целевом сервере: ```bash df -h /backups # Общий вывод df -BG --output=avail /backups | tail -1 | tr -d 'G' # Только число (в гигабайтах) ```
---
- **Итог**
Теперь ваши бэкапы будут: 1. Проверять свободное место перед запуском. 2. Прерываться с ошибкой (или очищать старые данные), если места недостаточно. 3. Гарантированно хранить только 5 последних версий.
Для самых надежных сетапов рекомендуем **BorgBackup + проверку места** — это сочетание безопасности и контроля ресурсов.