# Сессия ДЕПЛОЯ (23–24.06.2026) — стек выкачен на прод + хэндофф следующей сессии

**Кодовая фраза стены:** «роутер-наставник». **Где работали:** прод `liderra.ru` (через `ssh liderra-prod`) + локалка + gitea. **На проде ДВА живых клиента** (tenant 2 `client1` 1.8М₽/1013 сделок; tenant 25 `tmihaleva150`/омега).

Продолжает [SESSION-DONE-FJ-2026-06-23-and-next-handoff.md](SESSION-DONE-FJ-2026-06-23-and-next-handoff.md). Закрывает деплой + хвосты.

---

## 1. ✅ ЧТО СДЕЛАНО (не повторять)

### Деплой стека на прод (gitea/main `b11e1d97`, follow-up `b808a24f`)
- **Выкачено на боевой:** балансовый блок N/G/E/H/M/O + F/J (единый расчёт замков, фикс дедлока `balance_freeze_log`) + source-edit-lock UX + **онлайн-ЮKassa (СПИТ — флаг `billing_yookassa_enabled` отсутствует в `system_settings` → код по умолчанию OFF)**.
- **Миграция** `2026_06_22_170000_add_balance_transaction_id_to_saas_transactions` применена ВРУЧНУЮ под `sudo -u postgres` (таблица `crm_migrator`-owned, штатная роль не альтерит «must be owner») + `INSERT INTO migrations ... batch 21`. `migrate:status` чисто.
- **💰 Деньги клиента ЦЕЛЫ:** tenant 2 = 1 836 400 ₽ / 1013 сделок (эталон до==после). 3 тенанта.
- **Метод:** `git archive HEAD app/ db/` + `npm run build` (sitekey зашит в `vite.config.js`, не нужен env) → scp → `sudo tar` overlay → миграция вручную → `redeploy.sh`. Квирк-107 OK (`config.php` владелец www-data), очередь active, HTTP 200.

### ⚠️ Инцидент деплоя (важно — учтено)
`redeploy.sh` упал на `composer install`: `vendor/` принадлежит www-data, скрипт бежит от ubuntu → Permission denied, `set -e` оборвал до кэшей/рестарта → **прод 500 на окно**. Затяжной 500 = opcache держал старые кэши (пересобрал classmap от root + кэши + **повторный** рестарт php-fpm — opcache подхватывает только после рестарта ПОСЛЕ пересборки кэшей). **`redeploy.sh` ИСПРАВЛЕН** (composer от root `COMPOSER_ALLOW_SUPERUSER` + `chown vendor www-data`), синкнут на прод, README дополнен 3 граблями. Клиенты денег не потеряли; лиды и так не шли (проекты выключены намеренно).

