# 17 · Миграция с v1

[← Home](Home.md)

v1 — это один файл `bas-ip.php` (+ `config.php`, `css/`, `.api_token`),
который открывал шлагбаум BAS-IP по кнопке и показывал снимок камеры.
Код v1 навсегда сохранён в ветке [`main`](https://github.com/paulmann/BAS-IP/tree/main);
ветка `BAS-IP_2` содержит v2.

## Что изменилось

| Аспект | v1 | v2 |
|---|---|---|
| Состав | 3 PHP-файла + css | полноценное приложение (~180 файлов кода) |
| Аутентификация | `.api_token` файлом рядом со скриптом (публичный репозиторий!) | логины/пароли, роли, 2FA, сессии, API-токены со scopes |
| Данные | нет (всё в браузере) | БД MySQL/PostgreSQL/SQLite: жители, оплаты, журнал, аудит |
| Открытие | кнопка «открыть» | панель оператора, кабинет жителя, гостевые ссылки/коды, API, CLI, расписания |
| Журнал | только ошибки в лог | каждое открытие: кто/когда/тип доступа/результат/снимок |
| Деньги | нет | начисления, счета, оплаты, перерасчёт, должники, напоминания |
| Рассылки | нет | e-mail/Telegram/SMS/WhatsApp/webhook, очередь, шаблоны |
| Обновление | git pull руками | автообновление с бэкапом и откатом |
| UI | одна страница | светлая/тёмная тема, mobile-first, админка, кабинет, справка |

## Совместимость

* **Старые автоматизации продолжают работать**: `bas_ip.php?cmd=lock_open|
  status|get_time|get_cameras|reboot|sip_enable|sip_disable` форвардится на
  новый API. Отличие: теперь требуется аутентификация (API-токен/сессия/
  IP-allowlist) и каждый вызов пишется в аудит.
* `bas-ip.php` (панель v1) → 301 на `/panel`.
* `get_last_image.php` → снимок камеры нового API (с авторизацией).

## План перехода

1. **⚠️ Отзовите токен v1.** Файл `.api_token` лежал в публичном репозитории —
   считайте ключ скомпрометированным: смените пароль/ключ API панели BAS-IP.
2. Установите v2 рядом ([01 · Установка](01-Installation.md)) — другое
   расположение или поддомен; v1 не трогает.
3. Создайте API-токен для существующих автоматизаций:
   `bin/bas-ip api:token --name="legacy" --scopes=gate.open,gate.status,gate.log`
   и передавайте его в старых скриптах (`Authorization: Bearer …`).
4. Заполните базу жителей: вручную или импортом из вашей таблицы/Excel
   (Админка → Данные → Импорт, есть образец CSV).
5. Настройте устройство (панель та же — `basip`-драйвер, адрес/логин те же),
   проверьте `gate:test`.
6. Прогоните месяц параллельно: v2 пишет журнал, v1 остаётся как запасной
   путь; убедитесь, что всё открывается.
7. Переведите DNS/nginx на v2, выключите v1 (или оставьте `bas-ip.php`
   форвардером — он уже часть v2).
8. Первый платёжный цикл проведите через мастер начисления
   ([08 · Биллинг](08-Billing.md)).

## Перенос «истории» из v1

v1 не вёл структурированных данных — переносить нечего, кроме:

* списка жителей (если вели в Excel/таблице) — через импорт CSV/JSON;
* журнала ошибок (`error_log`) — остаётся в архиве v1;
* токена устройства — **отозвать** (см. шаг 1).

## Обратная совместимость конфигов

Конфиг v1 (`config.php` с `$api_url`, `$login`, `$password`) не читается v2
намеренно: локальный конфиг v2 создаётся установщиком, а секрет устройства
переезжает в шифрованное хранилище (`secret:set DEVICE_PASSWORD`).

---
Дальше: [18 · FAQ](18-FAQ.md)
