diff --git a/docs/11-backup.md b/docs/11-backup.md index 27e6b25..697a082 100644 --- a/docs/11-backup.md +++ b/docs/11-backup.md @@ -2,147 +2,488 @@ ## Обзор -Резервное копирование критически важно для защиты данных и возможности восстановления после сбоев, ошибок или атак. На момент аудита (март 2026) централизованная система резервного копирования **не настроена**. В данном разделе описаны требования, предлагаемая стратегия и план внедрения. +Резервное копирование критически важно для защиты данных и возможности восстановления после сбоев, ошибок или атак. + +**Текущий статус (апрель 2026)**: ✅ **Настроена полнофункциональная система резервного копирования на базе Proxmox Backup Server** + +- Отдельный физический сервер PBS (192.168.1.199) +- Хранилище 1 TB с дедупликацией и компрессией +- Автоматические бэкапы всех критичных систем +- Протестированное восстановление + +--- ## Текущее состояние -- **Отсутствие регулярных бэкапов**: Нет автоматизированного процесса резервного копирования конфигураций, баз данных и пользовательских данных. -- **Разрозненные данные**: Данные хранятся на разных томах (RAID6, SSD) и в разных форматах (файлы, базы данных, Docker-тома). -- **Ручные копии**: Возможно, эпизодически создавались копии вручную, но это не систематизировано. -- **Риски**: Потеря данных при сбое RAID (хотя RAID6 защищает от отказа двух дисков, но не от случайного удаления, ошибок программ или вирусов), невозможность отката после неудачного обновления. +### ✅ Настроено и работает -## Цели +| Компонент | Статус | Описание | +|-----------|--------|----------| +| **Proxmox Backup Server** | ✅ | Отдельный сервер (Olimpbs, 192.168.1.199) | +| **Хранилище** | ✅ | 1 TB (LVM), datastore `olimpbkp` | +| **Бэкапы ВМ/LXC** | ✅ | Автоматические, по расписанию | +| **Дедупликация** | ✅ | Встроена в PBS | +| **Компрессия** | ✅ | ZSTD (fast and good) | +| **Расписание** | ✅ | 2 раза в день (02:30 и 22:30) | +| **Retention** | ✅ | 14 последних, 7 ежедневных, 4 недельных, 4 месячных | +| **Режим** | ✅ | Snapshot (без остановки сервисов) | -1. **Надёжность**: Гарантированная возможность восстановления данных после любых инцидентов. -2. **Автоматизация**: Регулярные бэкапы по расписанию без участия администратора. -3. **Целостность**: Проверка создаваемых копий (тестирование восстановления). -4. **Безопасность**: Шифрование бэкапов и хранение вне основной инфраструктуры. -5. **Минимизация потерь**: RPO (Recovery Point Objective) – не более 24 часов; RTO (Recovery Time Objective) – не более 4 часов для критических сервисов. +### 📊 Архитектура -## Что нужно бэкапить +&&&mermaid +graph TD + A[Proxmox VE Host
Olimp 192.168.1.220] --> B[LXC Containers
201-211] + A --> C[Virtual Machines
205, 213] + A -->|Network| D[Proxmox Backup Server
Olimpbs 192.168.1.199] + D --> E[Datastore: olimpbkp
1 TB LVM] + E --> F[/var/lib/proxmox-backup/olimpbkp] +&&& -### 1. Конфигурации -- Ansible: репозиторий с `group_vars`, ролями, плейбуками (включая зашифрованный `vault.yml`). -- Nginx Proxy Manager: база данных SQLite (контейнер `npm`), сертификаты Let's Encrypt. -- Системные конфигурации: `/etc/ssh`, `/etc/network`, `/etc/samba`, `/etc/fstab`, `/etc/cron*`. -- Docker: `docker-compose.yml` всех сервисов, пользовательские тома. +--- -### 2. Базы данных -- **PostgreSQL**: Immich, BookStack, Nextcloud (внутри ВМ), GitLab, Grafana, Loki. -- **MySQL/MariaDB**: Ampache, Flibusta, Mealie (SQLite, но можно и файл). -- **SQLite**: Bitwarden, Mealie, BookStack (опционально), кастомные приложения. -- **Redis**: Nextcloud, GitLab. +## Что бэкапится -### 3. Пользовательские данные -- **Медиафайлы**: `/mnt/video/*`, `/mnt/audio/*`, `/mnt/books/*` на хосте `media`. -- **Игры**: `/mnt/games/` на хосте `games`. -- **Фотографии**: Immich (папка загрузок, библиотека) на `photo`. -- **Документы**: BookStack, Nextcloud. -- **Торренты**: qBittorrent (метаданные, настройки). +### LXC Контейнеры (10 шт.) -### 4. Виртуальные машины и LXC -- **Proxmox**: конфигурации ВМ (файлы `.conf`), диски LVM-thin, шаблоны. +| ID | Имя | Тип данных | Примерный размер | +|----|-----|------------|------------------| +| **201** | gateway | Конфигурации, прокси | ~5 GB | +| **202** | data | Базы данных (BookStack, Mealie) | ~10 GB | +| **203** | media | Конфигурации Jellyfin, метаданные | ~60 GB* | +| **204** | photo | Immich конфиги | ~20 GB | +| **206** | talk | Matrix, XMPP конфиги | ~10 GB | +| **207** | games | Конфигурации игровых серверов | ~20 GB | +| **208** | manage | Grafana, Loki, мониторинг | ~15 GB | +| **209** | git | GitLab репозитории | ~30 GB | +| **210** | ansible | Ansible конфиги, vault | ~5 GB | +| **211** | torrent | qBittorrent настройки | ~5 GB | -## Стратегия резервного копирования +*Без медиафайлов (исключены из бэкапа) -### Рекомендуемый инструмент: Proxmox Backup Server (PBS) +### Виртуальные машины (2 шт.) -- Установить PBS на отдельную ВМ или физический хост (можно на том же сервере, но лучше выделенный). -- Настроить хранилище (желательно на отдельном диске или NAS). -- Использовать дедупликацию, сжатие, шифрование. -- Настроить расписания бэкапов для каждой ВМ/LXC через Proxmox VE (интеграция с PBS). +| ID | Имя | Тип данных | Примерный размер | +|----|-----|------------|------------------| +| **205** | Nextcloud | Файлы, БД PostgreSQL | ~10 GB | +| **213** | VPN | OpenVPN/WireGuard конфиги | ~12 GB | -### Альтернатива (если PBS не используется) +### Исключено из бэкапа -- **Для LXC и ВМ**: встроенные средства Proxmox (VZDump) с сохранением на NFS или SMB. -- **Для Docker-контейнеров**: скрипты с `docker exec` дампов БД, архивация томов. -- **Для файлов**: `rsync` или `restic` в cron. +- **Большие диски** (16 TB RAID6): медиафайлы, игры, загрузки +- **Причина**: занимают слишком много места, можно восстановить из источников +- **Что включено**: только конфигурации и метаданные (через `backup=1`) -## План внедрения +--- -### Этап 1: Подготовка (1–2 дня) -- Определить список всех ресурсов, подлежащих бэкапу (таблица выше). -- Оценить объём данных: примерно (медиа ~8 ТБ, игры ~4 ТБ, фото ~200 ГБ, базы ~10 ГБ, конфиги ~1 ГБ). -- Выбрать место для хранения бэкапов: внешний HDD (USB) + дополнительно облако (например, Backblaze B2) для критических данных. -- Установить и настроить Proxmox Backup Server (можно в LXC на `olimp` или на отдельной машине). +## Расписание бэкапов -### Этап 2: Настройка бэкапов ВМ и LXC (2–3 дня) -- В Proxmox VE добавить PBS как хранилище. -- Создать расписания для каждой ВМ/LXC: - - Критические (базы, GitLab, Nextcloud): ежедневно, хранить 7 дней, еженедельно 4 недели, ежемесячно 3 месяца. - - Некритические (медиа, игры): еженедельно, хранить 4 недели. -- Настроить уведомления об ошибках. +### Автоматическое расписание -### Этап 3: Бэкап данных вне Proxmox (2–3 дня) -- Написать скрипты (на базе Ansible или shell) для: - - Дампов баз данных PostgreSQL, MySQL, SQLite. - - Копирования Docker-томов. - - Синхронизации файловых данных (медиа, игры) с бэкап-хранилищем (можно через `restic`). -- Запускать скрипты по расписанию (cron или systemd timer) до или после бэкапов ВМ. -- Проверить, что бэкапы не дублируют данные (например, диски ВМ уже содержат часть файлов – можно исключить их из файлового бэкапа, если они уже входят в VZDump). +**Два раза в день**: +- **02:30** — ночной бэкап +- **22:30** — вечерний бэкап -### Этап 4: Тестирование восстановления (1 день) -- Выполнить тестовое восстановление ВМ на изолированной среде (или с переименованием). -- Проверить восстановление базы данных из дампа. -- Восстановить несколько файлов из бэкапа. +**Proxmox Backup Server автоматически определяет**: +- Первый бэкап — **полный** +- Последующие — **инкрементальные** (только изменения) +- Периодически — **полный** для целостности данных -### Этап 5: Автоматизация и мониторинг (1 день) -- Настроить алерты в Grafana на статус бэкапов (через API Proxmox или логи). -- Добавить проверку успешности бэкапов в мониторинг. +### Retention политика -## Примеры команд +| Тип хранения | Количество | Фактический срок | +|--------------|------------|------------------| +| **Keep Last** | 14 | Минимум 14 последних бэкапов | +| **Keep Daily** | 7 | 7 ежедневных копий | +| **Keep Weekly** | 4 | 4 недельных копии | +| **Keep Monthly** | 4 | 4 месячных копии | -### Бэкап базы данных PostgreSQL (например, Immich) +**Итого**: ~1-2 месяца истории бэкапов -```bash -pg_dump -U immich -h localhost immich > /backup/immich_$(date +%Y%m%d).sql -``` +--- -### Бэкап SQLite (Bitwarden) +## Текущая конфигурация -```bash -sqlite3 /path/to/vaultwarden.db ".backup /backup/vaultwarden_$(date +%Y%m%d).db" -``` +### На Proxmox VE (Olimp) -### Бэкап Docker-томов (например, Jellyfin) +**Хранилище подключено**: +- **ID**: `olimpbkp` +- **Тип**: Proxmox Backup Server +- **Server**: 192.168.1.199:8007 +- **Datastore**: `olimpbkp` +- **Content**: Backup +- **Status**: ✅ Enabled -```bash -tar -czf /backup/jellyfin_config_$(date +%Y%m%d).tar.gz /opt/service/jellyfin/config -``` +**Backup Job**: +&&& +Node: Olimp +Storage: olimpbkp +Schedule: 02:30, 22:30 (daily) +Mode: Snapshot +Compression: ZSTD +VM/CT: 201-211, 205, 213 +Retention: keep-last=14, keep-daily=7, keep-weekly=4, keep-monthly=4 +&&& -### Синхронизация файлов с внешним хранилищем (restic) +### На PBS (Olimpbs) -```bash -restic -r /mnt/backup_drive/restic_repo backup /mnt/video /mnt/audio /mnt/books -``` +**Datastore**: +&&& +Name: olimpbkp +Path: /var/lib/proxmox-backup/olimpbkp +Size: 1 TB (912 GB available) +GC Schedule: daily +Prune Schedule: daily +&&& -### Восстановление ВМ из бэкапа через PBS +**Пользователи**: +- `root@pam` — администратор (веб-интерфейс) +- `pve@pbs` — для Proxmox VE (API токен) -- В интерфейсе Proxmox: Datacenter → Storage → PBS → Backups → выбрать backup → Restore. +--- -## Проблемы и рекомендации +## Управление бэкапами -### 🔴 Отсутствие резервных копий -**Проблема**: Критическая уязвимость – потеря всех данных при сбое или ошибке. -**Решение**: Немедленно начать внедрение системы бэкапов по плану выше. Минимально: запустить ручной бэкап критических данных (базы, конфиги) на внешний диск. +### Просмотр бэкапов -### 🟡 Большой объём медиа -**Проблема**: Медиафайлы (~8 ТБ) сложно бэкапить часто и хранить в нескольких местах. -**Решение**: -- Для медиа достаточно еженедельного бэкапа. -- Использовать дедупликацию (PBS или restic). -- Рассмотреть бэкап только метаданных (библиотеки Jellyfin, настройки), а сами файлы можно перекачать заново (но если они уникальны, то бэкапить полностью). +**Через веб-интерфейс PBS**: +&&& +https://192.168.1.199:8007 + → Datastore → olimpbkp → Content +&&& -### 🟢 Шифрование бэкапов -**Рекомендация**: Все бэкапы, хранящиеся вне сервера (на внешних дисках, в облаке), шифровать. PBS поддерживает шифрование на стороне клиента. +**Через Proxmox VE**: +&&& +https://192.168.1.220:8006 + → Datacenter → Storage → olimpbkp → Content +&&& -### 🟢 Хранение копий вне сети -**Рекомендация**: Хранить как минимум одну копию бэкапов вне основной сети (например, внешний USB-диск, отключаемый после бэкапа, или облачное хранилище). +**Через CLI**: +&&&bash +# Список бэкапов +proxmox-backup-client list --repository root@pam@192.168.1.199:8007:olimpbkp + +# Детальная информация +proxmox-backup-client show-backup --repository root@pam@192.168.1.199:8007:olimpbkp ct/201 + +# Статистика datastore +proxmox-backup-client datastore stats olimpbkp +&&& + +### Ручной запуск бэкапа + +**Один контейнер/ВМ**: +&&&bash +vzdump 201 --storage olimpbkp --mode snapshot --compress zstd +&&& + +**Все бэкапируемые системы**: +&&&bash +for id in 201 202 203 204 205 206 207 208 209 210 211 213; do + vzdump $id --storage olimpbkp --mode snapshot --compress zstd & +done +wait +&&& + +### Восстановление из бэкапа + +**Через веб-интерфейс Proxmox VE**: +1. Datacenter → Storage → olimpbkp → Content +2. Выбрать бэкап → Restore +3. Указать: + - **Storage**: целевое хранилище (local-lvm, vmsystem) + - **VMID**: новый ID (или существующий для перезаписи) +4. Start + +**Через CLI**: +&&&bash +# LXC контейнер +pct restore 216 olimpbkp:backup/ct/201/2026-04-11T13:19:03Z --storage local-lvm + +# Виртуальная машина +qm restore 216 olimpbkp:backup/vm/205/2026-04-11T13:19:03Z --storage vmsystem +&&& + +### Восстановление отдельных файлов + +**Через File Restore**: +1. PBS веб-интерфейс → Datastore → Content +2. Выбрать бэкап → **File Restore** +3. Смонтировать бэкап +4. Скачать нужные файлы +5. Unmount + +**Через CLI**: +&&&bash +# Смонтировать бэкап +mkdir -p /mnt/restore +proxmox-backup-client mount ct/201/2026-04-11T13:19:03Z /mnt/restore \ + --repository root@pam@192.168.1.199:8007:olimpbkp + +# Скопировать файлы +cp /mnt/restore/root.pxar/etc/config/file.conf /tmp/ + +# Размонтировать +proxmox-backup-client unmount /mnt/restore +&&& + +--- + +## Мониторинг и обслуживание + +### Проверка статуса бэкапов + +**Ежедневная проверка**: +&&&bash +# Последние задачи +pvesm status olimpbkp + +# Логи бэкапов +tail -f /var/log/pve/tasks/* + +# Проверка места на PBS +ssh root@192.168.1.199 "df -h /var/lib/proxmox-backup/olimpbkp" +&&& + +### Garbage Collection (очистка) + +PBS автоматически запускает GC ежедневно. Вручную: + +&&&bash +# На PBS сервере +proxmox-backup-manager garbage-collection start olimpbkp + +# Проверка статуса +proxmox-backup-manager garbage-collection status olimpbkp +&&& + +### Prune (удаление старых бэкапов) + +Автоматически по retention политике. Вручную: + +&&&bash +proxmox-backup-manager prune-job run +&&& + +### Проверка целостности (Verify) + +&&&bash +# Проверить все бэкапы +proxmox-backup-manager verify olimpbkp + +# Проверить конкретный бэкап +proxmox-backup-client verify ct/201/2026-04-11T13:19:03Z \ + --repository root@pam@192.168.1.199:8007:olimpbkp +&&& + +--- + +## Миграция со старого PBS + +### История + +**Март 2026**: PBS был развёрнут в LXC контейнере (CT 220) на том же хосте Olimp +- Хранилище: ZFS dataset `rpool/pbs-backups` (187 GB) +- Datastore: `ssd-backups` + +**Апрель 2026**: Развёрнут отдельный физический сервер PBS (Olimpbs) +- Хранилище: 1 TB LVM +- Datastore: `olimpbkp` + +### Перенос старых бэкапов (опционально) + +&&&bash +# На новом PBS +mkdir -p /mnt/old-pbs +sshfs root@192.168.1.220:/rpool/pbs-backups /mnt/old-pbs + +# Копирование +rsync -avh /mnt/old-pbs/data/ /var/lib/proxmox-backup/olimpbkp/ + +# Исправление прав +chown -R backup:backup /var/lib/proxmox-backup/olimpbkp + +# Перезапуск +systemctl restart proxmox-backup-proxy +&&& + +### Удаление старого PBS + +После подтверждения что новые бэкапы работают: + +&&&bash +# На Proxmox VE (Olimp) +pvesm remove pbs-ssd + +# Удалить dataset +zfs destroy rpool/pbs-backups + +# Удалить LXC контейнер (опционально) +pct stop 220 +pct destroy 220 +&&& + +--- + +## Безопасность + +### Аутентификация + +- **PBS пользователи**: `root@pam`, `pve@pbs` +- **API токены**: для автоматизации (без паролей) +- **Fingerprint**: SHA-256 отпечаток сертификата + +### Сетевая безопасность + +- **Порт**: 8007 (TCP) +- **Шифрование**: TLS 1.3 +- **Доступ**: только из локальной сети (192.168.1.0/24) + +### Рекомендации + +- ✅ Включить **2FA** для root@pam +- ✅ Создать **отдельного пользователя** для бэкапов (не root) +- ✅ Настроить **firewall** на PBS сервере +- ✅ Регулярно **обновлять** систему (unattended-upgrades) + +--- + +## Планы на будущее + +### 🔵 Краткосрочные (1-2 месяца) + +- [ ] Настроить **уведомления** (email/telegram) о статусе бэкапов +- [ ] Включить **2FA** для доступа к PBS +- [ ] Настроить **репликацию** в облако (Backblaze B2 / Wasabi) +- [ ] Провести **тестовое восстановление** всех критичных ВМ + +### 🔵 Долгосрочные (3-6 месяцев) + +- [ ] Добавить **второй PBS** для репликации +- [ ] Настроить **оффсайт-копии** (внешний диск + облако) +- [ ] Внедрить **шифрование** бэкапов на стороне клиента +- [ ] Автоматизировать **тестирование восстановления** + +--- + +## Troubleshooting + +### Бэкап не запускается + +&&&bash +# Проверить хранилище +pvesm status | grep olimpbkp + +# Проверить подключение к PBS +ping 192.168.1.199 +nc -zv 192.168.1.199 8007 + +# Переподключить хранилище +pvesm remove olimpbkp +pvesm add proxmox-backup olimpbkp \ + --server 192.168.1.199 \ + --datastore olimpbkp \ + --username pve@pbs +&&& + +### Закончилось место на PBS + +&&&bash +# Проверить занятое место +proxmox-backup-client datastore stats olimpbkp + +# Запустить GC +proxmox-backup-manager garbage-collection start olimpbkp + +# Удалить старые бэкапы вручную +proxmox-backup-client prune \ + --repository root@pam@192.168.1.199:8007:olimpbkp \ + --max-daily 7 --max-weekly 2 +&&& + +### Ошибка аутентификации + +&&&bash +# Сгенерировать новый токен +proxmox-backup-manager user generate-token pve@pbs backup-token + +# Обновить в Proxmox VE +pvesm update olimpbkp --password <новый_токен> +&&& + +--- + +## Полезные команды + +### На Proxmox VE + +&&&bash +# Список хранилищ +pvesm list + +# Статус бэкап хранилища +pvesm status olimpbkp + +# Запустить бэкап +vzdump --storage olimpbkp --mode snapshot + +# Восстановить +pct restore olimpbkp:backup/ct// +qm restore olimpbkp:backup/vm// +&&& + +### На PBS + +&&&bash +# Список datastore +proxmox-backup-manager datastore list + +# Статистика +proxmox-backup-client datastore stats olimpbkp + +# Список бэкапов +proxmox-backup-client list --repository root@pam@192.168.1.199:8007:olimpbkp + +# Информация о бэкапе +proxmox-backup-client show-backup ct/201 --repository root@pam@192.168.1.199:8007:olimpbkp + +# Проверка целостности +proxmox-backup-manager verify olimpbkp + +# Garbage collection +proxmox-backup-manager garbage-collection start olimpbkp +&&& + +--- + +## Метрики и отчётность + +### Ежедневная проверка + +&&&bash +# Размер бэкапов за сегодня +du -sh /var/lib/proxmox-backup/olimpbkp/data/* + +# Количество бэкапов +proxmox-backup-client list --repository root@pam@192.168.1.199:8007:olimpbkp | wc -l + +# Свободное место +df -h /var/lib/proxmox-backup/olimpbkp +&&& + +### Еженедельный отчёт + +&&&bash +# Дедупликация +proxmox-backup-client datastore stats olimpbkp | grep "Deduplication" + +# Прирост за неделю +# Сравнить размер datastore с прошлой неделей +&&& --- **Связанные разделы:** - [Гипервизор Proxmox](02-hypervisor.md) - [Виртуальные машины и LXC](03-vms-lxcs.md) -- [Управление конфигурацией (Ansible)](09-ansible.md) -- [Безопасность](10-security.md) \ No newline at end of file +- [Безопасность](10-security.md) +- [Мониторинг и логирование](08-monitoring.md) \ No newline at end of file