# Rsync: бэкап каталога по SSH

Индекс LLMS: [llms.txt](/llms.txt)

---

## Rsync: бэкап каталога по SSH

Классический способ переложить каталог на удалённую машину — `rsync` поверх SSH. Не нужно открывать дополнительных портов, трафик шифруется, а сам инструмент умеет докачивать изменения и сохранять метаданные. Одна команда — и бэкап готов.

---

## Базовая команда rsync через SSH

Минимальный вызов для копирования локального каталога на удалённый хост:

```bash
rsync -avz /path/to/source/ user@host:/path/to/dest/
```

Слеш в конце у source имеет значение: без него rsync создаст на удалённой стороне подпапку `source/`, с ним — скопирует содержимое напрямую в `dest/`.

Если SSH слушает нестандартный порт:

```bash
rsync -avz -e 'ssh -p 2222' /path/to/source/ user@host:/path/to/dest/
```

> [!TIP]
> Для автоматизации в cron лучше указывать порт через `-e`, а не править `/etc/ssh/ssh_config` — так проще поддерживать разные хосты с разными портами.

---

## Ключи архивации и синхронизации

`-a` (archive) — главный флаг. Он объединяет несколько опций в одну: рекурсивный обход, сохранение прав, владельцев, временных метаданных, симлинков и пустых каталогов.

| Флаг | Назначение |
|------|-----------|
| `-a` | Архивный режим (рекурсия + метаданные) |
| `-v` | Подробный вывод |
| `-z` | Сжатие при передаче |
| `-P` | `--partial --progress` — докачка и прогресс-бар |
| `--delete` | Удалять файлы на приёмнике, отсутствующие на источнике |
| `-e ssh` | Указать удалённую оболочку |
| `--bwlimit=KBPS` | Ограничение полосы пропускания |

> [!WARNING]
> `--delete` — мощный инструмент. Если источник случайно очистился, на удалённой машине останется пусто. Проверяйте список перед применением.

Полный пример бэкапа с ограничением полосы и прогрессом:

```bash
rsync -avzP --bwlimit=10000 -e 'ssh -p 2222' \
  /data/backup/ user@backupserver:/mnt/backup/
```

---

## Исключения файлов и каталогов

Для исключения конкретных путей используется `--exclude`. Паттерны применяются относительно источника:

```bash
rsync -avz --exclude='*.log' --exclude='cache/' \
  /data/ user@host:/data/
```

Если исключений много, удобнее использовать файл-список:

```bash
# exclude.txt
*.tmp
*.bak
cache/
lost+found/
```

```bash
rsync -avz --exclude-from='exclude.txt' /data/ user@host:/data/
```

> [!NOTE]
> `--exclude` проверяется по очереди. Более поздние правила могут перекрыть ранние, если пути пересекаются. Для точного контроля используйте `--filter`.

---

## Dry-run перед запуском

Перед реальным запуском всегда прогоняйте с `--dry-run` (или `-n`). rsync покажет, что именно было бы скопировано/удалено, но не трогает файлы:

```bash
rsync -avzn --delete --exclude-from='exclude.txt' \
  /data/ user@host:/data/
```

Сравните вывод с ожидаемым списком. Если всё совпадает — убираете `-n` и запускаете реальную синхронизацию.

Для cron-задачи с уведомлениями на почту:

```bash
#!/bin/bash
rsync -avz --delete --exclude-from='/etc/rsync-exclude.txt' \
  /data/ user@host:/data/ 2>&1 | mail -s "Rsync backup report" admin@example.com
```

---

## Итого

`rsync` через SSH покрывает 90% задач бэкапа без дополнительных агентов на стороне приёмника. Ключевой порядок действий: сначала `--dry-run`, потом `--exclude`, потом `--delete` если нужна точная зеркализация. Остальное — настройка под конкретный хост и порт.
