# Снимок: ПРОД ↔ ЛОКАЛКА + здоровье прода + доступ (15.06.2026)

**Снято:** 15.06.2026 живым чтением боевого `liderra-test` (через бастион) и локального репозитория.
**Боевой:** VM `liderra-test` (`fhmu5kbgbui60r773qic`), внешний `111.88.246.137`, внутр. `10.128.0.15`.
**Локальный:** репозиторий «Документация», `main` = `cc82665`.

## Главное отличие прод ↔ локалка: фича lead-region

Прод применил **все те же 29 миграций, что в локальном `main`, плюс одну лишнюю** (batch 14):

> `2026_05_31_100000_create_phone_ranges_and_resolution_log`

Это **фича lead-region** (определение региона лида по телефону). **Проверено по коду** (find на
проде + grep локально), а не по имени миграции:

**Прод — полная фича (8 файлов):**
`app/Services/LeadRegionResolver.php` (ядро, телефон→регион), `RegionTagResolver.php` (tag-fallback),
`Dto/RegionResolution.php`, `app/Support/DaDataRegionMap.php`, `RussianRegions.php`,
`Console/Commands/PhoneRegionSmokeCommand.php`, `DealsBackfillRegionCityCommand.php`
(+ `SupplierRegions.php`). Каскад DaData → реестр Россвязи → tag-fallback. Живая, на 100%.

**Локальный `main` — только старый tag-слой:** есть `RegionTagResolver.php` + `RussianRegions.php`
(их зовёт `Jobs/RouteSupplierLeadJob.php` через `use App\Services\RegionTagResolver`).
**Ядро телефон-каскада ОТСУТСТВУЕТ** (0 совпадений по grep): нет `LeadRegionResolver`,
`DaDataRegionMap`, `RegionResolution`, обеих команд и миграции `phone_ranges`. При этом `main`
**не сломан** — ссылается только на присутствующий `RegionTagResolver`, это просто более ранняя
версия. Последняя локальная миграция — `2026_05_30 add_advisory_lock_to_audit_chain_hash`.

**Итог:** прод = `main` **+ телефон-каскад lead-region** (надстройка `LeadRegionResolver` над
tag-слоем + миграция `phone_ranges`). Полный код каскада — в ветках (в бэкапе/Gitea):
`worktree-feat+lead-region-resolution` (`11079791`), `worktree-lead-region-tails` (`e2c00d60`),
в `main` не влит.

Остальные 29 миграций — **идентичны** (0001 … 2026_05_30, имена совпадают).

## ⚠️ ХВОСТ (для списка хвостов): рассинхрон main ↔ прод

- **Суть:** боевой код впереди `main` на фичу lead-region; `main` её не содержит.
- **Риск:** деплой текущего `main` на прод **снёс бы код lead-region** (миграция `phone_ranges`
  и таблицы остались бы, а обслуживающий их код пропал) → регресс живой фичи. Деплоить `main`
  «как есть» НЕЛЬЗЯ.
- **Что нужно:** влить lead-region-ветку (`worktree-feat+lead-region-resolution` + добор
  `worktree-lead-region-tails`) в `main`, прогнать тесты, и только потом считать `main`
  деплоебельным. Отдельная аккуратная задача (сверка + merge + регрессия).
- **Связано:** общий git-рассинхрон (345 локальных коммитов не на origin / 57 на origin не
  локально) — из P1-риска (GitHub suspend). Сводить — после восстановления git-доступа.

## Health-снимок прода (15.06.2026 ~17:16 MSK)

| Параметр | Значение |
|---|---|
| Uptime | 25 дней, load average 0.00 / 0.00 / 0.00 (простаивает) |
| Диск `/` | 19 ГБ, занято 9.1 ГБ — **49%** (здоров; после disk-full инцидента было 0 свободно) |
| nginx | active ✅ |
| php8.3-fpm | active ✅ |
| postgresql | active ✅ |
| liderra-queue | active ✅ |

Боевой здоров, замечаний нет.

## Способ доступа к проду (восстановлен 15.06.2026)

Прямой SSH с dev-машины на прод режется фильтром (dev-IP `89.144.17.119`); канал GitHub Actions
умер (аккаунт suspend). Рабочий путь — **через бастион gitea-VM по внутренней сети** (фильтр на
внутренний хоп не действует):

- Алиас в `~/.ssh/config`: **`liderra-prod`** (ProxyJump через `liderra-bastion` = gitea-VM
  `111.88.252.149`, ключ `gitea_vm`; прод `10.128.0.15`, ключ `liderra_deploy`).
- Использование: **`ssh liderra-prod '<команда>'`** (читать и выполнять на проде).
  Пример: `ssh liderra-prod 'sudo -u www-data php /var/www/liderra/app/artisan migrate:status'`.
- Бэкап-сервер Gitea (бастион) — см. `docs/ops/gitea/2026-06-15-gitea-backup-server-actual.md`.
