docs: ADR-009/010, карта деплоя, деплой-памятка фронта, задачи фронтендеру

Приёмка и починка 15.09.2026:
- ADR-009: один бэк на оба домена — прод-домен smart-updown.binom.pw переведён на тот же
  TS-шлюз (:8895), что и testfront; Kotlin-бэк (3NWEK) выключен обратимо. Разобраны расхождения
  API игры и шлюза (их должны править во фронте).
- ADR-010: две ловушки деплоя фронта — (1) чарт рендерит только path '/', поэтому helm-релиз
  сносит /api,/ws → вынесены в отдельный ingress smart-updown-api вне helm;
  (2) захардкоженный values.image.tag бьёт Chart.AppVersion → helm upgrade НЕ поднимает новый
  образ (новый RS не создаётся), на домене остаётся старый билд при 'Upgrade complete'.
  Приведена правильная команда (--reuse-values --set image.tag=<N>) и способ ПРОВЕРКИ по кубу
  и домену, а не по helm. Отмечен остаточный риск: Unity-ассеты immutable 7 суток при
  неизменяемых именах файлов → кэш браузера держит старый билд.
- README: карта деплоя (кто где живёт), статус проекта на 15.09, актуализирован блок
  безопасности (SEC-16 — утечка SOL, блокер перед mainnet), Kotlin-бэк помечен выключенным,
  добавлен TS-шлюз как боевой бэк, ссылки на tools/ и k8s/.
- TASKS.md: деплой-памятка фронта + задачи фронтендеру (убрать image.tag, хэш в именах
  ассетов, привести API игры к контракту шлюза).
