Files
homelab-docs/docs/backup/backup-howto.md

18 KiB
Raw Blame History

Бэкапы: как устроены и как восстанавливать

Краткая справка: что бэкапится, куда, когда и как восстановить.


Где хранятся бэкапы

Все локальные бэкапы лежат на отдельном диске хоста 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 Все выбранные контейнеры (100109) и 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:0003: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):
    tar -xzf etc-pve-YYYYMMDD-HHMM.tar.gz -C /
    
    При одномузловой установке обычно достаточно распаковать в /. При кластере — аккуратно с нодами и storage.
  3. Восстановление конфигов сети/хоста (interfaces, hosts, resolv.conf):
    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):
    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, затем:
    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:

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 Миран.

Требования для бэкапа: на хосте 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 Миран).


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).
  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.


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 оставлено свободным для плановой перезагрузки сервера.


Связанные документы