# 13 · Бэкап и восстановление

[← Home](Home.md)

## Что резервируется

| Данные | Где | Как бэкапится |
|---|---|---|
| База (жители, оплаты, журнал, аудит) | MySQL/PostgreSQL/SQLite | дамп `mysqldump` / `pg_dump` / копия файла SQLite |
| Конфигурация и секреты | `.bas-ip.config.local.php`, `storage/app/secrets` | тип `full` (по умолчанию бэкап — только БД) |
| Файлы приложения | код | снимок версии при автообновлении ([14](14-Updating.md)) |
| Журналы, очередь, кэш | `storage/` | обычно не нужны; `backup.include_storage` при желании |

## Создание

* **UI**: Админка → Данные → «Создать копию» (+ расписание автобэкапов в
  Настройках: keep N, шифрование, расписание cron).
* **CLI**: `bin/bas-ip backup:create [--type=db|full] [--note="перед обновлением"]`
* **cron**: `30 3 * * * cd /var/www/bas-ip && php bin/bas-ip backup:create --quiet`

Копии — zip в `storage/app/backups/` (имя содержит драйвер и дату), запись
в таблице `backups` (тип, размер, статус, примечание). Ротация: хранится
последние `backup.keep` (14) копий. Опционально: шифрование ключом приложения
(`backup.encrypt`) и offsite (sftp).

## Восстановление

**UI**: Админка → Данные → Бэкапы → «Восстановить» (двойное подтверждение).
**CLI**: `bin/bas-ip backup:restore ID [--yes]` (ID из `backup:list`).

Что происходит: проверка архива → (для БД) гашение активных соединений →
заливка дампа (MySQL/PG) или замена файла (SQLite) → проверка целостности →
запись в аудит. Приложение на время восстановления лучше перевести в
режим обслуживания (`bin/bas-ip maintenance --on`); **шлагбаум продолжит
открываться** (maintenance не блокирует gate-маршруты).

## Перенос на другой сервер / другую СУБД

1. Старый сервер: `backup:create --type=full`, скачайте архив; либо
   экспортируйте данные: Админка → Данные → Экспорт (жители/оплаты JSON).
2. Новый сервер: установите приложение ([01](01-Installation.md)), создайте
   базу **той же или другой СУБД** (схема переносима).
3. Вариант А (та же СУБД): `backup:restore` из скачанного архива
   (положите файл в `storage/app/backups/` и `backup:list` его увидит).
4. Вариант Б (другая СУБД): `bin/bas-ip migrate` на новой БД →
   Админка → Данные → Импорт (JSON-экспорт жителей с контактами/машинами),
   импорт оплат отдельным файлом; журнал ворот переносится SQL-дампом
   таблиц `gate_events`/`guest_passes` при необходимости.
5. Перенесите секреты: `secret:list` (имена) → `secret:set` на новом месте;
   скопируйте `.bas-ip.config.local.php` (поправьте БД/URL) и
   `app.key` — **без него секреты и подписанные ссылки не расшифруются**.

## Экспорт/импорт как «лёгкий бэкап»

Регулярный экспорт JSON (жители + оплаты + журнал) в облако — хорошая
дополнительная страховка от логических ошибок (в отличие от дампа, виден
глазами). CLI: `residents:export --format=json --status=all --include=contacts,cars,payments,invoices`.

## Проверка бэкапов

Раз в месяц восстанавливайте копию в тестовое окружение:

```bash
php bin/bas-ip backup:list
php bin/bas-ip backup:restore <ID> --yes     # на тестовом стенде!
php bin/bas-ip doctor
```

Бэкап, который ни разу не восстанавливали, — это не бэкап.

---
Дальше: [14 · Обновления](14-Updating.md)