### Прочее закрыто этой сессией
- **Пред-деплойный аудит** (дрейф + потери): прод-код == git побайтово (552 файла, 0 правок мимо git), вся работа всех сессий (вкл. оплату) в main+gitea, прод-БД == канон. Ничего не потеряно. → `2026-06-23-PRE-DEPLOY-drift-and-loss-audit.md`.
- **schema.sql метрика** RLS-политик 42→44 (исторический недоучёт; реально 44 == прод). CHANGELOG обновлён.
- **Бэкап отката на проде:** `/home/ubuntu/pre-deploy-20260623-162331.dump` (БД 13M, pg_restore --list OK) + `pre-deploy-env-*.bak` + `pre-deploy-code-*.tar.gz`.
- Долги докалки ЗАКРЫТЫ (deptrac baseline `app/deptrac.baseline.yaml`, larastan env-принят, диагностируемость won't-fix), прод-ops (failed_jobs 494к→7, tenant 24 удалён), приёмка раунд-2 вся закрыта, FN-RESET/FN-SESSION-env на проде. См. [SESSION-DONE-FJ...](SESSION-DONE-FJ-2026-06-23-and-next-handoff.md).
- **Лиды не идут с 3 июня = намеренное решение владельца** (сам выключил проекты), НЕ дефект. → `2026-06-23-LEADS-STOPPED-correction.md`.

### Омега разобрана ДО КОНЦА (read-only, прод + кабинет поставщика)
- Омега = tenant 25 `tmihaleva150`, **1 проект** 188 (call, номер `791353XXXXX`), баланс **300₽**, `preflight_blocked_at` (блок корректен — 300₽ не покрывают 50/день×~70₽).
- **В нашей системе омега получила 3 лида за всё время** (1 на 02.06 под старым маппингом + 2 на 23.06), все приняты без потерь, все дропнуты блоком (0 сделок).
- **«2 vs поставщик 1» по B2 = ОДИН лид (тел. 796207XXXXX) в двух наших рядах:** csv_recovery (03:01) + webhook (03:18). Слились бы в 1 сделку, но проект заблокирован → до слияния не дошло. Поставщик считает 1 (`phones_cnt=1`). Денег не потеряно, дубля-списания нет.
- **Глазами у поставщика (crm.bp-gr.ru, заход живой):** 3 rt-проекта омеги (B1/B2/B3, id 13390366/369/371), все `status=true` но **`go=false` (НЕ запущены)**, лимит 17/17/16=50/день (ёмкость, не выдача), доставлено: B1=0, B2=1, B3=0. Пользователь `#134637 @lkomega.ru Дмитрий`.
- **Вывод:** омега почти не получала лидов, т.к. у поставщика проекты `go=false` И у нас балансовый блок. Всё консистентно, потерь нет.

---

## 2. ⏳ ЧТО ОСТАЛОСЬ

### 🟢 Решение владельца (не работа — выбор)
- **Омега (tenant 25 / проект 188)** — включать или оставить выключенной. Чтобы ВКЛЮЧИТЬ: (а) поставить `go=true` у поставщика на B1/B2/B3 + (б) пополнить баланс tenant 25 (на 50/день нужно тысячи ₽; 300₽ мало) → новый код (E) сам снимет блок «всё-или-ничего». Пока выключена — потерь нет.

### ⛔ Старый блокер (ждёт регистрации ООО)
- **Б-1 / ООО** → от него: **онлайн-оплата ЮKassa** (включить флаг `billing_yookassa_enabled` + заполнить `YOOKASSA_WEBHOOK_IPS` подсетями ЮKassa + апгрейд до настоящего `auth:saas-admin`), **Yandex 360 SSO** (DO-4), **Диз-3**, **DO-2**.

### 🧹 Мелкая уборка (по желанию)
- 2 незакоммиченных `.md` (source-edit-lock plan/spec/runbook) болтаются в рабочей копии.
- Репо-хлам (~30 слитых веток, 14 worktree, 19 stash) — рекомендация: **оставить до после запуска** (всё в main, удалять = риск ради нуля).

---

## 3. КЛЮЧЕВЫЕ ФАКТЫ/ГРАБЛИ ДЛЯ СЛЕДУЮЩЕЙ СЕССИИ
- **Прод теперь на `b808a24f`** (стек выкачен). Перед любым новым накатом — сверка HEAD прода (метод в `deploy/README.md`, `redeploy.sh` уже исправлен).
- **Миграции crm_migrator-owned таблиц** (saas_transactions и др.) — вручную под `sudo -u postgres` + INSERT в migrations ДО `redeploy.sh`.
- **composer на проде** — только от root (vendor=www-data); после деплоя кэши пересобирать и ТОЛЬКО ПОТОМ рестартить php-fpm (opcache).
- **tinker `<file>` виснет/не выполняет** — использовать самобутстрап PHP-скрипт (`require vendor/autoload + bootstrap/app + Kernel::bootstrap`) от www-data, не tinker.
- **Заход к поставщику:** `sudo -u www-data php artisan supplier:session:refresh` работает; `SupplierPortalClient::listProjects()` / `requestNumbersReport()` для чтения.
- **gitea = единственный бэкап** (github origin мёртв/suspended). Пуш: `git push gitea main`.

---

## 4. ПРОМТ ДЛЯ НОВОЙ СЕССИИ (копировать целиком)

```
Кодовая фраза «роутер-наставник». Продолжаем Лидерру. Стек УЖЕ выкачен на прод
(балансовый блок + F/J + source-edit-lock + ЮKassa спит), деньги клиента целы.

Прочитай ПЕРВЫМ делом полный контекст последней сессии (деплой + омега + что осталось):
docs/superpowers/findings/2026-06-23-balance-block/SESSION-DONE-DEPLOY-2026-06-23-and-next-handoff.md
Там §1 — что УЖЕ сделано (НЕ повторять), §2 — что осталось, §3 — грабли прода.
Более ранний контекст рядом: SESSION-DONE-FJ-...md, 2026-06-23-PRE-DEPLOY-drift-and-loss-audit.md,
2026-06-23-LEADS-STOPPED-correction.md. Авторитетный снимок прода — ПИЛОТ.md (запись 23.06 16:45).

УЖЕ ЗАКРЫТО (не делать заново): деплой стека на прод (gitea b808a24f), приёмка раунд-2,
долги докалки (deptrac/larastan/диагностируемость), прод-ops (failed_jobs/tenant 24),
FN-RESET/FN-SESSION-env на проде, лиды=решение владельца (не дефект), омега разобрана до конца
(получила 1 реальный лид, у поставщика go=false + у нас блок 300₽, потерь нет).

ОСТАЛОСЬ (уточни приоритет у владельца):
  - ОМЕГА (tenant 25/проект 188): включать или нет — РЕШЕНИЕ ВЛАДЕЛЬЦА. Включить = go=true
    у поставщика + пополнить баланс tenant 25 (300₽ мало) → код E сам снимет блок. Пока — потерь нет.
  - Б-1/ООО (висяк): онлайн-оплата ЮKassa (флаг billing_yookassa_enabled + YOOKASSA_WEBHOOK_IPS +
    auth:saas-admin), Yandex 360 SSO, Диз-3, DO-2.
  - Мелкая уборка: 2 незакоммиченных .md (source-edit-lock), репо-хлам (оставить до после запуска).

ГРАБЛИ ПРОДА (см. §3 + deploy/README.md): миграции crm_migrator-таблиц вручную под postgres;
composer на проде только от root (vendor=www-data); кэши пересобирать ДО рестарта php-fpm (opcache);
tinker <file> виснет → самобутстрап PHP-скрипт от www-data; gitea = единственный бэкап.

На боевой — НИЧЕГО необратимого без явного GO владельца. Read-only разведка по SSH свободно.
Бэкап отката прода: /home/ubuntu/pre-deploy-20260623-162331.dump (+env +code).
```