This commit is contained in:
Hermes Agent
2026-09-15 12:13:23 +03:00
parent 101a4b60a9
commit 21a3a37a66
3 changed files with 138 additions and 13 deletions
+45 -13
View File
@@ -19,7 +19,8 @@
|---|---|---|---|---|---|
| 1 | **Смарт-контракт (оригинал)** | `akovalenko/Smart-game` | `~/WORK/games/Smart-game` | Rust/Anchor (Solana) | игровая логика ставок вверх/вниз, ваулт, выплата (**SOL**, не трогаем) |
| 1b | **Смарт-контракт (фантики)** | `subochev/smart-updown-token` | `~/WORK/games/smart-updown-token` | Rust/Anchor (Solana) | копия Smart-game для перевода на наши фантики (SPL-токен) — **работаем тут** |
| 2 | **Бэкенд (релейер)** | `subochev/smart-updown-server` | `~/WORK/games/smart-updown-server` | Kotlin/Spring Boot + solanaj | ретрансляция ставок, свап-клиент к pump.fun, релейер |
| 2 | **Бэкенд (релейер) — ⏸ ВЫКЛЮЧЕН** | `subochev/smart-updown-server` | `~/WORK/games/smart-updown-server` | Kotlin/Spring Boot + solanaj | канонический Kotlin-бэк, programId `3NWEK…` (в цепь не задеплоен, WS нет). **Выключен 15.09.2026** (`replicas=0`, ingress удалён) — оба домена переведены на TS-шлюз; см. ADR-009 |
| 2b | **Игровой шлюз (боевой)** | `subochev/smart-updown-token` → `relayer/` | `~/WORK/games/smart-updown-token/relayer` | TypeScript (Node 22) | **кастодиальный TS-шлюз `:8895`** — реально обслуживает оба домена: ставки, кран, расчёт, WS. Контракт `9ALs…` |
| 3 | **Фронт (Unity)** | `subochev/fun-game-front2` | `~/WORK/games/fun-game-front2` | Unity WebGL + Phantom | UI, кошелёк, подпись create_bet |
| 4 | **Тестовый фронт** | `subochev/test-front` | `~/WORK/games/test-front` | HTML/JS + Phantom | технический дашборд для ручного теста экономики (пополнение/ставка/вывод) без Unity |
| 5 | **Мета-репо (этот)** | `subochev/pump-game-ops` | `~/WORK/games/pump-game-ops` | Markdown | документация, решения, задачи |
@@ -27,6 +28,9 @@
> Примечания:
> - Remote-адреса: `https://git.binom.pw/<owner>/<repo>.git`.
> - Ветки: `smart-updown-server` и `fun-game-front2` — `main`; `Smart-game` сейчас на `extract-sources`.
> - ⚠️ **Актуальный бэк — TS-шлюз (пункт 2b), не Kotlin.** Kotlin-бэк выключен, но его код и образ
> целы: откат — `kubectl scale deploy -n game smart-updown-server-smart-updown-server --replicas=1`
> плюс возврат его ingress из `/root/bak-smart-updown-15.09/` (см. ADR-009).
## Внешние зависимости (upstream)
@@ -58,20 +62,48 @@ binance-market — это **не часть игры**, а **общий инфр
## Статус проекта (сводка)
Задачи и статусы — в `TASKS.md` (или `docs/TASKS.md`). Здесь — только верхи:
- [ ] Фаза 0 — экономика (токен, курс, mint) — **в работе**
- [ ] Фаза 1 — контракт на токене — **не начато**
- [ ] Фаза 4 — задействовать свап-клиент — **клиент готов**
- [ ] Фаза 5 — фронт (баланс/пополнение/вывод) — **не начато**
- [ ] Интеграция с `binance-market` (NATS/WS-клиент `PriceSource`) — **см. ADR-007**
Задачи и статусы — в `TASKS.md`. Здесь — только верхи (актуально на **2026-09-15**):
- [x] **Игра работает на живом стенде** — оба домена на ОДНОМ TS-шлюзе (ADR-009).
- [x] Цена SOL — из `binance-market` по NATS, раздача фронту по WS (ADR-007/008).
- [x] Авто-закрытие ставок на шлюзе, расчёт — **математика проверена 3/3** (выигрыш 1.3×.
проигрыш 0, ничья — возврат залога).
- [x] Фаза 5 — фронт (Unity WebGL) — **живой, деплоится тегами** (деплой-памятка в `TASKS.md`).
- [ ] **Перед mainnet:** закрыть `SEC-16` (безвозвратная утечка SOL с игрока) — правка контракта
+ редеплой; см. `docs/SECURITY.md`.
- [ ] Фаза 4 — задействовать свап-клиент (`pump.fun`) — **клиент готов**; Фаза 0/1 (экономика
токена, контракт на фантиках) — по `TASKS.md`.
## Карта деплоя (кто где живёт)
| Что | Где | Адрес/идентификатор |
|---|---|---|
| **k3s-кластер** | VM `192.168.76.120`, ns `game` | — |
| **Игровой бэк (боевой)** | TS-шлюз `updown-relayer`, сервис `testfront-gateway-smart-updown-relayer:8895` | оба домена: `/api`, `/ws` |
| **Домены** | `smart-updown.binom.pw` (Unity-игра), `testfront.binom.pw` (тех-дашборд) | один и тот же бэк |
| **Фронт игры** | deployment `fun-game-front2` (nginx + Unity WebGL) | образ `images.binom.pw/fun/game-front2:<тег>` |
| **Ingress-пути** | **`smart-updown-api`** — `/api`,`/ws` (ВНЕ helm); `fun-game-front2-…` — только `/` | ADR-010 |
| **Solana localnet** | LXC 151 на Proxmox `192.168.76.66` | RPC `192.168.76.181:8899` |
| **Контракт (в цепи)** | `9ALs…S1fCpf` (фантики, 4 инструкции) | прод-игра работает тут |
| **Реестр образов** | `images.binom.pw` | — |
## Безопасность
**Открытый чек-лист — `docs/SECURITY.md`** (пункты `SEC-1…SEC-15`, аудит живого стенда 2026-09-13).
Критично на сегодня (`SEC-1…SEC-6`): у контракта нет верхней границы окна закрытия ставки и нет
серверного авто-закрытия — момент расчёта выбирает клиент, что даёт безрисковый арбитраж. Плюс
открытые наружу `/bet`, `/close`, `/faucet` без авторизации.
**Чек-лист — `docs/SECURITY.md`** (пункты `SEC-1…SEC-16`; аудит живого стенда 2026-09-13,
дополнен приёмкой боевого домена 2026-09-15).
- **Закрыто:** отсутствие авто-закрытия (шлюз сам закрывает по расписанию), окно выбора момента
расчёта игроком (цена берётся из истории на момент экспирации), зависание при равных ценах
(`SEC-9` → возврат залога), `POST /close` удалён (404).
- 🔴 **Открыто, блокер перед mainnet — `SEC-16`:** рента PDA-аккаунта ставки (**1 559 040 lamports**,
= 0.00155904 SOL) списывается с кошелька **игрока** и **не возвращается никогда** (аккаунт не
закрывается). На тестах маскируется краном; на mainnet это реальные деньги игрока, тающие без
проигрыша. Лечение — `close = bettor` в `close_bet` + редеплой.
- **Остальное открытое:** NATS без аутентификации, `/bet` и `/faucet` без авторизации (на
тестовом стенде допустимо), отложенные `SEC-13…SEC-15`.
## Прочее
- Ночная экономика и mint-адреса: `docs/ECONOMY.md` (создаётся в Фазе 0).
- Разделы задач общего характера (например, мок/деплой/стабильность) — в `TASKS.md`.
- Ночная экономика и mint-адреса: `docs/ECONOMY.md`.
- Разделы задач общего характера (мок/деплой/стабильность) — в `TASKS.md`.
- **Диагностические и приёмочные скрипты** (живой стенд) — в `tools/`, с питфоллами замера в
`tools/README.md`.
- **k8s-манифесты вне helm** (отдельный ingress `/api`,`/ws`) — в `k8s/`.