232 lines
18 KiB
Markdown
232 lines
18 KiB
Markdown
# Бэкапы: как устроены и как восстанавливать
|
||
|
||
Краткая справка: что бэкапится, куда, когда и как восстановить.
|
||
|
||
---
|
||
|
||
## Где хранятся бэкапы
|
||
|
||
Все локальные бэкапы лежат на отдельном диске хоста Proxmox: **/dev/sdb1**, смонтирован в **/mnt/backup**.
|
||
|
||
```
|
||
/mnt/backup/
|
||
├── proxmox/
|
||
│ ├── dump/ ← vzdump (LXC и VM целиком)
|
||
│ └── etc-pve/ ← конфиги хоста (etc/pve, interfaces, hosts, resolv.conf)
|
||
├── databases/ ← логические дампы БД (pg_dump)
|
||
│ ├── ct101-nextcloud/
|
||
│ ├── ct103-gitea/
|
||
│ ├── ct104-paperless/
|
||
│ └── vm200-immich/
|
||
├── photos/
|
||
│ └── library/ ← копия библиотеки Immich (оригиналы фото) с VM 200
|
||
├── other/
|
||
│ ├── vaultwarden/ ← архив данных Vaultwarden (пароли); для restic → Yandex
|
||
│ └── ct105-vectors/ ← векторы RAG (vectors.npz) из CT 105
|
||
├── restic/ ← (опционально)
|
||
└── vps/
|
||
└── miran/ ← VPS Миран: БД бота, voice_users, копия S3 (telegram-helper-bot)
|
||
```
|
||
|
||
---
|
||
|
||
## Что, откуда, куда, когда
|
||
|
||
| Что | Откуда | Куда (локально) | Когда | Хранение |
|
||
|-----|--------|------------------|------|----------|
|
||
| **LXC и VM** | Все выбранные контейнеры (100–109) и VM 200 | `/mnt/backup/proxmox/dump/` | **02:00** ежедневно (задание в Proxmox UI) | По настройкам задания (например: 7 daily, 4 weekly, 6 monthly) |
|
||
| **Конфиги хоста** | `/etc/pve`, `/etc/network/interfaces`, `/etc/hosts`, `/etc/resolv.conf` | `/mnt/backup/proxmox/etc-pve/` | **02:15** ежедневно (cron: `backup-etc-pve.sh`) | 30 дней |
|
||
| **БД Nextcloud (PostgreSQL)** | CT 101, контейнер `nextcloud-db-1` в `/opt/nextcloud` | `/mnt/backup/databases/ct101-nextcloud/` | **01:15** ежедневно (cron: `backup-ct101-pgdump.sh`) | 14 дней |
|
||
| **БД Gitea (PostgreSQL)** | CT 103, контейнер `gitea-db-1` в `/opt/gitea` | `/mnt/backup/databases/ct103-gitea/` | **03:00** ежедневно (cron: `backup-ct103-gitea-pgdump.sh`) | 14 дней |
|
||
| **БД Paperless (PostgreSQL)** | CT 104, контейнер `paperless-db-1` в `/opt/paperless` | `/mnt/backup/databases/ct104-paperless/` | **02:30** ежедневно (cron: `backup-ct104-pgdump.sh`) | 14 дней |
|
||
| **Данные Vaultwarden (пароли)** | CT 103, `/opt/docker/vaultwarden/data` | `/mnt/backup/other/vaultwarden/` | **02:45** ежедневно (cron: `backup-vaultwarden-data.sh`); каталог в restic → Yandex | 14 дней |
|
||
| **БД Immich (PostgreSQL)** | VM 200, контейнер `database` в `/opt/immich` | `/mnt/backup/databases/vm200-immich/` | **03:15** ежедневно (cron: `backup-vm200-pgdump.sh`) | 14 дней |
|
||
| **Векторы RAG (CT 105)** | CT 105, `/home/rag-service/data/vectors/` (vectors.npz) | `/mnt/backup/other/ct105-vectors/` | **03:30** ежедневно (cron: `backup-ct105-vectors.sh`) | 14 дней |
|
||
| **Оригиналы фото Immich** | VM 200, `/mnt/data/library/` | `/mnt/backup/photos/library/` | **01:30** ежедневно (cron: `backup-immich-photos.sh`, rsync) | Все копии (без автоудаления) |
|
||
| **VPS Миран (telegram-helper-bot)** | VPS 185.147.80.190: БД `tg-bot-database.db`, каталог `voice_users`, бакет S3 (Miran) | `/mnt/backup/vps/miran/` (db/, voice_users/, s3/) | **01:00** ежедневно (cron: `backup-vps-miran.sh`) | БД: 14 дней; voice_users и S3 — перезапись |
|
||
| **Выгрузка в Yandex (restic)** | `/mnt/backup` целиком | Yandex Object Storage | **04:00** ежедневно (cron: `backup-restic-yandex.sh`) | 3 daily, 2 weekly, 2 monthly |
|
||
|
||
**Окно бэкапов:** внутренние копии (синк внутри сервера) — **01:00–03:30**; выгрузка в облако — **04:00**. **05:00** зарезервировано под плановую перезагрузку сервера. Задание vzdump — из веб-интерфейса Proxmox (Центр обработки данных → Резервная копия).
|
||
|
||
---
|
||
|
||
## Восстановление
|
||
|
||
### 1. Восстановление контейнера (LXC) или виртуальной машины (VM) из vzdump
|
||
|
||
**Когда нужно:** потеря или поломка одной/нескольких гостевых систем.
|
||
|
||
1. В Proxmox: **Центр обработки данных → Резервная копия** (или узел → Резервная копия).
|
||
2. Выбрать хранилище **backup** (или то, куда пишет задание).
|
||
3. Найти нужный бэкап по VMID и дате.
|
||
4. **Восстановить** → указать новый VMID (если восстанавливаем как копию) или тот же (если заменяем сломанный), узел и storage для дисков.
|
||
5. Запустить ВМ/контейнер и проверить доступность.
|
||
|
||
**С CLI (на хосте):**
|
||
|
||
- LXC: `pct restore <vmid> /path/to/backup.vma.zst --storage local-lvm` (и т.п., см. `pct restore --help`).
|
||
- VM: `qm restore <vmid> /path/to/backup.vma.zst` (и т.п., см. `qm restore --help`).
|
||
|
||
Путь к файлу бэкапа на хосте: `/mnt/backup/proxmox/dump/` (имя файла вида `vzdump-lxc-100-...` или `vzdump-qemu-200-...`).
|
||
|
||
---
|
||
|
||
### 2. Восстановление конфигов хоста (/etc/pve и сеть)
|
||
|
||
**Когда нужно:** переустановка Proxmox или потеря конфигов узла (при этом диск с бэкапами доступен).
|
||
|
||
1. Скопировать нужный архив с хоста, например:
|
||
`etc-pve-YYYYMMDD-HHMM.tar.gz` и/или `etc-host-configs-YYYYMMDD-HHMM.tar.gz` из `/mnt/backup/proxmox/etc-pve/`.
|
||
2. **Восстановление /etc/pve** (на переустановленном хосте, от root):
|
||
```bash
|
||
tar -xzf etc-pve-YYYYMMDD-HHMM.tar.gz -C /
|
||
```
|
||
При одномузловой установке обычно достаточно распаковать в `/`. При кластере — аккуратно с нодами и storage.
|
||
3. **Восстановление конфигов сети/хоста** (interfaces, hosts, resolv.conf):
|
||
```bash
|
||
tar -xzf etc-host-configs-YYYYMMDD-HHMM.tar.gz -C /
|
||
```
|
||
При необходимости поправить под текущее железо (интерфейсы, IP) и перезапустить сеть.
|
||
|
||
После восстановления конфигов — заново добавить storage для бэкапов (если переустанавливали с нуля) и восстанавливать гостей из vzdump по шагу 1.
|
||
|
||
---
|
||
|
||
### 3. Восстановление БД Immich (PostgreSQL) на VM 200
|
||
|
||
**Когда нужно:** повреждение или потеря базы Immich при рабочей ВМ (образ VM можно не трогать, восстанавливаем только БД).
|
||
|
||
1. Скопировать нужный дамп на VM 200, например:
|
||
`immich-db-YYYYMMDD-HHMM.sql.gz` из `/mnt/backup/databases/vm200-immich/`.
|
||
2. На VM 200 (ssh admin@192.168.1.200):
|
||
```bash
|
||
cd /opt/immich
|
||
gunzip -c /path/to/immich-db-YYYYMMDD-HHMM.sql.gz | docker compose exec -T database psql -U <DB_USERNAME> -d <DB_DATABASE_NAME>
|
||
```
|
||
Или распаковать `.sql.gz`, затем:
|
||
```bash
|
||
docker compose exec -T database psql -U <DB_USERNAME> -d <DB_DATABASE_NAME> < backup.sql
|
||
```
|
||
`<DB_USERNAME>` и `<DB_DATABASE_NAME>` — из `/opt/immich/.env` (обычно `postgres` и `immich`).
|
||
|
||
Перед восстановлением лучше остановить приложение Immich (или как минимум не писать в БД). При полной пересоздании БД — очистить каталог данных PostgreSQL в контейнере и затем загрузить дамп.
|
||
|
||
---
|
||
|
||
### 4. Восстановление библиотеки фото Immich
|
||
|
||
**Когда нужно:** потеря данных на диске VM 200 (например `/mnt/data/library`).
|
||
|
||
На VM 200 (или с хоста через rsync в обратную сторону): скопировать содержимое `/mnt/backup/photos/library/` обратно в каталог библиотеки Immich на VM 200 (в .env указан `UPLOAD_LOCATION`, обычно `/mnt/data/library`). Пример с хоста Proxmox:
|
||
|
||
```bash
|
||
rsync -av /mnt/backup/photos/library/ admin@192.168.1.200:/mnt/data/library/
|
||
```
|
||
|
||
После копирования на VM 200 выставить владельца/права под контейнер Immich (если нужно) и перезапустить сервисы.
|
||
|
||
---
|
||
|
||
### 5. Восстановление БД Paperless (CT 104), Gitea (CT 103)
|
||
|
||
**Paperless:** дамп из `/mnt/backup/databases/ct104-paperless/paperless-db-*.sql.gz`. На CT 104: остановить приложение, `gunzip -c backup.sql.gz | docker exec -i paperless-db-1 psql -U paperless -d paperless`, запустить стек.
|
||
|
||
**Gitea:** дамп из `/mnt/backup/databases/ct103-gitea/gitea-db-*.sql.gz`. На CT 103: остановить Gitea, восстановить в контейнер `gitea-db-1` (psql -U gitea -d gitea), запустить стек.
|
||
|
||
---
|
||
|
||
### 6. Восстановление данных Vaultwarden (CT 103)
|
||
|
||
Архив из `/mnt/backup/other/vaultwarden/vaultwarden-data-*.tar.gz`. На CT 103: остановить Vaultwarden, распаковать в `/opt/docker/vaultwarden/` (получится каталог `data/`), выставить владельца/права под контейнер, запустить Vaultwarden.
|
||
|
||
---
|
||
|
||
### 7. Восстановление бэкапа VPS Миран (telegram-helper-bot)
|
||
|
||
**Когда нужно:** потеря данных на VPS или перенос бота на другой хост.
|
||
|
||
В бэкапе есть:
|
||
- **БД:** `/mnt/backup/vps/miran/db/tg-bot-database-YYYYMMDD.db` — копии SQLite.
|
||
- **Голосовые сообщения:** `/mnt/backup/vps/miran/voice_users/` — каталог .ogg.
|
||
- **S3 (контент бота):** `/mnt/backup/vps/miran/s3/` — полная копия бакета (photos, videos, voice и т.д.).
|
||
|
||
**Восстановление на VPS:**
|
||
1. Скопировать выбранный файл БД на VPS:
|
||
`scp -P 15722 /mnt/backup/vps/miran/db/tg-bot-database-YYYYMMDD.db deploy@185.147.80.190:/home/prod/bots/telegram-helper-bot/database/tg-bot-database.db`
|
||
2. Восстановить `voice_users`:
|
||
`rsync -avz -e "ssh -p 15722" /mnt/backup/vps/miran/voice_users/ deploy@185.147.80.190:/home/prod/bots/telegram-helper-bot/voice_users/`
|
||
3. При потере данных в S3 — загрузить из бэкапа в бакет Miran (через aws s3 sync или панель), используя endpoint `https://api.s3.miran.ru` и креды из [VPS Миран](vps-miran-bots.md).
|
||
|
||
**Требования для бэкапа:** на хосте Proxmox — SSH-ключ root → deploy@185.147.80.190 (порт 15722); для S3 — установленный `aws` cli и файл `/root/.vps-miran-s3.env` с переменными S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKET_NAME (см. [VPS Миран](../vps/vps-miran-bots.md)).
|
||
|
||
---
|
||
|
||
### 8. Восстановление векторов RAG (CT 105)
|
||
|
||
Архив из `/mnt/backup/other/ct105-vectors/vectors-*.tar.gz`. Распаковать на хосте и скопировать в контейнер: `tar -xzf vectors-*.tar.gz` → затем `pct push 105 ./vectors /home/rag-service/data/` или распаковать внутри CT 105 в `/home/rag-service/data/` (получится каталог `vectors/` с `vectors.npz`).
|
||
|
||
---
|
||
|
||
### 9. Восстановление VM 200 (Immich) с нуля
|
||
|
||
VM 200 **не входит** в задание vzdump (образ ~380 ГБ, не помещается в политику 7 копий). В бэкапе есть: **конфиг ВМ** (в архивах `/etc/pve`), **БД** (pg_dump), **фото** (rsync в `photos/library`). Восстановление — создание новой ВМ с теми же параметрами и перенос данных.
|
||
|
||
**Что есть после восстановления хоста:**
|
||
- Из бэкапа `etc-pve`: файл `/etc/pve/qemu-server/200.conf` — полное описание ВМ (CPU, память, диски, **hostpci для GPU**, сеть). Его можно использовать как образец при создании новой ВМ.
|
||
- Дамп БД: `/mnt/backup/databases/vm200-immich/immich-db-*.sql.gz`.
|
||
- Фото: `/mnt/backup/photos/library/`.
|
||
|
||
**Ключевые параметры VM 200** (если восстанавливать вручную без конфига):
|
||
- **Ресурсы:** 3 ядра, 10 GB RAM.
|
||
- **GPU:** проброс видеокарты (hostpci) — в Proxmox: Hardware → Add → PCI Device → выбрать VGA/NVIDIA, поставить «All Functions» и «ROM-Bar» при необходимости. В конфиге это выглядит как `hostpci0: 0000:xx:00.0` и т.п.
|
||
- **Диски:** первый — системный (~35 GB), второй — данные (~350 GB) под `/mnt/data` (библиотека, PostgreSQL, Docker).
|
||
- **Сеть:** статический IP 192.168.1.200/24, шлюз 192.168.1.1.
|
||
- **ОС:** Debian 13 (trixie), пользователь **admin**, SSH.
|
||
|
||
**Порядок восстановления:**
|
||
|
||
1. **Создать ВМ 200** в Proxmox с теми же параметрами (скопировать из восстановленного `200.conf` или задать вручную: CPU, RAM, hostpci для GPU, два диска, сеть с IP 192.168.1.200).
|
||
2. **Установить ОС** (Debian 13), создать пользователя admin, настроить SSH.
|
||
3. **Разметить второй диск** и смонтировать в `/mnt/data` (как в [container-200](../containers/container-200.md)).
|
||
4. **Установить Docker**, склонировать/восстановить каталоги Immich: `/opt/immich/` (docker-compose.yml, .env — из своих заметок или копии; секреты из Vaultwarden).
|
||
5. **Создать каталоги** `/mnt/data/library`, `/mnt/data/postgres` (и др. по .env).
|
||
6. **Скопировать фото** с хоста бэкапов на ВМ:
|
||
`rsync -av /mnt/backup/photos/library/ admin@192.168.1.200:/mnt/data/library/`
|
||
7. **Запустить только контейнер БД** (database), восстановить дамп (см. раздел 3 выше), затем поднять весь стек Immich.
|
||
8. Проверить NPM (прокси на 192.168.1.200:2283), при необходимости заново включить ML и настройки в Immich.
|
||
|
||
Подробное описание сервисов, образов и портов — в [container-200](../containers/container-200.md).
|
||
|
||
---
|
||
|
||
## Restic и Yandex
|
||
|
||
Скрипт **`backup-restic-yandex.sh`** выгружает весь каталог `/mnt/backup` в Yandex Object Storage (S3). Retention: **3 daily, 2 weekly, 2 monthly** (`restic forget --keep-daily 3 --keep-weekly 2 --keep-monthly 2`). Пароли и дампы — чувствительные данные; не выкладывать в открытый доступ.
|
||
|
||
---
|
||
|
||
## Скрипты на хосте Proxmox
|
||
|
||
| Скрипт | Назначение | Cron |
|
||
|--------|------------|------|
|
||
| `/root/scripts/backup-vps-miran.sh` | Бэкап VPS Миран: БД бота, voice_users, S3 (Miran) | 0 1 * * * |
|
||
| `/root/scripts/backup-ct101-pgdump.sh` | Логический дамп БД Nextcloud из CT 101 | 15 1 * * * |
|
||
| `/root/scripts/backup-immich-photos.sh` | Копирование библиотеки фото Immich (rsync с VM 200) | 30 1 * * * |
|
||
| `/root/scripts/backup-etc-pve.sh` | Бэкап /etc/pve и конфигов хоста | 15 2 * * * |
|
||
| `/root/scripts/backup-ct104-pgdump.sh` | Логический дамп БД Paperless из CT 104 | 30 2 * * * |
|
||
| `/root/scripts/backup-vaultwarden-data.sh` | Копирование данных Vaultwarden (пароли) из CT 103 | 45 2 * * * |
|
||
| `/root/scripts/backup-ct103-gitea-pgdump.sh` | Логический дамп БД Gitea из CT 103 | 0 3 * * * |
|
||
| `/root/scripts/backup-vm200-pgdump.sh` | Логический дамп БД Immich с VM 200 | 15 3 * * * |
|
||
| `/root/scripts/backup-ct105-vectors.sh` | Копирование векторов RAG (vectors.npz) из CT 105 | 30 3 * * * |
|
||
| `/root/scripts/backup-restic-yandex.sh` | Выгрузка /mnt/backup в Yandex S3 (restic), retention 3/2/2 | 0 4 * * * |
|
||
|
||
Задание vzdump (LXC/VM) настраивается в Proxmox UI (расписание 02:00). **05:00** оставлено свободным для плановой перезагрузки сервера.
|
||
|
||
---
|
||
|
||
## Связанные документы
|
||
|
||
- [Стратегия бэкапов (фаза 1)](proxmox-phase1-backup.md) — общий план и принятые решения.
|
||
- [Архитектура](../architecture/architecture.md) — хост, IP, доступ.
|
||
- [VM 200 (Immich)](../containers/container-200.md) — сервисы, пути, .env.
|